純C語言學生管理系統(學生期末作業)
阿新 • • 發佈:2019-01-08
**
純C語言學生管理系統(學生期末作業)
**
分為7大功能:增、刪、查、改、預覽、儲存、匯出
程式碼都加有註釋,利於不懂的,理解
新增功能
//新增學生 void input () { int i; int j,ge; DaoChu(); printf("你要儲存幾個學生的資訊:"); scanf("%d",&ge); for(i=count;i<count+ge;i++)//遍歷裡面的資料, { printf("請輸入學號:"); scanf("%d",&data[i].id ); for (j=0; j<i; j++)//// 跟資料來源的資料比較,是否有一樣的學號 { if( data[i].id==data[j].id )/// 比較 { printf("學號重複!請你重新輸入:\n"); } } printf("請輸入姓名:"); scanf("%s",&data[i].name);//輸入的資料直接儲存到地址 printf("輸入手機號:"); scanf("%s",&data[i].phone); printf("以下輸入成績\n"); printf("語文:"); scanf("%d",&data[i].score[0]); printf("數學:"); scanf("%d",&data[i].score[1]); printf("英語:"); scanf("%d",&data[i].score[2]); Sleep(1000); printf("新增成功\n"); Sleep(800); system("CLS"); } count =count+ge; CunChu();//輸入完資料 儲存到本地 }
刪除功能如下:
void move () { int i,f; int j,n; char move[10]; struct data *p=NULL;//定義 int k=0; DaoChu(); system("CLS"); printf("刪除全部輸入all、單個one:\n"); scanf("%s",move); if(strcmp(move,"all")==0) { for (f=0;f<count;f++) { count=0; CunChu(); } printf("刪除成功\n"); } else if(strcmp(move,"one")==0) { printf("請輸入你要刪除學生的學號:"); scanf("%d",&i); for(n=0;n<count;n++) { if(i==data[n].id) { k=1;j=n;break;//如果找到該學號就把k設為真 ,n的值賦給j } } if(k) { if(count==1) { p=&data[0];//如果刪除最後一個學生資訊幾把p指向它的首地址 然後釋放掉 free(p);//釋放記憶體free這是釋放記憶體的函式 count=0;//然後個數設為0 } else { for(i=j;i<=count;i++) { data[i]=data[i+1];//如果還有多個學生的話,就用後面一個學生往上移一位,覆蓋那個學生 } count=count-1;//個數減一 } printf("刪除成功\n\n"); CunChu();//然後儲存資料 } else printf("輸入資料錯誤!\n"); } }
查詢功能
/// 查詢學生,按學號查詢 void find() { int xuehao; int i,k=0; DaoChu(); if (count==0) { printf("沒有任何資料\n"); return; } printf("請輸入你要查詢學生的學號:"); scanf("%d",&xuehao); printf("學號\t姓名\t 手機號 \t英語\t數學\t語文\t總分\n"); printf("---------------------------------------------------------\n"); for(i=0;i<count;i++) { if(xuehao==data[i].id)//如果找到這個學生的學號就列印他的所有資訊 { k=1; printf("%d\t%s\t%s\t%d\t%d\t%d\t",data[i].id,data[i].name,data[i].phone,data[i].score[0],data[i].score[1],data[i].score[2]); data[i].score[3]=data[i].score[0]+data[i].score[1]+data[i].score[2]; printf("%d\n",data[i].score[3]); } } if (k==0) { printf("沒有該學生,是否輸入有錯\n"); } printf("---------------------------------------------------------\n"); }
修改功能
//修改函式
/* 工作原理
這個函式是先把資料匯出,然後再判斷輸入的學號是否一樣,找到一樣的就修改
然後再儲存進去!
*/
void revise()
{
int m=0;
int xuehao,xx,j,i;
FILE *fp;
int f=0;
DaoChu();//呼叫匯出資料函式
printf("請輸入你要修改的學號:");
scanf("%d",&xuehao);
for(xx=0;xx<count;xx++)
{
if(xuehao==data[xx].id)
{
printf("找到該學生!可以修改\n");
f=1;
printf("請輸入學號:");
scanf("%d",&data[xx].id);
for (i=0; i<xx; i++)//// 跟資料來源的資料比較,是否有一樣的學號
{
if( data[xx].id==data[i].id )/// 比較
{
printf("學號重複!請你重新輸入:\n");
continue;
}
}
printf("請輸入姓名:");
scanf("%s",&data[xx].name);
printf("輸入手機號:");
scanf("%s",&data[xx].phone);
printf("以下輸入成績\n");
printf("語文:");
scanf("%d",&data[xx].score[0]);
printf("數學:");
scanf("%d",&data[xx].score[1]);
printf("英語:");
scanf("%d",&data[xx].score[2]);
printf("修改成功\n");
CunChu();
break;
}
}
if(!f)
printf("沒有找到!\n");
}
//學生列表資訊
void list_all()
{
int j;
DaoChu();
system("CLS");
printf(" 學號 姓名 手機號 英語 數學 語文 總分 \n");
printf("------------------------------------------------------------\n");
for(j=0;j<count;j++)
{
//STUDENT *s =&data[j];
printf( " %-10d %-6s %-11s %3d %3d %3d ",data[j].id,data[j].name,data[j].phone,data[j].score[0],data[j].score[1],data[j].score[2]);
data[j].score[3] =data[j].score[0]+data[j].score[1]+data[j].score[2];
printf(" %3d \n",data[j].score[3]);
}
printf("------------------------------------------------------------\n");
printf("總數:%d\n",count);
}
瀏覽功能
void list_all()
{
int j;
DaoChu();
system("CLS");
printf(" 學號 姓名 手機號 英語 數學 語文 總分 \n");
printf("------------------------------------------------------------\n");
for(j=0;j<count;j++)
{
//STUDENT *s =&data[j];
printf( " %-10d %-6s %-11s %3d %3d %3d ",data[j].id,data[j].name,data[j].phone,data[j].score[0],data[j].score[1],data[j].score[2]);
data[j].score[3] =data[j].score[0]+data[j].score[1]+data[j].score[2];
printf(" %3d \n",data[j].score[3]);
}
printf("------------------------------------------------------------\n");
printf("總數:%d\n",count);
}
匯入本地
//存到檔案
void CunChu()
{
int i;
FILE *rs;//定義一個檔案指標rs
if((rs=fopen("student.txt","w"))==NULL)//如果指定檔案不存在則無法開啟,就新建
{
printf("not open");
exit(0);//退出
}
for(i=0;i<count;i++)
{
fwrite(&data[i], sizeof(data[i]), 1, rs);
}
if(ferror(rs))//如果ferror返回值為0(假),表示未出錯。如果返回一個非零值,表示出錯
{
fclose(rs);//如果出錯就關閉檔案流
perror("寫檔案失敗!\n");
return;
}
printf("儲存檔案成功!\n");
fclose(rs); //關閉檔案流
Sleep(1000);
system("CLS");
}
匯出檔案
void DaoChu()
{
struct data t;//定義一個結構體型別 t
int i=0;
FILE* fp = fopen("student.txt", "r");//fp指標指向所開啟的檔案
count=0;
if(fp==NULL)//如果開啟的檔案不存在就執行以下
{
perror("讀取檔案開啟失敗!\n");
return;
}
memset(data,0x0,sizeof(data));//它把陣列的起始地址作為其第一個引數,第二個引數是設定陣列每個位元組的值,第三個引數是陣列的長度(位元組數,不是元素個數)
while(1)//能開啟檔案就執行以下讀取資料
{
fread(&t,sizeof(t),1,fp);//如果有檔案的話,就依此讀取檔案&t表示首地址 t表示資料塊長度
if(ferror(fp))//如果出錯就讀取失敗ferror
{
fclose(fp);
perror("讀檔案過程失敗!\n");
return;
}
if(feof(fp))//這判斷如果到達檔案尾部就應該停止
{
break;
}
data[i]=t;//把t的資料賦給i
i++;//然後i以下加上
}
fclose(fp);//讀取完後關閉檔案流,否則會造成控制代碼洩露
count=i;//然後把i的個數賦給全域性變數
printf("匯出檔案成功!\n");
}
選單
//選單功能
void mune()
{
char cmdline[128];
while(1)
{
printf("\n\n\t\t\t歡迎來到我的學生管理系統!\n");
printf("\t\t\t\t新增:add \n\t\t\t\t查詢:find \n\t\t\t\t刪除:move \n\t\t\t\t瀏覽:list\n\t\t\t\t修改:revise\n\t\t\t\t儲存:input \n\t\t\t\t匯出:output \n\t\t\t\t退出:exit \n");
printf ("請輸入你的指令:");
scanf("%s",cmdline);
//選單處理
if (strcmp(cmdline,"revise")==0)
{
revise();
continue;
}
//選單處理
if (strcmp(cmdline,"exit")==0)
{
printf("退出系統\n");
break;
}
//選單處理
if (strcmp(cmdline,"add")==0)
{
input();
continue;
}
//選單處理
if (strcmp(cmdline,"find")==0)
{
find();
continue;
}
//選單處理
if (strcmp(cmdline,"move")==0)
{
move();
continue;
}
//選單處理
if (strcmp(cmdline,"list")==0)
{
list_all();
continue;
}
//選單處理
if (strcmp(cmdline,"input")==0)
{
CunChu();
continue;
}
if (strcmp(cmdline,"output")==0)
{
DaoChu();
continue;
}
printf("輸入指令有誤,請重新輸入!\n");
}
}
int main ()
{
mune();//直接呼叫選單函式
return 0;
}
專案原始碼如下:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "windows.h"
#define N 1000
/*學生資訊管理系統
/*定義一個學生資訊類的結構體
*/
typedef struct data
{
unsigned int id;
char name[16];
char phone[16];
int score[4];// 這表示成績 語數英 和總分
}STUDENT;
STUDENT data [N];//資料來源;錄入的資訊先存到這裡
int count =0;//記錄個數;
void CunChu();//宣告 後面呼叫
void DaoChu();
//新增學生
void input ()
{
int i;
int j,ge;
DaoChu();
printf("你要儲存幾個學生的資訊:");
scanf("%d",&ge);
for(i=count;i<count+ge;i++)//遍歷裡面的資料,
{
printf("請輸入學號:");
scanf("%d",&data[i].id );
for (j=0; j<i; j++)//// 跟資料來源的資料比較,是否有一樣的學號
{
if( data[i].id==data[j].id )/// 比較
{
printf("學號重複!請你重新輸入:\n");
continue;
}
}
printf("請輸入姓名:");
scanf("%s",&data[i].name);//輸入的資料直接儲存到地址
printf("輸入手機號:");
scanf("%s",&data[i].phone);
printf("以下輸入成績\n");
printf("語文:");
scanf("%d",&data[i].score[0]);
printf("數學:");
scanf("%d",&data[i].score[1]);
printf("英語:");
scanf("%d",&data[i].score[2]);
Sleep(1000);
printf("新增成功\n");
Sleep(800);
system("CLS");
}
count =count+ge;
CunChu();//輸入完資料 儲存到本地
}
/// 查詢學生,按學號查詢
void find()
{
int xuehao;
int i,k=0;
DaoChu();
if (count==0)
{
printf("沒有任何資料\n");
return;
}
printf("請輸入你要查詢學生的學號:");
scanf("%d",&xuehao);
printf("學號\t姓名\t 手機號 \t英語\t數學\t語文\t總分\n");
printf("---------------------------------------------------------\n");
for(i=0;i<count;i++)
{
if(xuehao==data[i].id)//如果找到這個學生的學號就列印他的所有資訊
{
k=1;
printf("%d\t%s\t%s\t%d\t%d\t%d\t",data[i].id,data[i].name,data[i].phone,data[i].score[0],data[i].score[1],data[i].score[2]);
data[i].score[3]=data[i].score[0]+data[i].score[1]+data[i].score[2];
printf("%d\n",data[i].score[3]);
}
}
if (k==0)
{
printf("沒有該學生,是否輸入有錯\n");
}
printf("---------------------------------------------------------\n");
}
//刪除一個學生的資訊
void move ()
{
int i,f;
int j,n;
char move[10];
struct data *p=NULL;//定義
int k=0;
DaoChu();
system("CLS");
printf("刪除全部輸入all、單個one:\n");
scanf("%s",move);
if(strcmp(move,"all")==0)
{
for (f=0;f<count;f++)
{
count=0;
CunChu();
}
printf("刪除成功\n");
}
else if(strcmp(move,"one")==0)
{
printf("請輸入你要刪除學生的學號:");
scanf("%d",&i);
for(n=0;n<count;n++)
{
if(i==data[n].id)
{
k=1;j=n;break;//如果找到該學號就把k設為真 ,n的值賦給j
}
}
if(k)
{
if(count==1)
{
p=&data[0];//如果刪除最後一個學生資訊幾把p指向它的首地址 然後釋放掉
free(p);//釋放記憶體free這是釋放記憶體的函式
count=0;//然後個數設為0
}
else
{
for(i=j;i<=count;i++)
{
data[i]=data[i+1];//如果還有多個學生的話,就用後面一個學生往上移一位,覆蓋那個學生
}
count=count-1;//個數減一
}
printf("刪除成功\n\n");
CunChu();//然後儲存資料
}
else
printf("輸入資料錯誤!\n");
}
}
//存到檔案
void CunChu()
{
int i;
FILE *rs;//定義一個檔案指標rs
if((rs=fopen("student.txt","w"))==NULL)//如果指定檔案不存在則無法開啟,就新建
{
printf("not open");
exit(0);//退出
}
for(i=0;i<count;i++)
{
fwrite(&data[i], sizeof(data[i]), 1, rs);
}
if(ferror(rs))//如果ferror返回值為0(假),表示未出錯。如果返回一個非零值,表示出錯
{
fclose(rs);//如果出錯就關閉檔案流
perror("寫檔案失敗!\n");
return;
}
printf("儲存檔案成功!\n");
fclose(rs); //關閉檔案流
Sleep(1000);
system("CLS");
}
//匯出檔案
void DaoChu()
{
struct data t;//定義一個結構體型別 t
int i=0;
FILE* fp = fopen("student.txt", "r");//fp指標指向所開啟的檔案
count=0;
if(fp==NULL)//如果開啟的檔案不存在就執行以下
{
perror("讀取檔案開啟失敗!\n");
return;
}
memset(data,0x0,sizeof(data));//它把陣列的起始地址作為其第一個引數,第二個引數是設定陣列每個位元組的值,第三個引數是陣列的長度(位元組數,不是元素個數)
while(1)//能開啟檔案就執行以下讀取資料
{
fread(&t,sizeof(t),1,fp);//如果有檔案的話,就依此讀取檔案&t表示首地址 t表示資料塊長度
if(ferror(fp))//如果出錯就讀取失敗ferror
{
fclose(fp);
perror("讀檔案過程失敗!\n");
return;
}
if(feof(fp))//這判斷如果到達檔案尾部就應該停止
{
break;
}
data[i]=t;//把t的資料賦給i
i++;//然後i以下加上
}
fclose(fp);//讀取完後關閉檔案流,否則會造成控制代碼洩露
count=i;//然後把i的個數賦給全域性變數
printf("匯出檔案成功!\n");
}
//修改函式
/* 工作原理
這個函式是先把資料匯出,然後再判斷輸入的學號是否一樣,找到一樣的就修改
然後再儲存進去!
*/
void revise()
{
int m=0;
int xuehao,xx,j,i;
FILE *fp;
int f=0;
DaoChu();//呼叫匯出資料函式
printf("請輸入你要修改的學號:");
scanf("%d",&xuehao);
for(xx=0;xx<count;xx++)
{
if(xuehao==data[xx].id)
{
printf("找到該學生!可以修改\n");
f=1;
printf("請輸入學號:");
scanf("%d",&data[xx].id);
for (i=0; i<xx; i++)//// 跟資料來源的資料比較,是否有一樣的學號
{
if( data[xx].id==data[i].id )/// 比較
{
printf("學號重複!請你重新輸入:\n");
continue;
}
}
printf("請輸入姓名:");
scanf("%s",&data[xx].name);
printf("輸入手機號:");
scanf("%s",&data[xx].phone);
printf("以下輸入成績\n");
printf("語文:");
scanf("%d",&data[xx].score[0]);
printf("數學:");
scanf("%d",&data[xx].score[1]);
printf("英語:");
scanf("%d",&data[xx].score[2]);
printf("修改成功\n");
CunChu();
break;
}
}
if(!f)
printf("沒有找到!\n");
}
//學生列表資訊
void list_all()
{
int j;
DaoChu();
system("CLS");
printf(" 學號 姓名 手機號 英語 數學 語文 總分 \n");
printf("------------------------------------------------------------\n");
for(j=0;j<count;j++)
{
//STUDENT *s =&data[j];
printf( " %-10d %-6s %-11s %3d %3d %3d ",data[j].id,data[j].name,data[j].phone,data[j].score[0],data[j].score[1],data[j].score[2]);
data[j].score[3] =data[j].score[0]+data[j].score[1]+data[j].score[2];
printf(" %3d \n",data[j].score[3]);
}
printf("------------------------------------------------------------\n");
printf("總數:%d\n",count);
}
//選單功能
void mune()
{
char cmdline[128];
while(1)
{
printf("\n\n\t\t\t歡迎來到我的學生管理系統!\n");
printf("\t\t\t\t新增:add \n\t\t\t\t查詢:find \n\t\t\t\t刪除:move \n\t\t\t\t瀏覽:list\n\t\t\t\t修改:revise\n\t\t\t\t儲存:input \n\t\t\t\t匯出:output \n\t\t\t\t退出:exit \n");
printf ("請輸入你的指令:");
scanf("%s",cmdline);
//選單處理
if (strcmp(cmdline,"revise")==0)
{
revise();
continue;
}
//選單處理
if (strcmp(cmdline,"exit")==0)
{
printf("退出系統\n");
break;
}
//選單處理
if (strcmp(cmdline,"add")==0)
{
input();
continue;
}
//選單處理
if (strcmp(cmdline,"find")==0)
{
find();
continue;
}
//選單處理
if (strcmp(cmdline,"move")==0)
{
move();
continue;
}
//選單處理
if (strcmp(cmdline,"list")==0)
{
list_all();
continue;
}
//選單處理
if (strcmp(cmdline,"input")==0)
{
CunChu();
continue;
}
if (strcmp(cmdline,"output")==0)
{
DaoChu();
continue;
}
printf("輸入指令有誤,請重新輸入!\n");
}
}
int main ()
{
mune();
return 0;
}
作者水平有限:碼bug挺多的~歡迎大家參照修改!
c語言作業,伸手黨福利
如下侵權請聯絡作者!