/*學生的基本資訊包括如下欄位:學號、姓名、班級、語文數學英語物理四門課的成績
系統可對學生資訊進行基本管理,包括學生資訊的增、刪、改、查、統計、存盤等功能,具體功能要求如下:
1、增加學生資訊,提示用戶輸入新的學生相關資訊,可連續輸入多個學生資訊。
2、洗掉學生資訊,提示用戶輸入要洗掉的學號,如果該學生資訊存在,則將該學號所對應的學生資訊洗掉,否則輸出提示資訊。
3、修改學生資訊,提示用戶輸入要進行修改的學號,如果該學生資訊存在,則提示用戶輸入修改的資料,否則輸出提示資訊。
4、查詢學生資訊,按不同條件對學生資訊進行查詢操作,輸出滿足條件的學生資訊。
5、基本統計資訊,可對學生資訊進行基本的統計分析。
6、學生資訊保存,根據所有對學生資訊相關操作后的結果,將相關學生資訊存盤到檔案中。*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct stud
{
int num;
char name[30];
char classnum;
int score[4];
struct stud *next;
};
struct stud *head=NULL;
void InsertStud()
{
char s[10];
do
{
int tmp;
printf("請輸入學號:\n");
scanf("%d",&tmp);
struct stud *q,*p;
p=head;
while(p!=NULL)
{
if(p->classnum==tmp)
{
printf("該學生已存在!\n");
return;
}
p=p->next;
}
q=(struct stud*)malloc(sizeof(struct stud));
if(q==NULL)
{
printf("申請記憶體失敗\n");
return;
}
q->classnum=tmp;
printf("請輸入姓名:");
scanf("%s",q->name);
printf("請輸入學號:");
scanf("%d",&q->num);
printf("請輸入班級:");
scanf("%s",&q->classnum);
printf("請輸入四門課的成績:");
scanf("%d%d%d%d",&q->score[0],&q->score[1],&q->score[2],&q->score[3]);
q->next=NULL;
p=head;
if(p==NULL)
{
head=q;
}
else
{
while(p->next!=NULL)
{
p=p->next;
}
p->next=q;
}
printf("學生增加成功!\n");
printf("你還需要繼續輸入學生資訊嗎?(no退出):");
scanf("%s",s);
}
while(strcmp(strupr(s),"NO")!=0);
}
void DelStud()
{
int flag=1;
int num;
printf("請輸入要洗掉的學生學號:\n");
scanf("%d",&num);
struct stud *p,*q;
p=q=head;
while(p!=NULL&&flag==1)
{
if(p->classnum==num)
{
if(p==head)//洗掉首節點
{
head=p->next;
free(p);
}
else
{
q->next=p->next;
free(p);
}
flag=0;
printf("洗掉學生資訊成功!\n");
return;
}
else
{
q=p;
p=p->next;
}
}
if(flag==1)
{
printf("沒有找到可以洗掉的學生學號!\n");
}
}
void UpdateStud()
{
int flag=1;
int num;
printf("請輸入要修改的學生的學號:\n");
scanf("%d",&num);
struct stud *p;
p=head;
while(p!=NULL&&flag==1)
{
if(p->num==num)
{
printf("請輸入新學號:\n");
scanf("%d",&p->num);
printf("請輸入新姓名:\n");
scanf("%s",p->name);
printf("請輸入新班級:\n");
scanf("%s",p->classnum);
printf("請輸入新成績:\n");
scanf("%d%d%d%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);
flag=0;
printf("學生資訊修改操作成功\n");
}
else
{
p=p->next;
}
}
if(flag==1)
{
printf("沒有找到要修改的記錄\n");
}
}
void QueryStud()
{
int flag=1;
int num;
struct stud *p;
printf("請輸入要查詢的學號:\n");
scanf("%d",&num);
p=head;
while(p!=NULL&&flag==1)
{
if(p->num==num)
{
printf("姓名:%s",p->name);
printf("學號:%d",&p->num);
printf("班級:%s",p->classnum);
printf("語文成績:%d 數學成績:%d 英語成績:%d 物理成績:%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);
flag=0;
}
else
{
p=p->next;
}
}
if(flag==1)
{
printf("沒有查詢到要查詢的資訊!");
}
}
/*void StaticStud()
{
}
*/
void SaveStud()
{
FILE *fp;
if((fp=fopen("stud.dat","wb"))==NULL);//打開檔案stud.dat
{
printf("檔案打開失敗\n");
return;//打開失敗退出
}
struct stud *p;
p=head;
while(p!=NULL)
{
fwrite(p,sizeof(struct stud),1,fp);
p=p->next;
}
fclose(fp);//關閉檔案
printf("學生資訊保存成功!\n");
}
int fileexist(char *filename)
{
FILE *fp;
if((fp=fopen(filename,"rb"))==NULL)
return 0;
else
{
fclose(fp);
return 1;
}
}
void load()
{
if(fileexist("stud.dat")==0)
return;
FILE *fp;
if((fp=fopen("stud.dat","rb"))==NULL)
{
printf("檔案打開失敗!\n");
return;
}
struct stud *p,*q;
p=head;
while(!feof(fp))
{
q=(struct stud *)malloc(sizeof(struct stud));
if(q==NULL)
{
printf("申請記憶體失敗!\n");
return;
}
fread(q,sizeof(struct stud),1,fp);
q->next=NULL;
if(p==NULL)
{
head=p;
}
else
{
while(p->next!=NULL)
{
p=p->next;
}
p->next=q;
}
}
fclose(fp);
}
int main()
{
int i;
load();
do
{
printf("\n\n\n");
printf("\t\t*****************************************\n");
printf("\t\t** **\n");
printf("\t\t** 歡迎來到學生資訊管理系統 **\n");
printf("\t\t*****************************************\n");
printf("\t\t** 1、增加學生資訊 2、洗掉學生資訊**\n");
printf("\t\t** 3、修改學生資訊 4、查詢學生資訊**\n");
printf("\t\t** 5、基本資訊統計 6、保存學生資訊**\n");
printf("\t\t** 7、退出 **\n");
printf("\t\t** **\n");
printf("\t\t*****************************************\n");
printf("請選擇操作:");
scanf("%d",&i);
switch(i)
{
case 1 : InsertStud();break;
case 2 : DelStud();break;
case 3 : UpdateStud();break;
case 4 : QueryStud();break;
// case 5 : StaticStud();break;
case 6 : SaveStud();break;
case 7 : break;
default : printf("選擇錯誤,請重選");break;
}
}while(i!=7);
return 0;
}
除了1增加學生資訊可以,其他都或多或少有點問題,尤其是6保存學生資訊,一直提示檔案打開失敗。
2洗掉也不行,4查詢出現的學生學號是隨機亂碼,3修改完畢后無法回傳主選單。
uj5u.com熱心網友回復:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct stud
{
int num;
char name[30];
int classnum;
int score[4];
struct stud *next;
};
struct stud *head=NULL;
void InsertStud()
{
char s[10];
do
{
int tmp;
printf("請輸入學號:\n");
scanf("%d",&tmp);
struct stud *q,*p;
p=head;
while(p!=NULL)
{
if(p->classnum==tmp)
{
printf("該學生已存在!\n");
return;
}
p=p->next;
}
q=(struct stud*)malloc(sizeof(struct stud));
if(q==NULL)
{
printf("申請記憶體失敗\n");
return;
}
q->classnum=tmp;
printf("請輸入姓名:");
scanf("%s",q->name);
printf("請輸入學號:");
scanf("%d",&q->num);
//printf("請輸入班級:"); //還要輸入班級嗎?上面不是已經賦值了嗎?
//scanf("%s",&q->classnum);
printf("請輸入四門課的成績:");
scanf("%d%d%d%d",&q->score[0],&q->score[1],&q->score[2],&q->score[3]);
q->next=NULL;
p=head;
if(p==NULL)
{
head=q;
}
else
{
while(p->next!=NULL)
{
p=p->next;
}
p->next=q;
}
printf("學生增加成功!\n");
printf("你還需要繼續輸入學生資訊嗎?(no退出):");
scanf("%s",s);
}
while(strcmp(strupr(s),"NO")!=0);
}
void DelStud()
{
int flag=1;
int num;
printf("請輸入要洗掉的學生學號:\n");
scanf("%d",&num);
struct stud *p,*q;
p=q=head;
while(p!=NULL&&flag==1)
{
if(p->classnum==num)
{
if(p==head)//洗掉首節點
{
head = p->next;
free(p);
}
else
{
q->next=p->next;
free(p);
}
flag=0;
printf("洗掉學生資訊成功!\n");
return;
}
else
{
q=p;
p=p->next;
}
}
if(flag==1)
{
printf("沒有找到可以洗掉的學生學號!\n");
}
}
void UpdateStud()
{
int flag=1;
int num;
printf("請輸入要修改的學生的學號:\n");
scanf("%d",&num);
struct stud *p;
p=head;
while(p!=NULL&&flag==1)
{
if(p->num==num)
{
printf("請輸入新學號:\n");
scanf("%d",&p->num);
printf("請輸入新姓名:\n");
scanf("%s",p->name);
printf("請輸入新班級:\n");
//scanf("%s",p->classnum);
scanf("%d", &p->classnum);
printf("請輸入新成績:\n");
scanf("%d%d%d%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);
flag=0;
printf("學生資訊修改操作成功\n");
}
else
{
p=p->next;
}
}
if(flag==1)
{
printf("沒有找到要修改的記錄\n");
}
}
void QueryStud()
{
int flag=1;
int num;
struct stud *p;
printf("請輸入要查詢的學號:\n");
scanf("%d",&num);
p=head;
while(p!=NULL&&flag==1)
{
if(p->num==num)
{
printf("姓名:%s",p->name);
//printf("學號:%d",&p->num); //為什么要加&?
printf("學號:%d", p->num);
//printf("班級:%s",p->classnum);
printf("班級:%d",p->classnum);
//printf("語文成績:%d 數學成績:%d 英語成績:%d 物理成績:%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);
printf("語文成績:%d 數學成績:%d 英語成績:%d 物理成績:%d", p->score[0], p->score[1], p->score[2], p->score[3]);
flag=0;
}
else
{
p=p->next;
}
}
if(flag==1)
{
printf("沒有查詢到要查詢的資訊!");
}
}
/*void StaticStud()
{
}
*/
void SaveStud()
{
FILE *fp;
if((fp=fopen("stud.dat","wb"))==NULL);//打開檔案stud.dat
{
printf("檔案打開失敗\n");
return;//打開失敗退出
}
struct stud *p;
p=head;
while(p!=NULL)
{
fwrite(p,sizeof(struct stud),1,fp);
p=p->next;
}
fclose(fp);//關閉檔案
printf("學生資訊保存成功!\n");
}
//int fileexist(char *filename)
int fileexist(const char *filename)
{
FILE *fp;
if((fp=fopen(filename,"rb"))==NULL)
return 0;
else
{
fclose(fp);
return 1;
}
}
void load()
{
if(fileexist("stud.dat")==0)
return;
FILE *fp;
if((fp=fopen("stud.dat","rb"))==NULL)
{
printf("檔案打開失敗!\n");
return;
}
struct stud *p,*q;
p=head;
while(!feof(fp))
{
q=(struct stud *)malloc(sizeof(struct stud));
if(q==NULL)
{
printf("申請記憶體失敗!\n");
return;
}
fread(q,sizeof(struct stud),1,fp);
q->next=NULL;
//if(p==NULL)
if(head==NULL)
{
//head=p;
head = q; //如果把p賦值給head,那么這里是有問題的;
p = q;
}
else
{
while(p->next!=NULL)
{
p=p->next;
}
p->next=q;
}
}
fclose(fp);
}
int main()
{
int i;
load();
do
{
printf("\n\n\n");
printf("\t\t*****************************************\n");
printf("\t\t** **\n");
printf("\t\t** 歡迎來到學生資訊管理系統 **\n");
printf("\t\t*****************************************\n");
printf("\t\t** 1、增加學生資訊 2、洗掉學生資訊**\n");
printf("\t\t** 3、修改學生資訊 4、查詢學生資訊**\n");
printf("\t\t** 5、基本資訊統計 6、保存學生資訊**\n");
printf("\t\t** 7、退出 **\n");
printf("\t\t** **\n");
printf("\t\t*****************************************\n");
printf("請選擇操作:");
scanf("%d",&i);
switch(i)
{
case 1 : InsertStud();break;
case 2 : DelStud();break;
case 3 : UpdateStud();break;
case 4 : QueryStud();break;
// case 5 : StaticStud();break;
case 6 : SaveStud();break;
case 7 : break;
default : printf("選擇錯誤,請重選");break;
}
}while(i!=7);
return 0;
}
供參考~
uj5u.com熱心網友回復:
樓上很厲害啊轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/188299.html
標籤:C語言
