1.系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令
2.开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示“成绩表为空!请先使用命令 T 录入学生成绩。”
同理,当输入其他的成绩处理命令时也作相应的处理。
3.输入命令 T,调用Type子函数录入成绩。界面提示输入学生人数
输入3 后提示输入3名学生的3门课成绩,列出成绩单的表头“学号 语文 数学 英语”,提示学号:1
输入1号学生的3门课成绩,用空格间隔,回车结束。提示学号:2
以此类推,直到输入结束
4.输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
5.输入命令 A ,调用Average子函数计算平均分,提示“平均分已计算。请使用命令L查看。” Average子函数调用结束,返回。提示输入命令。
输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
6.输入命令 P ,调用Sort子函数将各学生记录按平均分由高到低排序,提示“完成排序。请使用命令L查看。” Sort子函数调用结束,返回。提示输入命令。
输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
7.输入命令 S ,调用Search子函数查询学生成绩,提示“输入要查询的学生学号”。
输入3 ,找到3号学生的成绩并输出。Search子函数调用结束,返回。提示输入命令。
8.输入命令C , 执行清屏函数语句system("clear");
清除屏幕的所有内容。提示输入命令。
9.输入命令D,执行删除函数Delete
10.输入命令M,执行Modify函数
11.输入命令H , 调用Help子函数显示帮助菜单。Help子函数调用结束,返回。提示输入命令。
10.输入命令Q , 则退出系统。
11.构造思想:
1)输出数组元素时,要将学号单独处理,输出为整数(即保留0位小数)。同理,在计算成绩时也要将第1列的学号撇开,只计算第2列之后的。成绩保留2位小数。
2)学生人数n贯穿始终,通过n的值判断当前命令的子函数是否能够调用执行。例如:当n=0时,说明还没有录入成绩。而一旦输入命令T,也即调用Type子函数录入了成绩,则n的值就不再是0。当n!=0时,就可以进行其他的成绩操作。
代码展示
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student // 定义结构体数组,用来存放学生信息
{
int num;
float Chinese;
float math;
float English;
float average;
} stu[32];
void Help(); // 声明函数
int Type(struct student *p, int n);
void List(int n);
void Average(int n);
void paixu(int n);
void Search(int n);
int Delete(int n);
void Modify(int n);
int main(int argc, char const *argv[])
{
Help(); // 调用帮助菜单函数
int n = 0;
while (1) // 重复输入命令
{
char ml[32];
printf("请输入命令=");
scanf(" %s", ml);
if (strlen(ml) > 1)
{
printf("输入命令错误,请重新输入\n");
continue;
}
if (ml[0] == 'C')
system("clear"); // 输入C时,触发清屏函数
else if (ml[0] == 'Q')
break; // 输入Q时退出程序
else if (ml[0] == 'T')
n = Type(stu, n); // 输入T时调用Type函数录入信息
else if (n == 0) // 当学生人数为0时无法使用其它命令,需要先录入信息
printf("成绩表为空!请先使用命令T录入学生成绩\n");
else if (n != 0)
{
if (ml[0] == 'H')
Help(); // 当输入H时调用Help函数打开帮助菜单
else if (ml[0] == 'L')
List(n); // 输入L时调用List函数列出学生信息
else if (ml[0] == 'D')
n = Delete(n); // 输入D时调用Delete函数删除学生信息
else if (ml[0] == 'M')
Modify(n); // 输入M时调用Modify函数修改学生信息
else if (ml[0] == 'A')
Average(n); // 输入A时调用Average函数计算平均分
else if (ml[0] == 'P')
paixu(n); // 输入P时调用paixu函数进行排序
else if (ml[0] == 'S')
Search(n); // 输入S时调用Search函数进行查询
}
getchar(); // 回收垃圾字符
}
return 0;
}
int Type(struct student *p, int n) // 录入信息函数
{
int num;
printf("请输入学生人数:");
scanf("%d", &num);
printf("请输入%d个学生的成绩\n", num);
printf("学号 语文 数学 外语\n");
for (int a = n; a < n + num; a++) // for循环遍历录入信息
{
printf("%d ", a + 1);
stu[a].num = a + 1;
scanf("%f %f %f", &stu[a].Chinese, &stu[a].math, &stu[a].English);
}
n = num + n;
return n; // 返回学生人数
}
void Help() // 帮助菜单
{
printf("**************************************\n");
printf("* 学生成绩管理系统————帮助菜单 *\n");
printf("**************************************\n");
printf("* H=显示帮助菜单 *\n");
printf("* T=成绩录入 *\n");
printf("* A=计算学生平均分 *\n");
printf("* L=列出成绩表 *\n");
printf("* P=按平均成绩由高到低排序 *\n");
printf("* S=按学号查询学生成绩 *\n");
printf("* D=删除 *\n");
printf("* X=修改 *\n");
printf("* C=清屏 *\n");
printf("* Q=退出系统 *\n");
printf("**************************************\n");
printf(" Copyright <c> 2024.08.06 By zhr\n");
}
void List(int n) // 列出学生信息函数
{
printf("学生成绩如下:\n");
printf("学号 语文 数学 外语 平均分\n");
for (int a = 0; a < n; a++) // for循环遍历结构体数组
{
printf("%d %.2f %.2f %.2f %.2f", stu[a].num, stu[a].Chinese, stu[a].math, stu[a].English, stu[a].average);
printf("\n");
}
}
void Average(int n) // 计算平均分函数
{
for (int a = 0; a < n; a++)
stu[a].average = (stu[a].Chinese + stu[a].English + stu[a].math) / 3;
printf("平均分已计算,请使用命令L查看\n");
}
void paixu(int n) // 排序函数
{
struct student stu1;
if (stu[0].average == 0) // 平均分未计算时无法排序
printf("无法排序,请先使用命令A计算平均分\n");
else
{
for (int a = 0; a < n - 1; a++)
{
for (int b = 0; b < n - 1 - a; b++)
{
if (stu[b].average < stu[b + 1].average)
{
stu1 = stu[b]; // 通过交换结构体数组进行排序
stu[b] = stu[b + 1];
stu[b + 1] = stu1;
}
}
}
printf("已完成排序,请使用命令L查看\n");
}
}
void Search(int n)
{
int num;
printf("请输入要查询的学生的学号:");
scanf("%d", &num);
printf("学号 语文 数学 外语 平均分\n");
for (int a = 0; a < n; a++)
if (stu[a].num == num) // 通过学号打印学生信息
printf("%d %.2f %.2f %.2f %.2f\n", stu[a].num, stu[a].Chinese, stu[a].math, stu[a].English, stu[a].average);
}
int Delete(int n) // 删除函数
{
int num;
int i;
printf("请输入要删除的学生的学号");
scanf("%d", &num);
if (num > n || num <= 0)
printf("输入学号错误请重新输入");
for (int a = 0; a < n; a++)
if (stu[a].num == num)
i = a;
for (int m = i; m < n - 1; m++) // 将删除学号后面的数组往前补,以此类推
stu[m] = stu[m + 1];
return n - 1;
}
void Modify(int n) // 修改信息函数
{
int num;
int i;
printf("请输入要修改的学生的学号");
scanf("%d", &num);
for (int a = 0; a < n; a++)
if (stu[a].num == num)
{
i = a;
break;
}
printf("请输入修改后的信息\n");
printf("学号 语文 数学 外语 \n");
printf("%d ", stu[i].num);
scanf("%f %f %f", &stu[i].Chinese, &stu[i].math, &stu[i].English);
}
分文件
1. 头文件:.h结尾的文件
头文件、宏定义、typedef、结构体、共用体和枚举的定义、函数的声明和外部引用extern。
全局变量一般不会定义在头文件中
2. 源文件:.c结尾的文件
包含main函数的.c文件: main函数
包含子函数的.c: 子函数
main.c文件
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"add.h"
int main(int argc, char const *argv[])
{
Help(); // 调用帮助菜单函数
int n = 0;
while (1) // 重复输入命令
{
char ml[32];
printf("请输入命令=");
scanf(" %s", ml);
if (strlen(ml) > 1)
{
printf("输入命令错误,请重新输入\n");
continue;
}
if (ml[0] == 'C')
system("clear"); // 输入C时,触发清屏函数
else if (ml[0] == 'Q')
break; // 输入Q时退出程序
else if (ml[0] == 'T')
n = Type(stu, n); // 输入T时调用Type函数录入信息
else if (n == 0) // 当学生人数为0时无法使用其它命令,需要先录入信息
printf("成绩表为空!请先使用命令T录入学生成绩\n");
else if (n != 0)
{
if (ml[0] == 'H')
Help(); // 当输入H时调用Help函数打开帮助菜单
else if (ml[0] == 'L')
List(n); // 输入L时调用List函数列出学生信息
else if (ml[0] == 'D')
n = Delete(n); // 输入D时调用Delete函数删除学生信息
else if (ml[0] == 'M')
Modify(n); // 输入M时调用Modify函数修改学生信息
else if (ml[0] == 'A')
Average(n); // 输入A时调用Average函数计算平均分
else if (ml[0] == 'P')
paixu(n); // 输入P时调用paixu函数进行排序
else if (ml[0] == 'S')
Search(n); // 输入S时调用Search函数进行查询
}
getchar(); // 回收垃圾字符
}
return 0;
}
hanshu.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "add.h"
int Type(struct student *p, int n) // 录入信息函数
{
int num;
printf("请输入学生人数:");
scanf("%d", &num);
printf("请输入%d个学生的成绩\n", num);
printf("学号 语文 数学 外语\n");
for (int a = n; a < n + num; a++) // for循环遍历录入信息
{
printf("%d ", a + 1);
stu[a].num = a + 1;
scanf("%f %f %f", &stu[a].Chinese, &stu[a].math, &stu[a].English);
}
n = num + n;
return n; // 返回学生人数
}
void Help() // 帮助菜单
{
printf("**************************************\n");
printf("* 学生成绩管理系统————帮助菜单 *\n");
printf("**************************************\n");
printf("* H=显示帮助菜单 *\n");
printf("* T=成绩录入 *\n");
printf("* A=计算学生平均分 *\n");
printf("* L=列出成绩表 *\n");
printf("* P=按平均成绩由高到低排序 *\n");
printf("* S=按学号查询学生成绩 *\n");
printf("* D=删除 *\n");
printf("* X=修改 *\n");
printf("* C=清屏 *\n");
printf("* Q=退出系统 *\n");
printf("**************************************\n");
printf(" Copyright <c> 2024.08.06 By zhr\n");
}
void List(int n) // 列出学生信息函数
{
printf("学生成绩如下:\n");
printf("学号 语文 数学 外语 平均分\n");
for (int a = 0; a < n; a++) // for循环遍历结构体数组
{
printf("%d %.2f %.2f %.2f %.2f", stu[a].num, stu[a].Chinese, stu[a].math, stu[a].English, stu[a].average);
printf("\n");
}
}
void Average(int n) // 计算平均分函数
{
for (int a = 0; a < n; a++)
stu[a].average = (stu[a].Chinese + stu[a].English + stu[a].math) / 3;
printf("平均分已计算,请使用命令L查看\n");
}
void paixu(int n) // 排序函数
{
struct student stu1;
if (stu[0].average == 0) // 平均分未计算时无法排序
printf("无法排序,请先使用命令A计算平均分\n");
else
{
for (int a = 0; a < n - 1; a++)
{
for (int b = 0; b < n - 1 - a; b++)
{
if (stu[b].average < stu[b + 1].average)
{
stu1 = stu[b]; // 通过交换结构体数组进行排序
stu[b] = stu[b + 1];
stu[b + 1] = stu1;
}
}
}
printf("已完成排序,请使用命令L查看\n");
}
}
void Search(int n)
{
int num;
printf("请输入要查询的学生的学号:");
scanf("%d", &num);
printf("学号 语文 数学 外语 平均分\n");
for (int a = 0; a < n; a++)
if (stu[a].num == num) // 通过学号打印学生信息
printf("%d %.2f %.2f %.2f %.2f\n", stu[a].num, stu[a].Chinese, stu[a].math, stu[a].English, stu[a].average);
}
int Delete(int n) // 删除函数
{
int num;
int i;
printf("请输入要删除的学生的学号");
scanf("%d", &num);
if (num > n || num <= 0)
printf("输入学号错误请重新输入");
for (int a = 0; a < n; a++)
if (stu[a].num == num)
i = a;
for (int m = i; m < n - 1; m++) // 将删除学号后面的数组往前补,以此类推
stu[m] = stu[m + 1];
return n - 1;
}
void Modify(int n) // 修改信息函数
{
int num;
int i;
printf("请输入要修改的学生的学号");
scanf("%d", &num);
for (int a = 0; a < n; a++)
if (stu[a].num == num)
{
i = a;
break;
}
printf("请输入修改后的信息\n");
printf("学号 语文 数学 外语 \n");
printf("%d ", stu[i].num);
scanf("%f %f %f", &stu[i].Chinese, &stu[i].math, &stu[i].English);
}
add.h(头文件)
struct student // 定义结构体数组,用来存放学生信息
{
int num;
float Chinese;
float math;
float English;
float average;
} stu[32];
void Help(); // 声明函数
int Type(struct student *p, int n);
void List(int n);
void Average(int n);
void paixu(int n);
void Search(int n);
int Delete(int n);
void Modify(int n);
makefile管理
CC=gcc
CFLAGS=-c -g -Wall
OBJS=main.o hanshu.o
main:$(OBJS)
$(CC) $^ -o $@
%.o:%.c
$(CC) $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
$(RM) *.o
标签:改良,管理系统,int,ml,stu,num,详细,printf,输入
From: https://blog.csdn.net/qq_64136247/article/details/141199695