作者:小代码

 

时间:2013年8月2日17:30:22

 

IDE:VC6.0

 

功能:

 

 

一、输入:
 1、尾部追加
 2、追加多个

二、输出所有信息

三、返回序号 为 n 的学生的信息

四、最高分、最低分、平均分

五、排序
 1、按序号排序
 2、按成绩排序

六、写入文件

 

 

代码:

 

StuMain.c

 

 

#include<stdio.h>
#include<stdlib.h>
#include "Student.h"


int main( void )
{
	
	void Menu( void );//菜单提示

	int order;

	pMAN head = Init();

	Menu();
	printf("学生信息管理系统:");
	int or = scanf("%d",&order);

	while ( true )
	{
		if ( 0 == or )
		{
			continue;
		}

		switch ( order )
		{
		case 1:
			{
				append( head );
				break;
			}
		case 2:
			{
				printf("信息全部为 0 时,输入结束.\n");
				input( head );
				break;
			}
		case 3:
			{
				show( head );
				break;
			}
		case 4:
			{
				int xu;
				printf("输入待查序号:");
				scanf("%d",&xu);
				pSTU temp = getIndex( head, xu );
				if ( NULL != temp )
				{
					printf("%-3d| 学号:%-10s姓名:%-15s年龄:%d\t成绩:%.2lf\n",temp->xu,temp->num,temp->name,temp->age,temp->score);
				}
				
				break;
			}
		case 5:
			{
				printf("%.2lf\n",maxScore( head ) );
				break;
			}
		case 6:
			{
				printf("%.2lf\n",minScore( head ) );
				break;
			}
		case 7:
			{
				printf("%.2lf\n",avrScore( head ) );
				break;
			}
		case 8:
			{
				sortOfXu( head );
				break;
			}
		case 9:
			{
				sortOfScore( head );
				break;
			}
		case 10:
			{
				double seach;
				pSTU temp = NULL;
				printf("输入待查询成绩:");
				scanf("%lf",&seach);
				temp = seachOfScore( head, seach );
				if ( NULL != temp )
				{
					printf("%-3d| 学号:%-10s姓名:%-15s年龄:%d\t成绩:%.2lf\n",temp->xu,temp->num,temp->name,temp->age,temp->score);
				}
				else
				{
					printf("无此学生信息!\n");
				}
				break;
			}
		case 11:
			{
				writeFile( head );
				break;
			}
		case -1:
			{
				getchar();
				char ch;				
				printf("是否退出系统?Y/N");
				ch = getchar();
				if ( 'Y' == ch || 'y' == ch )
				{
					printf("已退出系统...\n");
					exit(0);
				}				
				break;
			}
		default :
			{
				printf("输入的命令无效,请重新输入!\n");
				break;
			}
		}

		printf("学生信息管理系统:");
		or = scanf("%d",&order);
	}
	

	printf("\n\nHello World!\n");
	return 0;
}


//菜单提示
void Menu( void )
{
	char one[] = "追加";
	char two[] = "追加多个";
	char three[] = "输出所有";
	char four[] = "返回 n ";
	char five[] = "最高分";
	char six[] = "最低分";
	char seven[] = "平均分";
	char eight[] = "序号排序";
	char nine[] = "成绩排序";
	char ten[] = "查询成绩";
	char eleven[] = "写入文件";
	char quit[] = "退出系统";

	printf("\t1-%-15s\t2-s%-15s\n",one,two);
	printf("\t3-%-15s\t4-s%-15s\n",three,four);
	printf("\t5-%-15s\t6-s%-15s\n",five,six);
	printf("\t7-%-15s\t8-s%-15s\n",seven,eight);
	printf("\t9-%-15s\t10-s%-15s\n",nine,ten);
	printf("\t11-%-15s\t-1%-15s\n",eleven,quit);
	
}


 

 

 

Student.h

 

struct Student
{
	char num[15];//学号
	char name[20];//姓名
	int age;//年龄
	double score;//成绩

	int xu;//序号
	struct Student * next;
};

typedef struct Student STU;
typedef struct Student * pSTU;

struct StuMan
{
	pSTU first;//头结点
	pSTU last;//尾结点
	int len;//总信息数
};

typedef struct StuMan MAN;
typedef struct StuMan * pMAN;


pMAN Init( void );//初始化
bool isEmpty( pMAN head );//是否为空
void append( pMAN head );//追加
void input( pMAN head );//追加多个
void show( pMAN head );//输出所有
pSTU getIndex( pMAN head, int n );//返回序号为 n 的学生信息
double maxScore( pMAN head );//最高分
double minScore( pMAN head );//最低分
double avrScore( pMAN head );//平均分
void sortOfXu( pMAN head );//按序号排序
void sortOfScore( pMAN head );//按成绩排序
pSTU seachOfScore( pMAN head, double seachScore );//按成绩查询
void writeFile( pMAN head );//写入文件


 

 

 

Student.c

 

#include<stdio.h>
#include<stdlib.h>
#include"Student.h"

//初始化
pMAN Init( void )
{
	pMAN head = (pMAN)malloc(sizeof(MAN));

	if ( NULL == head )
	{
		printf("初始化失败!\n");
	}

	head->first = NULL;
	head->last = NULL;
	head->len = 0;

	return head;
}

//是否为空
bool isEmpty( pMAN head )
{
	if ( 0 == head->len )
	{
		return true;
	}
	else
	{
		return false;
	}
}

//追加
void append( pMAN head )
{
	pSTU temp = (pSTU)malloc(sizeof(STU));
	scanf("%s%s%d%lf",temp->num,temp->name,&temp->age,&temp->score);
	temp->next = NULL;

	if ( true == isEmpty( head ) )//如果信息为空,则在第一个位置追加
	{
		head->last = temp;
		head->first = temp;
		head->len++;
		
	}
	else//信息不为空,则在最后一个位置追加
	{
		head->last->next = temp;
		head->last = temp;
		head->len++;
		
	}

	head->last->xu = head->len;
}


//追加多个
void input( pMAN head )
{
	if ( true == isEmpty( head ) )//如果信息为空,则先在第一个位置追加一个
	{
		append( head );
	}
	
	//不为空,或已经在第一个位置追加一个,在尾部追加
	
	pSTU temp = (pSTU)malloc(sizeof(STU));
	
	scanf("%s%s%d%lf",temp->num,temp->name,&temp->age,&temp->score);
	temp->next = NULL;
		
	while ( '0' != temp->num[0] )
	{
		head->last->next = temp;
		head->last = temp;
		head->len++;
		temp->xu = head->len;

		temp = (pSTU)malloc(sizeof(STU));
		scanf("%s%s%d%lf",temp->num,temp->name,&temp->age,&temp->score);
		temp->next = NULL;

	}
	
}

//输出所有
void show( pMAN head )
{
	if ( true == isEmpty( head ) )//信息为空,则退出
	{
		printf("信息为空!\n");
		return ;
	}

	pSTU temp = head->first;

	while ( NULL != temp )
	{
		printf("%-3d| 学号:%-10s姓名:%-15s年龄:%d\t成绩:%.2lf\n",temp->xu,temp->num,temp->name,temp->age,temp->score);
		temp = temp->next;
	}
}

//返回序号为 n 的学生信息
pSTU getIndex( pMAN head, int n )
{
	pSTU temp = NULL;

	//如果序号不在合理范围内,则给出提示,并退出函数
	if ( n < 1 )
	{
		printf("序号应大于 1!\n");
		return temp;
	}
	
	if ( n > head->len )
	{
		printf("序号应不大于 %d!\n",head->len);
		return temp;
	}

	temp = head->first;

	while ( true )
	{
		if ( n == temp->xu )
		{
			break;
		}

		temp = temp->next;
	}

	return temp;
}


//最高分
double maxScore( pMAN head )
{
	double max = -1;
	int i = 1;
	pSTU temp = head->first;

	if ( true == isEmpty( head ) )
	{
		printf("信息为空!\n");
		return max;
	}

	max = temp->score;
	temp = temp->next;
	

	for ( i = 2; i <= head->len; i++ )
	{
		max = ( temp->score >= max ) ? temp->score : max;
		temp = temp->next;
		
	}

	return max;
}


//最低分
double minScore( pMAN head )
{
	double min = -1;
	int i = 1;
	pSTU temp = head->first;
	
	if ( true == isEmpty( head ) )
	{
		printf("信息为空!\n");
		return min;
	}
	
	min = temp->score;
	temp = temp->next;

	for ( i = 2; i <= head->len; i++ )
	{
		min = ( temp->score <= min ) ? temp->score : min;
	}
	
	return min;

}


//平均分
double avrScore( pMAN head )
{
	double ave = 0;
	int i = 1;
	pSTU temp = head->first;

	if ( true == isEmpty( head ) )
	{
		printf("信息为空!\n");
		return ave;
	}

	for ( i = 1; i <= head->len; i++ )
	{
		ave += temp->score;
		temp = temp->next;
	}

	ave = ave / head->len;

	return ave;
}



// 按序号排序
void sortOfXu( pMAN head )
{
	if ( true == isEmpty( head ) )
	{
		printf("信息为空!\n");
		return ;
	}
	
	pSTU * pSort = (pSTU*)malloc(sizeof(pSTU)*head->len);//指针数组
	int i = 1;
	int j = 1;
	pSTU temp = NULL;
	
	for ( i = 0, temp = head->first; i < head->len; i++, temp = temp->next )//保存各条信息指针
	{
		pSort[i] = temp;
	}
	
	// 	for ( i = 0; i < head->len; i++ )
	// 	{
	// 		printf("%-3d| 学号:%-10s姓名:%-15s年龄:%d\t成绩:%.2lf\n",pSort[i]->xu,pSort[i]->num,pSort[i]->name,pSort[i]->age,pSort[i]->score);
	// 	}
	
	
	for ( i = 0; i < head->len - 1; i++ )//指针排序
	{
		for ( j = i + 1; j < head->len; j++)
		{
			if ( pSort[i]->xu > pSort[j]->xu )
			{
				temp = pSort[i];
				pSort[i] = pSort[j];
				pSort[j] = temp;
			}
			
		}
	}
	
	//指针复位
	head->first = pSort[0];
	head->last = pSort[head->len - 1];
	head->last->next = NULL;
	for ( i = 0; i < head->len - 1; i++ )
	{
		pSort[i]->next = pSort[i+1];
	}


}


//按成绩排序
void sortOfScore( pMAN head )
{
	if ( true == isEmpty( head ) )
	{
		printf("信息为空!\n");
		return ;
	}
	
	pSTU * pSort = (pSTU*)malloc(sizeof(pSTU)*head->len);//指针数组
	int i = 1;
	int j = 1;
	pSTU temp = NULL;

	for ( i = 0, temp = head->first; i < head->len; i++, temp = temp->next )//保存各条信息指针
	{
		pSort[i] = temp;
	}

// 	for ( i = 0; i < head->len; i++ )
// 	{
// 		printf("%-3d| 学号:%-10s姓名:%-15s年龄:%d\t成绩:%.2lf\n",pSort[i]->xu,pSort[i]->num,pSort[i]->name,pSort[i]->age,pSort[i]->score);
// 	}


	for ( i = 0; i < head->len - 1; i++ )//指针排序
	{
		for ( j = i + 1; j < head->len; j++)
		{
			if ( pSort[i]->score > pSort[j]->score )
			{
				temp = pSort[i];
				pSort[i] = pSort[j];
				pSort[j] = temp;
			}
			
		}
	}

	//指针复位
	head->first = pSort[0];
	head->last = pSort[head->len - 1];
	head->last->next = NULL;
	for ( i = 0; i < head->len - 1; i++ )
	{
		pSort[i]->next = pSort[i+1];
	}


}

//按成绩查询
pSTU seachOfScore( pMAN head, double seachScore )
{
	pSTU seach = head->first;
	

	if ( true == isEmpty( head ) )
	{
		printf("信息为空!\n");
		return seach;
	}

	while ( NULL != seach )
	{
		if ( seachScore == seach->score )
		{
			break;
		}

		seach = seach->next;
	}

	return seach;

}
//写入文件
void writeFile( pMAN head )
{
	char *str = (char*)malloc(sizeof(char)*25);
	pSTU temp = NULL;
	printf("输入文件名称:");
	scanf("%s",str);
	int i = 1;
	FILE *fp;
	if ( NULL == ( fp = fopen( str, "w" ) ) )
	{
		printf("打开文件失败!\n");
		return;
	}

	temp = head->first;

	while ( i <= head->len )
	{
		fprintf( fp, "%-3d| 学号:%-10s姓名:%-15s年龄:%d\t成绩:%.2lf\n",temp->xu,temp->num,temp->name,temp->age,temp->score);
		temp = temp->next;
		i++;
	}


}


 

 

 

 

 

 

第一版_i++