C语言课设思路

1.课设要求

1. 课程名称:超市管理系统

2. 课题来源:课程组自拟

3. 课题类型:综合型

4. 目的和意义

(1)综合运用所学知识,解决实际问题

(2)全面提高学生的程序设计能力和开发能力

5. 功能描述(根据相应功能可决定相应的函数名及其功能)

(1)添加商品记录(若原来有此商品,则修改商品数量;若没有此商品,则添加商品)

eg : AddProduct / Add /任意可以让人们理解该函数作用的名称,切忌使用纯数字或字母等,会降低整体的阅读体验

​ 下面同理(不会翻译就用拼音嘛)

(2)查询商品(分别按商品编号和商品名称查询)

(3)对商品数据排序(分别按销售价和日销售量的降序排序)

(4)删除商品记录

(5)修改商品记录

(6)日销售盈利分析

(7)输出商品信息表

(8)用文件保存商品信息

按照上述基本要求,查阅文献,自主设计和补充功能,实现完整的系统。

6. 基本要求

(1)功能齐全:界面操作灵活方便。

(2)界面友好:界面友好、输入有提示、尽量展示人性化。

(3)可读性强:源程序代码清晰、有层次、主要程序段有注释。

(4)健壮性好:用户输入非法数据时,系统应及时给出警告信息。

(5)在规定的时间内完成课程设计任务

(6)完成课程设计报告(参照后面的格式要求)

2.程序设计

(1)准备阶段

首先决定好你的编程工具、运行环境等(此处后面需填写在课设报告里),按我给的教程进行配置的话,这些内容应该如下所示。(如有不一样的大家对照着修改即可)

编程软件:Visual Studio Code

编译环境:TDM—GCC 10.3.0-2(64+32bit)

运行系统:Windows 10 21H2 (设置中的Windows规格可查看,如下图)

(填写的这么详细是为了防止源文件到时候交上去后,课设老师运行出现兼容性错误时,就可以借这些配置避免他给大家判错)

另外就是有关编程软件的几点注意事项:

以VS Code为例,新建文件时,只需在左边的文件资源管理器中打开一个目录(存放C语言源文件的),右键新建文件,命名即可,需要注意的是文件名为XXX.c,一定要记得写上.c 不然运行时会直接报错。

接下来是乱码问题,VS Code的默认文本编码为UTF-8,当你在写程序中输入中文后,可能会在运行时出现乱码现象(如下图)

所以在程序开始写前,点击设置,搜索encoding 改成GBK

若已经写好代码,但是没有改文本编码的话,可以新建一个改好编码的文件,然后把代码复制过去(在已经运行过的代码文件里直接改,会在下次打开时出现乱码)


然后大家写代码的时候一定要对较复杂的地方打上注释,便于课设老师理解,也方便自己理解和记忆。

1
2
3
//适用于单行注释,只能注释双斜杠后面这一行的内容
/*被包括的所有内 “阿巴阿巴”
容都被注释*/

大致注意要点就是这些,有遇到其他问题的同学也可以提出来哈~

(2)开始编程

此处只介绍对该命题部分要点的思路介绍,以及相应的老师在答辩时可能会询问的地方

对于超市管理系统

在前面我们已经介绍过,根据题目要求确定相应函数名和功能,由于单凭一个主函数main() “一写到底”来写程序不太现实,所以一开始我们可以确定的就是必然需要使用模块化设计和结构体函数。

大致思维导图如下:

1.主函数

这部分我认为主要用来负责程序的界面以及调用函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   printf("\n");
printf("超市管理系统");
printf("\n");
printf("1. 添加商品记录\n");
printf("2. 查询商品\n");
printf("3. 对商品数据排序\n");
printf("4. 删除商品记录\n");
printf("5. 修改商品记录\n");
printf("6. 日销售盈利分析\n");
printf("7. 输出商品信息表\n");
printf("8. 保存商品信息\n");
printf("9. 退出\n");
printf("\n");
printf("请输入选项: ");

同时为了允许用户进行多种操作的选择,可以利用switch语句实现多分支结构(课本99页)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
switch (choice) {
case 1:
addProduct();
break;
case 2:
searchProduct();
break;
case 3:
sortProducts();
break;
case 4:
deleteProduct();
break;
case 5:
modifyProduct();
break;
case 6:
dailySalesAnalysis();
break;
case 7:
printProductInfo();
break;
case 8:
saveProductInfo();
break;
case 9:
printf("谢谢使用!\n");
exit(0);
default:
printf("无效的选项,请重新输入。\n");
}

为了持续接受用户输入,我们可以使用 无限循环 来进行实现

来猜猜

while (1) 

于是我们程序的主要框架就已经出现了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
int main() {
int choice;

while (1) {
printf("\n超市管理系统\n");
printf("1. 添加商品记录\n");
printf("2. 查询商品\n");
printf("3. 对商品数据排序\n");
printf("4. 删除商品记录\n");
printf("5. 修改商品记录\n");
printf("6. 日销售盈利分析\n");
printf("7. 输出商品信息表\n");
printf("8. 保存商品信息\n");
printf("9. 退出\n");
printf("请输入选项: ");
scanf("%d", &choice);

switch (choice) {
case 1:
addProduct();
break;
case 2:
searchProduct();
break;
case 3:
sortProducts();
break;
case 4:
deleteProduct();
break;
case 5:
modifyProduct();
break;
case 6:
dailySalesAnalysis();
break;
case 7:
printProductInfo();
break;
case 8:
saveProductInfo();
break;
case 9:
printf("谢谢使用!\n");
exit0);
default:
printf("无效的选项,请重新输入。\n");
}
}

return 0;
}

2.各个模块

在此之前为了保证一定的便利性,我们给本程序的核心词定义一个结构体,并定义一个全局数组 products,用于存储商品信息。

1
2
3
4
5
6
7
8
typedef struct {
char id[10];
char name[50];
int quantity;
float price;
float costPrice;
int dailySales;
} Product;
1
2
3
Product products[MAX_PRODUCTS];
int numProducts = 0;
/*此处的 MAX_PRODUCTS 在此前已通过#define定义过了,它表示的是这个变量的值,即为此系统容纳的商品记录最大值。*/
①添加商品记录

此函数的任务:

  • 允许用户输入商品的ID、名称和数量。
  • 首先,检查商品是否已经存在于系统中,如果存在,则会更新商品的数量。
  • 如果商品是一个新商品,则将其添加到 products 数组中。

所以我们需要考虑的是定义哪些变量,以及相应的数据类型,并且考虑数组的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void addProduct() {
char productId[10];
int i, found = 0;

printf("请输入商品ID: ");
scanf("%s", productId);

for (i = 0; i < numProducts; i++) {
if (strcmp(products[i].id, productId) == 0) {
found = 1;
break;
}
}

if (found == 1) {
printf("商品已存在于系统中。请输入新的数量: ");
scanf("%d", &products[i].quantity);
} else {
if (numProducts == MAX_PRODUCTS) {
printf("无法添加更多的商品。\n");
return;
}

printf("请输入商品名称: ");
scanf("%s", products[numProducts].name);

printf("请输入商品数量: ");
scanf("%d", &products[numProducts].quantity);

printf("请输入商品价格: ");
scanf("%f", &products[numProducts].price);

printf("请输入商品成本价: ");
scanf("%f", &products[numProducts].costPrice);

printf("请输入商品日销售量: ");
scanf("%d", &products[numProducts].dailySales);

strcpy(products[numProducts].id, productId);
numProducts++;
printf("商品已成功添加到系统中。\n");
}
}

在这段代码中,我们使用一个循环来遍历已存在的商品列表,以查找与用户输入的商品ID匹配的商品。循环使用变量i来迭代访问每个商品的信息,并通过strcmp函数将用户输入的商品ID与当前遍历的商品ID进行比较。

如果找到匹配的商品ID,即strcmp函数返回0,我们将设置found变量为1,并使用break语句跳出循环。此时,我们知道该商品已存在于系统中。

如果没有找到匹配的商品ID,在循环结束后,found变量仍为0,表示商品不存在于系统中。

接下来,根据found变量的值来执行相应的操作。如果found为1,即商品已存在于系统中,我们要求用户输入新的数量并更新商品的数量。如果found为0,并且已达到商品列表的最大容量MAX_PRODUCTS,则无法添加更多的商品。

②查询商品

此函数的任务:

  • 提示用户选择查询方式(按商品编号或商品名称)。
  • 根据用户的选择,要求用户输入相应的关键词(商品编号或商品名称)。
  • 查找匹配的商品记录。
  • 如果找到匹配的商品记录,输出商品的详细信息
  • 如果未找到匹配的商品记录,则输出未找到匹配的商品的提示信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void searchProduct() {
int choice;
char searchKey[50];
int found = 0;
int i;

printf("请选择查询方式:\n");
printf("1. 按商品编号查询\n");
printf("2. 按商品名称查询\n");
printf("请选择: ");
scanf("%d", &choice);

switch (choice) {
case 1:
printf("请输入商品编号: ");
scanf("%s", searchKey);
for (i = 0; i < numProducts; i++) {
if (strcmp(products[i].id, searchKey) == 0) {
found = 1;
break;
}
}
break;
case 2:
printf("请输入商品名称: ");
scanf("%s", searchKey);
for (i = 0; i < numProducts; i++) {
if (strcmp(products[i].name, searchKey) == 0) {
found = 1;
break;
}
}
break;
default:
printf("无效的选择。\n");
return;
}

if (found == 1) {
printf("商品详细信息:\n");
printf("商品编号: %s\n", products[i].id);
printf("商品名称: %s\n", products[i].name);
printf("商品数量: %d\n", products[i].quantity);
printf("商品价格: %.2f\n", products[i].price);
printf("商品成本价: %.2f\n", products[i].costPrice);
printf("商品日销售量: %d\n", products[i].dailySales);
} else {
printf("未找到匹配的商品。\n");
}
}
③对商品数据排序

此函数的任务:

  • 该函数用于对商品数据进行排序
  • 提示用户选择排序方式(按销售价或日销售量降序排序)
  • 排序后,输出排序结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
void sortProducts() {
int choice;
printf("请选择排序方式:\n");
printf("1. 按销售价降序排序\n");
printf("2. 按日销售量降序排序\n");
printf("请输入选项:");
scanf("%d", &choice);

if (choice == 1) {
// 按销售价降序排序
for (int i = 0; i < numProducts - 1; i++) {
for (int j = 0; j < numProducts - i - 1; j++) {
if (products[j].price < products[j + 1].price) {
// 交换商品记录
Product temp = products[j];
products[j] = products[j + 1];
products[j + 1] = temp;
}
}
}
} else if (choice == 2) {
// 按日销售量降序排序
for (int i = 0; i < numProducts - 1; i++) {
for (int j = 0; j < numProducts - i - 1; j++) {
if (products[j].dailySales < products[j + 1].dailySales) {
// 交换商品记录
Product temp = products[j];
products[j] = products[j + 1];
products[j + 1] = temp;
}
}
}
} else {
printf("无效的选项。\n");
return;
}

// 输出排序结果
printf("排序结果:\n");
printf("商品编号\t\t商品名称\t\t商品数量\t\t商品价格\t\t商品日销售量\n");
for (int i = 0; i < numProducts; i++) {
printf("%s\t\t%s\t\t%d\t\t%.2f\t\t%d\n", products[i].id, products[i].name, products[i].quantity, products[i].price, products[i].dailySales);
}
}
④删除商品记录

此函数的任务:

  • 提示用户输入要删除的商品ID。
  • 查找匹配的商品记录。
  • 将记录从数组中删除。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void deleteProduct() {
char productId[10];
int i, found = 0;

printf("请输入要删除的商品ID: ");
scanf("%s", productId);

for (i = 0; i < numProducts; i++) {
if (strcmp(products[i].id, productId) == 0) {
found = 1;
break;
}
}

if (found) {
for (int j = i; j < numProducts - 1; j++) {
products[j] = products[j + 1];
}
numProducts--;
printf("商品已成功删除。\n");
} else {
printf("未找到匹配的商品。\n");
}
}
⑤修改商品记录

此函数的任务:

  • 提示用户输入要修改的商品ID
  • 查找匹配的商品记录
  • 如果找到匹配的商品记录,要求用户输入新的商品数量,并更新对应商品记录的数量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void modifyProduct() {
char productId[10];
int i, found = 0;

printf("请输入要修改的商品ID: ");
scanf("%s", productId);

for (i = 0; i < numProducts; i++) {
if (strcmp(products[i].id, productId) == 0) {
found = 1;
break;
}
}

if (found == 1) {
printf("请输入新的数量: ");
scanf("%d", &products[i].quantity);
printf("商品信息已成功更新。\n");
} else {
printf("未找到匹配的商品。\n");
}
}
⑥日销售盈利分析

此函数的任务:

  • 计算每个商品的盈利(销售价减去成本价)和总盈利。
  • 输出每个商品的盈利和总盈利
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void dailySalesAnalysis() {
float totalProfit = 0.0;
int totalSales = 0;
int i;

for (i = 0; i < numProducts; i++) {
float dailyProfit = (products[i].price - products[i].costPrice) * products[i].dailySales;
totalProfit += dailyProfit;
totalSales += products[i].dailySales;
}

printf("日销售盈利分析:\n");
printf("总销售量: %d\n", totalSales);
printf("总盈利: %.2f\n", totalProfit);
}
⑦输出商品信息表

此函数的任务:

  • 显示所有商品的详细信息。
  • 首先输出表头,包括商品编号、商品名称、商品数量、商品价格和商品日销售量
  • 输出每个商品的信息
1
2
3
4
5
6
7
8
9
10
void printProductInfo() {
printf("商品信息表:\n");
printf("商品编号\t商品名称\t商品数量\t商品价格\t商品成本价\t商品日销售量\n");

for (int i = 0; i < numProducts; i++) {
printf("%s\t\t%s\t\t%d\t\t%.2f\t\t%.2f\t\t%d\n",
products[i].id, products[i].name, products[i].quantity,
products[i].price, products[i].costPrice, products[i].dailySales);
}
}
⑧保存商品信息

此函数的任务:

  • 用于将商品信息保存到文件中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void saveProductInfo() {
FILE *file;
file = fopen("product_info.txt", "w");

if (file == NULL) {
printf("无法保存商品信息。\n");
return;
}

for (int i = 0; i < numProducts; i++) {
fprintf(file, "%s,%s,%d,%.2f,%.2f,%d\n",
products[i].id, products[i].name, products[i].quantity,
products[i].price, products[i].costPrice, products[i].dailySales);
}

fclose(file);
printf("商品信息已成功保存到文件。\n");
}

对于学生管理系统

基本框架和上一课设题目差不多,此处只提相关要点和需要深入考虑的问题。

1. 课程名称:学生成绩管理系统

2. 课题来源:课程组自拟

3. 课题类型:综合型

4. 目的和意义

(1)综合运用所学知识,解决实际问题

(2)全面提高学生的程序设计能力和开发能力

5. 功能描述

(1)添加学生记录 (此处就可定义一个变量计算出平均数的值)

(2)查询学生信息(分别按学号和姓名) 可用Switch结构

(3)对学生成绩排序(分别按平均成绩和各科成绩降序排序)

​ 因为按各科成绩排序的代码行较多,可将成绩排序单独拎出来当作一函数

(4)删除学生记录

(5)修改学生记录

(6)班级成绩分析(各科平均成绩、最高分、最低分、及格率)

(7) 输出学生信息表

(8) 用文件保存商品信息

按照上述基本要求,查阅文献,自主设计和补充功能,实现完整的系统。

6. 基本要求

(1)功能齐全:界面操作灵活方便。

(2)界面友好:界面友好、输入有提示、尽量展示人性化。

(3)可读性强:源程序代码清晰、有层次、主要程序段有注释。

(4)健壮性好:用户输入非法数据时,系统应及时给出警告信息。

(5)在规定的时间内完成课程设计任务

(6)完成课程设计报告(参照后面的格式要求)

主函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
int main() {
int choice;

loadStudentsFromFile();

do {
printf("\n");
printf("学生成绩管理系统\n");
printf("1. 添加学生\n");
printf("2. 查询学生\n");
printf("3. 按平均成绩排序\n");
printf("4. 按科目排序\n");
printf("5. 删除学生\n");
printf("6. 修改学生\n");
printf("7. 班级成绩分析\n");
printf("8. 保存学生信息到文件\n");
printf("9. 输出学生信息表\n");
printf("0. 退出\n");
printf("请选择操作:");
scanf("%d", &choice);

switch (choice) {
case 1:
addStudent();
break;
case 2:
searchStudent();
break;
case 3:
sortByAverage();
break;
case 4:
sortBySubject();
break;
case 5:
deleteStudent();
break;
case 6:
modifyStudent();
break;
case 7:
classAnalysis();
break;
case 8:
saveStudentsToFile();
break;
case 9:
printStudentTable();
break;
case 0:
break;
default:
printf("无效的选择。\n");
}
} while (choice != 0);

return 0;
}

①添加学生
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void addStudent() {
if (numStudents == MAX_STUDENTS) {
printf("无法添加更多的学生记录。\n");
return;
}

printf("请输入学生ID: ");
scanf("%s", students[numStudents].id);

printf("请输入学生姓名: ");
scanf("%s", students[numStudents].name);

printf("请输入语文成绩: ");
scanf("%f", &students[numStudents].scores[0]);

printf("请输入数学成绩: ");
scanf("%f", &students[numStudents].scores[1]);

printf("请输入英语成绩: ");
scanf("%f", &students[numStudents].scores[2]);

// 计算平均成绩
students[numStudents].average = (students[numStudents].scores[0] + students[numStudents].scores[1] + students[numStudents].scores[2]) / 3.0;

printf("学生记录已添加。\n");
numStudents++;
}

②查询学生信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void searchStudent() {
int choice;
char keyword[MAX_NAME_LENGTH];

printf("请选择查询方式: \n");
printf("1. 按学号查询\n");
printf("2. 按姓名查询\n");
scanf("%d", &choice);

switch (choice) {
case 1:
printf("请输入学生ID: ");
scanf("%s", keyword);
for (int i = 0; i < numStudents; i++) {
if (strcmp(students[i].id, keyword) == 0) {
printf("学生ID: %s\n", students[i].id);
printf("学生姓名: %s\n", students[i].name);
printf("语文成绩: %.2f\n", students[i].scores[0]);
printf("数学成绩: %.2f\n", students[i].scores[1]);
printf("英语成绩: %.2f\n", students[i].scores[2]);
printf("平均成绩: %.2f\n", students[i].average);
return;
}
}
printf("未找到匹配的学生记录。\n");
break;
case 2:
printf("请输入学生姓名: ");
scanf("%s", keyword);
for (int i = 0; i < numStudents; i++) {
if (strcmp(students[i].name, keyword) == 0) {
printf("学生ID: %s\n", students[i].id);
printf("学生姓名: %s\n", students[i].name);
printf("语文成绩: %.2f\n", students[i].scores[0]);
printf("数学成绩: %.2f\n", students[i].scores[1]);
printf("英语成绩: %.2f\n", students[i].scores[2]);
printf("平均成绩: %.2f\n", students[i].average);
return;
}
}
printf("未找到匹配的学生记录。\n");
break;
default:
printf("无效的选择。\n");
}
}
③按平均成绩排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void sortByAverage() {
for (int i = 0; i < numStudents - 1; i++) {
for (int j = 0; j < numStudents - i - 1; j++) {
if (students[j].average < students[j + 1].average) {
// 交换学生记录
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}

printf("按平均成绩排序结果:\n");
for (int i = 0; i < numStudents; i++) {
printf("学生ID: %s\t姓名: %s\t平均成绩: %.2f\n", students[i].id, students[i].name, students[i].average);
}
}

④按学科进行排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
void sortBySubject() {
int choice;

printf("请选择排序方式: \n");
printf("1. 按语文成绩排序\n");
printf("2. 按数学成绩排序\n");
printf("3. 按英语成绩排序\n");
scanf("%d", &choice);

switch (choice) {
case 1:
for (int i = 0; i < numStudents - 1; i++) {
for (int j = 0; j < numStudents - i - 1; j++) {
if (students[j].scores[0] < students[j + 1].scores[0]) {
// 交换学生记录
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("按语文成绩排序结果:\n");
for (int i = 0; i < numStudents; i++) {
printf("学生ID: %s\t姓名: %s\t语文成绩: %.2f\n", students[i].id, students[i].name, students[i].scores[0]);
}
break;
case 2:
for (int i = 0; i < numStudents - 1; i++) {
for (int j = 0; j < numStudents - i - 1; j++) {
if (students[j].scores[1] < students[j + 1].scores[1]) {
// 交换学生记录
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("按数学成绩排序结果:\n");
for (int i = 0; i < numStudents; i++) {
printf("学生ID: %s\t姓名: %s\t数学成绩: %.2f\n", students[i].id, students[i].name, students[i].scores[1]);
}
break;
case 3:
for (int i = 0; i < numStudents - 1; i++) {
for (int j = 0; j < numStudents - i - 1; j++) {
if (students[j].scores[2] < students[j + 1].scores[2]) {
// 交换学生记录
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("按英语成绩排序结果:\n");
for (int i = 0; i < numStudents; i++) {
printf("学生ID: %s\t姓名: %s\t英语成绩: %.2f\n", students[i].id, students[i].name, students[i].scores[2]);
}
break;
default:
printf("无效的选择。\n");
}
}
⑤删除学生
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void deleteStudent() {
char studentId[10];
int found = 0;

printf("请输入要删除的学生ID: ");
scanf("%s", studentId);

for (int i = 0; i < numStudents; i++) {
if (strcmp(students[i].id, studentId) == 0) {
found = 1;
for (int j = i; j < numStudents - 1; j++) {
students[j] = students[j + 1];
}
numStudents--;
printf("学生记录已成功删除。\n");
break;
}
}

if (!found) {
printf("未找到匹配的学生记录。\n");
}
}
⑥修改学生记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void modifyStudent() {
char studentId[10];
int found = 0;

printf("请输入要修改的学生ID: ");
scanf("%s", studentId);

for (int i = 0; i < numStudents; i++) {
if (strcmp(students[i].id, studentId) == 0) {
found = 1;

printf("请输入新的语文成绩: ");
scanf("%f", &students[i].scores[0]);

printf("请输入新的数学成绩: ");
scanf("%f", &students[i].scores[1]);

printf("请输入新的英语成绩: ");
scanf("%f", &students[i].scores[2]);

// 更新平均成绩
students[i].average = (students[i].scores[0] + students[i].scores[1] + students[i].scores[2]) / 3.0;

printf("学生记录已成功更新。\n");
break;
}
}

if (!found) {
printf("未找到匹配的学生记录。\n");
}
}
⑦班级成绩分析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
void classAnalysis() {
float totalChinese = 0, totalMath = 0, totalEnglish = 0;
float maxChinese = 0, maxMath = 0, maxEnglish = 0;
float minChinese = 100, minMath = 100, minEnglish = 100;
int passCount = 0;

for (int i = 0; i < numStudents; i++) {
totalChinese += students[i].scores[0];
totalMath += students[i].scores[1];
totalEnglish += students[i].scores[2];

if (students[i].scores[0] > maxChinese) {
maxChinese = students[i].scores[0];
}
if (students[i].scores[1] > maxMath) {
maxMath = students[i].scores[1];
}
if (students[i].scores[2] > maxEnglish) {
maxEnglish = students[i].scores[2];
}

if (students[i].scores[0] < minChinese) {
minChinese = students[i].scores[0];
}
if (students[i].scores[1] < minMath) {
minMath = students[i].scores[1];
}
if (students[i].scores[2] < minEnglish) {
minEnglish = students[i].scores[2];
}

if (students[i].scores[0] >= 60 && students[i].scores[1] >= 60 && students[i].scores[2] >= 60) {
passCount++;
}
}

float avgChinese = totalChinese / numStudents;
float avgMath = totalMath / numStudents;
float avgEnglish = totalEnglish / numStudents;
float passRate = (float) passCount / numStudents * 100;

printf("班级成绩分析:\n");
printf("语文平均成绩:%.2f\n", avgChinese);
printf("数学平均成绩:%.2f\n", avgMath);
printf("英语平均成绩:%.2f\n", avgEnglish);
printf("语文最高分:%.2f\n", maxChinese);
printf("数学最高分:%.2f\n", maxMath);
printf("英语最高分:%.2f\n", maxEnglish);
printf("语文最低分:%.2f\n", minChinese);
printf("数学最低分:%.2f\n", minMath);
printf("英语最低分:%.2f\n", minEnglish);
printf("及格率:%.2f%%\n", passRate);
}
⑧保存学生信息到文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void saveStudentsToFile() {
FILE *file = fopen("students.txt", "w");

if (file == NULL) {
printf("无法打开文件。\n");
return;
}

for (int i = 0; i < numStudents; i++) {
fprintf(file, "%s %s %.2f %.2f %.2f %.2f\n", students[i].id, students[i].name,students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].average);
}

fclose(file);
printf("学生信息已成功保存到文件。\n");
}

void loadStudentsFromFile() {
FILE *file = fopen("students.txt", "r");

if (file == NULL) {
printf("无法打开文件。\n");
return;
}

numStudents = 0;
char line[100];

while (fgets(line, sizeof(line), file) != NULL) {
sscanf(line, "%s %s %f %f %f %f", students[numStudents].id, students[numStudents].name,
&students[numStudents].scores[0], &students[numStudents].scores[1], &students[numStudents].scores[2],
&students[numStudents].average);
numStudents++;
}

fclose(file);
printf("学生信息已成功从文件加载。\n");
}
⑨输出学生信息表
1
2
3
4
5
6
7
void printStudentTable() {
printf("学生信息表:\n");
printf("学号\t姓名\t\t语文\t数学\t英语\t平均成绩\n");
for (int i = 0; i < numStudents; i++) {
printf("%s\t%s\t\t%.2f\t%.2f\t%.2f\t%.2f\n", students[i].id, students[i].name,students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].average);
}
}

⑩退出