當前位置:首頁 » 編程語言 » 鏈表學生管理系統c語言

鏈表學生管理系統c語言

發布時間: 2025-02-24 14:46:10

A. 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,

B. 編寫一個c語言程序,實現錄入學生學號和姓名信息的功能

#include<stdio.h>

#include<stdlib.h>

intmain(void)

{

chars[10];//姓名

intnum;//學號

printf("請輸入姓名: ");

gets(s);

printf("請輸學號: ");

scanf("%d",&num);

printf("姓名是:%s 學號是:%d ",s,num);

system("pause");

return0;

}

(2)鏈表學生管理系統c語言擴展閱讀

c語言建立學生檔案

#include<stdio.h>

#include<string.h>

結構學生

{

整數

字元名稱[10];

intEng;

墊子;

};

//s_number-檢索的學號

//numebr-文檔已經存儲的學號

//按學號查找

布爾搜索(chars_New[],charNew[])

{

如果(strcmp(s_New,New))

{

返回true;//查找成功

}

其他

{

returnfalse;//查找失敗

}

}

無效menu()

{

printf(「----------------------------------------------------------- 「);

printf(「菜單: 」);

printf(「 1。建立學生檔案 」);

printf(「 2。讀取所有學生記錄 」);

printf(「 3。在文件尾添加學生記錄 」);

printf(「 4。查詢學生姓名 」);

printf(「 5。結束程序 」);

printf(「----------------------------------------------------------- 「);

}

無效menu_2()

{

printf(「----------------------------------------------------------- 「);

printf(「查找選擇菜單: 」);

printf(「 1。按名字查找 」);

printf(「 2。按學號查找 」);

printf(「請選擇: 」);

printf(「----------------------------------------------------------- 「);

}

intmain()

{

而(1)

{

菜單();

法官

printf(「請輸入你的選項:」);

判斷=scanf(「%d」,&n);

如果(判斷==0)

{

printf(「輸入格式錯誤! 」);

}

開關(n)

{

情況1:

{

FILE*pf=fopen(「Student.txt」,「w+」);

字元標志='Y';

while(flag=='Y'|flag=='y')

{

學生stu;//創建學生結構體

printf(「請輸入學生的學號: 」);

scanf(「%d」,&stu.number);

getchar();//吃掉以上一個輸入的回車符

printf(「請輸入學生的姓名: 」);

scanf(「%s」,stu.name);

printf(「請輸入學生的語文成績: 」);

scanf(「%d」,&stu.Chi);

printf(「請輸入學生的英語成績: 」);

scanf(「%d」,&stu.Eng);

printf(「請輸入學生的數學成績: 」);

scanf(「%d」,&stu.Mat);

//把學生檔案導入Student.txt文檔

fprintf(pf,「#姓名:%s 學號:%d 語言成績:%d 英語成績:%d 數學成績:%d 」,stu.name,stu.number,stu.Chi,stu.Eng,stu.Mat);

getchar();//吃掉以上一個輸入的回車符

printf(「是否繼續輸入學生檔案?(是或否) 」);

判斷=scanf(「%c」,&flag);

如果(判斷==0)

{

printf(「輸入格式錯誤! 」);

}

}

fclose(pf);

打破;

}

C. 用C語言寫學生成績管理系統基本功能:1、 輸入一個班級的學生基本信息(包括學號,姓名,性別,5門課程成績

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

struct stud_node
{
long int ID; //學號
int age; //年齡
long int dormnumber,phonenumber; //宿舍號碼,電話號碼
char name[15]; //姓名
char sex; //性別
struct student*next;
};

struct stud_node*Create_Stu_Doc();//新建鏈表
int main(void){
system("color 3E");
FILE *fp=NULL;//定義文件指針
fp=fopen("stud.txt","wb");
if(fp==NULL)
{
printf("File open error \n");
exit (0);
}
struct stud_node*head,*p;
int choice,age;
long int ID,dormnumber,phonenumber;
char name[15],sex;
int size=sizeof(struct stud_node);

printf("+---------------------------+\n");
printf("| 歡迎使用教務信息管理系統 |\n");
printf("+---------------------------+\n");

printf("\n\t\t-----------------------------------------------------\n");
printf("\t\t+ 主菜單正掘 +\n");
printf("\t\t-----------------------------------------------------\n");
printf("\t\t+ [1]--錄入學生資料 +\n");
printf("\t\t+ [0]--退出系統 +\n");
printf("\t\t-----------------------------------------------------\n");
printf("\n");
printf("\t\t請輸入您的選擇:");

scanf("%d",&choice);
switch(choice)
{
case 0 : break;
case 1 : head=Create_Stu_Doc;break;
default:printf("\n無效選項!");
}
}

struct stud_node*Create_Stu_Doc()//新建鏈早洞表
{
int y,age;
long int ID,dormnumber,phonenumber;
char name[15],sex;
int size=sizeof(struct stud_node);
struct stud_node*head,*tail,*p;
FILE *fp=NULL;//定義文件指針
fp=fopen("stud.txt","r");
head=tail=NULL;
printf("--------------------\n");
printf("請輸入學生的學號:");
printf("請輸入學生的姓名:");
printf("請輸入學生的性別:");
printf("請輸入學生的年齡:");
printf("請輸入舉睜核學生的宿舍號碼:");
printf("請輸入學生的電話號碼:");
while(!feof(fp))
{
p=(struct stud_node *)malloc(size);
fscanf(fp,"%ld%c%c%d%ld%ld",&ID,&name,&sex,&age,&dormnumber,&phonenumber);
p->ID=ID;
strcpy(p->name,name);
strcpy(p->age,age);
p->dormnumber=dormnumber;
p->phonenumber=phonenumber;
p->next=NULL;
if(head==NULL) head=p;
else tail->next=p;
tail=p;
}
printf("\n1.繼續輸入.\n0.結束輸入.\n");
printf("請選擇:");
scanf("%d",&y);
if(y)
return head;
fclose(fp);

}

D. 寫c語言學生信息管理系統 求前輩指點一二 大恩不言謝 沒有賞金了

#include<stdio.h>
#include<io.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#defineMAX200

structstudent
{
charno[10];//學號
charname[50];//姓名
floatscore[3];//分數
floatmath;
floateng;
floatphy;
};
structdata
{
intcount;//當前學生數組中學生的個數
structstudentstu[MAX];//學生數組
}dd;

//顯示主菜單
voidmenu()
{
system("cls");//清屏
printf(" ");
printf(" ******************************* ");
printf(" ");
printf(" 學生成績管理系統 ");
printf(" ");
printf(" [1]查看所有學生信息 ");
printf(" [2]輸入學生記錄 ");
printf(" [3]刪除學生記錄 ");
printf(" [4]修改學生記錄 ");
printf(" [5]查詢學生成績(學號) ");
printf(" [6]查詢成學生績(姓名) ");
printf(" [7]查看成績排序(學號) ");
printf(" [0]退出 ");
printf(" ");
}

//等待用戶按回車後回到主菜單
voidto_menu()
{
charc1,c2;
printf(" 按回車鍵返回主菜單...");
scanf("%c%c",&c1,&c2);//第一個字元吸收上次的確認回車鍵
menu();
}
//統計信息
voidren()
{
intA=0,B=0,C=0,D=0,E=0,s;
inti;

for(i=0;i<dd.count;i++)
{
s=(int)(dd.stu[i].math/10);
switch(s)
{
case10:
case9:
A++;
break;
case8:
B++;
break;
case7:
C++;
break;
case6:
D++;
break;
default:
E++;
break;
}
}

printf("總人數:%d ",dd.count);
printf("獲得「優秀」的人數:%d ",A);
printf("獲得「良」的人數:%d ",B);
printf("獲得「中」的人數:%d ",C);
printf("獲得「及格」的人數:%d ",D);
printf("不及格的人數:%d ",E);

}

//查看所有學生信息
voidview_data()
{
inti;
printf("學號 姓名 數學 英語 物理");
printf(" ------------------------------------------------------------------- ");
for(i=0;i<dd.count;i++)
printf("%s %s %-7.1f %-7.1f %-7.1f ",dd.stu[i].no,dd.stu[i].name,dd.stu[i].math,dd.stu[i].eng,dd.stu[i].phy);
printf(" ------------------------------------------------------------------- ");
ren();
}


//將數據從結構體數組保存到文件中
voidsave_data()
{
FILE*fp;//文件指針
inti,k;
k=dd.count; //其實k沒有什麼實際的意義,直接在fwrite里使用&dd.count就可以了。
fp=fopen("D:\data.txt","w");//文件存儲位置:當前文件夾
fwrite(&k,sizeof(int),1,fp);
for(i=0;i<dd.count;i++)
fwrite(&dd.stu[i],sizeof(structstudent),1,fp);
fclose(fp);
}

//輸入學生記錄
voidadd_data()
{
intb;
intk=dd.count;
while(k<MAX)
{
printf("請輸入學生學號:");scanf("%s",dd.stu[k].no);
printf("請輸入學生姓名:");scanf("%s",dd.stu[k].name);
printf("請輸入數學成績:");scanf("%f",&dd.stu[k].math);
printf("請輸入英語成績:");scanf("%f",&dd.stu[k].eng);
printf("請輸入物理成績:");scanf("%f",&dd.stu[k].phy);

dd.count++; //需要提前置0,在主函數中。
k=dd.count;
printf(" 繼續添加學生信息[1-yes0-no]:");
scanf("%d",&b);
if(b==0)break;
}
save_data();
}

//將數據從文件讀到結構體數組中
voidread_data()
{
FILE*fp;
inti,k;

k=0;
if((fp=fopen("D:\data.txt","r"))==NULL)//如果文件不存在
{
dd.count=0;
}
else
{
fread(&k,sizeof(int),1,fp);
dd.count=k;
for(i=0;i<k;i++)
{
fread(&dd.stu[i],sizeof(structstudent),1,fp);
}
fclose(fp);
}
}

//刪除學生記錄
voiddelete_data()
{
inti,k;
charno[10];
printf(" 請輸入要刪除學生的學號:");
scanf("%s",no);
k=-1;
for(i=0;i<dd.count;i++)
{
if(strcmp(dd.stu[i].no,no)==0)
{
k=i;
break;
}
}
if(k==-1)
{
printf(" 沒有找到該學生(學號-%s)!",no);
}
else
{
//你沒有寫刪除的操作啊
for(i=k;i<dd.count-1;i++) //將後面的數據前移一位
dd.stu[i]=dd.stu[i+1];
memset(&dd.stu[dd.count-1],0,sizeof(structstudent)); //將dd.stu[dd.count-1]數據置0
dd.count--;

save_data();
printf(" 刪除學生(學號-%s)記錄成功!",no);
}
}

//修改學生記錄
voidedit_data()
{
inti,k;
charno[10],name[50];
printf(" 請輸入要修改學生的學號:");
scanf("%s",no);
k=-1;
for(i=0;i<dd.count;i++)
{
if(strcmp(dd.stu[i].no,no)==0)
{
k=i;
break;
}
}
if(k==-1)
{
printf(" 沒有找到該學生(學號-%s)!",no);
}
else
{
printf(" 請輸入學生數據:");
printf(" 姓名");
printf(" -------------------------------------------------------------------- ");
scanf("%s",name);
strcpy(dd.stu[k].name,name);
save_data();
printf(" 修改學生記錄(學號-%s)成功!",no);
}
}

//查詢學生成績(學號)
voidquery_data_no()
{
inti,k;
charno[10];
printf(" 請輸入要查詢學生的學號:");
scanf("%s",no);
k=-1;
for(i=0;i<dd.count;i++)
{
if(strcmp(dd.stu[i].no,no)==0)
{
printf(" 學號 姓名 數學 英語 物理");
printf(" ----------------------------------------------------------------- ");
k=i;
printf("%s %s %-7.1f %-7.1f %-7.1f ",dd.stu[i].no,dd.stu[i].name,dd.stu[i].math,dd.stu[i].eng,dd.stu[i].phy);
break; // 學號應該是唯一的,找到了一個就代表以後的沒有了。
}
}
if(k==-1)
{
printf(" 沒有找到該學生(學號-%s)!",no);
}
}

//查詢學生成績(姓名)
voidquery_data_name()
{
inti,k;
charname[10];
printf(" 請輸入要查詢學生的姓名:");
scanf("%s",name);
k=-1;
for(i=0;i<dd.count;i++)
{
if(strcmp(dd.stu[i].name,name)==0)
{
printf(" 學號 姓名 數學 英語 物理");
printf(" ----------------------------------------------------------------- ");

k=i;
printf("%s %s %-7.1f %-7.1f %-7.1f ",dd.stu[i].no,dd.stu[i].name,dd.stu[i].math,dd.stu[i].eng,dd.stu[i].phy);
break;
}
}
if(k==-1)
{
printf(" 沒有找到該學生(姓名-%s)!",name);
}
}

//排序(學號)
voidsort_data_no(structdataBuff)
{
inti;
intj;
intk;
inth;
structstudenttemp;
FILE*fp;
if((fp=fopen("D:\data.txt","w+"))==NULL)
{
printf("cannotopenfile! ");
exit(0);
}
printf("請輸入要查詢的科目:1-數學,2-英語,3-物理:");
scanf("%d",&k);

switch(k)
{
case1:
for(i=0;i<Buff.count-1;i++)
for(j=i+1;j<Buff.count;j++)
if(Buff.stu[i].math>Buff.stu[j].math)
{
temp=Buff.stu[i];
Buff.stu[i]=Buff.stu[j];
Buff.stu[j]=temp;
}
printf("名次 學號 姓名 數學 ");
for(i=0;i<Buff.count;i++)
printf("%d %s %s %-7.1f ",i+1,Buff.stu[i].no,Buff.stu[i].name,Buff.stu[i].math);
break;
case2:
for(i=0;i<Buff.count-1;i++)
for(j=i+1;j<Buff.count;j++)
if(Buff.stu[i].eng>Buff.stu[j].eng)
{
temp=Buff.stu[i];
Buff.stu[i]=Buff.stu[j];
Buff.stu[j]=temp;
}
printf("名次 學號 姓名 英語 ");
for(i=0;i<Buff.count;i++)
printf("%d %s %s %-7.1f ",i+1,Buff.stu[i].no,Buff.stu[i].name,Buff.stu[i].eng);
break;
case3:
for(i=0;i<Buff.count-1;i++)
for(j=i+1;j<Buff.count;j++)
if(Buff.stu[i].phy>Buff.stu[j].phy)
{
temp=Buff.stu[i];
Buff.stu[i]=Buff.stu[j];
Buff.stu[j]=temp;
}
printf("名次 學號 姓名 物理 ");
for(i=0;i<Buff.count;i++)
printf("%d %s %s %-7.1f ",i+1,Buff.stu[i].no,Buff.stu[i].name,Buff.stu[i].phy);
break;
default:
printf("輸入錯誤!");
exit(0);
}

printf("請按任意鍵繼續....");
getch();

fclose(fp);
}

//主函數
voidmain()
{
intfun;
dd.count=0;
read_data();
menu();
while(1)
{
printf("請輸入功能號[0-7]:");//這里不需要什麼&fun,
scanf("%d",&fun);
switch(fun)
{
case1:view_data();break;//查看所有學生信息
case2:add_data();break;//輸入學生記錄
case3:delete_data();break;//刪除學生記錄
case4:edit_data();break;//修改學生記錄
case5:query_data_no();break;//查詢學生成績(學號)
case6:query_data_name();break;//查詢成學生績(姓名)
case7:sort_data_no(dd);break;//查看成績排序(學號)//直接將結構體dd發送過去就可以了
case0:break;//退出
}
if(fun==0)break;
to_menu();
}

return;
}

熱點內容
曙光伺服器怎麼看內存位置 發布:2025-02-24 18:18:50 瀏覽:132
安卓手機軟體分類怎麼弄 發布:2025-02-24 18:13:53 瀏覽:552
王座配置如何恢復設置 發布:2025-02-24 18:07:32 瀏覽:96
演算法選股 發布:2025-02-24 18:02:58 瀏覽:591
我們一家訪問人20120123 發布:2025-02-24 17:38:24 瀏覽:919
平民編程 發布:2025-02-24 17:36:21 瀏覽:2
列印機雲運維伺服器 發布:2025-02-24 17:27:01 瀏覽:493
體檢卡初始密碼是什麼 發布:2025-02-24 17:26:58 瀏覽:118
php獲取文件後綴 發布:2025-02-24 17:24:32 瀏覽:23
新mg6如何設置安卓手機互聯 發布:2025-02-24 17:12:37 瀏覽:268