1. 程式人生 > >學生資訊管理系統(c語言)

學生資訊管理系統(c語言)

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define LEN sizeof(STD)
typedef struct student {
	char		xh[12];         /*學號*/
	char		xm[12];         /*姓名*/
	float		sxcj;           /*數學成績*/
	float		cxsj;           /*程式設計成績*/
	float		zf;             /*總分*/
	struct student	*next;          /*指向下條記錄*/
}STD;
int	NUM	= 0;                    /* 定義全域性變數,統計學生人數 */
STD	*head	= NULL;

void mainmenu();                        /* 主選單 */

void record();                          /* 寫入學生資訊 */

void insert( struct student *p );       /* 插入學生資訊 */

void print( struct student *p );        /* 列印資訊 */

void display();                         /* 檢視所有學生資訊 */

void query();                           /* 建立查詢 */

void query_by_num();                    /*按學號查詢 */

void query_by_name();                   /*按姓名查詢 */

void query_by_sxcj();                   /*按數學成績查詢 */

void query_by_cxsj();                   /*按程式設計成績查詢 */

void query_by_zf();                     /*按總分查詢 */

void readData();                        /* 讀取資料 */

void writeData();                       /* 寫入資料 */

void freeAll();                         /* 釋放結點 */

void del();                             /*刪除學生資訊 */

void change();                          /* 修改學生資訊 */

void devise( struct student *p );

void main()
{
	mainmenu();
}


/* 主選單 */
void mainmenu()
{
	int choice;
	readData();
	do
	{
		printf( "\t\t\t +--------------------+\n" );
		printf( "\t\t\t | 學生資訊管理系統 |\n" );
		printf( "\t\t\t | [1]--建立學生資訊 |\n" );
		printf( "\t\t\t | [2]--瀏覽學生資訊 |\n" );
		printf( "\t\t\t | [3]--查詢學生資訊 |\n" );
		printf( "\t\t\t | [4]--刪除學生資訊 |\n" );
		printf( "\t\t\t | [5]--修改學生資訊 |\n" );
		printf( "\t\t\t | [6]--退出系統 |\n" );
		printf( "\t\t\t +--------------------+\n" );
		printf( "請輸入操作選項:" );
		scanf( "%d", &choice );
		switch ( choice )
		{
		case 1:
			record();       /* 讀入學生資訊 */
			break;
		case 2:
			display();      /* 檢視學生資訊 */
			break;
		case 3:
			query();        /* 查詢學生資訊 */
			break;
		case 4:
			del();          /*刪除學生資訊 */
			break;
		case 5:
			change();       /* 修改學生資訊 */
			break;
		default:
			printf( "無效選項!\n" );
			break;
		case 6:
			writeData();    /* 把學生資訊寫入檔案中 */
			freeAll();      /* 釋放所有結點 */
			exit( 0 );      /* 退出 */
		}
	}
	while ( choice != 6 );
}


/* 錄入學生資訊,每次只錄入一個學生資訊 */
void record()
{
	struct student *p0;
	p0 = (STD *) malloc( LEN );
	printf( "請輸入學生的學號:" );
	scanf( "%s", &p0->xh );
	printf( "請輸入學生的姓名:" );
	scanf( "%s", p0->xm );
	printf( "請輸入學生的數學成績:" );
	scanf( "%f", &p0->sxcj );
	printf( "請輸入學生的程式設計成績:" );
	scanf( "%f", &p0->cxsj );
	p0->zf = p0->sxcj + p0->cxsj;
	insert( p0 );   /* 每次錄入一個學生資訊後將其插入連結串列中 */
	printf( "該學生的資訊為:\n" );
	printf( "學號\t姓名\t數學\t程式\t總分\n" );
	print( p0 );    /* 每次錄入一個學生資訊後輸出其資訊 */
}


/* 插入學生資訊 */
void insert( STD *stu )
{
	STD *p0, *p1, *p2;
	p1	= head;
	p0	= stu;
	if ( head == NULL )
	{
		head		= p0;
		p0->next	= NULL;
	}else  {
		while ( (p0->xh > p1->xh) && (p1->next != NULL) )
		{
			p2	= p1;
			p1	= p1->next;
		}
		if ( p0->xh <= p1->xh )
		{
			if ( head == p1 )
				head = p0;
			else
				p2->next = p0;
			p0->next = p1;
		}else  {
			p1->next	= p0;
			p0->next	= NULL;
		}
	}
	NUM++; /* 累加統計學生人數 */
}


/* 列印資訊 */
void print( struct student *p )
{
	printf( "%s\t%s\t%-5.2f\t%-5.2f\t%-5.2f\n", p->xh, p->xm, p->sxcj, p->cxsj, p->zf );
}


/* 檢視學生資訊 */
void display()
{
	struct student *p;
	printf( "學生總人數:%d\n", NUM );
	p = head;
	if ( head != NULL )
	{
		printf( "學號\t姓名\t數學\t程式\t總分\n" );
		do
		{
			print( p );
			p = p->next;
		}
		while ( p != NULL );
	}
	printf( "\n" );
}


/* 查詢學生資訊 */
void query()
{
	int choice;
	do
	{
		printf( "+---------------------+\n" );
		printf( "|[1]--按學號查詢 |\n" );
		printf( "|[2]--按姓名查詢 |\n" );
		printf( "|[3]--數學成績查詢 |\n" );
		printf( "|[4]--程式設計成績查詢|\n" );
		printf( "|[5]--總分查詢 |\n" );
		printf( "|[6]--返回主選單 |\n" );
		printf( "+---------------------+\n" );
		printf( "請輸入操作選項:" );
		scanf( "%d", &choice );
		switch ( choice )
		{
		case 1:
			query_by_num();
			break;
		case 2:
			query_by_name();
			break;
		case 3:
			query_by_sxcj();
			break;
		case 4:
			query_by_cxsj();
		case 5:
			query_by_zf();
		default:
			printf( "操作選項錯誤!\n" );
			break;
		case 6:
			return;
		}
	}
	while ( choice != 6 );
}


/*按學號查詢學生資訊 */
void query_by_num()
{
	char		num[10];
	struct student	*p1;
	printf( "請輸入學生的學號:" );
	scanf( "%s", num );
	if ( head == NULL )
	{
		printf( "沒有學生資訊!\n" );
		return;
	}
	p1 = head;
	while ( strcmp( num, p1->xh ) != 0 && p1->next != NULL )
		p1 = p1->next;
	if ( strcmp( num, p1->xh ) == 0 )
	{
		printf( "學號\t姓名\t數學\t程式\t總分\n" );
		print( p1 );
	}else
		printf( "沒有找到該學生資訊!\n" );
}


/*按姓名查詢學生資訊 */
void query_by_name()
{
	char	name[20];
	STD	*p1;
	printf( "請輸入學生的姓名:" );
	scanf( "%s", name );
	if ( head == NULL )
	{
		printf( "沒有學生資訊!\n" );
		return;
	}
	p1 = head;
	while ( strcmp( name, p1->xm ) != 0 && p1->next != NULL )
		p1 = p1->next;
	if ( !strcmp( name, p1->xm ) )
	{
		printf( "學號\t姓名\t數學\t程式\t總分\n" );
		print( p1 );
	}else
		printf( "沒有找到該學生資訊!\n" );
}


/*按數學成績查詢 */
void query_by_sxcj()
{
	float	sxcj;
	STD	*p1;
	printf( "請輸入學生的數學成績:" );
	scanf( "%f", &sxcj );
	if ( head == NULL )
	{
		printf( "沒有學生資訊!\n" );
		return;
	}
	p1 = head;
	while ( sxcj != p1->sxcj && p1->next != NULL )
		p1 = p1->next;
	if ( sxcj == p1->sxcj )
	{
		printf( "學號\t姓名\t數學\t程式\t總分\n" );
		print( p1 );
	}else
		printf( "沒有找到該學生資訊!\n" );
}


/*按程式設計成績查詢 */
void query_by_cxsj()
{
	float	cxsj;
	STD	*p1;
	printf( "請輸入學生的程式設計成績:" );
	scanf( "%f", &cxsj );
	if ( head == NULL )
	{
		printf( "沒有學生資訊!\n" );
		return;
	}
	p1 = head;
	while ( cxsj != p1->cxsj && p1->next != NULL )
		p1 = p1->next;
	if ( cxsj == p1->cxsj )
	{
		printf( "學號\t姓名\t數學\t程式\t總分\n" );
		print( p1 );
	}else
		printf( "沒有找到該學生資訊!\n" );
}


/*按總分查詢 */
void query_by_zf()
{
	float	zf;
	STD	*p1;
	printf( "請輸入學生的總分成績:" );
	scanf( "%f", &zf );
	if ( head == NULL )
	{
		printf( "沒有學生資訊!\n" );
		return;
	}
	p1 = head;
	while ( zf != p1->zf && p1->next != NULL )
		p1 = p1->next;
	if ( zf == p1->zf )
	{
		printf( "學號\t姓名\t數學\t程式\t總分\n" );
		print( p1 );
	}else
		printf( "沒有找到該學生資訊!\n" );
}


/*刪除學生資訊 */
void del()
{
	struct student	*p1, *p2;
	char		num[12];
	if ( head == NULL )
	{
		printf( "沒有學生資訊!\n" );
		return;
	}
	printf( "請輸入您要刪除的學生的學號:" );
	scanf( "%s", num );
	p1 = head;
	while ( strcmp( num, p1->xh ) != 0 && p1->next != NULL )
	{
		p2	= p1;
		p1	= p1->next;
	}
	if ( strcmp( num, p1->xh ) == 0 )
	{
		if ( p1 == head )
			head = p1->next;
		else
			p2->next = p1->next;
		free( p1 );
		NUM--;
	}else
		printf( "沒有該學生的資訊!\n" );
}


/* 修改學生資訊 */
void change()
{
	STD	*p1, *p2;
	char	num[12];
	if ( head == NULL )
	{
		printf( "沒有學生的資訊!\n" );
		return;
	}
	printf( "請輸入您要修改的學生的學號:" );
	scanf( "%s", num );
	p1 = head;
	while ( strcmp( num, p1->xh ) != 0 && p1->next != NULL )
	{
		p2	= p1;
		p1	= p1->next;
	}
	if ( strcmp( num, p1->xh ) == 0 )
		devise( p1 );
	else
		printf( "沒有該學生的資訊!\n" );
}


/* 修改學生資訊 */
void devise( struct student *p )
{
	int choice;
	do
	{
		printf( "+------------------------------+\n" );
		printf( "|請選擇您要修改的學生的資訊內容|\n" );
		printf( "|[1]--學號 |\n" );
		printf( "|[2]--姓名 |\n" );
		printf( "|[3]--數學成績 |\n" );
		printf( "|[4]--程式設計成績 |\n" );
		printf( "|[5]--總分 |\n" );
		printf( "|[6]--取消 |\n" );
		printf( "+------------------------------+\n" );
		printf( "請輸入操作選項:" );
		scanf( "%d", &choice );
		switch ( choice )
		{
		case 1:
			printf( "請輸入新學號:" );
			scanf( "%s", p->xm );
			break;
		case 2:
			printf( "請輸入新姓名:" );
			scanf( "%s", p->xm );
			break;
		case 3:
			printf( "請輸入新的數學成績:" );
			scanf( "%f", p->sxcj );
			break;
		case 4:
			printf( "請輸入新的程式設計成績:" );
			scanf( "%f", p->cxsj );
			break;
		case 5:
			printf( "請輸入新的總分:" );
			scanf( "%f", p->zf );
			break;
		case 6:
			return;
		default:
			printf( "選項錯誤!\n" );
			break;
		}
	}
	while ( choice != 6 );
}


/* 讀取檔案 */
void readData()
{
	FILE	*fp;
	STD	*p1, *p2;
	fp = fopen( "students.txt", "r" ); /* 開啟檔案 */
	if ( !fp )
	{
		printf( "檔案開啟錯誤!\n" );
		return;
	}
	fscanf( fp, "%d\n", &NUM );
	head = p1 = p2 = (STD *) malloc( LEN );
	fscanf( fp, "%s\t%s\t%f\t%f\t%f\n", p1->xh, p1->xm, &p1->sxcj, &p1->cxsj, &p1->zf ); /*  */
	while ( !feof( fp ) )
	{
		p1 = (struct student *) malloc( LEN );
		fscanf( fp, "%s\t%s\t%f\t%f\t%f\n", p1->xh, p1->xm, &p1->sxcj, &p1->cxsj, &p1->zf );
		p2->next	= p1;
		p2		= p1;
	}
	p2->next = NULL;
	fclose( fp );
}


/* 寫入檔案 */
void writeData()
{
	FILE	* fp; /* 檔案指標 */
	STD	*p;
	fp = fopen( "students.txt", "w+" );
	if ( !fp )
	{
		printf( "檔案開啟錯誤!\n" );
		return;
	}
	fprintf( fp, "%d\n", NUM );
	for ( p = head; p != NULL; p = p->next )
	{
		print(p);
		fprintf( fp, "%s\t%s\t%f\t%f\t%f\n", p->xh, p->xm, p->sxcj, p->cxsj, p->zf );
	}
	fclose( fp );
}


/* 釋放結點 */
void freeAll()
{
	STD *p1, *p2;
	p1 = p2 = head;
	while ( p1 )
	{
		p2 = p1->next;
		free( p1 );
		p1 = p2;
	}
}