C語言 學生成績管理系統
阿新 • • 發佈:2018-12-10
功能: 輸入若干個學生資訊(比如:學號,姓名及三門課成績),能實現 學生資訊的錄入、查詢、插入、排序等功能。 要求: 用資料檔案儲存學生資訊。利用選單可以迴圈完成各個操作。 進一步要求: 能夠實現對成績的修改更好。 (檔案函式 、結構陣列,排序等)
輸入學生資料存放在“stu.dat”檔案中,不能輸入重複的學號,否則將會判斷重複,要求重新輸入,但第二次必須輸入正確,會直接錄入檔案“stu.dat”,排序之後的資料存放在“stu.sort”中,修改可按照學號和姓名修改,若有姓名重複的同學,自動修改學號的學生資訊。修改是全部讀出再錄入,而不是覆蓋寫入,覆蓋寫入還沒有學會。程式碼還有問題,就不公佈了
# include <stdio.h>
# include<stdlib.h>
# include<string.h>
# define N 100
# define Swap {k=s[i];s[i]=s[min];s[min]=k;}
typedef struct student
{
char num[20];
char name[20];
float score1;
float score2;
float score3;
float aver;
float sum;
}stu;
int main()
{
void input();
void search();
void output();
void insert();
void sort ();
void swap();
void update();
int n;
while(1)
{
printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf("\n");
printf(" ◆◆◆◆◆學生成績管理系統◆◆◆◆◆◆◆\n");
printf(" ◆ 選單 ◆\n" );
printf(" ◆ 選項1:輸入 ◆\n");
printf(" ◆ 選項2: 查詢 ◆\n");
printf(" ◆ 選項3:輸出 ◆\n");
printf(" ◆ 選項4:插入 ◆\n");
printf(" ◆ 選項5:排序 ◆\n");
printf(" ◆ 選項6:修改 ◆\n");
printf(" ◆ 選項0:退出 ◆\n");
printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ◆\n");
printf("\n");
printf(" 執行操作:");
scanf("%d",&n);
switch(n)
{
case 1: input();break;
case 2: search();break;
case 3: output();break;
case 4: insert();break;
case 5: sort();break;
case 6:update();break;
case 0: exit(0);break;
default: printf("\n 輸入錯誤\n\n");break;
}
}
}
/*
// 用資料檔案儲存學生成績資訊(不能判斷學號是否重複
void input()
{
stu s[N];
int i,n;
printf("輸入學生個數:\n");
scanf("%d",&n);
FILE *fp;
fp=fopen("stu.dat","a+"); //要考慮覆蓋問題
if (fp==NULL)
{
printf("Can't open the file %s.\n","stu.date");
exit(0);
}
printf("輸入學生資訊:\n");
printf("學號姓名 英語 數學 C語言\n");
for(i=0;i<n;i++)
{
scanf("%s%s%f%f%f",s[i].num,s[i].name,&s[i].score1,&s[i].score2,
&s[i].score3);
}
//fprintf(fp," 學號 名字 英語 數學 C語言 平均分 總分\n");
for (i=0;i<n;i++)
{
s[i].sum=s[i].score1+s[i].score2+s[i].score3;
s[i].aver=(s[i].sum)/3;
fprintf(fp,"%10ld %10s %8.2f %8.2f %8.2f%8.2f %8.2f\n",s[i].num,s[i].name,
s[i].score1,s[i].score2,
s[i].score3,s[i].aver,
s[i].sum);
}
fclose(fp);
}*/
// 用資料檔案儲存學生成績資訊
void input()
{
stu s[N],a[N],t,w[N]; //a[N]為檔案中的,s[N]為輸入的學生資訊
int i,n,j,k=0,flag=0;
printf("輸入學生個數:\n");
scanf("%d",&n);
FILE *fp;
fp=fopen("stu.dat","r");
if (fp==NULL)
{
fclose(fp);
fp=fopen("stu.dat","a+"); //要考慮覆蓋問題
if (fp==NULL)
{
printf("Can't open the file %s.\n","stu.date");
exit(0);
}
printf("輸入學生資訊:\n");
printf("學號姓名 英語 數學 C語言\n");
scanf("%s%s%f%f%f",s[0].num,s[0].name,&s[0].score1,&s[0].score2,
&s[0].score3);
s[0].sum=s[0].score1+s[0].score2+s[0].score3;
s[0].aver=(s[0].sum)/3;
fprintf(fp,"%10s %10s %8.2f %8.2f %8.2f%8.2f %8.2f\n",s[0].num,s[0].name,
s[0].score1,s[0].score2,
s[0].score3,s[0].aver,
s[0].sum); //寫入第一個學生資料
fclose(fp);
i=1;
while(i<n)
{
flag=0;
fp=fopen("stu.dat","r");
if (fp==NULL)
{
printf("Can't open the file %s.\n","stu.date");
exit(0);
}
scanf("%s%s%f%f%f",s[i].num,s[i].name,&s[i].score1,&s[i].score2,
&s[i].score3);
s[i].sum=s[i].score1+s[i].score2+s[i].score3;
s[i].aver=(s[i].sum)/3;
for(j=0;j<N;j++) //判斷是否重複(必須保證第二次輸入正確的學號)
{
fscanf(fp,"%s%s%f%f%f%f%f\n",a[i].num,a[i].name,&a[i].score1,
&a[i].score2,&a[i].score3,
&a[i].aver,&a[i].sum);
if(strcmp(a[i].num,s[i].num)==0)
{
printf("該學號已經存在,請重新輸入(請確認第二次輸入的學號不重複)\n");
scanf("%s%s%f%f%f",w[k].num,w[k].name,&w[k].score1,&w[k].score2,
&w[k].score3);
w[k].sum=w[k].score1+w[k].score2+w[k].score3;
w[k].aver=(w[k].sum)/3;
t=w[k];w[k]=s[i];s[i]=t; //正確地學號等資訊,替換錯的
fclose(fp);
fp=fopen("stu.dat","a+");
fprintf(fp,"%10s %10s %8.2f %8.2f %8.2f%8.2f %8.2f\n",s[i].num,s[i].name,
s[i].score1,s[i].score2,
s[i].score3,s[i].aver,
s[i].sum);
fclose(fp);
k++;flag=1; //有重複的學號
i++;
break;
}
}
if(!flag)
{
fclose(fp);
fp=fopen("stu.dat","a+");
fprintf(fp,"%10ld %10s %8.2f %8.2f %8.2f%8.2f %8.2f\n",s[i].num,s[i].name,
s[i].score1,s[i].score2,
s[i].score3,s[i].aver,
s[i].sum);
i++;
}
}
}
else //能正常開啟文件
{
fclose(fp);
for(i=0;i<n;i++)
{
fp=fopen("stu.dat","r");
flag=0;
printf("輸入學生資訊:\n");
printf("學號姓名 英語 數學 C語言\n");
scanf("%s%s%f%f%f",s[i].num,s[i].name,&s[i].score1,&s[i].score2,
&s[i].score3);
s[i].sum=s[i].score1+s[i].score2+s[i].score3;
s[i].aver=(s[i].sum)/3;
flag=0;
for(j=0;j<N;j++) //判斷是否重複(必須保證第二次輸入正確的學號)
{
fscanf(fp,"%s%s%f%f%f%f%f\n",a[i].num,a[i].name,&a[i].score1,
&a[i].score2,&a[i].score3,
&a[i].aver,&a[i].sum);
if(strcmp(a[i].num,s[i].num)==0)
{
printf("該學號已經存在,請重新輸入\n");
scanf("%s%s%f%f%f",w[k].num,w[k].name,&w[k].score1,&w[k].score2,
&w[k].score3);
w[k].sum=w[k].score1+w[k].score2+w[k].score3;
w[k].aver=(w[k].sum)/3;
t=w[k];w[k]=s[i];s[i]=t; //正確地學號等資訊,替換錯的
fclose(fp);
fp=fopen("stu.dat","a+");
fprintf(fp,"%10s %10s %8.2f %8.2f %8.2f%8.2f %8.2f\n",s[i].num,s[i].name,
s[i].score1,s[i].score2,
s[i].score3,s[i].aver,
s[i].sum);
fclose(fp);
k++;flag=1;
i++;
break;
}
}
if(!flag)
{
fclose(fp);
fp=fopen("stu.dat","a+"); /* if (fp==NULL) {printf("Can't open the file %s.\n","stu.date");exit(0);}*/
fprintf(fp,"%10s %10s %8.2f %8.2f %8.2f%8.2f %8.2f\n",s[i].num,s[i].name,
s[i].score1,s[i].score2,
s[i].score3,s[i].aver,
s[i].sum);
fclose(fp);
}
}
}
return;
}
//按學號查詢
void search()
{ // 補充按姓名(相同名字的)查詢
FILE *fp;
stu s[N];
char ch[20];
float m;
int i,flag=0,t,n;
fp=fopen("stu.dat","r");
if(fp==NULL)
{ printf("the file open error\n");
exit(0);
}
while(1)
{
printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf(" ◆◆◆◆◆◆◆學生成績管理系統◆◆◆◆◆◆◆◆◆◆\n");
printf(" ◆ ◆\n");
printf(" ◆ 排序選單 ◆\n");
printf(" ◆ 選項1:按學號查詢 ◆\n");
printf(" ◆ 選項2:姓名查詢 ◆\n");
printf(" ◆ 選項0:退出 ◆\n");
printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf("\n 執行操作:");
scanf("%d",&t);
for(i=0;i<N;i++)
{
fscanf(fp,"%s%s%f%f%f%f%f\n",s[i].num,s[i].name,&s[i].score1,
&s[i].score2,&s[i].score3,
&s[i].aver,&s[i].sum);
}
n=i;
switch(t)
{
case 1:printf("輸入想要查詢的學號:");
scanf("%s",&ch);
for(i=0;i<n;i++)
{
if(strcmp(ch,s[i].num)==0)
{
printf("%10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",s[i].num,s[i].name,
s[i].score1,s[i].score2,
s[i].score3,s[i].aver,
s[i].sum);
flag=1;
break;
}
}
break;
case 2:printf("輸入想要查詢的姓名:");
scanf("%s",ch);
for(i=0;i<n;i++)
{
if(strcmp(ch,s[i].name)==0)
{
printf("%10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",s[i].num,s[i].name,
s[i].score1,s[i].score2,
s[i].score3,s[i].aver,
s[i].sum);
flag=1;
}
}
break;
case 0:break;
default:printf("\n\n輸入錯誤\n\n"); return;
}
if(!flag)
{
printf(" 查無此人\n");
break;
}
return;
}
fclose(fp);
}
//輸出
void output()
{
stu s[N];
FILE *fp;
int i=0;
fp=fopen("stu.dat","r");
if(fp==NULL)
{
printf("can not open this file\n");
exit(0);
}
printf("\n學生資訊:\n");
printf("次序 學號 姓名 英語 數學 C語言 平均分 總分\n");
while(!feof(fp))
{
fscanf(fp,"%s%s%f%f%f%f%f\n",s[i].num,s[i].name,&s[i].score1,&s[i].score2,
&s[i].score3,&s[i].aver,&s[i].sum);
printf("%3d %10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",i+1,s[i].num,s[i].name,
s[i].score1,s[i].score2,
s[i].score3,s[i].aver,
s[i].sum);
i++;
}
fclose(fp);
}
void sort() //任意排序
{
stu s[N],k;
FILE *fp1,*fp2;
int i=0,j,min,count=0,n;
fp1=fopen("stu.dat","r");
fp2=fopen("stu.sort","w");
if(fp1==NULL)
{
printf("the file can not open.\n");
exit(0);
}
if(fp2==NULL)
{
printf("the file write error\n");
exit(0);
}
while(!feof(fp1))
{
fscanf(fp1,"%s%s%f%f%f%f%f\n",s[i].num,s[i].name,&s[i].score1,
&s[i].score2,&s[i].score3,
&s[i].aver,&s[i].sum);
i++;
}
count=i; //總人數
fclose(fp1);
printf("\n");
while(1)
{
printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf(" ◆◆◆◆◆◆◆學生成績管理系統◆◆◆◆◆◆◆◆◆◆\n");
printf(" ◆ ◆\n");
printf(" ◆ 排序選單 ◆\n");
printf(" ◆ 選項1:按學號排序 ◆\n");
printf(" ◆ 選項2:姓名的音序排序 ◆\n");
printf(" ◆ 選項3:按score1(英語成績)排序 ◆\n");
printf(" ◆ 選項4:按score2(數學成績)排序 ◆\n");
printf(" ◆ 選項5:按score3(C語言)排序 ◆\n");
printf(" ◆ 選項6:按總分或者平均分排序 ◆\n");
printf(" ◆ 選項0:退出 ◆\n");
printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf("\n 執行操作:");
scanf("%d",&n);
printf("\n");
for(i=0;i<count;i++)
{
min=i;
switch(n)
{
case 1: for(j=i+1;j<count;j++) //按學號排序
if(strcmp(s[j].num,s[min].num)<0) min=j;
if(min!=i) Swap;
break;
case 2:
for(j=i+1;j<count;j++)
if(strcmp(s[j].name,s[min].name)<0) min=j;
if(min!=i)
Swap;
break;
case 3:
for(j=i+1;j<count;j++)
if(s[j].score1<s[min].score1) min=j;
if(min!=i) Swap;
break;
case 4:
for(j=i+1;j<count;j++)
if(s[j].score2<s[min].score2) min=j;
if(min!=i) Swap;
break;
case 5:
for(j=i+1;j<count;j++)
if(s[j].score3<s[min].score3) min=j;
if(min!=i)
Swap;
break;
case 6: for(j=i+1;j<count;j++)
if(s[j].sum<s[min].sum) min=j;
if(min!=i) Swap;
break;
case 0:break;
default:printf(" 輸入錯誤\n");return;
}
}
printf("名次 學號 姓名 英語 數學 C語言 平均分 總分\n");
for(i=0;i<count;i++)
{
printf("%d %10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",i+1,s[i].num,s[i].name,
s[i].score1,s[i].score2,s[i].score3,
s[i].aver,s[i].sum);
fprintf(fp2,"%10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",s[i].num,s[i].name,
s[i].score1,s[i].score2,s[i].score3,
s[i].aver,s[i].sum);
}
printf("\n");
fclose(fp2);
return;
}
}
//插入學生
void insert()
{
printf("插入後請選擇排序方式\n");
printf("\n輸入需要插入的學生人數\n");
input();
sort();
}
// 修改按學號
//要求補充按姓名
void update()
{
FILE *fp;
stu temp,s[N];
int i=0,count,n,flag=0,k=0;
fp=fopen("stu.sort","r");
if(fp==NULL)
{
printf("the file can not open\n");
exit(0);
}
while(!feof(fp))
{
fscanf(fp,"%s%s%f%f%f%f%f\n",s[i].num,s[i].name,&s[i].score1,
&s[i].score2,&s[i].score3,
&s[i].aver,&s[i].sum);
i++;
}
fclose(fp);
fp=fopen("stu.sort","w");
count=i;
while(1)
{
printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf(" ◆◆◆◆◆◆◆學生成績管理系統◆◆◆◆◆◆◆◆◆◆\n");
printf(" ◆ ◆\n");
printf(" ◆ 排序選單 ◆\n");
printf(" ◆ 選項1:按學號修改 ◆\n");
printf(" ◆ 選項2:姓名修改 ◆\n");
printf(" ◆ 選項0:退出 ◆\n");
printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf("提示:按姓名查詢時若有同名,自動修改學號相同的同學\n\n");
printf("\n 執行操作:");
scanf("%d",&n);
printf(" 輸入需要修改學生資訊:\n");
printf("學號姓名英語數學C語言\n");
scanf("%s%s%f%f%f",&temp.num,temp.name,&temp.score1,&temp.score2,&temp.score3);
temp.sum=temp.score1+temp.score2+temp.score3;
temp.aver=temp.sum/3;
switch(n)
{
case 1: for(i=0;i<count;)
{
if(strcmp(s[i].num,temp.num)==0)
{ s[i]=temp;flag=1; break; }
else i++;
}
break;
case 2:for(i=0;i<count;i++)
{
if(strcmp(s[i].name,temp.name)==0)
{ s[i]=temp;flag=1;k++; }
}
if(k!=1)
{
printf("有姓名相同的同學,自動修改學號相同的同學的資訊\n\n")
for(i=0;i<count;i++)
{
if(strcmp(s[i].name,temp.name)==0)
{ s[i]=temp;flag=1; }
}
}
break;
case 0:break;
default:printf("\n 選擇錯誤\n");return;
}
if(!flag)
{
printf(" 查詢無果\n");
break;
}
for(i=0;i<count;i++)
{
printf("%10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",s[i].num,s[i].name,
s[i].score1,s[i].score2,
s[i].score3,s[i].aver,
s[i].sum);
fprintf(fp,"%10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",s[i].num,s[i].name,
s[i].score1,s[i].score2,
s[i].score3,s[i].aver,
s[i].sum);
}
printf("\n 修改成功\n");
fclose(fp);
return;
}
}