學生成績管理計劃
編寫壹個管理程序來統計學生的考試成績。
假設學生成績已經以壹個學生壹條記錄的形式存儲在檔案中。
每個學生的記錄包含姓名、學號、各門課程成績等信息。
該程序具有以下功能:查找每門課程的總分,平均分,根據名稱、
根據學號查找其記錄並顯示,瀏覽所有學生的成績並根據總分從高到低顯示學生信息。
*/
# include & ltstdio.h & gt
# define n3/*課程數量*/
# definenamelen20/*名稱中的最大字符數*/
# #定義代碼EN 10/*/*學生編號的最大字符數*/
# define fnamelen 80/*文件名的最大字符數*/
# definebullen80/*緩沖區中的最大字符數*/
/*課程名稱列表*/
char課業[SWN][NAMELEN+1] = { "語文"、"數學"、"英語" };
結構記錄
{
charname[name len+1];/*姓名*/
char code[CODELEN+1];/*學生ID */
int marks[SWN];/*各門課程的成績*/
int total/*總分*/
}斯圖;
結構節點
{
charname[name len+1];/*姓名*/
char code[CODELEN+1];/*學生ID */
int marks[SWN];/*各門課程的成績*/
int total/*總分*/
structnode * next/*後續表格元素指針*/
} *頭;/*鏈表頭指針*/
int total[SWN];/*每門課程的總成績*/
FILE * stfpt/*文件指針*/
char stuff[fname len];/*文件名*/
/*從指定文件中讀取記錄*/
int readrecord(FILE *fpt,struct record *rpt)
{
char buf[buf len];
int I;
if(fscanf(fpt," %s ",buf)!=1)
返回0;/*文件結尾*/
strncpy(RPT-& gt;name,buf,name len);
fscanf(fpt," %s ",buf);
strncpy(RPT-& gt;code,buf,CODELEN);
for(I = 0;我& ltSWN;i++)
fscanf(fpt," %d ",& ampRPT->;marks[I]);
for(RPT-& gt;total=0,I = 0;我& ltSWN;i++)
RPT->;total+= RPT-& gt;標記[I];
返回1;
}
/*將記錄寫入指定文件*/
writerecord(FILE *fpt,struct record *rpt)
{
int I;
fprintf(fpt," %s\n ",RPT-& gt;姓名);
fprintf(fpt," %s\n ",RPT-& gt;碼);
for(I = 0;我& ltSWN;i++)
fprintf(fpt," %d\n ",RPT-& gt;marks[I]);
返回;
}
/*顯示學生記錄*/
displaystu(結構記錄*報告)
{
int I;
printf(" \ n名稱:%s\n ",RPT-& gt;姓名);
printf("Code : %s\n ",RPT-& gt;碼);
printf(" Marks:\ n ");
for(I = 0;我& ltSWN;i++)
printf(" %-15s : %4d\n ",schoolwork[i],RPT-& gt;marks[I]);
printf("總計:%4d\n ",RPT-& gt;合計);
}
/*計算各科總分*/
int totalmark(char *fname)
{
FILE * fp
結構記錄;
int count,I;
if((fp=fopen(fname," r))= = NULL)
{
printf("無法打開文件%s.\n ",fname);
返回0;
}
for(I = 0;我& ltSWN;i++)
total[I]= 0;
count = 0;
while(readrecord(fp,& amps)!=0)
{
for(I = 0;我& ltSWN;i++)
total[I]+= s . marks[I];
count++;
}
fclose(FP);
返回計數;/*返回記錄的數量*/
}
/*列表顯示學生信息*/
void liststu(char *fname)
{
FILE * fp
結構記錄;
if((fp=fopen(fname," r))= = NULL)
{
printf("無法打開文件%s.\n ",fname);
返回;
}
while(readrecord(fp,& amps)!=0)
{
display stu(& amp;s);
printf("\n按ENTER鍵繼續...\ n ");
while(getchar()!= ' \ n ');
}
fclose(FP);
返回;
}
/*構造鏈表*/
結構節點*生成列表(char *fname)
{
FILE * fp
結構記錄;
結構節點*p,*u,*v,* h;
int I;
if((fp=fopen(fname," r))= = NULL)
{
printf("無法打開文件%s.\n ",fname);
返回NULL
}
h =空;
p=(結構節點*)malloc(sizeof(結構節點));
while(readrecord(fp,(struct record *)p)!=0)
{
v = h;
而(v & amp& ampp->;總計& lt= v->;總計)
{
u = v;
v = v-& gt;接下來;
}
如果(v==h)
h = p;
其他
u-& gt;next = p;
p->;next = v;
p=(結構節點*)malloc(sizeof(結構節點));
}
免費(p);
fclose(FP);
返回h;
}
/*按順序顯示鏈表中的每個表格元素*/
void顯示列表(結構節點*h)
{
而(h!=空)
{
display stu((struct record *)h);
printf("\n按ENTER鍵繼續...\ n ");
while(getchar()!= ' \ n ');
h = h-& gt;接下來;
}
返回;
}
/*按學生姓名查找學生記錄*/
int retrievebyn(char *fname,char *key)
{
FILE * fp
int c;
結構記錄;
if((fp=fopen(fname," r))= = NULL)
{
printf("無法打開文件%s.\n ",fname);
返回0;
}
c = 0;
while(readrecord(fp,& amps)!=0)
{
if(strcmp(s.name,key)==0)
{
display stu(& amp;s);
c++;
}
}
fclose(FP);
如果(c==0)
printf("學生%s不在文件%s中,\n ",key,fname);
返回1;
}
/*按學號查找學生記錄*/
int retrievebyc(char *fname,char *key)
{
FILE * fp
int c;
結構記錄;
if((fp=fopen(fname," r))= = NULL)
{
printf("無法打開文件%s.\n ",fname);
返回0;
}
c = 0;
while(readrecord(fp,& amps)!=0)
{
if(strcmp(s.code,key)==0)
{
display stu(& amp;s);
c++;
打破;
}
}
fclose(FP);
如果(c==0)
printf("學生%s不在文件%s中,\n ",key,fname);
返回1;
}
主()
{
int i,j,n;
char c;
char buf[buf len];
FILE * fp
結構記錄;
clr SCR();
printf("請輸入學生成績記錄文件的名稱:");
scanf("%s ",stuff);
if((FP = fopen(stuff," r))= = NULL)
{
printf("文件%s不存在,您想創建它嗎?(是/否)”,填充);
getchar();
c = getchar();
if(c=='Y'||c=='y ')
{
FP = fopen(stuff," w ");
printf("請輸入要寫入文件的記錄號:");
scanf("%d ",& ampn);
for(I = 0;我& ltn;i++)
{
printf("輸入學生姓名:");
scanf("%s ",& amps . name);
printf("輸入學生的代碼:");
scanf("%s ",& amp美國代碼);
for(j = 0;j & ltSWN;j++)
{
printf("輸入%s標記: ",課業[j]);
scanf("%d ",& amps . marks[j]);
}
寫記錄(FP & amp;s);
}
fclose(FP);
}
}
fclose(FP);
getchar();
/* clrscr();*/
puts("現在您可以輸入壹個命令來管理記錄。");
puts("m:分數的平均值。");
puts("t:總分數。");
puts("n:按學生姓名搜索記錄。");
puts("c:按學生代碼搜索記錄。");
puts("l:列出所有記錄。");
puts("s:按總數對記錄進行排序和列出。");
puts("q:不幹了!");
while(1)
{
puts("請輸入命令:");
scanf(" %c ",& ampc);/*輸入選擇命令*/
if(c=='q'||c=='Q ')
{
puts("\n感謝您的使用。");
打破;/* q,結束程序運行*/
}
開關(c)
{
案例“m”:/*計算平均分*/
案例“M”:
if((n = total mark(stuff))= = 0)
{
puts("錯誤!");
打破;
}
printf(" \ n ");
for(I = 0;我& ltSWN;i++)
printf("%-15s的平均值為:%.2f.\n ",課業[i],(浮點)合計[I]/n);
打破;
案例' t': /*計算總分*/
案例“T”:
if((n = total mark(stuff))= = 0)
{
puts("錯誤!");
打破;
}
printf(" \ n ");
for(I = 0;我& ltSWN;i++)
printf("%-15s的總分是:%d.\n ",課業[i],總分[I]);
打破;
案例“n”:/*按學生姓名查找記錄*/
案例“N”:
printf("請輸入您要搜索的學生姓名:");
scanf("%s ",buf);
retrieve byn(stuff,buf);
打破;
案例“c”:/*按學生ID查找記錄*/
案例“C”:
printf("請輸入您要搜索的學生代碼:");
scanf("%s ",buf);
retrievebyc(stuf,buf);
打破;
案例“l”:/*列出所有學生記錄*/
案例“L”:
list stu(stuff);
打破;
案例':/*按總分降序顯示*/
案例:
if((head = makelist(stuff))!=空)
displaylist(表頭);
打破;
默認:break
}
}
}