C語言學生管理系統
前言
很多學校都選擇C語言作為學生編程入門語言,許多老師都會布置C語言期末大作業,作業題目很多就是學生資訊管理系統,以前都是練習小題目,幾十行代碼就能搞定,而完整的寫完這個系統我用了差不多400行代碼,完整寫完這個系統,是對一個學期所學知識的進一步深入了解于學習,還能擴充一些課外知識,篇幅很長,收藏起來,慢慢看!
題目詳情
一、學生資訊管理程式 基本要求:
1.要求實作學生資訊的 使用幫助、添加、查找、洗掉、修改、瀏覽、保存、重繪、退出等9個功能,每個功能模塊均能實作從模塊中退出,從而完成一個學生管理系統所需功能,
2.要使用結構體來實作對學生資訊的存盤,
3.學生資訊需至少包括:學號,姓名,性別,年齡, 成績資訊至少包括三科以上成績:C語言、高數、英語…
4.使用檔案完成資料的存盤與讀取,要求每次運行某個功能模塊時將資料讀入結構體中,并給用戶提供保存選項,可以將結構體中的資料保存在檔案中,
5.系統制作完成后應實作類似下圖所示界面:

入坑全程序
整體思路
可以利用一個switch函式,加上代碼模塊化的思想,一個函式實作一個功能,分別實作題目要求的9個功能,為了讓代碼更加的模塊化,額外增加一個選單函式用于輸出選單界面,一共10個函式,
每個模塊的具體實作方法
結構體的創建
題目要求需要使用結構體來對學生資訊進行儲存,所以需要創建一個結構體,同時也要注意結構體中需要包含學生的那些資訊,
代碼展示:
struct student
{
char StuID[LEN];//學生學號
char Stuname[LEN];
int Stuage;
char Stusex;
float score[3]; //三科成績
}stu[N];//N是學生人數,具體可以在代碼開頭進行更改
main函式
- 回傳選單界面以及exit(退出)函式的實作:
由于每次執行完函式后,都要回傳主選單界面,所以用到一個while函式來控制回圈,我們知道,當while的回圈條件為 1(真)時,回圈繼續,否則(為0,就是假時)結束回圈,利用這個特性,只需要用一個全域變數(我用的是 t)來控制回圈即可,在定義時賦值為真(1),當執行exit函式(退出函式)時,將其值改為假(0)即可結束回圈,實作退出,此思路后續exit函式的描述部分將不再說明, - 除此之,就是switch函式實作選單函式的選擇執行,詳細請看代碼:
int main()
{
int num;//num是選單選項
while(t)//t是全域變數,用exit函式改變t的值來控制回圈是否繼續
{
menu();//輸出主選單界面
printf("您好,請輸入選單編號:");
scanf("%d",&num);
switch(num)
{
case 1: help(); break;
case 2: increase(); break;
case 3: seek(); break;
case 4: de(); break;
case 5: save(); break;
case 6: present(); break;
case 7: modify(); break;
case 8: flush(); break;
case 9: exit(); break;
default:printf("輸入有誤,請重新輸入!");
}
}
menu函式
menu函式就只有一個功能,輸出選單界面,界面的美化與格式的控制相信都比我強,哈哈,廢話不多說,上代碼:
void menu()
{
printf("\n\n");
printf("*****************************************************\n");
printf("*----------------------duoduo------------------------\n");
printf("* 學生資訊管理系統 *\n");
printf("*****************************************************\n");
printf("********************系統功能選單*********************\n");
printf("---------------------- --------------------------\n");
printf("*****************************************************\n");
printf("** 1、使用幫助 * 2、增加學生資訊 **\n");
printf("*****************************************************\n");
printf("** 3、查詢學生資訊 * 4、洗掉學生資訊 **\n");
printf("*****************************************************\n");
printf("** 5、保存當前資訊 * 6、顯示當前資訊 **\n");
printf("*****************************************************\n");
printf("** 7、修改學生資訊 * 8、重繪學生資訊 **\n");
printf("*****************************************************\n");
printf("** 9、退出系統 * **\n");
printf("************************* \n");
printf("---------------------- --------------------------\n");
}
help函式
help函式是給用戶的提示,也不做多的解釋,直接上代碼:
void help()
{
printf("\n這是一個學生資訊管理系統,為了幫助您更快的了解使用它,請先仔細閱讀以下注意事項:\n");
printf("\n 注意事項: \n ");
printf("\n 1、請根據提示進行操作!\n");
printf("\n 2、初次使用請先選擇增加學生資訊!\n");
printf("\n 3、修改或者增加學生資訊后切記保存!\n");
printf("\n 4、如果資料有錯誤,請先修改再保存!\n");
printf("\n 5、若您之前使用過,下次進入系統請先重繪學生資訊!\n");
printf("\n 6、在添加學生時,用兩個字符代表不同的性別,比如男用‘M’代替,女用‘W’代替!\n");
printf("\n 7、保存或者重繪時,輸入的檔案名后綴請使用.txt,比如: stu.txt,系統會在源程式\n");
printf("\n “學生管理系統.exe”的相同目錄建立一個.txt檔案來保存學生資訊,您可以查看\n");
printf("\n 該檔案,但非專業人員不要輕易改動,否則會造成重繪資料例外或重繪失敗!\n");
printf("\n 8、學生資訊包括:姓名、學號、性別、年齡、C語言成績、高數成績、英語成績等!\n");
printf("\n 9、使用遇到任何問題請與我們聯系,郵箱:ouyang_na_na@163.com\n");
printf("\n 10、最后感謝您的使用!\n");
system("pause");
}
這里解釋一下system("pause");因為課堂上以及平時做題我們都很少用它,實際上它的作用就是讓系統暫停,方便我們閱讀或者是觀察程式,在執行程式時就是下面這樣的:

很熟悉吧,沒錯,就是請按任意鍵繼續,讓系統暫停,下面還會
多次用到,將不再解釋了喲,
increase函式
increase函式算是該系統的核心函式之一,其函式思想用到了回圈的嵌套使用,還有flag的運用也與前面main函式中用 t 控制回圈有異曲同工之處,主要分為兩大步驟來完成:
- 判斷新加入的學生學號是否已經存在,這一步用到了一個flag來作為標志,如果存在就要重新輸入,讓flag=1,即可讓回圈繼續,不存在flag=0,結束回圈,進入下一步,
- 添加學生資訊,這一步就是簡單的輸入賦值,需要注意的是利用getchar()函式來處理換行符這個小技巧,
其余的細節代碼中我已經詳細的解釋,可以看看代碼,
代碼:
void increase()
{
int i=n,j,flag,m=0;//i代表增加學生資訊程序中任意時刻的學生人數
printf("\n請輸入待增加的學生人數:\n");
scanf("%d",&m);
if(m>0){
do{
flag=1;
while(flag)
{
flag=0;
printf("請輸入第%d位學生的學號:\n",i+1);//第幾位學生從1開始計數,而stu[]從零開始,需要加1
scanf("%s",stu[i].StuID);
//判斷學號是否重復
for(j=0;j<i;j++){
if(strcmp(stu[i].StuID,stu[j].StuID)==0){
printf("該學號已經存在,請重新輸入!\n");
flag=1;
break;
}
}
}
printf("請輸入第%d位學生姓名:\n",i+1);
scanf("%s",stu[i].Stuname);
printf("請輸入第%d位學生年齡:\n",i+1);
scanf("%d",&stu[i].Stuage);
getchar();//處理上面輸入的換行符,不然系統會把換行符當做一個字符賦值給性別
printf("請輸入第%d位學生性別:\n",i+1);
scanf("%c",&stu[i].Stusex);
printf("請輸入第%d位學生的C語言成績:\n",i+1);
scanf("%f",&stu[i].score[0]);
printf("請輸入第%d位學生的高數成績:\n",i+1);
scanf("%f",&stu[i].score[1]);
printf("請輸入第%d位學生的大學英語成績:\n",i+1);
scanf("%f",&stu[i].score[2]);
i++;
}while(i<n+m);//只要當前學生人數還沒到達添加后的總人數,就得繼續添加
}
n+=m;// 添加完成,系統人數n的值也要增加
printf("添加完成!!!\n");
system("pause");
}
seek 函式
seek查找函式,呼叫此函式,可以實作按姓名或者學號查找某一學生的資訊,其核心思路也是用到了switch函式輸入子選單的方式來實作的,同時又用flag作為標志來判斷是否已經查找到該學生資訊,考慮到需要查找學生資訊的次數不止一次,就需要用到while函式來實作回圈,可以看到回圈條件是1(永遠為真),有人可能會說:那這不就是死回圈嗎?實際上除了讓回圈條件為假,還可以用其它方式結束回圈,比如用return陳述句,代碼后面介紹,
代碼:
void seek()
{
int i,num,flag;
char s1[LEN+1];
printf("*****************************\n");
printf("**-------1.按學號查詢------**\n");
printf("**-------2.按姓名查詢------**\n");
printf("**-------3.退出本選單------**\n");
printf("*****************************\n");
while(1)
{
flag=0;
printf("請輸入子選單:");
scanf("%d",&num);
switch(num)
{
case 1:
printf("請輸入需要查找學生的學號:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
{
if(strcmp(stu[i].StuID,s1)==0)
{
flag=1;
printf("學號\t\t姓名\t\t性別\t\t年齡\t\tC語言\t\t高數\t\t英語\n");
printf("%s\t\t%s\t\t%c\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\n",stu[i].StuID,stu[i].Stuname,stu[i].Stusex,stu[i].Stuage,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
}break;
case 2:
printf("請輸入需要查找學生的姓名:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
{
if(strcmp(stu[i].Stuname,s1)==0)
{
flag=1;
printf("學號\t\t姓名\t\t性別\t\t年齡\t\tC語言\t\t高數\t\t英語\n");
printf("%s\t\t%s\t\t%c\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\n",stu[i].StuID,stu[i].Stuname,stu[i].Stusex,stu[i].Stuage,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
}break;
case 3: return;
default: printf("請在1--3之間輸入\n");
}
if(flag==0)
printf("找不到該學生!\n請重新輸入!");
}
}
這里解釋一下子選單三:
可以看到,后面我直接用了一個return陳述句來實作退出,是因為return函式具有把程式流程從被呼叫函式轉向主函式的作用,一旦遇到return就會立即結束正在執行的函式,平時用的return陳述句后面都是跟引數回傳值的,實際上也可以不跟引數,僅僅代表結束此函式,
后面的修改學生資訊的modify函式也用到這種思想,將不再解釋,嘿嘿,
de函式
de函式是洗掉學生資訊的函式,呼叫此函式,可以按照學號洗掉學生資訊,核心思想:
- 找到該學生的位置
- 接著把該名學生后面的學生往前移動一位,學生總人數再減去一
- flag的應用,用于判斷是否已經找到該學號的學生,方便結束回圈,以及給用戶的提示,
代碼:
void de()
{
int i,j,flag;
char s1[LEN];
printf("請輸入需要洗掉的學生學號:\n");
scanf("%s",s1);
flag=0;
for(i=0;i<n;i++)
{
if(strcmp(s1,stu[i].StuID)==0)
{
flag=1;
for(j=i;j<n-1;j++)
{
stu[j]=stu[j+1];//直接把后面的學生都往前移動一位
}
}
if(flag==1) break;//說明已經找到了需要洗掉的學生,結束回圈
}
if(0==flag)
{
printf("該學號不存在!!!\n");
}
if(1==flag)
{
printf("洗掉成功\n");
n--;
}
system("pause");
}
save函式
save有保存的意思,哈哈,平時用的ctrl+s應該就是它,我也是寫了這個才知道的,如果你和我一樣,那就記住了哦!扯遠了,進入正題,
一旦呼叫save函式,就只有一個作用,就是把程式中結構體中現有的資訊輸出到檔案保存起來,該部分算是我寫這個程式的難點之一,因為關于檔案的知識需要自己看書查資料,先看代碼再解釋其中的難點,
代碼:
void save()//把學生資訊保存到檔案
{
int i;
FILE *fp;
char filename[LEN+1];
printf("請輸入要保存的檔案名:\n");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("打開檔案失敗!\n");
exit(0);
}
for(i=0;i<n;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("保存失敗!!\n");
printf("保存成功!!!\n");
fclose(fp);
system("pause");
}
這里需要解釋的主要有兩個部分:
第一部分:
if((fp=fopen(filename,"w"))==NULL)
{
printf("打開檔案失敗!\n");
exit(0);
}
- fopen是打開檔案的函式,它的形式引數中的filename是需要我們提前輸入的一個字符型陣列,代表檔案名,"w"是指以只寫(只寫就是只向檔案輸出資訊,不讀取)的方式打開檔案,
- fopen函式首先會在.exe源程式的相同目錄查找之前輸入的檔案名,如果不存在該檔案名,就會新建一個;如果存在,就會洗掉原檔案,重新建立一個新的檔案,
- fopen函式的回傳值是指向該檔案的指標的指標,此處用使fp指向它的回傳值,
第二部分:
for(i=0;i<n;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("保存失敗!!\n");
printf("保存成功!!!\n");
for回圈不多作解釋,重點說一下fwrite函式與后面flush函式中需要用到的fread函式,后面flush函式用到將不在解釋,
其一般呼叫形式為:
fwrite(buffer,size,count,fp); 將buffer中的資料每次輸出"size x count "位元組長度的資料到fp所指的檔案中,
fread(buffer,size,count,fp); 從fp所指的檔案中每次讀入"size x count "位元組長度的資料到buffer對應的地址中,
下面依次解釋每個引數:
- buffer:是一個地址,是用來存放從檔案讀入的資料(對fread函式來說)或者輸出到檔案的資料的來源(對fwrite函式來說),
- size:要讀寫的位元組數
- count:要讀寫多少個資料項(每個資料項長度為size),
- fp:FILE型別的指標,
對于兩個函式來說,只要其成功執行,就會回傳count的值,程式中為1,
present函式
一旦呼叫present函式,就顯示當前所有的學生資訊,用簡單的for回圈輸出即可,需要注意結構體中的資料型別不要弄錯了,同時注意控制格式,"\t" 就是tab健的那個空格,這里用兩個 “\t” 是為了解決學生姓名或者學號太長而引起的上下格式不對應的問題.
代碼:
void present()
{
int i;
if(n==0)
{
printf("您好,現在沒有學生資訊,請先增加學生資訊或者重繪再來試試!\n");
}
else
{
printf("現在共有%d名學生:\n",n);
printf("學號\t\t姓名\t\t性別\t\t年齡\t\tC語言\t\t高數\t\t英語\n");
for(i=0;i<n;i++)
{
printf("%s\t\t%s\t\t%c\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\n",stu[i].StuID,stu[i].Stuname,stu[i].Stusex,stu[i].Stuage,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
}
system("pause");
}
如果只用一個 “\t” ,當名字或者學號過長時,就會出現下面這種情況:

可以發現,由于姓名太長,性別的位置已經被姓名占據了,后面就會出現錯位的情況,
modify函式
呼叫該函式即可修改任意學生的任意資訊,考慮到可能需要修改學生的多向資訊,所以用到while函式,且回圈條件永遠為真,相同的思路前面seek函式中已經說過,不再解釋,也同樣用到flag作為是否找到學生的標志,方便于沒有找到的情況下重新輸入姓名,以及對用戶的提示,核心思路還是switch陳述句,子選單實作修改,具體請看代碼:
void modify()
{
int i,flag;
char ID[LEN],name[LEN],sex;
int age;
float score;//以上命名顧名思義,不作解釋
printf("請輸入需要修改的學生姓名:\n");
getchar();
gets(name);
while(1)
{
flag=0;
for(i=0;i<n;i++)
{
if(strcmp(name,stu[i].Stuname)==0)
{
flag=1;
int num;//用于switch函式的子選單
printf("***************************************************\n");
printf("*----1.修改學號-------- - -----2.修改性別-------*\n");
printf("*----3.修改年齡-------- - -----4.修改C語言成績--*\n");
printf("*----5.修改高數成績---- - -----6.修改英語成績---*\n");
printf("*-------------------7.退出本選單------------------*\n");
printf("***************************************************\n\n");
printf("請輸入子選單:");
scanf("%d",&num);
switch(num)
{
case 1:
printf("請輸入新的學號:\n");
getchar();
gets(ID);
strcpy(stu[i].StuID,ID);break;
case 2:
getchar();
printf("請輸入新的性別:\n");
scanf("%c",&sex);
stu[i].Stusex=sex;break;
case 3:
printf("請輸入新的年齡:\n");
scanf("%d",&age);
stu[i].Stuage=age;break;
case 4:
printf("請輸入新的C語言成績:\n");
scanf("%f",&score);
stu[i].score[0]=score;break;
case 5:
printf("請輸入新的高數成績:\n");
scanf("%f",&score);
stu[i].score[1]=score;break;
case 6:
printf("請輸入新的英語成績:\n");
scanf("%f",&score);
stu[i].score[2]=score;break;
case 7:
return;break;
default:
printf("請在1--7之間選擇!\n");
}
if(num>0&&num<7)
printf("修改成功,記得保存喲!!!\n");
break;//找到學生,結束回圈;
}
}
if(flag==0)
{
printf("沒有找到該學生,請重新輸入需要修改資訊的學生姓名:\n");
gets(name);
}
}
system("pause");
}
flush函式
呼叫flush函式,即可將之前檔案中的資料讀入結構體中來進行操作,需要注意的兩個地方,一個是fread() 函式的使用,前面save函式已經介紹過,不再解釋;還有就是
if((fp=fopen(filename,"r"))==NULL)//打開檔案
中的 “r” 代表以只讀(只從檔案讀取資料)的方式打開檔案,
代碼:
void flush()
{
int i,k=0;//k代表重繪程序中學生人數
FILE *fp;
char filename[LEN+1];
printf("請輸入需要重繪的檔案名:\n");
getchar();
gets(filename);
if((fp=fopen(filename,"r"))==NULL)//打開檔案
{
printf("打開檔案失敗!\n");
exit(0);
}
for(i=0;i<N;i++)//N是最大的學生人數,可在程式開頭進行更改
{
if(fread(&stu[i],sizeof(struct student),1,fp)==1)
k++;//記錄學生人數
}
n=k;// 把k的值給n
if(k==0)
printf("重繪失敗!!!\n");
else
printf("重繪成功!!!\n");
fclose(fp);
system("pause");
}
exit函式
main函式中已經簡單介紹過,就是通過改變main函式中的回圈條件 “t” 的值來實作程式的結束與否,
代碼:
void exit()
{
int h;//控制是否確認退出
printf("即將退出,確認請按1,取消請按0\n");
scanf("%d",&h);
if(h==1)
{
t=0;//t是main函式中while函式是否繼續執行的控制條件,是一個全域變數,程式開頭已經定義并且賦值位 1
printf("成功退出,感謝使用!\n");
}
if(h==0)
{
printf("退出已取消!\n");
system("pause");
}
}
整個程式代碼
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//需要用到strcmp函式
#define LEN 15//姓名和學號的最大字符數
#define N 50//最大學生人數
int n=0,t=1;//n代表當前學生人數,t用來控制整個程式的執行,以及程式的退出;
//函式宣告
void menu();//主選單函式
void help();//使用幫助
void increase();//增加學生資訊
void seek();//查找學生資訊
void de();//洗掉學生資訊
void save();//保存檔案
void present();//顯示當前資訊
void modify();//修改學生資訊
void flush();//重繪學生成績
void exit();//退出函式
struct student
{
char StuID[LEN];//學生學號
char Stuname[LEN];
int Stuage;
char Stusex;
float score[3]; //各科成績
}stu[N];
int main()
{
int num;//num是選單選項
while(t)//t是全域變數,用exit函式來控制回圈是否繼續
{
menu();//輸出主選單界面
printf("您好,請輸入選單編號:");
scanf("%d",&num);
switch(num)
{
case 1: help(); break;
case 2: increase(); break;
case 3: seek(); break;
case 4: de(); break;
case 5: save(); break;
case 6: present(); break;
case 7: modify(); break;
case 8: flush(); break;
case 9: exit(); break;
default:printf("輸入有誤,請重新輸入!");
}
}
system("pause");
return 0;
}
void menu()
{
printf("\n\n");
printf("*****************************************************\n");
printf("*----------------------duoduo------------------------\n");
printf("* 學生資訊管理系統 *\n");
printf("*****************************************************\n");
printf("********************系統功能選單*********************\n");
printf("---------------------- --------------------------\n");
printf("*****************************************************\n");
printf("** 1、使用幫助 * 2、增加學生資訊 **\n");
printf("*****************************************************\n");
printf("** 3、查詢學生資訊 * 4、洗掉學生資訊 **\n");
printf("*****************************************************\n");
printf("** 5、保存當前資訊 * 6、顯示當前資訊 **\n");
printf("*****************************************************\n");
printf("** 7、修改學生資訊 * 8、重繪學生資訊 **\n");
printf("*****************************************************\n");
printf("** 9、退出系統 * **\n");
printf("************************* \n");
printf("---------------------- --------------------------\n");
}
void help()
{
printf("\n這是一個學生資訊管理系統,為了幫助您更快的了解使用它,請先仔細閱讀以下注意事項:\n");
printf("\n 注意事項: \n ");
printf("\n 1、請根據提示進行操作!\n");
printf("\n 2、初次使用請先選擇增加學生資訊!\n");
printf("\n 3、修改或者增加學生資訊后切記保存!\n");
printf("\n 4、如果資料有錯誤,請先修改再保存!\n");
printf("\n 5、若您之前使用過,下次進入系統請先重繪學生資訊!\n");
printf("\n 6、在添加學生時,用兩個字符代表不同的性別,比如男用‘M’代替,女用‘W’代替!\n");
printf("\n 7、保存或者重繪時,輸入的檔案名后綴請使用.txt,比如: stu.txt,系統會在源程式\n");
printf("\n “學生管理系統.exe”的相同目錄建立一個.txt檔案來保存學生資訊,您可以查看\n");
printf("\n 該檔案,但非專業人員不要輕易改動,否則會造成重繪資料例外或重繪失敗!\n");
printf("\n 8、學生資訊包括:姓名、學號、性別、年齡、C語言成績、高數成績、英語成績等!\n");
printf("\n 9、使用遇到任何問題請與我們聯系,郵箱:ouyang_na_na@163.com\n");
printf("\n 10、最后感謝您的使用!\n");
system("pause");
}
void increase()
{
int i=n,j,flag,m=0;//i代表增加學生資訊程序中任意時刻的學生人數
printf("\n請輸入待增加的學生人數:\n");
scanf("%d",&m);
if(m>0){
do{
flag=1;
while(flag)
{
flag=0;
printf("請輸入第%d位學生的學號:\n",i+1);//第幾位學生從1開始計數,而stu[]從零開始,需要加1
scanf("%s",stu[i].StuID);
//判斷學號是否重復
for(j=0;j<i;j++){
if(strcmp(stu[i].StuID,stu[j].StuID)==0){
printf("該學號已經存在,請重新輸入!\n");
flag=1;
break;
}
}
}
printf("請輸入第%d位學生姓名:\n",i+1);
scanf("%s",stu[i].Stuname);
printf("請輸入第%d位學生年齡:\n",i+1);
scanf("%d",&stu[i].Stuage);
getchar();//處理上面輸入的換行符,不然系統會把換行符當做一個字符賦值給性別
printf("請輸入第%d位學生性別:\n",i+1);
scanf("%c",&stu[i].Stusex);
printf("請輸入第%d位學生的C語言成績:\n",i+1);
scanf("%f",&stu[i].score[0]);
printf("請輸入第%d位學生的高數成績:\n",i+1);
scanf("%f",&stu[i].score[1]);
printf("請輸入第%d位學生的大學英語成績:\n",i+1);
scanf("%f",&stu[i].score[2]);
i++;
}while(i<n+m);//只要當前學生人數還沒到達添加后的總人數,就得繼續添加
}
n+=m;// 添加完成,系統人數n的值也要增加
printf("添加完成!!!\n");
system("pause");
}
void seek()
{
int i,num,flag;
char s1[LEN+1];
printf("*****************************\n");
printf("**-------1.按學號查詢------**\n");
printf("**-------2.按姓名查詢------**\n");
printf("**-------3.退出本選單------**\n");
printf("*****************************\n");
while(1)
{
flag=0;
printf("請輸入子選單:");
scanf("%d",&num);
switch(num)
{
case 1:
printf("請輸入需要查找學生的學號:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
{
if(strcmp(stu[i].StuID,s1)==0)
{
flag=1;
printf("學號\t\t姓名\t\t性別\t\t年齡\t\tC語言\t\t高數\t\t英語\n");
printf("%s\t\t%s\t\t%c\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\n",stu[i].StuID,stu[i].Stuname,stu[i].Stusex,stu[i].Stuage,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
}break;
case 2:
printf("請輸入需要查找學生的姓名:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
{
if(strcmp(stu[i].Stuname,s1)==0)
{
flag=1;
printf("學號\t\t姓名\t\t性別\t\t年齡\t\tC語言\t\t高數\t\t英語\n");
printf("%s\t\t%s\t\t%c\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\n",stu[i].StuID,stu[i].Stuname,stu[i].Stusex,stu[i].Stuage,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
}break;
case 3: return;
default: printf("請在1--3之間輸入\n");
}
if(flag==0)
printf("找不到該學生!\n請重新輸入!");
}
}
void de()
{
int i,j,flag;
char s1[LEN];
printf("請輸入需要洗掉的學生學號:\n");
scanf("%s",s1);
flag=0;
for(i=0;i<n;i++)
{
if(strcmp(s1,stu[i].StuID)==0)
{
flag=1;
for(j=i;j<n-1;j++)
{
stu[j]=stu[j+1];//直接把后面的學生都往前移動一位
}
}
if(flag==1) break;//說明已經找到了需要洗掉的學生,結束回圈
}
if(0==flag)
{
printf("該學號不存在!!!\n");
}
if(1==flag)
{
printf("洗掉成功\n");
n--;
}
system("pause");
}
void save()//把學生資訊保存到檔案
{
int i;
FILE *fp;
char filename[LEN+1];
printf("請輸入要保存的檔案名:\n");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("打開檔案失敗!\n");
exit(0);
}
for(i=0;i<n;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("保存失敗!!\n");
printf("保存成功!!!\n");
fclose(fp);
system("pause");
}
void present()
{
int i;
if(n==0)
{
printf("您好,現在沒有學生資訊,請先增加學生資訊或者重繪再來試試!\n");
}
else
{
printf("現在共有%d名學生:\n",n);
printf("學號\t\t姓名\t\t性別\t\t年齡\t\tC語言\t\t高數\t\t英語\n");
for(i=0;i<n;i++)
{
printf("%s\t\t%s\t\t%c\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\n",stu[i].StuID,stu[i].Stuname,stu[i].Stusex,stu[i].Stuage,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
}
system("pause");
}
void modify()
{
int i,flag;
char ID[LEN],name[LEN],sex;
int age;
float score;
printf("請輸入需要修改的學生姓名:\n");
getchar();
gets(name);
while(1)
{
flag=0;
for(i=0;i<n;i++)
{
if(strcmp(name,stu[i].Stuname)==0)
{
flag=1;
int num;//用于switch函式的子選單
printf("***************************************************\n");
printf("*----1.修改學號-------- - -----2.修改性別-------*\n");
printf("*----3.修改年齡-------- - -----4.修改C語言成績--*\n");
printf("*----5.修改高數成績---- - -----6.修改英語成績---*\n");
printf("*-------------------7.退出本選單------------------*\n");
printf("***************************************************\n\n");
printf("請輸入子選單:");
scanf("%d",&num);
switch(num)
{
case 1:
printf("請輸入新的學號:\n");
getchar();
gets(ID);
strcpy(stu[i].StuID,ID);break;
case 2:
getchar();
printf("請輸入新的性別:\n");
scanf("%c",&sex);
stu[i].Stusex=sex;break;
case 3:
printf("請輸入新的年齡:\n");
scanf("%d",&age);
stu[i].Stuage=age;break;
case 4:
printf("請輸入新的C語言成績:\n");
scanf("%f",&score);
stu[i].score[0]=score;break;
case 5:
printf("請輸入新的高數成績:\n");
scanf("%f",&score);
stu[i].score[1]=score;break;
case 6:
printf("請輸入新的英語成績:\n");
scanf("%f",&score);
stu[i].score[2]=score;break;
case 7:
return;break;
default:
printf("請在1--7之間選擇!\n");
}
if(num>0&&num<7)
printf("修改成功,記得保存喲!!!\n");
break;//找到學生,結束回圈;
}
}
if(flag==0)
{
printf("沒有找到該學生,請重新輸入需要修改資訊的學生姓名:\n");
gets(name);
}
}
system("pause");
}
void flush()
{
int i,k=0;//k代表重繪程序中學生人數
FILE *fp;
char filename[LEN+1];
printf("請輸入需要重繪的檔案名:\n");
getchar();
gets(filename);
if((fp=fopen(filename,"r"))==NULL)//打開檔案
{
printf("打開檔案失敗!\n");
exit(0);
}
for(i=0;i<N;i++)//N是最大的學生人數,可在程式開頭進行更改
{
if(fread(&stu[i],sizeof(struct student),1,fp)==1)
k++;//記錄學生人數
}
n=k;// 把k的值給n
if(k==0)
printf("重繪失敗!!!\n");
else
printf("重繪成功!!!\n");
fclose(fp);
system("pause");
}
void exit()
{
int h;//控制是否確認退出
printf("即將退出,確認請按1,取消請按0\n");
scanf("%d",&h);
if(h==1)
{
t=0;//t是main函式中while函式是否繼續執行的控制條件,是一個全域變數,程式開頭已經定義并且賦值位 1
printf("成功退出,感謝使用!\n");
}
if(h==0)
{
printf("退出已取消!\n");
system("pause");
}
}
運行結果展示
-
menu函式

-
help函式

-
increase函式

-
seek函式

-
de函式

-
save函式

-
present函式

-
modify函式

-
flush函式

-
exit函式

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255974.html
標籤:其他
