* * *這是我寫的。可以參考壹下。我的編譯器用的是devC++。可以說我的代碼效率很高。同時界面精致完美,深受老師好評。只是數據庫沒用。唯壹遺憾的是在vc下運行編譯器可能會出錯,主要是兩個編譯器為循環聲明變量,限制不壹致。具體細節可以改,只是程序。我也很忙。我沒時間看這個。抱歉。
*
/
# include & ltstdio.h & gt
# include & ltstdlib.h & gt
# include & ltstring.h & gt
# include & ltconio.h & gt
int shoud save = 0;/* */
結構學生
{
字符編號[10];/*學生ID */
char name[20];
國際貿易;
國際貿易;
int egrade
int totle
int ave
};
typedef結構節點
{
構造學生數據;
結構節點* next
}節點,*鏈接;
無效菜單()
{
printf(" \ t \ t \ t \ t學生成績管理系統\ n \ t \ t-n ");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *);
printf(" \ t 1輸入學生數據\ t \ t \ t \ t2刪除學生數據\ n ");
printf(" \ t 3查詢學生信息\ t \ t \ t \修改學生信息\ n ");
Printf("\t5顯示學生數據\t\t\t\t\t6統計學生成績\ n ");
Printf("\t7排序學生成績\ t \ t \ t \ t8保存學生數據\ n ");
Printf("\t9獲取幫助信息\ t \ t \ t \ t退出系統\ n ");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
}
void printstart()
{
printf("-\ n ");
}
無效錯誤()
{
printf(" \ n = = = = = & gt;提示:輸入錯誤!\ n ");
}
void Nofind()
{
printf(" \ n = = = = = & gt;提示:找不到學生!\ n ");
}
Void printc() /*該函數用於輸出中文標題*/
{
Printf("學生姓名,英語成績,數學成績,C語言成績,平均分\ n ");
}
Void printe(Node *p)/*該函數用於輸出中文標題下的具體內容*/
{
printf(" \ t % s \ t % s \ t % d \ t % d \ t % d \ t % d \ t % d \ t % d \ n ",p-& gt;data.num,p-& gt;data.name,p-& gt;data.egrade,p-& gt;data.mgrade,p-& gt;data.cgrade,p-& gt;data.totle,p-& gt;data . ave);
}//少打印名字
Node * locate (link L,char find mess [],char namernum [])/*該函數用於定位鏈表中符合條件的聯系人,並返回指針*/
{
node * r;
If (strcmp (namernum," num") = = 0)/*按學號查詢*/
{
r = l-& gt;接下來;
while(r)
{
if(strcmp(r-& gt;data.num,findmess)==0)
return r;
r = r-& gt;接下來;
}
}
Elseif (strcmp (namernum," name") = = 0)/*按名稱查詢*/
{
r = l-& gt;接下來;
while(r)
{
if(strcmp(r-& gt;data.name,findmess)==0)
return r;
r = r-& gt;接下來;
}
}
返回0;
}
Void Add(Link L) /*大寫增加學生的頭部指針,便於區分*/
{
系統(“cls”);//清除屏幕
節點*p,*r,* s;
字符編號[10];
while(1)
{
r = L;
s = L-& gt;接下來;
while(r->;下壹個!=空)
r = r-& gt;接下來;
Printf("請輸入妳的學號(用' 0 ':)返回上壹個菜單);
scanf("%s ",數字);
getchar();
if(strcmp(num," 0")==0)
打破;
while(s)
{
if(strcmp(s-& gt;data.num,num)= 0)
{
系統(“cls”);
printf(" = = = = = = & gt;提示:學號為“%s”的學生已經存在,請重新添加!\n ",編號);//更改分行符
printstart();
printc();
印刷品;
printstart();
printf(" \ n ");
Printf("請輸入妳的學號(用' 0 '):")返回上壹菜單;
scanf("%s ",數字);
getchar();
s = L-& gt;接下來;//返回再次搜索,新輸入是否已經存在。
}
其他
s = s-& gt;接下來;//如果沒有匹配,繼續找。。。
}
p=(節點*)malloc(sizeof(節點));
strcpy(p-& gt;data.num,num);
Printf("請輸入您的姓名:");
scanf("%s ",p-& gt;data . name);
getchar();//程序暫停輸入。
Printf("請輸入妳的C語言成績:");
scanf("%d ",& ampp->;data . cgrade);
getchar();
Printf("請輸入妳的數學成績:");
scanf("%d ",& ampp->;data . m grade);
getchar();
Printf("請輸入妳的英語成績:");
scanf("%d ",& ampp->;data . e grade);
getchar();
p->;data . totle = p-& gt;data . e grade+p-& gt;data . c grade+p-& gt;data . m grade;
p->;data . ave = p-& gt;data . totle/3;/*信息輸入已經完成*/
p->;next = NULL
r-& gt;next = p;
//r = p;這裏是多余的
shoudsave = 1;
}
Printf("按任意鍵返回!");
getch();
}
Void Qur(Link l) /*查詢學生*/
{
int sel
char find mess[20];
node * p;
char選擇;
while(1){
系統(“cls”);
如果(!l-& gt;下壹個)
{
printf(" \ n = = = = = & gt;提示:沒有可查詢的信息!\ n ");
//不返回;
Printf("請先加壹個數據,親愛的。。。\ n ");
打破;
}
printf(" \ n = = = = = & gt;1按學號搜索\ n = = = = > 2按姓名搜索\ n ");
scanf("%d ",& ampsel);
If(sel==1)/*學生ID */
{
Printf("請輸入要查找的學號:");
scanf("%s ",find mess);
p=Locate(l,findmess," num ");
如果(p)
{
printf(" \ t \ t \ t \ t \ t findings \ n ");
printstart();
printc();
printe(p);
printstart();
}
其他
nofind();
}
Else if(sel==2) /* name */
{
Printf("請輸入要查找的名稱:");
scanf("%s ",find mess);
p=Locate(l,findmess," name ");
如果(p)
{
printf(" \ t \ t \ t \ t \ t findings \ n ");
printstart();
printc();
printe(p);
printstart();
}
其他
nofind();
}
其他
錯誤();
printf(" \ n是否繼續查詢(y/n):");//選擇是否繼續查詢。
getchar();
scanf("%c ",& amp選擇);
if(choice=='n'){
Printf("按任意鍵返回!親愛的”);
getch();
打破;}
}
}
Void Del(Link l) /* Delete */
{
int sel
節點*p,* r;
char選擇;
char find mess[20];
while(1){
系統(“cls”);
如果(!l-& gt;下壹個)
{
printf(" \ n = = = = = & gt;提示:沒有數據可以刪除!\ n ");
Printf("回去再選,親愛的。。。");//返回;
打破;
}
printf(" \ n = = = = = & gt;1按學號刪除\ n = = = = > 2按姓名刪除\ n ");
scanf("%d ",& ampsel);
if(sel==1)
{
Printf("請輸入要刪除的學號:");
scanf("%s ",find mess);
p=Locate(l,findmess," num ");
如果(p)
{
r = l;
while(r->;下壹個!=p)
r = r-& gt;接下來;
r-& gt;next = p-& gt;接下來;
免費(p);
printf(" \ n = = = = = & gt;提示:該學生已被成功刪除!\ n ");
shoudsave = 1;
printf(" \ n是否要繼續刪除(y/n):");//選擇是否繼續刪除。
getchar();
scanf("%c ",& amp選擇);
if(choice=='n ')
打破;
}
否則{
nofind();
打破;
}
}
else if(sel==2)
{
Printf("請輸入要刪除的名稱:");
scanf("%s ",find mess);
p=Locate(l,findmess," name ");
如果(p)
{
r = l;
while(r-& gt;下壹個!=p)
r = r-& gt;接下來;
r-& gt;next = p-& gt;接下來;
免費(p);
printf(" \ n = = = = = & gt;提示:該學生已被成功刪除!\ n ");
shoudsave = 1;
printf(" \ n是否要繼續刪除(y/n):");//選擇是否繼續刪除。
getchar();
scanf("%c ",& amp選擇);
if(choice=='n ')
打破;
}
否則{
nofind();
打破;
}
}
其他
錯誤();
系統(“暫停”);
}
Printf("按任意鍵返回,親愛的");
getch();
}
無效修改(鏈接l)
{
系統(“cls”);
節點*p,* s;
s = l-& gt;接下來;
char find mess[20];
int key = 1;
while(1){
如果(!l-& gt;下壹個)
{
printf(" \ n = = = = = & gt;提示:沒有數據可以修改!\ n ");
打破;
}
while(鍵){
系統(“cls”);
getchar();
Printf("請輸入要修改的學號:");
scanf("%s ",find mess);
//添加壹個函數,檢查學號是否存在。
while(s)
{
if(strcmp(s-& gt;data.num,findmess)==0)
{
系統(“cls”);
printf(" = = = = = = & gt;提示:已經找到學號為“%s”的學生,請修改!\n ",find mess);
printstart();
printc();
印刷品;
printstart();
printf(" \ n ");
key = 0;//跳出大循環
打破;//跳出內部循環
}
其他
s = s-& gt;接下來;//如果沒有匹配,繼續找。。。
}
//如果掃描後還是找不到,會提示重新輸入。
如果(!s)
printf(" \ n該學號不存在,請檢查是否輸入正確!\ n ");
系統(“暫停”);
}
p=Locate(l,findmess," num ");
如果(p)
{
// printf("請輸入您新的C語言分數(原來是%d):",p-& gt;data . cgrade);
// scanf("%d ",& ampp->;data . cgrade);
Printf("請輸入您的新名字:");
scanf("%s ",p-& gt;data . name);
getchar();//程序暫停輸入。
Printf("請輸入新的C語言分數:");
scanf("%d ",& ampp->;data . cgrade);
getchar();
Printf("請輸入新的數學分數:");
scanf("%d ",& ampp->;data . m grade);
getchar();
Printf("請輸入新的英文分數:");
scanf("%d ",& ampp->;data . e grade);
getchar();
p->;data . totle = p-& gt;data . e grade+p-& gt;data . c grade+p-& gt;data . m grade;//改版後,總分和平均分都會有變化。
p->;data . ave = p-& gt;data . totle/3;/*信息輸入已經完成*/
printf(" \ n = = = = = & gt;提示:數據已修改成功!\ n ");
shoudsave = 1;
}
其他
nofind();
打破;
}
Printf("請按任意鍵繼續。。。");
getch();
}
無效顯示(鏈接l)
{
系統(“cls”);
int count = 0;
node * p;
p = l-& gt;接下來;
while(1){
如果(!p)
{
printf(" \ n = = = = = & gt;提示:沒有數據可顯示!\ n ");
//回復毛,返回;
打破;
}
printf(" \ t \ t \ t \ t顯示結果\ n ");
printstart();
printc();
printf(" \ n ");
while(p)
{
printe(p);
p = p-& gt;接下來;
}
printstart();
printf(" \ n ");
打破;//已修改
}
Printf("按任意鍵返回!");
getch();
}
//排序排序函數
Int SortData(Link L)//用最簡單的冒泡排序法按總分排序。
{
結構學生溫度;
node * r = L-& gt;接下來,*p1,* p2
int count=0,I,j;
while(r)
{ r = r-& gt;接下來;
count++;
}//計算鏈表的長度
for(I = 1;我& lt= count-1;i++){
for(r = L-& gt;接下來,j = 1;j & lt= count-I;r = r-& gt;下壹個)
{
if(r-& gt;data.totle & ltr-& gt;下壹個-& gt;data.totle)
{ temp = r-& gt;數據;
r-& gt;data = r-& gt;下壹個-& gt;數據;
r-& gt;下壹個-& gt;data = temp}
/* p 1 = r->;接下來;
r-& gt;next = r-& gt;下壹個-& gt;接下來;
p2 = r-& gt;下壹個-& gt;下壹個-& gt;接下來;
r-& gt;下壹個-& gt;next = p 1;
r-& gt;下壹個-& gt;下壹個-& gt;next = p2*/
j++;
}
}
Printf("排序成功!請返回主界面查詢!”);
getch();
返回0;
}
無效統計數據(鏈接L)
{ system(" cls ");
結構學生溫度;
node * r = L-& gt;接下來,*p1,* p2
int count=0,I,j;
while(r)
{ r = r-& gt;接下來;
count++;
}//計算鏈表的長度
for(I = 1;我& lt= count-1;i++){
for(r = L-& gt;接下來,j = 1;j & lt= count-I;r = r-& gt;下壹個)
{
if(r-& gt;data.ave & ltr-& gt;下壹個-& gt;data.ave)
{ temp = r-& gt;數據;
r-& gt;data = r-& gt;下壹個-& gt;數據;
r-& gt;下壹個-& gt;data = temp}
/* p 1 = r->;接下來;
r-& gt;next = r-& gt;下壹個-& gt;接下來;
p2 = r-& gt;下壹個-& gt;下壹個-& gt;接下來;
r-& gt;下壹個-& gt;next = p 1;
r-& gt;下壹個-& gt;下壹個-& gt;next = p2*/
j++;
}
}
Printf("\n最高平均分數是:\t%s,%d ",L-& gt;下壹個-& gt;data.name,L-& gt;下壹個-& gt;data . ave);
for(I = 1;我& lt= count-1;i++){
for(r = L-& gt;接下來,j = 1;j & lt= count-I;r = r-& gt;下壹個)
{
if(r-& gt;data . c grade & lt;r-& gt;下壹個-& gt;data.cgrade)
{ temp = r-& gt;數據;
r-& gt;data = r-& gt;下壹個-& gt;數據;
r-& gt;下壹個-& gt;data = temp}
/* p 1 = r->;接下來;
r-& gt;next = r-& gt;下壹個-& gt;接下來;
p2 = r-& gt;下壹個-& gt;下壹個-& gt;接下來;
r-& gt;下壹個-& gt;next = p 1;
r-& gt;下壹個-& gt;下壹個-& gt;next = p2*/
j++;
}
}
printf("\nc語言的最高分是:\t%s,%d ",L-& gt;下壹個-& gt;data.name,L-& gt;下壹個-& gt;data . cgrade);
for(I = 1;我& lt= count-1;i++){
for(r = L-& gt;接下來,j = 1;j & lt= count-I;r = r-& gt;下壹個)
{
if(r-& gt;data . m grade & lt;r-& gt;下壹個-& gt;data.mgrade)
{ temp = r-& gt;數據;
r-& gt;data = r-& gt;下壹個-& gt;數據;
r-& gt;下壹個-& gt;data = temp}
/* p 1 = r->;接下來;
r-& gt;next = r-& gt;下壹個-& gt;接下來;
p2 = r-& gt;下壹個-& gt;下壹個-& gt;接下來;
r-& gt;下壹個-& gt;next = p 1;
r-& gt;下壹個-& gt;下壹個-& gt;next = p2*/
j++;
}
}
printf(" \ n最高數學分數是:\t%s,%d ",L-& gt;下壹個-& gt;data.name,L-& gt;下壹個-& gt;data . m grade);
for(I = 1;我& lt= count-1;i++){
for(r = L-& gt;接下來,j = 1;j & lt= count-I;r = r-& gt;下壹個)
{
if(r-& gt;data . e grade & lt;r-& gt;下壹個-& gt;data.egrade)
{ temp = r-& gt;數據;
r-& gt;data = r-& gt;下壹個-& gt;數據;
r-& gt;下壹個-& gt;data = temp}
/* p 1 = r->;接下來;
r-& gt;next = r-& gt;下壹個-& gt;接下來;
p2 = r-& gt;下壹個-& gt;下壹個-& gt;接下來;
r-& gt;下壹個-& gt;next = p 1;
r-& gt;下壹個-& gt;下壹個-& gt;next = p2*/
j++;
}
}
printf(" \ n英語的最高分是:\t%s,%d ",L-& gt;下壹個-& gt;data.name,L-& gt;下壹個-& gt;data . e grade);
for(I = 1;我& lt= count-1;i++){
for(r = L-& gt;接下來,j = 1;j & lt= count-I;r = r-& gt;下壹個)
{
if(r-& gt;data.totle & ltr-& gt;下壹個-& gt;data.totle)
{ temp = r-& gt;數據;
r-& gt;data = r-& gt;下壹個-& gt;數據;
r-& gt;下壹個-& gt;data = temp}
/* p 1 = r->;接下來;
r-& gt;next = r-& gt;下壹個-& gt;接下來;
p2 = r-& gt;下壹個-& gt;下壹個-& gt;接下來;
r-& gt;下壹個-& gt;next = p 1;
r-& gt;下壹個-& gt;下壹個-& gt;next = p2*/
j++;
}
}//
printf(" \ n最高總分是:\t%s,%d ",L-& gt;下壹個-& gt;data.name,L-& gt;下壹個-& gt;data . totle);
系統(“暫停”);
}
無效保存(鏈接l)
{
系統(“cls”);
FILE * fp
node * p;
int flag=1,count = 0;
fp=fopen("c:\\student.txt "," WB ");
if(fp==NULL)
{
printf(" \ n = = = = = & gt;提示:重新打開文件時出錯!\ n ");
退出(1);
}
p = l-& gt;接下來;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)
{
p = p-& gt;接下來;
count++;
}
其他
{
flag = 0;
打破;
}
}
if(標誌)
{
printf(" \ n = = = = = & gt;提示:文件保存成功。(%d條記錄已被保存。)\n”,計數);
shoud save = 0;
}
fclose(FP);
系統(“暫停”);
}
int main()
{
鏈接l;/*鏈接表*/
FILE * fp/*文件指針*/
int sel
char ch
system(" color 4f ");
int count = 0;
節點*p,* r;
//在菜單功能中增加了Printef(" \ t \ t \ t \ t \ t學生成績管理系統\ n \ t \ t - n)。
l=(Node*)malloc(sizeof(Node))。
l-& gt;next = NULL
r = l;
fp=fopen("C:\\student.txt "," a b+ ");
if(fp==NULL)
{
printf(" \ n = = = = = & gt;提示:文件無法打開!\ n ");
退出(0);
}
printf(" \ n = = = = = & gt;提示:文件已經打開,正在導入記錄......\ n ");
而(!feof(fp))
{
p=(節點*)malloc(sizeof(節點));
If (fread (p,sizeof (node),1,FP) = = 1)/*將文件內容放入聯系人*/
{
p->;next = NULL
r-& gt;next = p;
r = p;/*在連接中掛起此聯系人*/
count++;
}
}
fclose(FP);/*關閉文件*/
while(1)
{
系統(“cls”);
printf(" \ n = = = = = & gt;提示:文件已經打開,正在導入記錄......\ n ");
menu();//調用主循環
Printf("請選擇壹個操作:");
scanf("%d ",& ampsel);
if(sel==0)
{
if(shoudsave==1)
{ getchar();
printf(" \ n = = = = = & gt;提示:數據已被更改。是否要保存對文件的更改(y/n)?\ n ");
scanf("%c ",& ampch);
if(ch=='y'||ch=='Y ')
保存(l);
}
printf(" \ n = = = = = & gt;提示:您已經退出系統。再見!\ n ");
打破;
}
開關(選擇)
{
案例1:添加(l);打破;/*增加學生*/
案例二:德爾(l);打破;/*刪除學生*/
案例三:古蘭經(左);打破;/*查詢學生*/
情況四:修改(l);打破;/*修改學生*/
案例5:Disp(l);打破;//顯示信息
案例6:統計數據(l);打破;//統計功能
案例7:sort data(l);打破;//排序
案例8:保存(l);打破;/*拯救學生*/
案例9: printf ("\ t \ t \ t = = = = = =幫助信息= = = = = = = ");menu();系統(“暫停”);打破;
默認:錯誤();getchar();打破;
}
}
While (l){ /*釋放鏈表L(不是1)占用的內存!*/
p = l;
l = l-& gt;接下來;
免費(p);
}
getchar();
返回0;
}