#include?<stdlib.h>
#include?<string.h>
#define?MAX?1000
typedef?struct?Lesson?//定義課程結構體
{
int?Lesson_Num;
char?Lesson_Name[50];
int?Lesson_Mark;
int?Lesson_Credit;
}Lesson;
typedef?struct?Student?//定義學生的結構體
{
char?Name[50];
int?Num;
int?Lesson_Count;
Lesson?L[20];
}Student;
Student?S[MAX];
static?int?Student_Count?=?0;?//記錄學生數的變量
void?PrintInterface();?//打印界面
int?AddStudent();?//添加,帶返回值,提示操作成功
int?DelStudent();?//刪除,帶返回值,提示操作成功
void?CheckStudent();?//查學生成績
void?CheckClass();?//查班成績表
void?WriteFile();?//寫入文本文件
void?ReadFile();?//讀取文本文件
void?main()
{
int?Choice;
while?(1)
{
PrintInterface();
scanf("%d%*c",?&Choice);?//"%*c"是吸收回車的,因為後面會輸入字母類型
if?(Choice?>=?0?&&?Choice?<=?6)?//選擇操作合法
{
switch?(Choice)
{
case?0:?exit(1);
case?1:
{
system("cls");
if?(AddStudent())?printf("\n添加成功...回車繼續\n");
else?printf("\n添加失敗...回車繼續\n");
getchar();
getchar();
system("cls");
break;
}
case?2:
{
system("cls");
if?(DelStudent())?printf("\n刪除成功...回車繼續\n");
else?printf("\n刪除失敗...回車繼續\n");
getchar();
getchar();
system("cls");
break;
}
case?3:
{
system("cls");
CheckStudent();
system("cls");
break;
}
case?4:
{
system("cls");
CheckClass();
system("cls");
break;
}
case?5:?WriteFile();system("cls");break;
case?6:?ReadFile();system("cls");break;
default:;
}
}
else
{
printf("無此功能..重新選擇..回車確定\n");?//選擇操作非法
getchar();
system("cls");?//清屏函數
}
}
}
void?PrintInterface()
{
printf("\t?--------------------------?\n");
printf("\t|?1、添加?|\n");
printf("\t|?|\n");
printf("\t|?2、刪除?|\n");
printf("\t|?|\n");
printf("\t|?3、查學生成績|\n");
printf("\t|?|\n");
printf("\t|?4、查班成績表|\n");
printf("\t|?|\n");
printf("\t|?5、寫入文本文件?|\n");
printf("\t|?|\n");
printf("\t|?6、讀取文本文件?|\n");
printf("\t|?|\n");
printf("\t|?0、退出?|\n");
printf("\t?--------------------------?\n");
printf("\t選擇操作:");
}
int?AddStudent()
{
int?S_count,?i,?j;
printf("\n添加中......\n");
printf("\n添加學生人數(如1、2?……999):");
scanf("%d",?&S_count);
if?(Student_Count?+?S_count?>=?MAX)?return?0;?//超過了數組上限
for?(i?=?Student_Count;?i?<?Student_Count?+?S_count;?i++)
{
printf("\n\t第%d個學生:\n",?i?-?Student_Count?+?1);
printf("\n\t學生學號:");?scanf("%d%*c",?&S[i].Num);
printf("\n\t學生姓名:");?gets(S[i].Name);
printf("\n\t該學生所修課程數:");?scanf("%d",?&S[i].Lesson_Count);
for?(j?=?0;?j?<?S[i].Lesson_Count;?j++)
{
printf("\n\t第%d門課:\n",?j?+?1);
printf("\n\t\t課程編號:");?scanf("%d%*c",?&S[i].L[j].Lesson_Num);
printf("\n\t\t課程名稱:");?gets(S[i].L[j].Lesson_Name);
printf("\n\t\t課程成績:");?scanf("%d",?&S[i].L[j].Lesson_Mark);
printf("\n\t\t課程學分:");?scanf("%d",?&S[i].L[j].Lesson_Credit);
if?(S[i].L[j].Lesson_Mark?<?60)?S[i].L[j].Lesson_Credit?=?0;?//不及格的課程學分為0
}
}
Student_Count?+=?S_count;
return?1;
}
int?DelStudent()
{
char?*D_Name;
int?D_Num;
int?i,?j;
printf("\n填寫待刪除學生的信息:\n");
printf("\n學生姓名:");?gets(D_Name);
printf("\n學生學號:");?scanf("%d",?&D_Num);
for?(i?=?0;?i?<?Student_Count;?i++)
{
if?(!strcmp(S[i].Name,?D_Name)?&&?S[i].Num?==?D_Num)
{
printf("\n找到該學生,刪除中......\n");
for?(j?=?i?+?1;?j?<?Student_Count;?j++)
{
S[j?-?1]?=?S[j];
}
break;
}
}
if?(i?==?Student_Count)
{
printf("\n未找到該學生...請核對所填信息\n\n");
return?0;
}
else
{
Student_Count--;
return?1;
}
}
void?CheckStudent()
{
int?C_Choice;
char?C_Name[50];
int?C_Num;
int?i,?j;
printf("\n輸入所查學生信息(1.姓名?\\?2.學號)選擇:");
scanf("%d%*c",?&C_Choice);
printf("\n查找中......\n");
if?(C_Choice?==?1?||?C_Choice?==?2)?//選擇合法
{
if?(C_Choice?==?1)
{
printf("\n姓名:");?gets(C_Name);
for?(i?=?0;?i?<?Student_Count;?i++)?//全部窮舉,防止同名同姓
{
if?(!strcmp(S[i].Name,?C_Name))
{
printf("\n學號:%d\t姓名:%s\n",?S[i].Num,?S[i].Name);
printf("\n課程編號\t課程名稱\t課程成績\t課程學分\n");
printf("-----------------------------------------------------\n");
for?(j?=?0;?j?<?S[i].Lesson_Count;?j++)
{
printf("%d\t\t%s\t\t%d\t\t%d\n",?S[i].L[j].Lesson_Num,
S[i].L[j].Lesson_Name,?S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
printf("-----------------------------------------------------\n");
}
printf("\n\n");
}
}
}
else
{
printf("\n學號:");?scanf("%d%*c",?&C_Num);
for?(i?=?0;?i?<?Student_Count;?i++)?//不用全部窮舉,學號唯壹
{
if?(S[i].Num?==?C_Num)
{
printf("\n學號:%d\t姓名:%s\n",?S[i].Num,?S[i].Name);
printf("\n課程編號\t課程名稱\t課程成績\t課程學分\n");
printf("-----------------------------------------------------\n");
for?(j?=?0;?j?<?S[i].Lesson_Count;?j++)
{
printf("%d\t\t%s\t\t%d\t\t%d\n",?S[i].L[j].Lesson_Num,
S[i].L[j].Lesson_Name,?S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
printf("-----------------------------------------------------\n");
}
printf("\n\n");
break;
}
}
}
printf("查找完畢...回車繼續\n");
getchar();
}
else?//選擇不合法
{
printf("選擇錯誤...回車繼續\n");
getchar();
return;
}
}
void?CheckClass()
{
int?C_LNum;
double?SSNum?=?0,?PassSNum?=?0,?SMark?=?0;
int?i,?j;
printf("\n請輸入課程編號:");
scanf("%d%*c",?&C_LNum);
printf("\n查找中......\n\n");
printf("學號\t姓名\t課程名稱\t課程成績\t課程學分\n");
printf("----------------------------------------------------\n");
for?(i?=?0;?i?<?Student_Count;?i++)
{
for?(j?=?0;?j?<?S[i].Lesson_Count;?j++)
{
if?(S[i].L[j].Lesson_Num?==?C_LNum)
{
printf("%d\t%s\t%s\t\t%d\t\t%d\n",?S[i].Num,?S[i].Name,?S[i].L[j].Lesson_Name,
S[i].L[j].Lesson_Mark,?S[i].L[j].Lesson_Credit);
printf("----------------------------------------------------\n");
SMark?+=?S[i].L[j].Lesson_Mark;
SSNum?++;
if?(S[i].L[j].Lesson_Mark?>=?60)?PassSNum++;
break;
}
}
}
printf("\n平均分:%.2lf\t及格率:%.2lf%%\n\n",?SMark?/?SSNum,?PassSNum?/?SSNum?*?100);
printf("\n查找完畢...回車繼續\n");
getchar();
}
void?WriteFile()
{
FILE?*fp;
int?i,?j;
char?Adr[100];
printf("\n請輸入寫入的文件地址:\n\n地址輸入格式:例如d:\\\\Student.txt(\\\\為轉義字符):");
scanf("%s%*c",?Adr);
printf("\n寫入中......\n");
if?(fp?=?fopen(Adr,"w"))?//寫入文件
{
fprintf(fp,"%d\n",Student_Count);
for?(i?=?0;?i?<?Student_Count;?i++)
{
fprintf(fp,"%d\t%s\t%d\n",S[i].Num,?S[i].Name,S[i].Lesson_Count);
for?(j?=?0;?j?<?S[i].Lesson_Count;?j++)
{
fprintf(fp,"%d\t%s\t%d\t%d\n",?S[i].L[j].Lesson_Num,
S[i].L[j].Lesson_Name,S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
}
}
printf("\n寫入完成...回車繼續\n");
fclose(fp);
}
else
{
printf("\n寫入失敗...回車繼續\n");
}
getchar();
}
void?ReadFile()
{
FILE?*fp;
int?i,?j;
char?Adr[100];
printf("\n請輸入讀取(為防止讀入錯誤,希望與寫入文件內容格式壹致)的文件地址:\n\n地址輸入格式:例如d:\\\\Student.txt(\\\\為轉義字符):");
scanf("%s%*c",?Adr);
printf("\n讀取中......\n");
if?(fp?=?fopen(Adr,"r"))
{
fscanf(fp,"%d",&Student_Count);
for?(i?=?0;?i?<?Student_Count;?i++)
{
fscanf(fp,"%d%s%d",&S[i].Num,?&S[i].Name,&S[i].Lesson_Count);
for?(j?=?0;?j?<?S[i].Lesson_Count;?j++)
{
fscanf(fp,"%d%s%d%d",&S[i].L[j].Lesson_Num,
&S[i].L[j].Lesson_Name,&S[i].L[j].Lesson_Mark,
&S[i].L[j].Lesson_Credit);
}
}
printf("\n讀取成功...回車繼續\n");
fclose(fp);
}
else
{
printf("\n讀取失敗...回車繼續\n");
}
getchar();
}