作者:小代码
时间:2013年8月2日17:30:22
IDE:VC6.0
功能:
一、输入:
1、尾部追加 2、追加多个二、输出所有信息
三、返回序号 为 n 的学生的信息
四、最高分、最低分、平均分
五、排序
1、按序号排序 2、按成绩排序六、写入文件
代码:
StuMain.c
#include#include #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#include #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++; }}