這次改寫了一些地方:
1:加入文件讀寫;
2:異常處理(效果是!但不是C標准庫的異常處理函數setjmp,longjmp);
3:其他一些小地方改寫;
看代碼:
[cpp]
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
typedef struct L
{
char Name[30];
long long Num;
float English;
float C_language;
struct L *Next;
}*Node;
void Menu(); //功能菜單
void Search(Node p); //查找
void Name_Search(Node p); //按姓名查找
void Num_Search(Node p); //按學號查找
void Initialization(Node p); //初始化表
void Add(Node p); // 添加
void Insert(Node p); //插入
void Delet(Node p); //刪除
void Show(Node p); //顯示
void Sort(Node p); //排序
void C_Sort(Node p); //c成績排序
void En_Sort(Node p); //英語成績排序
void Num_Sort(Node p); // 學號排序
void All_Sort(Node p); //總成績排序
void Most(Node p); //最大值
void DelName(Node p); //按姓名刪除
void DelNum(Node p); //按學號刪除
void Modify(Node p); //修改
void Num_Modify(Node p); //按學號修改
void Name_Modify(Node p); //按姓名修改
void Menu1(); //菜單
void Explanation(); //說明
void Import(Node p); //從文件導入數據
void Export(Node p); //將數據導入到外部文件中
int main()
{
Node p=new struct L;
system("color 1a");
Initialization(p);
Menu();
printf("\t選擇:\n");
printf("\t");
int m;
while(true)
{
scanf("%d",&m);
if(m==11)
{
Explanation();
getch();
system("cls");
break;
}
else
{
printf("\t請先看說明!\n");
printf("\t");
}
}
Menu1();
printf("\t選擇:\n");
printf("\t");
int n;
while(scanf("%d",&n)!=EOF)
{
switch(n)
{
case 1:
Add(p);fflush(stdin);break;
case 2:
Show(p);fflush(stdin);break;
case 3:
Insert(p);fflush(stdin);break;
case 4:
Sort(p);fflush(stdin);break;
case 5:
Delet(p);fflush(stdin);break;
case 6:
Search(p);fflush(stdin);break;
case 7:
Modify(p);fflush(stdin);break;
case 8:
fflush(stdin);return 0;
case 9:
Export(p);fflush(stdin);break;
case 10:
Import(p);fflush(stdin);break;
case 11:
Explanation();fflush(stdin);break;
default :
fflush(stdin);printf("\t沒有該選項:\n");break;
}
getch();
printf("\t");
system("cls");
Menu1();
printf("\t選擇:\n");
printf("\t");
}
return 0;
}
void Menu()
{
printf("\n");
printf("\t 成績管理系統 \3\n");
printf(" --------------------------------------\n");
printf("\t|\t1:添加\t |\t2:輸出\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t3:插入\t |\t4:排序\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t5:刪除\t |\t6:查詢\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t7:修改\t |\t8:退出\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t9:寫出到文件\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t10:導入從文件\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t11:說明(必看!)\t |\n");
printf(" --------------------------------------\n");
printf("\t");
printf("\n");
}
void Initialization(Node p)
{
p->Next=NULL;
p->Num=0;
}
void Add(Node p)
{
long long a;
float b,c;
char na[30];
while(p->Next!=NULL)
{
p=p->Next;
}
Node q=(Node)malloc(sizeof(struct L));
printf("\t輸入姓名:\n");
printf("\t");
scanf("%s",&na);
printf("\t輸入學號:\n");
printf("\t");
if(scanf("%lld",&a)==0)
{
printf("\t輸入類型與要求不符合,添加失敗!!\n");
getch();
return ;
}
q->Num=a;
printf("\t輸入英語成績:\n");
printf("\t");
if(scanf("%f",&b)==0)
{
printf("\t輸入類型與要求不符合,添加失敗!!\n");
getch();
return ;
}
q->English=b;
printf("\t輸入C語言成績:\n");
printf("\t");
if(scanf("%f",&c)==0)
{
printf("\t輸入類型與要求不符合,添加失敗!!\n");
getch();
return ;
}
q->C_language=c;
strcpy(q->Name,na);
p->Next=q;
q->Next=NULL;
printf("\t添加成功!\n");
p->Num++;
getch();
}
void Insert(Node p)
{
p->Num++;
printf("\t輸入插入位置:\n");
int n;
printf("\t");
scanf("%d",&n);
if(n<=0)
{
printf("位置錯誤!\n");
return;
}
n-=1;
while(n--)
{
p=p->Next;
}
Node q=(Node)malloc(sizeof(struct L));
printf("\t輸入姓名:\n");
scanf("%s",&q->Name);
printf("\t輸入學號:\n");
scanf("%lld",&q->Num);
printf("\t輸入英語成績:\n");
scanf("%f",&q->English);
printf("\t輸入C語言成績:\n");
scanf("%f",&q->C_language);
q->Next=p->Next;
p->Next=q;
printf("\t插入成功!\n");
getch();
}
void Delet(Node p)
{
if(p->Num==0)
{
printf("\t沒有可刪除的數據!\n");
return;
}
p->Num--;
printf("\t選擇:\n");
printf("\t1:按姓名刪除:\n");
printf("\t2:按學號刪除:\n");
int n;
printf("\t");
scanf("%d",&n);
switch(n)
{
case 1:DelName(p);break;
case 2:DelNum(p);break;
default:printf("\t無此選擇!\n");break;
}
printf("\t刪除成功!\n");
getch();
}
void DelName(Node p)
{
char s[30];
printf("\t輸入姓名:\n");
printf("\t");
scanf("%s",&s);
Node q=p;
for(q=q->Next;q->Next!=NULL;q=q->Next,p=p->Next)
{
if(!strcmp(q->Name,s))
{
p->Next=p->Next->Next;
}
}
getch();
}
void DelNum(Node p)
{
long long n;
printf("\t輸入學號:\n");
printf("\t");
scanf("%lld",&n);
Node q=p;
for(q=q->Next;q->Next!=NULL;q=q->Next,p=p->Next)
{
if(q->Num==n)
{
p->Next=p->Next->Next;
}
}
getch();
}
void Show(Node p)
{
if(p->Num==0)
{
printf("\t沒有可顯示的數據!\n");
return;
}
int len=p->Num;
p=p->Next;
for(int i=0;i<len;++i)
{
printf(" -------------------------------------------------\n");
printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
printf(" -------------------------------------------------\n");
printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
printf(" -------------------------------------------------\n");
printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
printf(" -------------------------------------------------\n");
printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
printf(" -------------------------------------------------\n");
printf("\t|\t總分:\t\t|\t%.2f\n",p->English+p->C_language);
printf(" -------------------------------------------------\n");
printf("\n");
p=p->Next;
}
printf("\t顯示完!\n");
getch();
}
void C_Sort(Node p)
{
Node x,y;
int len=p->Num;
for(int i=0;i<len;++i)
{
p=p->Next;
x=p;
y=p->Next;
for(int j=i+1;j<len;++j)
{
if(x->C_language>y->C_language)
{
x=y;
}
y=y->Next;
}
float a,b;
long long w;
char s[30];
w=x->Num;
x->Num=p->Num;
p->Num=w;
strcpy(s,x->Name);
strcpy(x->Name,p->Name);
strcpy(p->Name,s);
a=x->C_language;
x->C_language=p->C_language;
p->C_language=a;
b=x->English;
x->English=p->English;
p->English=b;
}
printf("\t排序成功!\n");
getch();
}
void Sort(Node p)
{
if(p->Num==0)
{
printf("\t沒有可排序的數據!\n");
return;
}
printf(" \t選擇:\n");
printf(" \t1:C語言成績從小到大排序:\n");
printf(" \t2:英語成績從小到大排序:\n");
printf(" \t3:總成績從小到大排序:\n");
printf(" \t4:學號從小到大排序:\n");
int n;
printf("\t");
scanf("%d",&n);
switch(n)
{
case 1:C_Sort(p);break;
case 2:En_Sort(p);break;
case 3:All_Sort(p);break;
case 4:Num_Sort(p);break;
default:printf("\t無此選擇!\n");break;
}
getch();
}
void En_Sort(Node p)
{
Node x,y;
int len=p->Num;
for(int i=0;i<len;++i)
{
p=p->Next;
x=p;
y=p->Next;
for(int j=i+1;j<len;++j)
{
if(x->English>y->English)
{
x=y;
}
y=y->Next;
}
float a,b;
char s[30];
long long w;
w=x->Num;
x->Num=p->Num;
p->Num=w;
strcpy(s,x->Name);
strcpy(x->Name,p->Name);
strcpy(p->Name,s);
a=x->C_language;
x->C_language=p->C_language;
p->C_language=a;
b=x->English;
x->English=p->English;
p->English=b;
}
printf("\t排序成功!\n");
getch();
}
void Search(Node p)
{
if(p->Num==0)
{
printf("\t沒有可查找的數據!\n");
return;
}
printf(" \t選擇:\n");
printf(" \t1:按姓名查詢:\n");
printf(" \t2:按學號查詢:\n");
int n;
printf("\t");
scanf("%d",&n);
switch(n)
{
case 1:Name_Search(p);break;
case 2:Num_Search(p);break;
default:printf("\t無此選擇!\n");break;
}
getch();
}
void Name_Search(Node p)
{
char ap[30];
printf("\t輸入姓名:\n");
printf("\t");
scanf("%s",&ap);
int len=p->Num;
p=p->Next;
int i;
for(i=0;i<len;++i)
{
if(!strcmp(ap,p->Name))
{
printf(" -------------------------------------------------\n");
printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
printf(" -------------------------------------------------\n");
printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
printf(" -------------------------------------------------\n");
printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
printf(" -------------------------------------------------\n");
printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
printf(" -------------------------------------------------\n");
printf("\t|\t總分:\t\t|\t%.2f\n",p->English+p->C_language);
printf(" -------------------------------------------------\n");
break;
}
p=p->Next;
}
if(i>=len)
{
printf("\t沒有找到該學生!\n");
}
getch();
}
void Num_Search(Node p)
{
long long sd;
printf("\t輸入學號:\n");
printf("\t");
scanf("%lld",&sd);
int len=p->Num;
p=p->Next;
int i;
for(i=0;i<len;++i)
{
if(sd==p->Num)
{
printf(" -------------------------------------------------\n");
printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
printf(" -------------------------------------------------\n");
printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
printf(" -------------------------------------------------\n");
printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
printf(" -------------------------------------------------\n");
printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
printf(" -------------------------------------------------\n");
printf("\t|\t總分:\t\t|\t%.2f\n",p->English+p->C_language);
printf(" -------------------------------------------------\n");
break;
}
p=p->Next;
}
if(i>=len)
{
printf("\t沒有找到該學生!\n");
}
getch();
}
void Modify(Node p)
{
if(p->Num==0)
{
printf("\t沒有可修改的數據!\n");
return;
}
printf(" \t選擇:\n");
printf(" \t1:輸入姓名修改:\n");
printf(" \t2:輸入學號修改:\n");
int n;
printf("\t");
scanf("%d",&n);
switch(n)
{
case 1:Name_Modify(p);break;
case 2:Num_Modify(p);break;
default:printf("\t無此選擇!\n");break;
}
getch();
}
void Num_Modify(Node p)
{
long long sd;
printf("\t輸入學號:\n");
printf("\t");
scanf("%lld",&sd);
int len=p->Num;
p=p->Next;
int i;
for(i=0;i<len;++i)
{
if(sd==p->Num)
{
printf(" -------------------------------------------------\n");
printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
printf(" -------------------------------------------------\n");
printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
printf(" -------------------------------------------------\n");
printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
printf(" -------------------------------------------------\n");
printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
printf(" -------------------------------------------------\n");
printf("\t這是之前的數據!\n");
printf("\t現在請更改!\n");
printf("\t輸入姓名:\n");
printf("\t");
scanf("%s",&p->Name);
printf("\t輸入學號:\n");
printf("\t");
scanf("%lld",&p->Num);
printf("\t輸入英語成績:\n");
printf("\t");
scanf("%f",&p->English);
printf("\t輸入C語言成績:\n");
printf("\t");
scanf("%f",&p->C_language);
printf("\t修改成功!\n");
getch();
break;
}
p=p->Next;
}
if(i>=len)
{
printf("\t沒有找到該學生!\n");
}
getch();
}
void Name_Modify(Node p)
{
char ap[30];
printf("\t輸入姓名:\n");
printf("\t");
scanf("%s",&ap);
int len=p->Num;
p=p->Next;
int i;
for(i=0;i<len;++i)
{
if(!strcmp(ap,p->Name))
{
printf(" -------------------------------------------------\n");
printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
printf(" -------------------------------------------------\n");
printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
printf(" -------------------------------------------------\n");
printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
printf(" -------------------------------------------------\n");
printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
printf(" -------------------------------------------------\n");
printf("\t這是之前的數據!\n");
printf("\t現在請更改!\n");
printf("\t輸入姓名:\n");
printf("\t");
scanf("%s",&p->Name);
printf("\t輸入學號:\n");
printf("\t");
scanf("%lld",&p->Num);
printf("\t輸入英語成績:\n");
printf("\t");
scanf("%f",&p->English);
printf("\t輸入C語言成績:\n");
printf("\t");
scanf("%f",&p->C_language);
printf("\t修改成功!\n");
getch();
break;
}
p=p->Next;
}
if(i>=len)
{
printf("\t沒有找到該學生!\n");
}
getch();
}
void All_Sort(Node p)
{
Node x,y;
int len=p->Num;
for(int i=0;i<len;++i)
{
p=p->Next;
x=p;
y=p->Next;
for(int j=i+1;j<len;++j)
{
if((x->English+x->C_language)>(y->English+y->C_language))
{
x=y;
}
y=y->Next;
}
float a,b;
char s[30];
long long w;
w=x->Num;
x->Num=p->Num;
p->Num=w;
strcpy(s,x->Name);
strcpy(x->Name,p->Name);
strcpy(p->Name,s);
a=x->C_language;
x->C_language=p->C_language;
p->C_language=a;
b=x->English;
x->English=p->English;
p->English=b;
}
printf("\t排序成功!\n");
getch();
}
void Num_Sort(Node p)
{
Node x,y;
int len=p->Num;
for(int i=0;i<len;++i)
{
p=p->Next;
x=p;
y=p->Next;
for(int j=i+1;j<len;++j)
{
if(x->Num>y->Num)
{
x=y;
}
y=y->Next;
}
float a,b;
char s[30];
long long w;
w=x->Num;
x->Num=p->Num;
p->Num=w;
strcpy(s,x->Name);
strcpy(x->Name,p->Name);
strcpy(p->Name,s);
a=x->C_language;
x->C_language=p->C_language;
p->C_language=a;
b=x->English;
x->English=p->English;
p->English=b;
}
printf("\t排序成功!\n");
getch();
}
void Menu1()
{
system("color 1a");
printf("\n");
printf("\t 成績管理系統 \3\n");
printf(" --------------------------------------\n");
printf("\t|\t1:添加\t |\t2:輸出\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t3:插入\t |\t4:排序\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t5:刪除\t |\t6:查詢\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t7:修改\t |\t8:退出\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t9:寫出到文件\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t10:導入從文件\t |\n");
printf(" --------------------------------------\n");
printf("\t");
printf("\n");
}
void Explanation()
{
system("cls");
system("color 07");
printf("------------------------------------------------------------------\n");
printf("\t在編寫過程中有很多地方使用了getch停頓\n");
printf("------------------------------------------------------------------\n");
printf("\t所以經常回車要按兩次!也要看情況,有些地方一次就行了\n");
printf("------------------------------------------------------------------\n");
printf("\t如果按了一次回車沒有反應,那就在按一次,\n");
printf("------------------------------------------------------------------\n");
printf("\t在輸入文件地址的時候要輸入絕對地址\n");
printf("------------------------------------------------------------------\n");
printf("\t在win7下要在C盤寫文件需要用管理員權限.\n");
printf("------------------------------------------------------------------\n");
printf("\t");
getch();
}
void Import(Node p)
{
printf("\t警告:此操作將使用文件中的數據覆蓋此時內存中的緩存數據!!\n");
char ch;
printf("\n");
printf("\t是否替換!(y/n)\n");
fflush(stdin);
printf("\t");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
p->Num=0;
FILE * a1;
char lujing[100];
printf("\t輸入要導入文件的路徑!\n");
fflush(stdin);
printf("\t");
gets(lujing);
a1=fopen(lujing,"rb");
if(a1==NULL)
{
printf("\t打開文件失敗,導入數據失敗!\n");
return ;
}
Node q=p;
while(!feof(a1))
{
p->Num++;
Node NEW =new struct L;
fscanf(a1,"%s%lld%f%f",NEW->Name,&NEW->Num,&NEW->English,&NEW->C_language);
q->Next=NEW;
NEW->Next=NULL;
q=q->Next;
}
p->Num--;
printf("\t操作成功!\n");
fclose(a1);
getch();
return ;
}
else if(ch=='n'||ch=='N')
{
printf("\t操作被取消!\n");
getch();
return ;
}
else
{
printf("\t輸入有誤!\n");
getch();
return ;
}
}
void Export(Node p)
{
printf("\t警告:此操作將覆蓋源文件中的數據!!\n");
char ch;
printf("\n");
printf("\t是否替換!(y/n)\n");
fflush(stdin);
printf("\t");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
FILE * a1;
char lujing[100];
printf("\t輸入要導出文件的路徑!\n");
fflush(stdin);
printf("\t");
gets(lujing);
a1=fopen(lujing,"wb");
if(a1==NULL)
{
printf("\t打開文件失敗,導出數據失敗!\n");
return ;
}
int len=p->Num;
for(int i=0;i<len;++i)
{
p=p->Next;
fprintf(a1,"%s %lld %.2f %.2f\n",p->Name,p->Num,p->English,p->C_language);
}
printf("\t操作成功!\n");
fclose(a1);
getch();
return ;
}
else if(ch=='n'||ch=='N')
{
printf("\t操作被取消!\n");
getch();
return ;
}
else
{
printf("\t輸入有誤!\n");
getch();
return ;
}
}
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
typedef struct L
{
char Name[30];
long long Num;
float English;
float C_language;
struct L *Next;
}*Node;
void Menu(); //功能菜單
void Search(Node p); //查找
void Name_Search(Node p); //按姓名查找
void Num_Search(Node p); //按學號查找
void Initialization(Node p); //初始化表
void Add(Node p); // 添加
void Insert(Node p); //插入
void Delet(Node p); //刪除
void Show(Node p); //顯示
void Sort(Node p); //排序
void C_Sort(Node p); //c成績排序
void En_Sort(Node p); //英語成績排序
void Num_Sort(Node p); // 學號排序
void All_Sort(Node p); //總成績排序
void Most(Node p); //最大值
void DelName(Node p); //按姓名刪除
void DelNum(Node p); //按學號刪除
void Modify(Node p); //修改
void Num_Modify(Node p); //按學號修改
void Name_Modify(Node p); //按姓名修改
void Menu1(); //菜單
void Explanation(); //說明
void Import(Node p); //從文件導入數據
void Export(Node p); //將數據導入到外部文件中
int main()
{
Node p=new struct L;
system("color 1a");
Initialization(p);
Menu();
printf("\t選擇:\n");
printf("\t");
int m;
while(true)
{
scanf("%d",&m);
if(m==11)
{
Explanation();
getch();
system("cls");
break;
}
else
{
printf("\t請先看說明!\n");
printf("\t");
}
}
Menu1();
printf("\t選擇:\n");
printf("\t");
int n;
while(scanf("%d",&n)!=EOF)
{
switch(n)
{
case 1:
Add(p);fflush(stdin);break;
case 2:
Show(p);fflush(stdin);break;
case 3:
Insert(p);fflush(stdin);break;
case 4:
Sort(p);fflush(stdin);break;
case 5:
Delet(p);fflush(stdin);break;
case 6:
Search(p);fflush(stdin);break;
case 7:
Modify(p);fflush(stdin);break;
case 8:
fflush(stdin);return 0;
case 9:
Export(p);fflush(stdin);break;
case 10:
Import(p);fflush(stdin);break;
case 11:
Explanation();fflush(stdin);break;
default :
fflush(stdin);printf("\t沒有該選項:\n");break;
}
getch();
printf("\t");
system("cls");
Menu1();
printf("\t選擇:\n");
printf("\t");
}
return 0;
}
void Menu()
{
printf("\n");
printf("\t 成績管理系統 \3\n");
printf(" --------------------------------------\n");
printf("\t|\t1:添加\t |\t2:輸出\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t3:插入\t |\t4:排序\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t5:刪除\t |\t6:查詢\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t7:修改\t |\t8:退出\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t9:寫出到文件\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t10:導入從文件\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t11:說明(必看!)\t |\n");
printf(" --------------------------------------\n");
printf("\t");
printf("\n");
}
void Initialization(Node p)
{
p->Next=NULL;
p->Num=0;
}
void Add(Node p)
{
long long a;
float b,c;
char na[30];
while(p->Next!=NULL)
{
p=p->Next;
}
Node q=(Node)malloc(sizeof(struct L));
printf("\t輸入姓名:\n");
printf("\t");
scanf("%s",&na);
printf("\t輸入學號:\n");
printf("\t");
if(scanf("%lld",&a)==0)
{
printf("\t輸入類型與要求不符合,添加失敗!!\n");
getch();
return ;
}
q->Num=a;
printf("\t輸入英語成績:\n");
printf("\t");
if(scanf("%f",&b)==0)
{
printf("\t輸入類型與要求不符合,添加失敗!!\n");
getch();
return ;
}
q->English=b;
printf("\t輸入C語言成績:\n");
printf("\t");
if(scanf("%f",&c)==0)
{
printf("\t輸入類型與要求不符合,添加失敗!!\n");
getch();
return ;
}
q->C_language=c;
strcpy(q->Name,na);
p->Next=q;
q->Next=NULL;
printf("\t添加成功!\n");
p->Num++;
getch();
}
void Insert(Node p)
{
p->Num++;
printf("\t輸入插入位置:\n");
int n;
printf("\t");
scanf("%d",&n);
if(n<=0)
{
printf("位置錯誤!\n");
return;
}
n-=1;
while(n--)
{
p=p->Next;
}
Node q=(Node)malloc(sizeof(struct L));
printf("\t輸入姓名:\n");
scanf("%s",&q->Name);
printf("\t輸入學號:\n");
scanf("%lld",&q->Num);
printf("\t輸入英語成績:\n");
scanf("%f",&q->English);
printf("\t輸入C語言成績:\n");
scanf("%f",&q->C_language);
q->Next=p->Next;
p->Next=q;
printf("\t插入成功!\n");
getch();
}
void Delet(Node p)
{
if(p->Num==0)
{
printf("\t沒有可刪除的數據!\n");
return;
}
p->Num--;
printf("\t選擇:\n");
printf("\t1:按姓名刪除:\n");
printf("\t2:按學號刪除:\n");
int n;
printf("\t");
scanf("%d",&n);
switch(n)
{
case 1:DelName(p);break;
case 2:DelNum(p);break;
default:printf("\t無此選擇!\n");break;
}
printf("\t刪除成功!\n");
getch();
}
void DelName(Node p)
{
char s[30];
printf("\t輸入姓名:\n");
printf("\t");
scanf("%s",&s);
Node q=p;
for(q=q->Next;q->Next!=NULL;q=q->Next,p=p->Next)
{
if(!strcmp(q->Name,s))
{
p->Next=p->Next->Next;
}
}
getch();
}
void DelNum(Node p)
{
long long n;
printf("\t輸入學號:\n");
printf("\t");
scanf("%lld",&n);
Node q=p;
for(q=q->Next;q->Next!=NULL;q=q->Next,p=p->Next)
{
if(q->Num==n)
{
p->Next=p->Next->Next;
}
}
getch();
}
void Show(Node p)
{
if(p->Num==0)
{
printf("\t沒有可顯示的數據!\n");
return;
}
int len=p->Num;
p=p->Next;
for(int i=0;i<len;++i)
{
printf(" -------------------------------------------------\n");
printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
printf(" -------------------------------------------------\n");
printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
printf(" -------------------------------------------------\n");
printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
printf(" -------------------------------------------------\n");
printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
printf(" -------------------------------------------------\n");
printf("\t|\t總分:\t\t|\t%.2f\n",p->English+p->C_language);
printf(" -------------------------------------------------\n");
printf("\n");
p=p->Next;
}
printf("\t顯示完!\n");
getch();
}
void C_Sort(Node p)
{
Node x,y;
int len=p->Num;
for(int i=0;i<len;++i)
{
p=p->Next;
x=p;
y=p->Next;
for(int j=i+1;j<len;++j)
{
if(x->C_language>y->C_language)
{
x=y;
}
y=y->Next;
}
float a,b;
long long w;
char s[30];
w=x->Num;
x->Num=p->Num;
p->Num=w;
strcpy(s,x->Name);
strcpy(x->Name,p->Name);
strcpy(p->Name,s);
a=x->C_language;
x->C_language=p->C_language;
p->C_language=a;
b=x->English;
x->English=p->English;
p->English=b;
}
printf("\t排序成功!\n");
getch();
}
void Sort(Node p)
{
if(p->Num==0)
{
printf("\t沒有可排序的數據!\n");
return;
}
printf(" \t選擇:\n");
printf(" \t1:C語言成績從小到大排序:\n");
printf(" \t2:英語成績從小到大排序:\n");
printf(" \t3:總成績從小到大排序:\n");
printf(" \t4:學號從小到大排序:\n");
int n;
printf("\t");
scanf("%d",&n);
switch(n)
{
case 1:C_Sort(p);break;
case 2:En_Sort(p);break;
case 3:All_Sort(p);break;
case 4:Num_Sort(p);break;
default:printf("\t無此選擇!\n");break;
}
getch();
}
void En_Sort(Node p)
{
Node x,y;
int len=p->Num;
for(int i=0;i<len;++i)
{
p=p->Next;
x=p;
y=p->Next;
for(int j=i+1;j<len;++j)
{
if(x->English>y->English)
{
x=y;
}
y=y->Next;
}
float a,b;
char s[30];
long long w;
w=x->Num;
x->Num=p->Num;
p->Num=w;
strcpy(s,x->Name);
strcpy(x->Name,p->Name);
strcpy(p->Name,s);
a=x->C_language;
x->C_language=p->C_language;
p->C_language=a;
b=x->English;
x->English=p->English;
p->English=b;
}
printf("\t排序成功!\n");
getch();
}
void Search(Node p)
{
if(p->Num==0)
{
printf("\t沒有可查找的數據!\n");
return;
}
printf(" \t選擇:\n");
printf(" \t1:按姓名查詢:\n");
printf(" \t2:按學號查詢:\n");
int n;
printf("\t");
scanf("%d",&n);
switch(n)
{
case 1:Name_Search(p);break;
case 2:Num_Search(p);break;
default:printf("\t無此選擇!\n");break;
}
getch();
}
void Name_Search(Node p)
{
char ap[30];
printf("\t輸入姓名:\n");
printf("\t");
scanf("%s",&ap);
int len=p->Num;
p=p->Next;
int i;
for(i=0;i<len;++i)
{
if(!strcmp(ap,p->Name))
{
printf(" -------------------------------------------------\n");
printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
printf(" -------------------------------------------------\n");
printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
printf(" -------------------------------------------------\n");
printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
printf(" -------------------------------------------------\n");
printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
printf(" -------------------------------------------------\n");
printf("\t|\t總分:\t\t|\t%.2f\n",p->English+p->C_language);
printf(" -------------------------------------------------\n");
break;
}
p=p->Next;
}
if(i>=len)
{
printf("\t沒有找到該學生!\n");
}
getch();
}
void Num_Search(Node p)
{
long long sd;
printf("\t輸入學號:\n");
printf("\t");
scanf("%lld",&sd);
int len=p->Num;
p=p->Next;
int i;
for(i=0;i<len;++i)
{
if(sd==p->Num)
{
printf(" -------------------------------------------------\n");
printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
printf(" -------------------------------------------------\n");
printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
printf(" -------------------------------------------------\n");
printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
printf(" -------------------------------------------------\n");
printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
printf(" -------------------------------------------------\n");
printf("\t|\t總分:\t\t|\t%.2f\n",p->English+p->C_language);
printf(" -------------------------------------------------\n");
break;
}
p=p->Next;
}
if(i>=len)
{
printf("\t沒有找到該學生!\n");
}
getch();
}
void Modify(Node p)
{
if(p->Num==0)
{
printf("\t沒有可修改的數據!\n");
return;
}
printf(" \t選擇:\n");
printf(" \t1:輸入姓名修改:\n");
printf(" \t2:輸入學號修改:\n");
int n;
printf("\t");
scanf("%d",&n);
switch(n)
{
case 1:Name_Modify(p);break;
case 2:Num_Modify(p);break;
default:printf("\t無此選擇!\n");break;
}
getch();
}
void Num_Modify(Node p)
{
long long sd;
printf("\t輸入學號:\n");
printf("\t");
scanf("%lld",&sd);
int len=p->Num;
p=p->Next;
int i;
for(i=0;i<len;++i)
{
if(sd==p->Num)
{
printf(" -------------------------------------------------\n");
printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
printf(" -------------------------------------------------\n");
printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
printf(" -------------------------------------------------\n");
printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
printf(" -------------------------------------------------\n");
printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
printf(" -------------------------------------------------\n");
printf("\t這是之前的數據!\n");
printf("\t現在請更改!\n");
printf("\t輸入姓名:\n");
printf("\t");
scanf("%s",&p->Name);
printf("\t輸入學號:\n");
printf("\t");
scanf("%lld",&p->Num);
printf("\t輸入英語成績:\n");
printf("\t");
scanf("%f",&p->English);
printf("\t輸入C語言成績:\n");
printf("\t");
scanf("%f",&p->C_language);
printf("\t修改成功!\n");
getch();
break;
}
p=p->Next;
}
if(i>=len)
{
printf("\t沒有找到該學生!\n");
}
getch();
}
void Name_Modify(Node p)
{
char ap[30];
printf("\t輸入姓名:\n");
printf("\t");
scanf("%s",&ap);
int len=p->Num;
p=p->Next;
int i;
for(i=0;i<len;++i)
{
if(!strcmp(ap,p->Name))
{
printf(" -------------------------------------------------\n");
printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
printf(" -------------------------------------------------\n");
printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
printf(" -------------------------------------------------\n");
printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
printf(" -------------------------------------------------\n");
printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
printf(" -------------------------------------------------\n");
printf("\t這是之前的數據!\n");
printf("\t現在請更改!\n");
printf("\t輸入姓名:\n");
printf("\t");
scanf("%s",&p->Name);
printf("\t輸入學號:\n");
printf("\t");
scanf("%lld",&p->Num);
printf("\t輸入英語成績:\n");
printf("\t");
scanf("%f",&p->English);
printf("\t輸入C語言成績:\n");
printf("\t");
scanf("%f",&p->C_language);
printf("\t修改成功!\n");
getch();
break;
}
p=p->Next;
}
if(i>=len)
{
printf("\t沒有找到該學生!\n");
}
getch();
}
void All_Sort(Node p)
{
Node x,y;
int len=p->Num;
for(int i=0;i<len;++i)
{
p=p->Next;
x=p;
y=p->Next;
for(int j=i+1;j<len;++j)
{
if((x->English+x->C_language)>(y->English+y->C_language))
{
x=y;
}
y=y->Next;
}
float a,b;
char s[30];
long long w;
w=x->Num;
x->Num=p->Num;
p->Num=w;
strcpy(s,x->Name);
strcpy(x->Name,p->Name);
strcpy(p->Name,s);
a=x->C_language;
x->C_language=p->C_language;
p->C_language=a;
b=x->English;
x->English=p->English;
p->English=b;
}
printf("\t排序成功!\n");
getch();
}
void Num_Sort(Node p)
{
Node x,y;
int len=p->Num;
for(int i=0;i<len;++i)
{
p=p->Next;
x=p;
y=p->Next;
for(int j=i+1;j<len;++j)
{
if(x->Num>y->Num)
{
x=y;
}
y=y->Next;
}
float a,b;
char s[30];
long long w;
w=x->Num;
x->Num=p->Num;
p->Num=w;
strcpy(s,x->Name);
strcpy(x->Name,p->Name);
strcpy(p->Name,s);
a=x->C_language;
x->C_language=p->C_language;
p->C_language=a;
b=x->English;
x->English=p->English;
p->English=b;
}
printf("\t排序成功!\n");
getch();
}
void Menu1()
{
system("color 1a");
printf("\n");
printf("\t 成績管理系統 \3\n");
printf(" --------------------------------------\n");
printf("\t|\t1:添加\t |\t2:輸出\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t3:插入\t |\t4:排序\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t5:刪除\t |\t6:查詢\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t7:修改\t |\t8:退出\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t9:寫出到文件\t |\n");
printf(" --------------------------------------\n");
printf("\t|\t10:導入從文件\t |\n");
printf(" --------------------------------------\n");
printf("\t");
printf("\n");
}
void Explanation()
{
system("cls");
system("color 07");
printf("------------------------------------------------------------------\n");
printf("\t在編寫過程中有很多地方使用了getch停頓\n");
printf("------------------------------------------------------------------\n");
printf("\t所以經常回車要按兩次!也要看情況,有些地方一次就行了\n");
printf("------------------------------------------------------------------\n");
printf("\t如果按了一次回車沒有反應,那就在按一次,\n");
printf("------------------------------------------------------------------\n");
printf("\t在輸入文件地址的時候要輸入絕對地址\n");
printf("------------------------------------------------------------------\n");
printf("\t在win7下要在C盤寫文件需要用管理員權限.\n");
printf("------------------------------------------------------------------\n");
printf("\t");
getch();
}
void Import(Node p)
{
printf("\t警告:此操作將使用文件中的數據覆蓋此時內存中的緩存數據!!\n");
char ch;
printf("\n");
printf("\t是否替換!(y/n)\n");
fflush(stdin);
printf("\t");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
p->Num=0;
FILE * a1;
char lujing[100];
printf("\t輸入要導入文件的路徑!\n");
fflush(stdin);
printf("\t");
gets(lujing);
a1=fopen(lujing,"rb");
if(a1==NULL)
{
printf("\t打開文件失敗,導入數據失敗!\n");
return ;
}
Node q=p;
while(!feof(a1))
{
p->Num++;
Node NEW =new struct L;
fscanf(a1,"%s%lld%f%f",NEW->Name,&NEW->Num,&NEW->English,&NEW->C_language);
q->Next=NEW;
NEW->Next=NULL;
q=q->Next;
}
p->Num--;
printf("\t操作成功!\n");
fclose(a1);
getch();
return ;
}
else if(ch=='n'||ch=='N')
{
printf("\t操作被取消!\n");
getch();
return ;
}
else
{
printf("\t輸入有誤!\n");
getch();
return ;
}
}
void Export(Node p)
{
printf("\t警告:此操作將覆蓋源文件中的數據!!\n");
char ch;
printf("\n");
printf("\t是否替換!(y/n)\n");
fflush(stdin);
printf("\t");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
FILE * a1;
char lujing[100];
printf("\t輸入要導出文件的路徑!\n");
fflush(stdin);
printf("\t");
gets(lujing);
a1=fopen(lujing,"wb");
if(a1==NULL)
{
printf("\t打開文件失敗,導出數據失敗!\n");
return ;
}
int len=p->Num;
for(int i=0;i<len;++i)
{
p=p->Next;
fprintf(a1,"%s %lld %.2f %.2f\n",p->Name,p->Num,p->English,p->C_language);
}
printf("\t操作成功!\n");
fclose(a1);
getch();
return ;
}
else if(ch=='n'||ch=='N')
{
printf("\t操作被取消!\n");
getch();
return ;
}
else
{
printf("\t輸入有誤!\n");
getch();
return ;
}
}
原先為了解決那個輸入錯誤問題,想了很多方法,近期看一個C函數手冊發現scanf函數。。。。。。解決了!!其實scanf函數是有返回值的,
函數原型:int scanf(char *format[,argument,...]);
如果輸入有誤則返回0;否則返回輸入數據的個數,利用這點就可以解決IO異常;
以前聽一個老師講java異常的時候他說這類異常是C語言力所不能及的!!
現在才發現C語言的博大精深,很多很多不知道的C語言秘密,