c语言课程设计 学生成绩管理系统

编写一个菜单驱动的学生成绩管理程序。某个人班级学生成绩管理,设课程数量为5门,学生人数为10人。
程序功能
(1)从键盘输入包括学号、姓名、各门课程、成绩
(2)计算每个人的总分和平均分,并按照平均分排序
(3) 具有查询功能
(4) 具有学生增加和减少功能 5将原始数据和计算后的数据保存在磁盘文件student。txt中.
系统菜单
【1】输入(键盘输入若干条记录,相当于初始化)
【2】插入(插入一条新纪录)
【3】查找(输入一个学生学号,输出其学生的基本信息和各科成绩)
【4】删除(按姓名或学号查找,删除一天学生记录)
【5】统计(若按1,则输入学生的学号统计该生的总分及平均分;若按2,则输入课程求该门课程的总平均分)
【6】排序(按学号或其他字段属性进行排序)
【7】存盘(将所有数据以文件的形式存盘)
【0】退出(退出系统)

楼主笑纳
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10 /*定义常量SIZE便于以后的修改*/
struct student /*定义一个结构体数组存放学生的信息*/
{
int number; /*学号*/
char name[20];/*名字*/
float score[3];/*分数*/
float average;/*平均分*/
}stu[SIZE];

void menu();/*调用菜单函数*/
void write();/*读入信息*/
void save();/*保存stud.dat文件函数*/
void open();/*检查是否正确保存*/
void inturn (struct student c[]);/*用于对学生的信息按平均分排序的函数*/
void save2();/*将排序后的信息存入studsort.dat文件中*/
void read();/*读取studsort.dat文件文件中第2 4 6 8 10个学生的信息*/

void main()
{

int choice;/*用户选择变量*/

printf("*******************************************************************************\n");
printf("* *\n");
printf("* Hwadee &学生成绩文件管理& Hwadee *\n");
printf("* *\n");
printf("*******************************************************************************\n\n\n");
printf("******************************●●欢迎使用●●*********************************");

system("pause");

while (1)
{
menu();/*调用菜单函数形成操作界面*/

printf("请选择:\t");
scanf("%d", &choice);

if ( choice == 0 )
{
system("cls");
printf("\n\n\t\t\t\t谢谢使用!!!);
break;
}

switch(choice) /*多重选择实现功能不同的功能*/
{

case 1:

write();
break;

case 2:

system("cls");
save();
break;

case 3:

system("pause");
system("cls");
open();
break;

case 4:

system("cls");
printf("排序前的学生信息:\n");
open();
inturn(stu);
save2();
break;

case 5:

system("cls");
read();
break;

default:

printf("\n无此项功能!\n请重新输入\n");

}

}

}

void menu()
{
printf("\n1*****输入学生信息\t\t2*****将信息存入文件stud.dat中\n");
printf("3*****检查文件数据\t\t4*****将学生信息排序并存入文件studsort.dat中\n");
printf("5*****读取文件studsort.dat中的第 2 4 6 8 10个学生的信息\n");
printf("0*****退出系统\n\n\n");
}
/**********************************************************************\
函数名称:
write
功能描述:
完成将学生信息写入
函数参数:
i stu
返回值:

模块历史:
\*********************************************************************/
void write()
{
int i;/*计数变量*/
stu[i].average = 0;/*初始化结构体成员 average*/

printf("请你输入学生的信息\n");
printf("学号\t姓名\t语文\t数学\t英语\t\n");
for (i=0; i<SIZE;i++)
{
scanf("%d\t",&stu[i].number);

if (stu[i].number == 0)/*不需输入信息时输入0即可*/
break;

scanf("%s\t%f\t%f\t%f",&stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);

stu[i].average = (stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;/*计算平均成绩*/

}
}

/**********************************************************************\
函数名称:
save
功能描述:
将写入的信息读入文件中
函数参数:
FILE *fp i
返回值:

模块历史:

\*********************************************************************/
void save()
{
FILE *fp;/*定义文件指针用于向文件读入数据*/
int i;
if ((fp=fopen("stud.dat","wb")) == NULL)
{
printf("cannot open file\n");
return;
}
for (i=0;i<SIZE;i++)
if (fwrite(&stu[i],sizeof(struct student),1,fp) != 1)
printf("file write error\n");
fclose(fp);
printf("\n信息保存成功!恭喜!!\n\n");
}
/**********************************************************************\
函数名称:
open
功能描述:
用于检查读入文件的数据是否正确
函数参数:
FILE *cp i
返回值:

模块历史:
\*********************************************************************/

void open()
{
int i;
FILE *cp;
cp = fopen ("stud.dat","rb");
printf("保存在stud.dat文件中的信息:\n\n");
printf("学号\t姓名\t数学\t语文\t英语\t平均分\n\n");
for (i=0;i<SIZE;i++)
{
fread(&stu[i],sizeof(struct student),1,cp);
printf("%d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n\n\n",stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].average );
}
fclose (cp);
}
/**********************************************************************\
函数名称:
inturn
功能描述:
用于对结构体数组中的元素排序
函数参数:
into i,j,k
struct student temp
返回值:

模块历史:
\*********************************************************************/

void inturn(struct student m[])
{
int i,j,k;/*计数变量*/
struct student temp;/*中间变量 类型为结构体*/
for(i=0; i<SIZE-1; i++) /*运用冒泡排序对结构体数组进行排序*/

for (j=i+1; j<SIZE; j++)
{

if( m[i].average < m[j].average )
{
temp = m[i];
m[i] = m[j];
m[j] = temp;
}
}
printf("\n排序后的学生信息:\n\n");
printf(" 学号\t姓名\t数学\t语文\t英语\t平均分\n");
for (i=0; i<SIZE; i++)
{
printf("第%d名 %d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n\n\n",i+1, stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].average );
}/*输出排序后的学生信息*/

}
/**********************************************************************\
函数名称:
save2
功能描述:
将排序后的学生信息读入到另外的文件中
函数参数:
FILE *mp
i
返回值:

模块历史:
\*********************************************************************/

void save2()
{
FILE *mp;
int i;
if ((mp=fopen("studsort.dat","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
for (i=0;i<SIZE;i++)
if (fwrite(&stu[i], sizeof(struct student), 1, mp) != 1)
printf("file write error\n");
fclose(mp);/*读取完毕关闭文件*/
}
/**********************************************************************\
函数名称:
read
功能描述:
读出另外文件中的信息
函数参数:
FILE *tp
i
返回值:

模块历史:
\*********************************************************************/

void read()
{
int i=1;
FILE *tp;
tp = fopen ("studsort.dat", "rb" );
printf("studsort.dat文件中偶数号码学生的信息如下:\n\n");
printf("学号\t姓名\t数学\t语文\t英语\t平均分\n\n");
for (i = 1;i<SIZE;i += 2)
{
fseek(tp,i*sizeof(struct student),0);/*fseek函数可以根据用户所需对文件开头的偏移量来读取文件的数据。

k*sizeof(struct student)是指将位置指针移到当前位置k个字节处*/
fread(&stu[i],sizeof(struct student),1,tp);
/*注意:必须使用fseek函数定位后才能根据自己所需读出数据,但是只用fseek函数不用fread,

只是把数据打印到屏幕上而并没有从文件中读取。这是一个常见性问题*/
printf("%d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n", stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].average );
}
fclose (tp);/*读取完毕关闭文件*/
}
温馨提示:答案为网友推荐,仅供参考
相似回答