c语言学生管理系统用文件保存

编写一个菜单驱动的学生成绩管理程序。实现如下管理功能:

? 能输入并显示 n 个学生的 m 门考试科目的成绩、总分和平均分。

? 按总分进行排序。

? 按学号进行排序。

? 任意输入一个学号,能显示该学生的姓名、各门功课的成绩。

? 将输入的学生成绩数据保存到文件中。

? 从文件中读出学生成绩数据。

具体要求如下:

1 )先用静态的数据结构(结构体数组)来存储和管理 n 个学生的学号、姓名、成绩等信息,进行编程。
2 )再换用动态数据结构(链表)来存储和管理 n 个学生的学号、姓名、成绩等信息,进行编程。
3 ) 排序函数是一个 具有多种排序方式的 通用的 排序程序,即 不仅可以实现成绩的升序排序,还可以实现成绩的降序排序。
4 )程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。
5 )输出菜单形式如下:
Management for Students' scores
1. Append record
2. List record
3. Delete record
4. Modify record
5. Search record
6. Sort Score in descending order by sum
7. Sort Score in ascending order by sum
8. Sort Score in descending order by num
9. Sort Score in ascending order by num
W. Write to a File
R. Read from a File
0. Exit
Please Input your choice:

/**********************************************
*File Name:StuHead.h *
*Created:07/11/28 *
*Author:Wen He *
*Description:此文件的指责是程序的头文件描述 *
**********************************************/

/*引入头文件*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 100 /*定义学生人数*/
#define MAXSUB 4 /*定义课程数目*/
int length; /*定义学生的实际人数*/

/*定义学生结构体*/
typedef struct tagStudent_t
{
char no[11]; /*学号*/
char name[20]; /*姓名*/
int score[MAXSUB];/*各科成绩*/
int sum; /*总分*/
float average; /*平均分*/
}Student;

/*函数声明*/
char menu_select();
void input(Student stuArray[]);
void output(Student stuArr[]);
void search(Student stuAray[]);
int searchByNo(Student stuArr[]);
void searchByName(Student stuArr[]);
void update(Student stuArray[]);
void delete(Student stuArray[]);

----------------------以上是头文件

/**********************************************
*File Name:stuMain.c *
*Created:07/11/28 *
*Author:Wen He *
*Description:此程序的指责为程序的入口,主函数 *
***********************************************/

#include "stuHead.h"

void main()
{
Student stus[MAXSIZE];
while(1)
{
switch(menu_select())
{
case '1':
input(stus);
break;
case '2':
update(stus);
printf("按任意键继续…");
fflush(stdin);
getchar();
break;
case '3':
search(stus);
printf("按任意键继续…");
fflush(stdin);
getchar();
break;
case '4':
delete(stus);
printf("按任意键继续…");
fflush(stdin);
getchar();
break;
case '5':
output(stus);
printf("按任意键继续…");
fflush(stdin);
getchar();
break;
case '0':
printf("\n 谢谢使用!\n");
exit(0);
}
}
}

以上是MAIN

下面是主程序

/**********************************************
*File Name:stuFun.c *
*Created:07/11/28 *
*Author:Wen He *
*Description:此程序的指责为各函数的定义 *
***********************************************/

#include "stuHead.h"

/**********************************************
*Function Name:menu_select
*Description:菜单选择
*Date:07/11/28
*parameter:无
*Author:Wen He
***********************************************/
char menu_select()
{
char MenuItem;

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");

do
{
printf("\n 请输入选项(0-5):");
fflush(stdin);
scanf("%c",&MenuItem);
getchar();
}while(MenuItem<'0'||MenuItem>'5');

return MenuItem;
}

/**********************************************
*Function Name:input
*Description:输入学生信息
*Date:07/11/28
*parameter:stuArray[MAXSIZE]
*Author:Wen He
***********************************************/
void input(Student stuArray[])
{
int i,j,k;
char cContinue;
int flag=1;
fflush(stdin);
for(i=length;i<MAXSIZE-1;i++)
{
printf("请输入第%d名学生的学号:",i+1);
scanf("%s",&stuArray[i].no);
if(i>0)
{
for(k=0;k<length;k++)
if(strcmp(stuArray[k].no,stuArray[i].no)==0)
break;
if(k<length)
{
i--;
printf("学号不能重复,请重新输入!");
continue;
}
}
printf("请输入姓名:");
scanf("%s",&stuArray[i].name);
for(j=0;j<MAXSUB;j++)
{
printf("请输入第%d门成绩:",j+1);
scanf("%d",&stuArray[i].score[j]);
if(stuArray[i].score[j]>100||stuArray[i].score[j]<0)
{
printf("错误数据,请重新输入!");
j--;
}
}
stuArray[i].sum=0;
for(j=0;j<MAXSUB;j++)
stuArray[i].sum+=stuArray[i].score[j];
stuArray[i].average=(float)stuArray[i].sum/MAXSUB;
length++;
do
{
flag=1;
fflush(stdin);
printf("需要继续录入吗?(Y/N)");
scanf("%c",&cContinue);
getchar();
switch(cContinue)
{
case 'Y':
case 'y':
flag=0;
break;
case 'N':
case 'n':
return;
}
}while(flag);
}
}

/**********************************************
*Function Name:output
*Description:输出学生信息
*Date:07/11/28
*parameter:stuArray[MAXSIZE]
*Author:Wen He
***********************************************/
void output(Student stuArray[])
{
int i,j;
printf("| 学号 | 姓名 | 成绩1 | 成绩2 | 成绩3 | 成绩4 | 总分 | 平均分 |\n");
printf("|------|--------------|-------|-------|-------|-------|------|--------|\n");
for(i=0;i<length;i++)
{
printf("|%-6s|%-14s|", stuArray[i].no,stuArray[i].name);
for(j=0;j<MAXSUB;j++)
printf("%7d|", stuArray[i].score[j]);
printf("%7d%7.2f\n",stuArray[i].sum, stuArray[i].average); /*输出数组中当前学生的信息*/
}
}

/**********************************************
*Function Name:search
*Description:查询学生信息
*Date:07/11/28
*parameter:stuArray[MAXSIZE]
*Author:Wen He
***********************************************/
void search(Student stuArray[])
{
char menuItem;
printf("\n\n\n"); /*输出三个空行*/
/*---------输出菜单界面开始-----------*/
printf(" | --------------------------------------------|\n");
printf(" | 查询子菜单项 |\n");
printf(" | --------------------------------------------|\n");
printf(" | 1---学号查询 |\n");
printf(" | 2---姓名查询 |\n");
printf(" | 0---返回主菜单 |\n");
printf(" | --------------------------------------------|\n");
/*----------菜单界面输出结束-----------*/
do
{
printf("\n 请输入菜单项数字(0~2):");
fflush(stdin);
scanf("%c",&menuItem);
getchar();
}while(menuItem<'0'||menuItem>'2');
switch(menuItem)
{
case '1':
searchByNo(stuArray);
break;
case '2':
searchByName(stuArray);
break;
}
return;
}

/**********************************************
*Function Name:searchByNo
*Description:按学号查询学生信息
*Date:07/11/28
*parameter:stuArray[MAXSIZE]
*Author:Wen He
***********************************************/
int searchByNo(Student stuArray[])
{
char no[20];
int i;
printf("\n请输入学生的学号:");
scanf("%s",no);
for(i=0;i<length;i++)
if(strcmp(stuArray[i].no,no)==0)
break;
if(i==length)
printf("您输入的学号不存在!\n");
else
{
printf("| 学号 | 姓名 | 成绩1 | 成绩2 | 成绩3 | 成绩4 | 总分 | 平均分 |\n");
printf("|------|--------------|-------|-------|-------|-------|------|--------|\n");
printf("|%-6s|%-14s|%7d|%7d|%7d|%7d|%7d|%7.2f|\n", stuArray[i].no,stuArray[i].name,
stuArray[i].score[0], stuArray[i].score[1], stuArray[i].score[2], stuArray[i].score[3],
stuArray[i].sum, stuArray[i].average); /*输出数组中当前学生的信息*/
}
return i;
}

/**********************************************
*Function Name:searchByName
*Description:按姓名查询学生信息
*Date:07/11/28
*parameter:stuArray[MAXSIZE]
*Author:Wen He
***********************************************/
void searchByName(Student stuArray[])
{
Student stu[10];
char searchName[20];
int i,j,k;
printf("\n请输入要查询学生的姓名:");
scanf("%s",searchName);
for(i=0,j=0;i<length;i++)
if(strcmp(stuArray[i].name,searchName)==0)
{
strcpy(stu[j].no,stuArray[i].no);
strcpy(stu[j].name,searchName);
for(k=0;k<4;k++)
stu[j].score[k]=stuArray[i].score[k];
stu[j].sum=stuArray[i].sum;
stu[j].average=stuArray[i].average;
j++;
}
if(j==0)
printf("您输入的姓名不存在!\n");
else
{
printf("| 学号 | 姓名 | 成绩1 | 成绩2 | 成绩3 | 成绩4 | 总分 | 平均分 |\n");
printf("|------|--------------|-------|-------|-------|-------|------|--------|\n");
for(i=0;i<j;i++)
printf("|%-6s|%-14s|%7d|%7d|%7d|%7d|%7d|%7.2f|\n", stu[i].no,stu[i].name,
stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].score[3],
stu[i].sum, stu[i].average); /*输出数组中当前学生的信息*/
}
}

/**********************************************
*Function Name:update
*Description:修改学生信息
*parameter:stuArray[MAXSIZE]
*Date:07/11/28
*Author:Wen He
***********************************************/
void update(Student stuArray[])
{
char answer;
int i,j;
i=searchByNo(stuArray);
if(i<length)
{
do
{
printf("您要修改的是以上记录吗?(Y/N)");
fflush(stdin);
scanf("%c",&answer);
getchar();
}while(answer!='Y'&&answer!='N'&&answer!='y'&&answer!='n');
if(answer=='Y'||answer=='y')
{
printf("请输入姓名:");
scanf("%s",stuArray[i].name);
stuArray[i].sum=0;
for(j=0;j<MAXSUB;j++)
{
printf("请输入第%d门课程的成绩:",j+1);
scanf("%d",&stuArray[i].score[j]);
stuArray[i].sum+=stuArray[i].score[j];
}
stuArray[i].average=(float)stuArray[i].sum/MAXSUB;
printf("您修改后的信息如下:\n");
printf("| 学号 | 姓名 | 成绩1 | 成绩2 | 成绩3 | 成绩4 | 总分 | 平均分 |\n");
printf("|------|--------------|-------|-------|-------|-------|------|--------|\n");
printf("|%-6s|%-14s|%7d|%7d|%7d|%7d|%7d|%7.2f|\n", stuArray[i].no,stuArray[i].name,
stuArray[i].score[0], stuArray[i].score[1], stuArray[i].score[2], stuArray[i].score[3],
stuArray[i].sum, stuArray[i].average); /*输出数组中当前学生的信息*/

}
}
}

/**********************************************
*Function Name:delete
*Description:删除学生信息
*Date:07/11/28
*parameter:stuArray[MAXSIZE]
*Author:Wen He
***********************************************/
void delete(Student stuArray[])
{
char answer;
int i,j;
i=searchByNo(stuArray);
if(i<length)
{
do
{
printf("您要删除的是以上记录吗?(Y/N)");
fflush(stdin);
scanf("%c",&answer);
getchar();
}while(answer!='Y'&&answer!='N'&&answer!='y'&&answer!='n');
if(answer=='Y'||answer=='y')
{
for(j=i;j<=length-1;j++)
stuArray[j]=stuArray[j+1];
printf("删除成功!");
length--;
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-07-05
给钱办事,保证妥当
!!!
相似回答