當前位置:首頁 » 編程語言 » 用鏈表存儲c語言學生信息管理
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

用鏈表存儲c語言學生信息管理

發布時間: 2023-04-07 00:20:35

❶ 如何用c語言鏈表實現學生信息管理系統

你來我們學校里吧,我這里有,濟南市,文化東路55號,
這里同學學C語主的每人都做了

❷ c語言編寫學生信息管理系統

稍微用了點c++(你給的分太低)
如下圖所示:
studf.txt
操作日誌文件:

❸ 請大神幫忙寫一個C語言的學生信息管理系統的程序,要求用鏈表。

定義
學生信息管理系統是針對學校學生處的大量業務處理工作而開發的管理軟體,主要用於學校學生信息管理,總體任務是實現學生信息關系的系統化、科學化、規范化和自動化,其主要任務是用計算機對學生各種信息進行日常管理,如查詢、修改、增加、刪除,另外還考慮到學生選課,針對這些要求設計了學生信息管理系統。推行學校信息管理系統的應用是進一步推進學生學籍管理規范化、電子化、控制輟學和提高教育水平的重要舉措。

產生背景
學生信息檔案的管理對於學校的管理者來說至關重要,學生信息是高等學校非常重要的一項數據資源,是一個教育單位不可缺少一部分。特別是近幾年來,國家政策的調整,我國高等院校大規模的擴招,給高等院校的教學管理、學生管理、後勤管理等方面都帶來不少的沖擊。其包含的數據量大,涉及的人員面廣,而且需要及時更新,故較為復雜,難以單純地依*人工管理,而且傳統的人工管理方式既不易於規范化,管理效率也不高,目前我國各類高等院校中還有相當一部分學生檔案管理還停留在紙介質的基礎上,尤其是中、小學對學生檔案的管理更是落後,這樣的管理機制已經不能適應時代發展的要求,其管理方法將浪費許多人力和物力。隨著科學技術的不斷提高,計算機科學與技術日漸成熟,計算機應用的普及已進入人類社會生活的各個領域,並發揮著越來越重要的作用。這種傳統的手工管理模式必然被以計算機為物質基礎的信息管理方法所取代。作為計算機應用的一部分,使用計算機對學生檔案進行管理,有著手工管理所無法比擬的優點,如:檢索迅速、查找方便、可靠性高、存儲量大、保密性好、壽命長、成本低等。這些優點能夠極大地提高學生檔案管理的效率,也是學校向科學化、正規化管理發展的必要條件,更是各個高等院校與世界接軌的重要條件。

開發意義
系統針對學校學生信息的特點以及管理中實際需要而設計,能夠有效地實現學生信息管理的信息化,減輕管理人員的工作負擔,高效率、規范化地管理大量的學生信息,並避免人為操作的錯誤和不規范行為。

基本功能
獎學金管理:支持學生成績績點、任職分值、榮譽分值、綜合分值等計算、統計和分析。實現自動排名、審計獎學金,公示獎學金評審結果等功能。困難生認定管理:學生申請,教師審批,申請發放各項資助。有助於加強學校對困難生的服務和管理,簡化困難生資助申請的繁瑣過程,給困難生提供更加簡潔、方便的服務渠道,確保資助准確、及時的發放。勤工崗位申請管理:崗位設定、學生申請、教師審批。提高了勤工崗位服務和管理的效率性和科學性。 科技項目申報管理:科技項目發布、學生申請、教師審批。實現了對學生科技項目執行情況的監督、檢查、項目驗收鑒定和經費管理等工作流程化、規范化的管理。就業信息管理:以「服務學生就業」理念為依託,構建一個針對性強,實時、方便的數據採集、分析和管理平台,逐步實現對學生就業信息的更好管理,提高信息化管理水平 , 為相關決策提供支持。黨員管理:支持以支部為核心的黨員管理方式,加強和改進黨員的管理,有助於黨員能夠及時參加黨的組織生活,接受黨組織的教育、管理和監督,更好的發揮先鋒模範作用。消息管理:意見反饋,處理。搭建師生溝通平台,保證各項事務公平、公正、公開處理。

❹ C語言程序設計學生成績管理系統,要求鏈表

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "windows.h"
int shoudsave=0; /* */
struct student
{
char num[10];/* 學號 */
char name[20];
char sex[4];
int cgrade;
int mgrade;
int egrade;
int totle;
int ave;
char neartime[10];/* 最近更新時間 */
};
typedef struct node
{
struct student data;
struct node *next;
}Node,*Link;
void menu()
{
printf("********************************************************************************");
printf("\t1登記學生資料\t\t\t\t\t2刪除學生資料\n");
printf("\t3查詢學生資料\t\t\t\t\t4修改學生資料\n");
printf("\t5保存學生資料\t\t\t\t\t0退出系統\n");
printf("********************************************************************************\n");
}
void printstart()
{
printf("-----------------------------------------------------------------------\n");
}
void Wrong()
{
printf("\n=====>提示:輸入錯誤!\n");
}
void Nofind()
{
printf("\n=====>提示:沒有找到該學生!\n");
}
void printc() /* 本函數用於輸出中文 */
{
printf(" 學號\t 姓名 性別 英語成績 數學成績 C語言成績 總分 平均分\n");
}
void printe(Node *p)/* 本函數用於輸出英文 */
{
printf("%-12s%s\t%s\t%d\t%d\t%d\t %d\t %d\n",p->data.num,p->data.name,p->data.sex,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave);
}
Node* Locate(Link l,char findmess[],char nameornum[]) /* 該函數用於定位連表中符合要求的接點,並返回該指針 */
{
Node *r;
if(strcmp(nameornum,"num")==0) /* 按學號查詢 */
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.num,findmess)==0)
return r;
r=r->next;
}
}
else if(strcmp(nameornum,"name")==0) /* 按姓名查詢 */
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.name,findmess)==0)
return r;
r=r->next;
}
}
return 0;
}
void Add(Link l) /* 增加學生 */
{
Node *p,*r,*s;
char num[10];
r=l;
s=l->next;
while(r->next!=NULL)
r=r->next; /* 將指針置於最末尾 */
while(1)
{
printf("請你輸入學號(以'0'返回上一級菜單:)");
scanf("%s",num);
if(strcmp(num,"0")==0)
break;
while(s)
{
if(strcmp(s->data.num,num)==0)
{
printf("=====>提示:學號為'%s'的學生已經存在,若要修改請你選擇'4 修改'!\n",num);
printstart();
printc();
printe(s);
printstart();
printf("\n");
return;
}
s=s->next;
}
p=(Node *)malloc(sizeof(Node));
strcpy(p->data.num,num);
printf("請你輸入姓名:");
scanf("%s",p->data.name);
getchar();
printf("請你輸入性別:");
scanf("%s",p->data.sex);
getchar();
printf("請你輸入c語言成績:");
scanf("%d",&p->data.cgrade);
getchar();
printf("請你輸入數學成績:");
scanf("%d",&p->data.mgrade);
getchar();
printf("請你輸入英語成績:");
scanf("%d",&p->data.egrade);
getchar();
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle / 3;
/* 信息輸入已經完成 */
p->next=NULL;
r->next=p;
r=p;
shoudsave=1;
}
}
void Qur(Link l) /* 查詢學生 */
{
int sel;
char findmess[20];
Node *p;
if(!l->next)
{
printf("\n=====>提示:沒有資料可以查詢!\n");
return;
}
printf("\n=====>1按學號查找\n=====>2按姓名查找\n");
scanf("%d",&sel);
if(sel==1)/* 學號 */
{
printf("請你輸入要查找的學號:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("\t\t\t\t查找結果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
else if(sel==2) /* 姓名 */
{
printf("請你輸入要查找的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{
printf("\t\t\t\t查找結果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
else
Wrong();
}
void Del(Link l) /* 刪除 */
{
int sel;
Node *p,*r;
char findmess[20];
if(!l->next)
{
printf("\n=====>提示:沒有資料可以刪除!\n");
return;
}
printf("\n=====>1按學號刪除\n=====>2按姓名刪除\n");
scanf("%d",&sel);
if(sel==1)
{
printf("請你輸入要刪除的學號:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:該學生已經成功刪除!\n");
shoudsave=1;
}
else
Nofind();
}
else if(sel==2)
{
printf("請你輸入要刪除的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:該學生已經成功刪除!\n");
shoudsave=1;
}
else
Nofind();
}
else
Wrong();
}
void Modify(Link l)
{
Node *p;
char findmess[20];
if(!l->next)
{
printf("\n=====>提示:沒有資料可以修改!\n");
return;
}
printf("請你輸入要修改的學生學號:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("請你輸入新學號(原來是%s):",p->data.num);
scanf("%s",p->data.num);
printf("請你輸入新姓名(原來是%s):",p->data.name);
scanf("%s",p->data.name);
getchar();
printf("請你輸入新性別(原來是%s):",p->data.sex);
scanf("%s",p->data.sex);
printf("請你輸入新的c語言成績(原來是%d分):",p->data.cgrade);
scanf("%d",&p->data.cgrade);
getchar();
printf("請你輸入新的數學成績(原來是%d分):",p->data.mgrade);
scanf("%d",&p->data.mgrade);
getchar();
printf("請你輸入新的英語成績(原來是%d分):",p->data.egrade);
scanf("%d",&p->data.egrade);
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle/3;
printf("\n=====>提示:資料修改成功!\n");
shoudsave=1;
}
else
Nofind();
}
void Disp(Link l)
{
int count=0;
Node *p;
p=l->next;
if(!p)
{
printf("\n=====>提示:沒有資料可以顯示!\n");
return;
}
printf("\t\t\t\t顯示結果\n");
printstart();
printc();
printf("\n");
while(p)
{
printe(p);
p=p->next;
}
printstart();
printf("\n");
}
void Tongji(Link l)
{
Node *pm,*pe,*pc,*pt,*pa; /* 用於指向分數最高的接點 */
Node *r=l->next;
if(!r)
{
printf("\n=====>提示:沒有資料可以統計!\n");
return ;
}
pm=pe=pc=pt=pa=r;
while(r!=NULL)
{
if(r->data.cgrade>=pc->data.cgrade)
pc=r;
if(r->data.mgrade>=pm->data.mgrade)
pm=r;
if(r->data.egrade>=pe->data.egrade)
pe=r;
if(r->data.totle>=pt->data.totle)
pt=r;
if(r->data.ave>=pa->data.ave)
pa=r;
r=r->next;
}
printf("------------------------------統計結果--------------------------------\n");
printf("總分最高者:\t%s %d分\n",pt->data.name,pt->data.totle);
printf("平均分最高者:\t%s %d分\n",pa->data.name,pa->data.ave);
printf("英語最高者:\t%s %d分\n",pe->data.name,pe->data.egrade);
printf("數學最高者:\t%s %d分\n",pm->data.name,pm->data.mgrade);
printf("c語言最高者:\t%s %d分\n",pc->data.name,pc->data.cgrade);
printstart();
}
void Sort(Link l)
{
Link ll;
Node *p,*rr,*s;
ll=(Link)malloc(sizeof(Node)); /* 用於做新的連表 */
ll->next=NULL;
if(l->next==NULL)
{
printf("\n=====>提示:沒有資料可以排序!\n");
return ;
}
p=l->next;
while(p)
{
s=(Node*)malloc(sizeof(Node)); /* 新建接點用於保存信息 */
s->data=p->data;
s->next=NULL;
rr=ll;
while(rr->next!=NULL && rr->next->data.totle>=p->data.totle)
rr=rr->next;
if(rr->next==NULL)
rr->next=s;
else
{
s->next=rr->next;
rr->next=s;
}
p=p->next;
}
free(l);
l->next=ll->next;
printf("\n=====>提示:排序已經完成!\n");
}
void Save(Link l)
{
FILE* fp;
Node *p;
int flag=1,count=0;
fp=fopen("c:\\student","wb");
if(fp==NULL)
{
printf("\n=====>提示:重新打開文件時發生錯誤!\n");
exit(1);
}
p=l->next;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)
{
p=p->next;
count++;
}
else
{
flag=0;
break;
}
}
if(flag)
{
printf("\n=====>提示:文件保存成功.(有%d條記錄已經保存.)\n",count);
shoudsave=0;
}
fclose(fp);
}
void main()
{
Link l;/* 連表 */
FILE *fp; /* 文件指針 */
int sel;
char ch;
char jian;
int count=0;
Node *p,*r;
printf("\t\t\t\t學生成績管理系統\n\t\t\t\t----------------------實驗項目\n");
l=(Node*)malloc(sizeof(Node));
l->next=NULL;
r=l;
fp=fopen("C:\\student","rb");
if(fp==NULL)
{
printf("\n=====>提示:文件還不存在,是否創建?(y/n)\n");
scanf("%c",&jian);
if(jian=='y'||jian=='Y')
fp=fopen("C:\\student","wb");
else
exit(0);
}
printf("\n=====>提示:文件已經打開,正在導入記錄......\n");
while(!feof(fp))
{
p=(Node*)malloc(sizeof(Node));
if(fread(p,sizeof(Node),1,fp)) /* 將文件的內容放入接點中 */
{
p->next=NULL;
r->next=p;
r=p; /* 將該接點掛入連中 */
count++;
}
}
fclose(fp); /* 關閉文件 */
printf("\n=====>提示:記錄導入完畢,共導入%d條記錄.\n",count);
while(1)
{
menu();
printf("請你選擇操作:");
scanf("%d",&sel);
if(sel==0)
{
if(shoudsave==1)
{ getchar();
printf("\n=====>提示:資料已經改動,是否將改動保存到文件中(y/n)?\n");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
Save(l);
}
printf("\n=====>提示:你已經退出系統,再見!\n");
break;
}
switch(sel)
{
case 1:Add(l);break; /* 增加學生 */
case 2:Del(l);break;/* 刪除學生 */
case 3:Qur(l);break;/* 查詢學生 */
case 4:Modify(l);break;/* 修改學生 */
case 5:Save(l);break;/* 保存學生 */
case 9:printf("\t\t\t==========幫助信息==========\n");break;
default: Wrong();getchar();break;
}
}
Sleep(100);
}
/* */

❺ C語言設計一個學生學籍管理系統,要求文件形式保存,且用到鏈表

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//鏈表結點結構體聲明
typedefstructsubjects
{
charname[20];
floatscore;
}sub;

typedefstructstudent
{
intnum;
charname[20];
subsubject[3];
structstudent*next;
}stu,*pstu;

#defineSIZEsizeof(stu)

//函數申明
pstuLoadInfo();
voidPrintMenu();
pstuAddStu(pstu);
pstuDeleStu(pstu);
pstuRwrStu(pstu);
voidFindStu(pstu,char);
voidCount(pstu,char*,float,float);
voidRank(pstu,char*);
voidSaveQuit(pstu);

//主函數
intmain()
{
floatscore1,score2;
charn,j;
charsubname[20];
pstuhead,ptr;

head=LoadInfo();
ptr=head->next;

//創建菜單,進入選擇循環
while(1)
{
PrintMenu();
printf("請輸入您的選擇編號:");
scanf("%d",&n);
getchar();
switch(n)
{
case1:
{
system("cls");
j=0;
while(4!=j)
{
printf("歡迎進入信息管理版塊! ");
printf("251、添加學生 ");
printf("252、刪除學生 ");
printf("253、修改學生信息 ");
printf("254、返回 ");
printf("請輸入您的選擇編號: ");
scanf("%d",&j);
getchar();

if(1==j)head=AddStu(head);
elseif(2==j)head=DeleStu(head);
elseif(3==j)head=RwrStu(head);
elseif(4==j);
elseprintf("輸入有誤,請重新輸入! ");

}
printf("請輸入回車鍵返回主菜單!");//此處本意按任意鍵返回,但是任意鍵的話,需要按鍵A,再按回車確定
getchar(); //則會連續收到兩個按鍵,造成錯誤讀入,可以改進scanf接收字元串,
system("cls"); //以下所有getchar()、system("cls")同理
break;
}
case2:
{
//信息查詢
system("cls");
printf("歡迎進入信息查詢版塊! ");
printf("請輸入要查詢的學生編號:");
scanf("%d",&j);
getchar();
//printf("%d ",j); //檢測輸入是否成功,調試程序用
FindStu(head,j); //查詢並輸出
printf(" 請輸入回車鍵返回主菜單!");
getchar();
system("cls");
break;
}
case3:
{
//成績統計
system("cls");
printf("歡迎進入成績統計版塊! ");
printf("請輸入科目:");
scanf("%s",&subname);
getchar();
printf("請輸入分數范圍(score1,score2):");
scanf("%f,%f",&score1,&score2);
getchar();
/*printf("%s%5.2f%5.2f ",subname,
score1,score2);*///檢測輸入是否成功,調試程序用
Count(head,subname,score1,score2); //統計並輸出
printf("請輸入回車鍵返回主菜單!");
getchar();
system("cls");
break;
}
case4:
{
//成績排序
system("cls");
printf("歡迎進入成績排序版塊,請輸入科目:");
scanf("%s",&subname);
getchar();
Rank(head,subname); //排序並輸出
printf(" 請輸入回車鍵返回主菜單! ");
getchar();
system("cls");
break;
}
case5:
{
//保存退出
SaveQuit(head); //文件操作,保存並退出
free(head);
return0;
}
default:
{
printf("輸入有誤,按回車鍵重新選擇! "); //主菜單錯誤輸出檢測
getchar();
system("cls");
}
}
}


}

//載入data數據,文件操作
pstuLoadInfo()
{
intnum;
charname[20];
charsub1[20];
charsub2[20];
charsub3[20];
floatscore1;
floatscore2;
floatscore3;

charfilename[]="D:\編程學習\編程實踐\c語言課程設計1學生信息管理\data.txt";//文件名,此處為簡化編程,採用固定地址名稱,未作輸入
FILE*fp;
pstuhead,ptr;

//創建帶表頭結點的空單鏈表head,用來存放載入信息
head=(pstu)malloc(SIZE);
ptr=head;
ptr->next=NULL;


//載入data文件,存入head鏈表
if(NULL==(fp=fopen(filename,"r"))) //判斷文件是否存在及可讀
{
printf("error!");
exit(0);
}

while(!feof(fp))
{
fscanf(fp,"%d%s%s%f%s%f%s%f ",&num,&name,
&sub1,&score1,&sub2,&score2,&sub3,&score3);//讀取一行,採用格式化讀取,避免了其他各種讀取方法的數據處理問題
//該方法缺點明顯,對數據格式要求教研,故data文件規定數據格式
ptr->next=(pstu)malloc(SIZE);
ptr=ptr->next;
ptr->next=NULL;

ptr->num=num;
strcpy(ptr->name,name);
strcpy(ptr->subject[0].name,sub1);
ptr->subject[0].score=score1;
strcpy(ptr->subject[1].name,sub2);
ptr->subject[1].score=score2;
strcpy(ptr->subject[2].name,sub3);
ptr->subject[2].score=score3;

}

fclose(fp); //關閉文件,已得到保存data信息的鏈表head

returnhead;
}


//列印主菜單
voidPrintMenu()
{
printf("*************************************** ");
printf("楓楓學生信息管理系統 ");
printf("*************************************** ");
putchar(' ');
printf("菜單 ");
printf("251、信息管理 ");
printf("252、信息查詢 ");
printf("253、成績統計 ");
printf("254、成績排序 ");
printf("255、保存退出 ");
}

//添加學生
pstuAddStu(pstux)
{
charnamestu[20];
char*p;
charsubname1[20],subname2[20],subname3[20];
pstuhead,ptr;

head=x;
ptr=head;

while(NULL!=ptr->next) //遍歷鏈表,找到鏈尾結點
{
ptr=ptr->next;
}

ptr->next=(pstu)malloc(SIZE); //默認在鏈表末追加添加信息
ptr=ptr->next;
ptr->next=NULL;

printf("請輸入添加學生的信息: ");

printf("請輸入添加學生的學號:");
scanf("%d",&ptr->num);
getchar();

printf("請輸入添加學生的姓名:");
scanf("%s",namestu);
getchar();
p=namestu;
strcpy(ptr->name,p);

printf("請輸入添加學生的科目1名稱:");
scanf("%s",&subname1);
getchar();
p=subname1;
strcpy(ptr->subject[0].name,p);

printf("請輸入添加學生的科目1成績:");
scanf("%f",&ptr->subject[0].score);
getchar();

printf("請輸入添加學生的科目2名稱:");
scanf("%s",&subname2);
getchar();
p=subname2;
strcpy(ptr->subject[1].name,p);

printf("請輸入添加學生的科目2成績:");
scanf("%f",&ptr->subject[1].score);
getchar();

printf("請輸入添加學生的科目3名稱:");
scanf("%s",&subname3);
getchar();
p=subname3;
strcpy(ptr->subject[2].name,p);

printf("請輸入添加學生的科目3成績:");
scanf("%f",&ptr->subject[2].score);
getchar();

putchar(' ');
returnhead;
}

//刪除學生
pstuDeleStu(pstux)
{
intnum;
pstuhead,ptr,qtr;

head=x;
ptr=head->next;
qtr=head;

printf("請輸入要刪除的學生的學號:");
scanf("%d",&num);
getchar();

while(ptr!=NULL)
{
if(ptr->num!=num) //遍歷查找鏈表結點,未找到跳過該結點
{
ptr=ptr->next;
qtr=qtr->next;
}
else //找到則刪除結點
{
ptr=ptr->next;
qtr->next=ptr;
break;
}
}

printf("該學生信息已刪除! ");
returnhead;
}

//修改學生信息
pstuRwrStu(pstux)
{
charnamestu[20];
char*p;
charsubname1[20],subname2[20],subname3[20];
intnum;
pstuhead,ptr;

head=x;
ptr=head->next;

printf("請輸入要修改的學生的學號:");
scanf("%d",&num);
getchar();

while(ptr!=NULL)
{
if(ptr->num==num)
{
printf("已找到該學生信息,請填入修改項目:");

printf("請輸入修改學生的姓名:");
scanf("%s",namestu);
getchar();
p=namestu;
strcpy(ptr->name,p);

printf("請輸入修改學生的科目1名稱:");
scanf("%s",subname1);
getchar();
p=subname1;
strcpy(ptr->subject[0].name,p);

printf("請輸入修改學生的科目1成績:");
scanf("%f",&ptr->subject[0].score);
getchar();

printf("請輸入修改學生的科目2名稱:");
scanf("%s",subname2);
getchar();
p=subname2;
strcpy(ptr->subject[1].name,p);

printf("請輸入修改學生的科目2成績:");
scanf("%f",&ptr->subject[1].score);
getchar();

printf("請輸入修改學生的科目3名稱:");
scanf("%s",subname3);
getchar();
p=subname3;
strcpy(ptr->subject[2].name,p);

printf("請輸入修改學生的科目3成績:");
scanf("%f",&ptr->subject[2].score);
getchar();

printf("該學生信息已修改! ");
break;
}
else
{
ptr=ptr->next;
}
}

returnhead;
}

//查找學生,參數為鏈表指針,和學生學號
//不好,應該將學號輸入放進子函數,簡化主函數結構,減少子函數參數
voidFindStu(pstux,chary)
{
pstuhead,ptr;

head=x;
ptr=head->next;

while(ptr!=NULL)
{
if(ptr->num==(int)y) //因主函數中為節省空間,學號輸入採用char數據,故強行准換
{
printf("已找到該學生信息! 如下:");
printf("%03d%s%s%5.2f%s%5.2f%s%5.2f ",
ptr->num,ptr->name,ptr->subject[0].name,ptr->subject[0].score,ptr->subject[1].name,ptr->subject[1].score,ptr->subject[2].name,ptr->subject[2].score); break; //注意此處找到並輸出信息後要手動退出循環
}
else
{
ptr=ptr->next;
}
}
if(ptr==NULL) //查詢成功檢測,while循環中若找到,則ptr停留在當前學生的結點上
{
printf("未能找到該學生信息! ");
}
}


//統計科目分數區間段的學生,參數為鏈表指針,科目名稱,分數區間上下限
//同理,參數的錄入應放入子函數,簡化結構和編程
voidCount(pstux,char*y,floatq,floatp)
{
pstuhead,ptr;
charname[20];
charflag=0; //手動設置的查找結果flag

head=x;
ptr=head->next;
strcpy(name,y);

//printf("%s%5.2f%5.2f ",name,q,p); //檢測輸入參數的傳遞,調試程序用

while(ptr!=NULL) //開始查找統計,科目查找用strcmp函數比較科目字元串,返回值0為字元串相等
{ //此處while循環體中,重復的查找步驟太多,應設置科目匹配flag,參照rank()函數
if(strcmp(name,ptr->subject[0].name)==0) //通過flag將科目確認放在while之外,循環體內只做分數區間的掃描和輸出
{
if(q<=ptr->subject[0].score&&ptr->subject[0].score<=p)
{
printf("%03d%s%s%5.2f ",ptr->num,ptr->name,ptr->subject[0].name,ptr->subject[0].score);
flag++;
}
}
if(strcmp(name,ptr->subject[1].name)==0)
{
if(q<=ptr->subject[1].score&&ptr->subject[1].score<=p)
{
printf("%03d%s%s%5.2f ",ptr->num,ptr->name,ptr->subject[1].name,ptr->subject[1].score);
flag++;
}
}
if(strcmp(name,ptr->subject[2].name)==0)
{
if(q<=ptr->subject[2].score&&ptr->subject[2].score<=p)
{
printf("%03d%s%s%5.2f ",ptr->num,ptr->name,ptr->subject[2].name,ptr->subject[2].score);
flag++;
}
}

ptr=ptr->next;
}

if(flag==0)
{
printf("未能找到該課程該區間分數段的學生! ");
}
}


//學科成績排名,採用交換數據的方法,參數為鏈表指針,科目名稱
//同理參數問題
//鏈表排序問題,此處用交換結點數據方法,還有其他多種排序方法
//如,交換結點,輔助指針數組排序(未實現,過程繁雜),插入法排序等
voidRank(pstux,char*y)
{
pstuhead,ptr,qtr;
charname[20];
charlen=0;
charflag=0; //簡化演算法,設置科目查找結果判斷值,flag=0表示科目輸入為未知科目,不存在
inti=0; //i、j循環次數控制參數
intj=0;
chartemp_name[20]; //數據交換時的暫存信息變數
floattemp0,temp1,temp2;
inttemp_num;

strcpy(name,y);
head=x;

ptr=head->next;
while(ptr!=NULL) //測鏈表長度,不包括表頭結點
{
ptr=ptr->next;
len++;
}
ptr=head->next; //指針ptr用過之後記得回原位


//開始查找科目
if(strcmp(name,ptr->subject[0].name)==0) flag=1;
if(strcmp(name,ptr->subject[1].name)==0) flag=2;
if(strcmp(name,ptr->subject[2].name)==0) flag=3;
if(flag==0)
{
printf("未找到該科目!");
return;
}

//開始排序,冒泡法比較各結點數據
//此處3個並列的if用switchcase更清晰結構
if(n==1)
{
for(i=0;i<len;i++)
{
ptr=head->next->next; //每一次內循環之後,ptr、qtr必然在最後兩個節點上
qtr=head->next; //故在進行內循環之前,要重新復位ptr、qtr
for(j=0;j<len-i-1;j++)
{
if(qtr->subject[0].score<ptr->subject[0].score)
{
temp_num=qtr->num; //交換數據,因數據格式(科目順序)明確規定,故不再做科目名稱的替換
strcpy(temp_name,qtr->name);
temp0=qtr->subject[0].score;
temp1=qtr->subject[1].score;
temp2=qtr->subject[2].score;

qtr->num=ptr->num;
strcpy(qtr->name,ptr->name);
qtr->subject[0].score=ptr->subject[0].score;
qtr->subject[1].score=ptr->subject[1].score;
qtr->subject[2].score=ptr->subject[2].score;

ptr->num=temp_num;
strcpy(ptr->name,temp_name);
ptr->subject[0].score=temp0;
ptr->subject[1].score=temp1;
ptr->subject[2].score=temp2;
}
qtr=qtr->next;
ptr=ptr->next;
}
}
}

if(n==2)
{
for(i=0;i<len;i++)
{
ptr=head->next->next;
qtr=head->next;
for(j=0;j<len-i-1;j++)
{
if(qtr->subject[1].score<ptr->subject[1].score)
{
temp_num=qtr->num;
strcpy(temp_name,qtr->name);
temp0=qtr->subject[0].score;
temp1=qtr->subject[1].score;
temp2=qtr->subject[2].score;

qtr->num=ptr->num;
strcpy(qtr->name,ptr->name);
qtr->subject[0].score=ptr->subject[0].score;
qtr->subject[1].score=ptr->subject[1].score;
qtr->subject[2].score=ptr->subject[2].score;

ptr->num=temp_num;
strcpy(ptr->name,temp_name);
ptr->subject[0].score=temp0;
ptr->subject[1].score=temp1;
ptr->subject[2].score=temp2;
}
qtr=qtr->next;
ptr=ptr->next;
}
}
}

if(n==3)
{
for(i=0;i<len;i++)
{
ptr=head->next->next;
qtr=head->next;
for(j=0;j<len-i-1;j++)
{
if(qtr->subject[2].score<ptr->subject[2].score)
{
temp_num=qtr->num;
strcpy(temp_name,qtr->name);
temp0=qtr->subject[0].score;
temp1=qtr->subject[1].score;
temp2=qtr->subject[2].score;

qtr->num=ptr->num;
strcpy(qtr->name,ptr->name);
qtr->subject[0].score=ptr->subject[0].score;
qtr->subject[1].score=ptr->subject[1].score;
qtr->subject[2].score=ptr->subject[2].score;

ptr->num=temp_num;
strcpy(ptr->name,temp_name);
ptr->subject[0].score=temp0;
ptr->subject[1].score=temp1;
ptr->subject[2].score=temp2;
}
qtr=qtr->next;
ptr=ptr->next;
}
}
}

//輸出排序過後的鏈表
ptr=head->next;
while(ptr!=NULL)
{
printf("%03d%s%s%5.2f%s%5.2f%s%5.2f ",
ptr->num,ptr->name,ptr->subject[0].name,ptr->subject[0].score,
ptr->subject[1].name,ptr->subject[1].score,
ptr->subject[2].name,ptr->subject[2].score);
ptr=ptr->next;
}
}


//保存文件並退出,文件操作
voidSaveQuit(pstux)
{
pstuhead,ptr;
FILE*fp;
charfilename[]="D:\編程學習\編程實踐\c語言課程設計1學生信息管理\data.txt";
head=x;
ptr=head->next;

if(NULL==(fp=fopen(filename,"w"))) //判斷文件是否存在及可讀
{
printf("error!");
exit(0);
}

while(ptr!=NULL) //遍歷鏈表結點,按data約定格式輸出數據
{
fprintf(fp,"%03d%s%s%5.2f%s%5.2f%s%5.2f ",
ptr->num,ptr->name,ptr->subject[0].name,ptr->subject[0].score,