?? ok.txt
字號:
# include <malloc.h>
# include <stdio.h>
# include <stdlib.h>
#define LEN sizeof(struct scorenode)
#define DEBUG
# include <string.h>
struct scorenode
{int number;/*學號*/
char name[10];/*姓名*/
float yuwen;/*語文成績*/
float yingyu;/*英語成績*/
float shuxue;/*數學成績 */
struct scorenode *next;
};
typedef struct scorenode score;
int n,k;/*n,k為全局變量,本程序中的函數均可以使用它*/
/*==============================================================================================*/
score *creat2311(void)
/*函數creat2311,功能:創建鏈表,此函數帶回一個指向鏈表頭的指針*/
{
score *head;
score *p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];
n=0;
p1=p2=p3=(score *)malloc(LEN);head=p3;
/*開辟一個新單元*/
printf("請輸入學生資料,輸0退出!\n");
repeat1: printf("請輸入學生學號(學號應大于0):");
/*輸入學號,學號應大于0*/
scanf("%d",&p1->number);
while(p1->number<0)
{getchar();
printf("輸入錯誤,請重新輸入學生學號:");
scanf("%d",&p1->number);}
/*輸入學號為字符或小于0時,程序報錯,提示重新輸入學號*/
if(p1->number==0)
goto end;
/*當輸入的學號為0時,轉到末尾,結束創建鏈表*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(p1->number!=p3->number)
p3=p3->next;
else
{printf("學號重復,請重輸!\n");
goto repeat1;
/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/
}
}
}
}
printf("請輸入學生姓名:");
scanf("%s",&p1->name);
/*輸入學生姓名*/
printf("請輸入語文成績(0~100):");
/*輸入語文成績,成績應在0-100*/
scanf("%f",&p1->yuwen);
while(p1->yuwen<0||p1->yuwen>100)
{getchar();
printf("輸入錯誤,請重新輸入語文成績");
/*輸入錯誤,重新輸入語文成績直到正確為止*/
scanf("%f",&p1->yuwen);}
printf("請輸入英語成績(0~100):");
/*輸入英語成績,成績應在0-100*/
scanf("%f",&p1->yingyu);
while(p1->yingyu<0||p1->yingyu>100)
{getchar();
printf("輸入錯誤,請重新輸入英語成績");
/*輸入錯誤,重新輸入英語成績直到正確為止*/
scanf("%f",&p1->yingyu);}
printf("請輸入數學成績(0~100):");
/*輸入數學成績,成績應在0-100*/
scanf("%f",&p1->shuxue);
while(p1->shuxue<0||p1->shuxue>100)
{getchar();
printf("輸入錯誤,請重新輸入數學成績");
scanf("%f",&p1->shuxue);}
/*輸入錯誤,重新輸入數學成績直到正確為止*/
head=NULL;
while(p1->number!=0)
{
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(score *)malloc(LEN);
printf("請輸入學生資料,輸0退出!\n");
repeat2:printf("請輸入學生學號(學號應大于0):");
scanf("%d",&p1->number);
/*輸入學號,學號應大于0*/
while(p1->number<0)
{getchar();
printf("輸入錯誤,請重新輸入學生學號:");
scanf("%d",&p1->number);}
/*輸入學號為字符或小于0時,程序報錯,提示重新輸入學號*/
if(p1->number==0)
goto end;
/*當輸入的學號為0時,轉到末尾,結束創建鏈表*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(p1->number!=p3->number)
p3=p3->next;
else
{printf("學號重復,請重輸!\n");
goto repeat2;
/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/
}
}
}
}
printf("請輸入學生姓名:");
scanf("%s",&p1->name);
/*輸入學生姓名*/
printf("請輸入語文成績(0~100):");
scanf("%f",&p1->yuwen);
/*輸入語文成績,成績應在0-100*/
while(p1->yuwen<0||p1->yuwen>100)
{getchar();
printf("輸入錯誤,請重新輸入語文成績");
scanf("%f",&p1->yuwen);}
/*輸入錯誤,重新輸入語文成績直到正確為止*/
printf("請輸入英語成績(0~100):");
scanf("%f",&p1->yingyu);
/*輸入英語成績,成績應在0-100*/
while(p1->yingyu<0||p1->yingyu>100)
{getchar();
printf("輸入錯誤,請重新輸入英語成績");
scanf("%f",&p1->yingyu);}
/*輸入錯誤,重新輸入英語成績直到正確為止*/
printf("請輸入數學成績(0~100):");
scanf("%f",&p1->shuxue);
/*輸入數學成績,成績應在0-100*/
while(p1->shuxue<0||p1->shuxue>100)
{getchar();
printf("輸入錯誤,請重新輸入數學成績");
scanf("%f",&p1->shuxue);}
/*輸入錯誤,重新輸入數學成績直到正確為止*/
}
end: p1=head;
p3=p1;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;
if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
/*交換前后結點中的學號值,使得學號大者移到后面的結點中*/
strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
/*交換前后結點中的姓名,使之與學號相匹配*/
fen=max->yuwen;
max->yuwen=p1->yuwen;
p1->yuwen=fen;
/*交換前后結點中的語文成績,使之與學號相匹配*/
fen=max->yingyu;
max->yingyu=p1->yingyu;
p1->yingyu=fen;
/*交換前后結點中的英語成績,使之與學號相匹配*/
fen=max->shuxue;
max->shuxue=p1->shuxue;
p1->shuxue=fen;
/*交換前后結點中的數學成績,使之與學號相匹配*/
}
}
max=head;p1=head;
/*重新使max,p指向鏈表頭*/
}
p2->next=NULL;
/*鏈表結尾*/
printf("輸入的學生數為:%d個!\n",n);
return(head);
}
/*==============================================================================================*/
/*==============================================================================================*/
score *load2311(score *head)
/*函數load2311,功能:從文件讀入學生記錄*/
{ score *p1,*p2;
int m=0;
char filepn[10];
FILE *fp;
printf("請輸入文件路徑及文件名:");
scanf("%s",filepn);/*輸入文件路徑及名稱*/
if((fp=fopen(filepn,"r+"))==NULL)
{
printf("不能打開文件!\n");
return 0;
}
fscanf(fp," 考試成績管理系統 \n");
fscanf(fp,"作者:董鵬飛 班級: 信息計3 學號:10 \n");
fscanf(fp,"-----------------------------------------\n");
fscanf(fp,"|學號\t|姓名\t|語文\t|英語\t|數學\t|\n");
fscanf(fp,"-----------------------------------------\n");/*讀入表格域*/
printf(" 考試成績管理系統 \n");
printf(" 作者:董鵬飛 班級: 信息計3 學號:10 \n");
printf("-----------------------------------------\n");
printf("|學號\t|姓名\t|語文\t|英語\t|數學\t|\n");
printf("-----------------------------------------\n");/*打印表格域*/
m=m+1;
if(m==1)
{
p1=(score *)malloc(LEN);
/*開辟一個新單元*/
fscanf(fp,"%d%s%f%f%f",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue);
/*文件讀入與顯示*/
head=NULL;
do
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(score *)malloc(LEN);
/*開辟一個新單元*/
fscanf(fp,"%d%s%f%f%f\n",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue);
/*文件讀入與顯示*/
}while(!feof(fp));
p2->next=p1;
p1->next=NULL;
n=n+1;
}printf("-----------------------------------------\n");
/*表格下線*/
fclose(fp);
/*結束讀入,關閉文件*/
return (head);
}
/*==============================================================================================*/
/*==============================================================================================*/
score *add2311(score *head,score *stu)
/*函數add2311,功能:追加學生資料,并且將所有學生資料按學號排序*/
{
score *p0,*p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];
p3=stu=(score *)malloc(LEN);/*開辟一個新單元*/
printf("\n輸入要增加的學生的資料!");
repeat4: printf("請輸入學生學號(學號應大于0):");
scanf("%d",&stu->number);
/*輸入學號,學號應大于0*/
while(stu->number<0)
{getchar();
printf("輸入錯誤,請重新輸入學生學號:");
scanf("%d",&stu->number);}
/*輸入錯誤,重新輸入學號*/
/******************************************************/
if(stu->number==0)
goto end2;
/*當輸入的學號為0時,轉到末尾,結束追加*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(stu->number!=p3->number)
p3=p3->next;
else
{printf("學號重復,請重輸!\n");
goto repeat4;
/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/
}
}
}
}
/******************************************************/
printf("輸入學生姓名:");
scanf("%s",stu->name);
/*輸入學生姓名*/
printf("請輸入語文成績(0~100):");
scanf("%f",&stu->yuwen);
/*輸入語文成績,成績應在0-100*/
while(stu->yuwen<0||stu->yuwen>100)
{getchar();
printf("輸入錯誤,請重新輸入語文成績");
scanf("%f",&stu->yuwen);}
/*輸入錯誤,重新輸入語文成績直到正確為止*/
printf("請輸入英語成績(0~100):");
scanf("%f",&stu->yingyu);
/*輸入英語成績,成績應在0-100*/
while(stu->yingyu<0||stu->yingyu>100)
{getchar();
printf("輸入錯誤,請重新輸入英語成績");
scanf("%f",&stu->yingyu);}
/*輸入錯誤,重新輸入英語成績直到正確為止*/
printf("請輸入數學成績(0~100):");
scanf("%f",&stu->shuxue);
/*輸入數學成績,成績應在0-100*/
while(stu->shuxue<0||stu->shuxue>100)
{getchar();
printf("輸入錯誤,請重新輸入數學成績");
scanf("%f",&stu->shuxue);}
/*輸入錯誤,重新輸入數學成績直到正確為止*/
p1=head;
p0=stu;
if(head==NULL)
{head=p0;p0->next=NULL;}
/*當原來鏈表為空時,從首結點開始存放資料*/
else/*原來鏈表不為空*/
{
if(p1->next==NULL)
/*找到原來鏈表的末尾*/
{
p1->next=p0;
p0->next=NULL;
/*將它與新開單元相連接*/
}
else
{
while(p1->next!=NULL)
/*還沒找到末尾,繼續找*/
{
p2=p1;p1=p1->next;
}
p1->next=p0;
p0->next=NULL;
}
}
n=n+1;
p1=head;
p0=stu;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;
if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
/*交換前后結點中的學號值,使得學號大者移到后面的結點中*/
strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
/*交換前后結點中的姓名,使之與學號相匹配*/
fen=max->yuwen;
max->yuwen=p1->yuwen;
p1->yuwen=fen;
/*交換前后結點中的語文成績,使之與學號相匹配*/
fen=max->yingyu;
max->yingyu=p1->yingyu;
p1->yingyu=fen;
/*交換前后結點中的英語成績,使之與學號相匹配*/
fen=max->shuxue;
max->shuxue=p1->shuxue;
p1->shuxue=fen;
/*交換前后結點中的數學成績,使之與學號相匹配*/
}
}
max=head;p1=head;
/*重新使max,p指向鏈表頭*/
} end2:
printf("現在的學生數為:%d個!\n",n);
return(head);
}
/*==============================================================================================*/
/*==============================================================================================*/
score *search2311(score *head)
/*函數search2311,功能:查詢學生成績*/
{int number;
score *p1,*p2;
printf("輸入要查詢的學生的學號,");
scanf("%d",&number);
while(number!=0)
{
if(head==NULL)
{printf("\n沒有任何學生資料!\n");return(head);}
printf("-----------------------------------------\n");
printf("|學號\t|姓名\t|語文\t|英語\t|數學\t|\n");
printf("-----------------------------------------\n");
/*打印表格域*/
p1=head;
while(number!=p1->number&&p1->next!=NULL)
{p2=p1;p1=p1->next;}
if(number==p1->number)
{printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue);
printf("-----------------------------------------\n");}
/*打印表格域*/
else
printf("%d不存在此學生!\n",number);
printf("輸入要查詢的學生的學號,");
scanf("%d",&number);
}
printf("已經退出了!\n");
return(head);}
/*==============================================================================================*/
/*==============================================================================================*/
score *del2311(score *head)
/*函數del2311,功能:刪除學生資料*/
{
score *p1,*p2;
int number;
printf("輸入要刪除的學生的學號(輸入0時退出):");
scanf("%d",&number);
getchar();
while(number!=0)
/*輸入學號為0時退出*/
{
if(head==NULL)
{
printf("\n沒有任何學生資料!\n");
return(head);
}
p1=head;
while(number!=p1->number&&p1->next!=NULL)
/*p1指向的不是所要找的首結點,并且后面還有結點*/
{
p2=p1;p1=p1->next;
} /*p1后移一個結點*/
if(number==p1->number)
/*找到了*/
{
if(p1==head)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -