【C語言】簡易學生信息管理系統

就是一個在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");
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章