基於陣列的學生管理系統【C語言版】
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define N 5
struct Student{
int num;
char name[25];
char major[10];
int classNo;
int score[4];
};
typedef struct Student STU;
void Input(STU *p);
void Output(STU *p);
void Save(STU *p);
int Fetch(STU *st,int n,char *filename);
void Max(STU stu[],int m);
double average_person(STU *p);
void sort_select(STU *p);
void Sort_Buble(STU *p);
void Sort_insert(STU *p);
void Search(STU *p);
void Ask();
void main()
{
int choose;
int i,j,m,n;
char filename[10];
STU stu[N];
STU *p;
p=stu;
while(1)
{
printf("\n——————————————————————————————————————————\n");
printf("|///// # 已經進入 大連海事大學--學生資訊管理系統 # //////\n");
printf("———————————————————————————————————————————\n\n\n");
printf("|///#No.1 ---- 輸入學生個人資訊 ---- \n");
printf("|///#No.2 ---- 輸出學生個人資訊 ---- \n");
printf("|///#No.3 ---- 儲存學生資訊 ---- \n");
printf("|///#No.4 ---- 讀取學生資訊 ---- \n");
printf("|///#No.5 ---- 輸出某門課程的最高分和分數最高的學生的姓名 ----\n");
printf("|///#No.6 ---- 對某專業的學生按總平均成績進行簡單選擇排序 ---- \n");
printf("|///#No.7 ---- 按平均成績對某班學生進行氣泡排序 ---- \n");
printf("|///#No.8 ---- 對某班學生按某門課程成績進行直接插入排序 ---- \n");
printf("|///#No.9 ---- 按照班級和成績的查詢某位學生資訊 ---- \n");
printf("\n **注意:若是輸入其他數字直接退出系統//**\n\n\n");
printf("———————————————————————————————————————————\n\n\n");
printf("請輸入選擇的功能編號:");
scanf("%d",&choose);
switch(choose)
{
case 1:
{
for(i=0;i<N;i++)
{
Input(stu+i);
}
Ask();
break;
}
case 2:{
printf("請輸入想要輸出第幾個學生的資訊:\n");
scanf("%d",&n);
if (n>=0 && n<N)
Output(stu+n-1);
else
printf("沒有這名學生!請重新輸入!");
Ask();
break;
}
case 3:{
getchar();
Save(stu);
printf("檔案儲存成功!\n");
Ask();
break;
}
case 4:
{
printf("請輸入讀入的檔名:");
scanf("%s",filename);
printf("請輸入要提取資訊的位置號:");
scanf(" %d",&j);
if (j>=0 && j<=N)
{
if ( Fetch(stu,j,filename)==0)
printf("提取失敗!\n");
}
Ask();
break;
}
case 5:
{
printf("請輸入想求最高分的科目代號(1,2,3),總成績代號:4:\n");
scanf("%d",&m);
Max(p,m);
Ask();
break;
}
case 6:
{
getchar();
printf("對某專業的學生,按總平均成績由低到高排序結果為:\n");
sort_select(stu);
Ask();
break;
}
case 7:
{
Sort_Buble(stu);
Ask();
break;
}
case 8:
{
Sort_insert(stu);
Ask();
break;
}
case 9:
{
getchar();
Search(stu);
Ask();
break;
}
default:
{
break;
}
}
if((choose<1)||(choose>10))
break;
}
}
void Input(STU *p)
{
int j;
printf("請輸入學生的學號:\n");
scanf("%d",&p->num);
getchar();
printf("請輸入學生的姓名 \n");
gets(p->name);
printf("請輸入學生的專業 軟體工程:soft/網路工程:net/電腦科學與技術:computer \n");
gets(p->major);
printf("請輸入學生的班級 1班/2班,:\n");
scanf("%d",&p->classNo);
getchar();
printf("請分別按順序輸入學生的三門成績:高數/英語/物理 \n");
for(j=0;j<3;j++)
{
printf("請輸入第%d門成績 :\n",j+1);
scanf("%d",&p->score[j]);
getchar();
}
p->score[3]=p->score[0]+p->score[1]+p->score[2];
}
void Output(STU *p)
{
printf("學號:%d\t| 姓名%s\t| 專業:%s\t| 班級:%d\t| 高數成績:%d\t| 英語成績:%d\t| 物理成績:%d\n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
}
double average_person(STU *p){
return(((p->score[0])+(p->score[1])+(p->score[2]))/3.0);
}
void Save(STU *p)
{
FILE *fp;
char filename[20];
int i;
printf("請輸入要儲存的檔名稱:\n");
gets(filename);
if((fp=fopen(filename,"wb"))==NULL)
{
printf("新建檔案失敗 請重試請重新輸入\n");
return;
}
for(i=0;i<N;i++)
{
if(fwrite(p++,sizeof(STU),1,fp)!=1)
printf("檔案寫入失敗 請重新輸入\n");
}
fclose(fp);
}
int Fetch(STU *p,int n,char *filename)
{
FILE *fp;
if((fp=fopen(filename,"rb"))==NULL)
{
fclose(fp);
return 0;
}
fseek(fp,(long)sizeof(STU)*n,0);
if ( (fread(p,sizeof(STU),1,fp)) != 1)
{
printf("檔案錄入失敗 請重新輸入:");
fclose(fp);
return 0;
}
Output(p);
fclose(fp);
return 1;
}
void Max(STU stu[],int m)
{
int i,index;
int y[N];
STU *p;
p=stu;
for(i=1;i<=N;i++)
y[i-1]=i-1;
switch(m)
{
case 1:
{
for(i=1;i<N;i++)
if((p+y[0])->score[0]<(p+y[i])->score[0])
{
index=y[0];
y[0]=y[i];
y[i]=index;
}
p=p+y[0];
printf("\t第1門最高分為:");
printf("%d\n",p->score[0]);
printf("\t得最高分的同學名字是:");
puts(p->name);
break;
}
case 2:
{
for(i=1;i<N;i++)
if((p+y[0])->score[1]<(p+y[i])->score[1])
{
index=y[0];
y[0]=y[i];
y[i]=index;
}
p=p+y[0];
printf("\t第2門最高分為:");
printf("%d\n",p->score[1]);
printf("\t得最高分的同學名字是:");
puts(p->name);
break;
}
case 3:
{
for(i=1;i<N;i++)
if((p+y[0])->score[2]<(p+y[i])->score[2])
{
index=y[0];
y[0]=y[i];
y[i]=index;
}
p=p+y[0];
printf("\t第3門最高分為:");
printf("%d\n",p->score[2]);
printf("\t得最高分的同學名字是:");
puts(p->name);
break;
}
case 4:
{
for(i=1;i<N;i++)
if((p+y[0])->score[3]<(p+y[i])->score[3])
{
index=y[0];
y[0]=y[i];
y[i]=index;
}
p=p+y[0];
printf("\t總成績最高分為:");
printf("%d\n",p->score[2]);
printf("\t得最高分的同學名字是:");
puts(p->name);
break;
}
default:
break;
}
}
void sort_select(STU *p)
{
int i,j,k;
char b[15];
double t,aver[N];
STU a;
printf("請選擇一個專業(請輸入已經錄入的專業名稱):\n");
gets(b);
for(i=0;i<N;i++)
{
aver[i]=average_person(p+i);
}
for(i=0;i<N-1;i++)
{
k=i;
for(j=i+1;j<N;j++)
if(aver[k]>aver[j])
k=j;
t=aver[i];
aver[i]=aver[k];
aver[k]=t;
a=*(p+i);*(p+i)=*(p+k);*(p+k)=a;
}
for(i=0;i<N;i++){
if(strcmp((p+i)->major,b)==0){
printf("專業:%s\t班級:%d\t姓名:%s\t平均成績:%5.3f\n",(p+i)->major,(p+i)->classNo,(p+i)->name,aver[i]);
}
}
}
void Sort_Buble(STU *p)
{
int i,j,b;
double t,aver[N];
STU a;
printf("選擇一個班級(請輸入已經建立的班級):\n");
scanf("%d",&b);
for(i=0;i<N;i++)
{
aver[i]=average_person(p+i);
}
for(i=0;i<N;i++)
for(j=0;j<N-1-i;j++)
if(aver[j]<aver[j+1])
{
t=aver[j];
aver[j]=aver[j+1];
aver[j+1]=t;
a=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=a;
}
for(i=0;i<N;i++)
if((p+i)->classNo==b){
printf("姓名:%s\t平均分=%5.3f\n",(p+i)->name,aver[i]);
}
}
void Sort_insert(STU *p)
{
int i,j,id,q,tem;
int score[N];
char b[10];
int k=0;
STU *m;
m=p;
getchar();
printf ("請輸入需要檢視成績的班級(請輸入已經錄入的專業):");
gets(b);
printf ("請輸入需要檢視成績的班級(請輸入已經錄入的班級):");
scanf ("%d",&q);
printf ("請輸入需要檢視分數的課程(1,2,3)\n");
scanf ("%d",&id);
getchar();
for (i=0; i<N; i++,p++)
{
if(strcmp(p->major,b)==0)
{ if(p->classNo==q){
score[k]=p->score[id-1];
k++;
}
}
}
for (i=1; i<k; i++)
if (score[i-1]>score[i])
{
tem=score[i];
j=i-1;
do
{
score[j+1]=score[j];
j--;
}
while (j>=0&&tem<score[j]);
score[j+1]=tem;
}
printf ("對該班級的學生,按第%d科成績由低到高進行直接插入排序為:\n",id);
for (i=0; i<k; i++)
{
p=m;
for (j=0; j<N; j++,p++)
{
if (strcmp(p->major,b)==0 && (p->score[id]==score[i]) && (p->classNo==q))
{
Output(p);
printf("\n");
}
}
}
}
void Search(STU *head)
{
STU *p;
int b,k,sum_scores;
int limit_score;
k=0 ;
printf ("請輸入該學生的班級號 \n");
scanf ("%d",&b);
getchar();
printf ("請輸入總成績>=**的學生(**為分數)\n");
scanf ("%d",&limit_score);
printf (" \t\t\t\t%d班總成績>=%d的學生資訊為:\t\t\t\t \n",b,limit_score);
for (p=head;p<head+N;p++)
{
sum_scores=(p->score[0])+(p->score[1])+(p->score[2]);
if((p->classNo)==b)
{
if (sum_scores >= limit_score)
{
printf ("該學生資訊為:\n");
Output(p);
printf("\n");
k++;
}
}
}
if (k==0)
printf ("查詢的學生資訊不存在:\n");
}
void Ask()
{
int c;
printf("\n已實現所選功能 輸出編號進行下一步操作:\n\n 1: 繼續選擇其他功能 2: 不再選擇直接退出系統\n");
scanf("%d",&c);
if (c==2)
exit(0);
}