就是一個在Dos下運行的小程序,無圖形界面,以鏈表的形式存儲學生的信息,支持查找 排序 修改 刪除等功能,說實話功能也不是很完善,寫這個例子完全是爲了練習C語言,大家不要噴我哈。
//作業一 :學生信息管理系統
//編譯環境爲 WIN7 64位 CodeBlocks
//源代碼,可執行程序,報告,建議
#include<stdio.h>
#include<stdlib.h>
#define MAX 20
//
typedef struct student
{
long int sno; //學號
int sage; //年齡
char sname[MAX]; //姓名
char sclass[MAX]; //班級
struct student *next; //結構體指針
}student;
student *head; //鏈表的頭指針(全局變量)
void menu(); //說明提示信息,對學生信息的各種操作
void toAdd(); //增加新的學生信息,並存儲
void toDelete(); // 刪除學生信息
void toSearch(); //查找任意一個學生的信息
void toModify(); //修改學生信息
void toOutput(); //按學號進行排序,然後依次進行輸出
void toReadData(); //程序運行開始的時候先把硬盤上的數據讀到內存上
void toSaveData(); //每進行依次對數據修改的操作,就對當前的數據進行一次保存
void about(); //輸出關於系統和作者的相關信息
void main()
{
int n = -1; //line53: while(n)
head = (student *)malloc(sizeof(struct student)); //程序中鏈表的形式爲帶有頭結點的形式
head->next = NULL;
toReadData(); //當程序運行初期,toReadData()函數從磁盤
//中把所有的學生信息數據以單向鏈表的形式讀入到內存當中
menu();
while(n) //line53
{
printf("輸入(0-6)進行操作:\n");
scanf("%d", &n);
while(n<0 || n>7)
{
printf("錯誤,輸入(0-6)進行操作:\n");
scanf("%d", &n);
}
switch(n)
{
case 1:
toAdd();
break;
case 2:
toDelete();
break;
case 3:
toSearch();
break;
case 4:
toModify();
break;
case 5:
toOutput();
break;
case 6:
about();
break;
case 0:
printf("謝謝使用!\n");
exit(0);
break;
default:
printf("錯誤!");
}
}
}
void menu() //菜單函數,用來提示用戶進行操作
{
printf("----~~~~----~~~~----~~~~----~~~~----~~~~----~~~~----~~~~----~~~~----~~~~----~~~~");
printf(" ~~~~----~~~~----~~~~----~~~~----~~~~----~~~~\n");
printf(" ---- 歡迎來到學生信息管理系統 ----\n");
printf(" ~~~~ ~~~~\n");
printf(" ----~~~~----~~~~----~~~~----~~~~----~~~~----\n");
printf(" ~~~~----~~~~----~~~~----~~~~----~~~~----~~~~\n");
printf(" ---- 操作 示例: ----\n");
printf(" ~~~~ 1. 註冊 ~~~~\n");
printf(" ---- 2. 刪除 ----\n");
printf(" ~~~~ 3. 尋找 ~~~~\n");
printf(" ---- 4. 修改 ----\n");
printf(" ~~~~ 5. 輸出 ~~~~\n");
printf(" ~~~~ 6. 關於 ~~~~\n");
printf(" ---- 0. 退出 ----\n");
printf(" ~~~~----~~~~----~~~~----~~~~----~~~~----~~~~\n");
}
void toAdd() //toAdd()函數,對應的操作是向系統中存入學生數據
{
FILE *fp;
student *p;
student *q;
q = head;
p = malloc(sizeof(struct student));
while(!(fp = fopen("data.txt", "a+b"))) //所有的數據都存在data.txt文件中
{
printf("ERROR!");
exit(1);
}
printf("開始註冊...\n");
printf("請輸入學生的學號:");
scanf("%ld", &p->sno);
while(q->next != NULL)
{
if(q->next->sno == p->sno)
{
printf("學號 %ld 已經被佔用的,請重新輸入:\n", p->sno);
scanf("%ld", &p->sno);
}
q = q->next;
}
printf("請輸入學生的年齡:");
scanf("%d", &p->sage);
printf("請輸入學生的姓名:");
scanf("%s", &p->sname);
printf("請輸入學生所在的班級:");
scanf("%s", &p->sclass);
while(!(fp = fopen("data.txt", "a")))
{
printf("錯誤!");
exit(1);
}
fprintf(fp, "%20ld%5d%20s%20s\n", p->sno, p->sage, p->sname, p->sclass);
fclose(fp);
toReadData(); //執行完依次toAdd()操作之後,自動把data.txt中的數據進行一次刷新
}
void toDelete() //從系統中刪除數據的操作
{
int dnum; //line:176 用戶輸入的將要被刪除的目標學號
int makesure;
student *p;
student *q;
p = head;
q = p->next;
printf("請輸入您要刪除的學生的學號:");
scanf("%d", &dnum); //line 176
while(p->next != NULL) //
{
if(q->sno == dnum)
{
break;
}
else
{
q = q->next;
p = p->next;
}
}
if(p->next == NULL)
{
printf("對不起,該學生並不存在!\n");
}
else
{
printf("您確認要刪除此學生的信息?\n");
printf("1.確認\n");
printf("2.取消\n");
scanf("%d", &makesure);
while(makesure != 1 && makesure != 2)
{
printf("錯誤,請重新輸入1 或 2 進行操作\n");
scanf("%d", &makesure);
}
if(makesure == 2)
{
return;
}
p->next = q->next;
free(q);
printf("\n");
printf("刪除操作完成!\n");
printf("\n");
}
toSaveData();
}
void toSearch() //search功能失敗,,,
{
int goon; //接下來進行操作的選擇變量
int xnum; //被查找的學號
student *p;
student *q;
p = head;
q = p->next;
printf("請輸入您要查找的學生的學號:\n");
scanf("%d", &xnum);
while(q)
{
if(q->sno == xnum)
{
break;
}
else
{
q = q->next;
p = p->next;
}
}
if(!q->next)
{
printf("對不起,該學生不存在!\n");
}
else
{
printf(" 學號 | 年齡 | 姓名 | 班級\n\n");
printf("%20ld%5d%20s%20s\n", q->sno, q->sage, q->sname, q->sclass);
}
printf("請按如下提示操作:\n");
printf("0. 結束本次操作。 \n");
printf("1. 修改這個學生的信息。 \n");
printf("2. 刪除這個學生的信息。 \n");
scanf("%d", &goon);
while(goon < 0 || goon > 2)
{
printf("錯誤,請重新輸入!\11n");
scanf("%d", &goon);
}
switch(goon)
{
case 0:
break;
case 1:
toModify();
break;
case 2:
toDelete();
break;
default:
printf("ERROR!");
}
}
void toModify() //修改學生的信息
{
//printf("Modify\n");
int xnum; //被查找的學號
int makesure;
student *p;
student *q;
p = head;
q = p->next;
printf("請輸入您要修改的學生的學號:\n");
scanf("%d", &xnum);
while(p->next != NULL)
{
if(q->sno == xnum)
{
break;
}
else
{
q = q->next;
p = p->next;
}
}
if(q->next == NULL)
{
printf("sorry! that student is not found!\n");
}
else
{
printf("該學生的詳細信息如下:\n");
printf(" 學號 | 年齡 | 姓名 | 班級\n\n");
printf("%20ld%5d%20s%20s\n", q->sno, q->sage, q->sname, q->sclass);
printf("您確認要修改此學生的信息?\n");
printf("1.確認\n");
printf("2.取消\n");
scanf("%d", &makesure);
while(makesure != 1 && makesure != 2)
{
printf("錯誤,請重新輸入1 或 2 進行操作\n");
scanf("%d", &makesure);
}
if(makesure == 2)
{
return;
}
printf("請重新輸入該學生的信息:\n");
printf("年齡:");
scanf("%d", &q->sage);
printf("姓名:");
scanf("%s", &q->sname);
printf("班級:");
scanf("%s", &q->sclass);
toSaveData(); //把修改過的信息重新全部輸入到硬盤當中去
printf("\n");
printf("該學生的信息已存儲完畢!\n");
printf("\n");
menu();
}
}
void toOutput() //輸出全部學生的信息
{
student *p;
student *q;
p = head;
q = p->next;
printf(" 學號|年齡 | 姓名 | 班級\n\n");
while(q->next != NULL)
{
if(q->sage < 0) //沒有此步驟的話,會多讀出一行亂碼,算是一個小bug啵
{
break;
}
printf("%20ld%5d%20s%20s\n", q->sno, q->sage, q->sname, q->sclass);
p = q;
q = p->next;
}
}
void toReadData() //
{
FILE *fp = NULL;
student *p, *q;
if(!(fp = fopen("data.txt", "r")))
{
printf("錯誤\n");
exit(1);
}
p = (student *)malloc(sizeof(struct student));
head->next = p;
p->next = NULL;
if(fgetc(fp)==EOF) //vc讀文件時,只有當文件到達尾部,再進行讀寫纔會返回FF結束標誌
{
fclose(fp);
return;
}
else
{
fseek(fp , 0L ,SEEK_SET);
}
while(!feof(fp))
{
q = (student *)malloc(sizeof(struct student));
if(fscanf(fp, "%20ld%5d%20s%20s\n", &p->sno, &p->sage, &p->sname, &p->sclass) == 0)
{
break;
}
p->next = q;
p = q;
p->next = NULL;
}
fclose(fp);
}
void toSaveData()
{
FILE *fp;
student *p, *q;
q = head;
p = q->next;
if(!(fp=fopen("data.txt","w")))
{
printf("Cannot open the file\n");
}
while(q->next->next)
{
fprintf(fp, "%20ld%5d%20s%20s\n", p->sno, p->sage, p->sname, p->sclass);
q = q->next;
p = p->next;
}
fclose(fp);
}
void about()
{
printf("\n");
printf("學生信息管理系統\n");
printf("當前版本:V 0.1\n\n");
printf("歷史版本:\n");
printf("V 0.1\n\n");
printf("作者:東東里個乖乖\n");
printf("聯繫作者:\n");
printf("E-mail: [email protected]\n");
printf("QQ: 940507063\n");
printf("\n");
}