> # ♻️ 资源
> **大小:** 76.2KB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010573**](https://www.yuque.com/sxbn/ks/100010573)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87404243**](https://download.csdn.net/download/s1t16/87404243)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 成绩管理系统
## 一、实验名称:成绩管理系统
## 二、实验学时:4 学时
## 三、实验目的:
1. 熟悉并掌握 C 语言程序设计的步骤。
2. 掌握 C 语言中函数、结构体、数组等知识和其用法。
3. 设计小型成绩管理系统,要求实现简单的功能,一门课程的成绩管理系统包括学生成绩的录入、查询、列表等功能。
## 四、实验内容:
要求:
利用结构数组存储所有学生信息,最多 100 个学生。编写学生成绩管理系统,其中学生的信息有学号、姓名(汉语拼音)和分数。
完成下面函数:
1、输入学生信息函数 AddStd 实现添加学生相关信息;
2、按学号查询学生详细信息(包括成绩)QueryById;
3、成绩列表函数 ListAll 按学号排序输出学生信息;
4、输出平均分 AvgScore;
5、输出最高分 MaxScore 学生信息(需要注意的是最高分的学生可能不只一人)。
利用 while 循环实现功能界面输出,根据用户选择调用对应的功能选项。所有学生成绩信息在退出系统时以文本文件保存到文件 scores.txt(格式自定,可以是每个学生的信息和成绩占一行),在系统第一次运行时 scores.txt 被创建,每次系统运行时系统将从文件读入已保存的学生成绩信息。
提交:
代码(.c 文件)、可执行文件(exe 文件)、实验报告(word 文件)和存有数据的 scores.txt。实验报告需提供成绩录入、成绩查询、成绩列表等功能的运行结果。所有文件打包成一个压缩文件。
## 五、实验步骤:
1. 定义结构体和顺序表:
考虑用结构体来表示数据元组,每个元组应包含学号、姓名(汉语拼音)和分数三个属性。同时建一个顺序表,用其中的指针指向结构体数组的元素,可实现对数据的操作。
部分代码如下:
```
typedef struct grade /* 定义元组信息 */
{
char StuNo[20]; /* 学号,由字符串组成 */
char Name[15]; /* 姓名,由字符串组成 */
int Score; /* 成绩,char类型 */
int Flag;
}Grade;
typedef struct sqlist /* 定义顺序表 */
{
Grade * elem;
}Sqlist;
```
其中定义 StuNo 为学号,是 20 个字符大小的字符串,Name 为姓名,是 15 个字符大小的字符串,Score 是 int 型变量,表示成绩,最后还加了一个 int 型变量 Flag,作用是充当一个标志位,判断此处有无数据,方便程序操作。
2. 除了题目中需要的函数外,还需要定义几个辅助函数,这里举几个比较典型的例子,详细代码见代码源文件。
(1)文件初始化函数:
```
void InitialFile() /* 文件初始化方法 */
{
FILE * pf;
if ( (pf = fopen( "scores.txt", "a" ) ) == NULL ) /* 打开操作不成功 */
{
printf( "错误:数据文件打开失败!n" );
return; /* 结束程序的执行 */
}
fclose( pf );
return;
}
```
作用:在每次程序开始时都执行一次,使用“a”方法打开文件,可以实现没有该文件自动穿件该文件,并且当该文件存在时可以不用清除其中的内容。
(2)文件读取函数:
```
void GetSqlist( int * mm, int * nn, Grade * b, Sqlist * a ) /* 通过现有文件创建一个顺序表 */
{
FILE * pf;
int tempc;
int tempcc;
char temps[20];
char tempss[15];
int i;
int count = 0;
a - > elem = b; /* 初始化 */
if ( (pf = fopen( "scores.txt", "r" ) ) == NULL ) /* 打开操作不成功 */
{
printf( "错误:文件打开失败!" );
return; /* 结束程序的执行 */
}
for ( i = 0; i < *nn; i++ )
{
(a - > elem + i) - > Flag = 0;
}
for ( i = 0; i < *nn; i++ )
{
tempc = fgetc( pf );
if ( tempc == EOF )
{
printf( "顺序表创建完成!n" );
break;
}
if ( tempc == '#' )
{
tempc = fgetc( pf );
if ( tempc != '#' )
{
count++;
fseek( pf, -1, SEEK_CUR );
fgets( temps, 20, pf );
if ( 1 )
{
strcpy( (a - > elem + i) - > StuNo, temps );
fseek( pf, 3, SEEK_CUR );
fgets( tempss, 15, pf );
strcpy( (a - > elem + i) - > Name, tempss );
fseek( pf, 4, SEEK_CUR );
fscanf( pf, "%d ", &tempcc ); /* */
(a - > elem + i) - > Score = tempcc;
(a - > elem + i) - > Flag = 1;
}
}
}
}
*mm = count;
return;
}
```
作用:在程序开始时执行此操作,可以实现将文件中的数据读取到当前内存中的效果,方便后续处理。
(3)结构体排序操作:
```
void SortSqlist(Sqlist * a, int * mm) //BUG
{
int i,
j;
int tempc;
char temps[20];
char tempss[15];
for (i = 0; i < 20; i++)
{
temps[i] = ' ';
}
for (i = 0; i < 15; i++)
{
tempss[i] = ' ';
}
for (i = 0; i < *mm; i++)
{
for (j = 0; j < *mm - 1; j++)
{
if (strcmp((a - >elem + j) - >StuNo, (a - >elem + j + 1) - >StuNo) > 0)
{
strcpy(temps, (a - >elem + j) - >StuNo);
strcpy((a - >elem + j) - >StuNo, (a - >elem + j + 1) - >StuNo);
strcpy((a - >elem + j + 1) - >StuNo, temps);
strcpy(tempss, (a - >elem + j) - >Name);
strcpy((a - >elem + j) - >Name, (a - >elem + j + 1) - >Name);
strcpy((a - >elem + j + 1) - >Name, tempss);
tempc = (a - >elem + j) - >Score;
(a - >elem + j) - >Score = (a - >elem + j + 1) - >Score;
(a - >elem + j + 1) - >Score = tempc;
}
}
}
}
```
作用:对当前数据表中元组按学号从小到大进行排序,使用的是冒泡排序法。
(4)写入文件函数
```
void WriteFile( Sqlist * a, int * mm )
{
int i;
FILE * pf;
if ( (pf = fopen( "scores.txt", "w" ) ) == NULL ) /* 打开操作不成功 */
{
printf( "错误:文件打开失败!" );
return; /* 结束程序的执行 */
}
for ( i = 0; i < *mm; i++ )
{
if ( (a - > elem + i) - > Flag == 1 )
{
fprintf( pf, "#%-20s##%-15s###%-5dn", (a - > elem + i) - > StuNo, (a - > elem + i) - > Name, (a - > elem + i) - > Score );
}
}
fclose( pf );
return;
}
```
作用:该系统实现的逻辑是:开始时从文件中读取数据到内存,之后对数据表的操作直接在内存中进行,当数据有变动或结束程序时,重新把内存中的数据按一定格式写入文件,这个函数就是写入文件用的。
4. 程序主要功能的实现:
(1)添加学生信息
```
void AddStu(Sqlist * a, int * mm, int * nn)
{
char newStuNo[20];
char newName[15];
int * newScore;
int i;
if ( * mm == *nn) //超出容量,返回值为0,表示出错
{
printf("出错:超出数据表容量!n"); //提示:超出容量,出错
return;
}
GetInfo(newStuNo, newName, newScore);
for (i = 0; i < *nn; i++)
{
if ((a - >elem + i) - >Flag == 0
神仙别闹
- 粉丝: 3588
- 资源: 7460
最新资源
- js-leetcode题解之158-read-n-characters-given-read4-ii-call
- js-leetcode题解之157-read-n-characters-given-read4.js
- js-leetcode题解之156-binary-tree-upside-down.js
- js-leetcode题解之155-min-stack.js
- js-leetcode题解之154-find-minimum-in-rotated-sorted-array-ii.js
- js-leetcode题解之153-find-minimum-in-rotated-sorted-array.js
- js-leetcode题解之152-maximum-product-subarray.js
- js-leetcode题解之151-reverse-words-in-a-string.js
- js-leetcode题解之150-evaluate-reverse-polish-notation.js
- js-leetcode题解之149-max-points-on-a-line.js
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈