欢迎来到我的博客!💃💃
🏡🏡推荐博客:August_._一起持续学习,不断总结,共同进步🎊🎊
前言
这段代码定义了一个学生结构体Student
,包含学生的学号、姓名、性别和成绩等信息。代码实现了一个菜单驱动的学生成绩管理系统。
整体架构流程
利用函数定义各功能模块,通过菜单完成各功能模块的选择。
注:学生成绩管理系统的功能模块包括:输入班级课程成绩、统计各课程最高分、最低分、平均分。统计每个学生的最高分、最低分、平均分,输出响应的结果等等。
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 100
#define MAX_SUBJECTS 5
int data_flag;
int fileflag;
struct Student
{
char student_id[12];
char name[9];
char sex;
float grades[MAX_SUBJECTS];
};
int menu()
{
int dd;
while (1){
ll2:system("cls");
printf("\n 功能选择\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(" | 10 删除数据 |\n");
printf(" | 11 查找数据 |\n");
printf(" | 12 获取数据 |\n");
printf(" | 13 保存数据 |\n");
printf(" | 0 退出系统 |\n");
printf(" --------------\n");
printf("请选择一个功能:");
scanf("%d",&dd);
if (dd<0||dd>13){
printf("\n选择有错,请重新输入! 按任意键继续");
fflush(stdin);
getchar();
}
else if(dd==0||dd==7||data_flag==1)
break;
else{
printf("\n无数据,请选择功能7创建数据! 按任意键继续");
fflush(stdin);
getchar();
}
}
return dd;
}
int max_grade(struct Student a[], int n, int index)
{
int i,mm;
mm=a[0].grades[index];
for(i=0;i<n;i++)
if(a[i].grades[index]>mm) mm=a[i].grades[index];
return mm;
}
int min_grade(struct Student a[], int n, int index)
{
int i,mm;
mm=a[0].grades[index];
for(i=0;i<n;i++)
if(a[i].grades[index]<mm) mm=a[i].grades[index];
return mm;
}
float average_grade(struct Student a[], int n, int index)
{
int i,mm=0;
for (i=0;i<n;i++)
mm=mm+a[i].grades[index];
return mm/(float)n;
}
int sum_grades(struct Student a[], int n, int index)
{
int i,mm=0;
for (i=0;i<n;i++)
mm=mm+a[i].grades[index];
return mm;
}
void sort_grades(struct Student a[], int n, int index)
{
int i,j,k,maxs;
struct Student mid;
for (i=0;i<n;i++){
k=i;
maxs=a[i].grades[index];
for (j=i+1;j<n;j++){
if(maxs<a[j].grades[index]){
k=j;
maxs=a[j].grades[index];
}
}
mid=a[i];
a[i]=a[k];
a[k]=mid;
}
}
void output_data(struct Student a[], int n)
{
int i;
printf("\n 数据显示!\n");
for (i=0;i<20;i++) printf("——");
printf("\n");
printf("%10s%13s%6s%6s%6s%6s%6s%6s\n",
"姓名","学号","性别","数学","物理","英语","思政","编程");
for (i=0;i<20;i++) printf("——");
printf("\n");
for (i=0;i<n;i++)
if (a[i].sex=='1')
printf("%10s%13s%6s%6.1f%6.1f%6.1f%6.1f%6.1f\n",
a[i].name,a[i].student_id,"男",a[i].grades[0],a[i].grades[1],a[i].grades[2],a[i].grades[3],a[i].grades[4]);
else
printf("%10s%13s%6s%6.1f%6.1f%6.1f%6.1f%6.1f\n",
a[i].name,a[i].student_id,"女",a[i].grades[0],a[i].grades[1],a[i].grades[2],a[i].grades[3],a[i].grades[4]);
for (i=0;i<20;i++) printf("——");
printf("\n按任意键继续!");
}
struct Student input_data()
{
struct Student data;
printf("姓名:");
fflush(stdin);
scanf("%s",data.name);
l03:printf("学号: ");
fflush(stdin);
scanf("%s",data.student_id);
if ( strlen(data.student_id)>11 || strlen(data.student_id)<1) {
printf("学号输入有错,请重新输入!\n");
while (getchar() != '\n');
goto l03;
}
le1:printf("性别:(1:男,2:女)");
fflush(stdin);
scanf(" %c",&data.sex); //添加空格跳过之前的空白字符
if (data.sex!='1'&&data.sex!='2'){
printf("输入有错,请重新输入1或者2\n");
goto le1;
}
le2:printf("数学: ");
fflush(stdin);
scanf("%f",&data.grades[0]);
if (data.grades[0]<0||data.grades[0]>100){
printf("输入有错,请重新输入! \n");
goto le2;
}
le3:printf("物理: ");
fflush(stdin);
scanf("%f",&data.grades[1]);
if (data.grades[1]<0||data.grades[1]>100){
printf("输入有错,请重新输入! \n");
goto le3;
}
le4:printf("英语: ");
fflush(stdin);
scanf("%f",&data.grades[2]);
if (data.grades[2]<0||data.grades[2]>100){
printf("输入有错,请重新输入! \n");
goto le4;
}
le5:printf("思政: ");
fflush(stdin);
scanf("%f",&data.grades[3]);
if (data.grades[3]<0||data.grades[3]>100){
printf("输入有错,请重新输入! \n");
goto le5;
}
le6:printf("编程: ");
fflush(stdin);
scanf("%f",&data.grades[4]);
if (data.grades[4]<0||data.grades[4]>100){
printf("输入有错,请重新输入! \n");
goto le6;
}
data_flag=1;
return data;
}
int input_all_data(struct Student a[])
{
int n,i;
struct Student data;
printf("班级数据输入!\n");
l1: printf("请输入班级人数:");
scanf("%d",&n);
if (n<2||n>MAX_STUDENTS){
printf("输入有错,请重新输入!");
goto l1;
}
for (i=0;i<n;i++){
printf("\n学生%d数据输入!\n",i+1);
data=input_data();
a[i]=data;
}
data_flag=1;
return n;
}
void count_grades(struct Student a[], int n, int counts[], int index)
{
int i;
for (i=0;i<5;i++) counts[i]=0;
for (i=0;i<n;i++){
if (a[i].grades[index] >= 90) counts[0]++;
else if (a[i].grades[index] >= 80) counts[1]++;
else if (a[i].grades[index] >= 70) counts[2]++;
else if (a[i].grades[index] >= 60) counts[3]++;
else if (a[i].grades[index] >= 0) counts[4]++;
}
}
int insert_student(struct Student a[], int n, int pos, struct Student s)
{
int i;
for (i=n-1;i>=pos;i--) a[i+1]=a[i];
a[pos]=s;
return n+1;
}
int delete_student(struct Student a[], int n, int pos)
{
int i;
for (i=pos-1;i<n;i++) a[i]=a[i+1];
return n-1;
}
int find_data(struct Student a[], int n, int x, int index)
{
int i,flag=0;
for (i=0;i<n;i++){
if (a[i].grades[index]==x){
flag=1;
break;
}
}
if(flag) return i+1;
else return 0;
}
int opendata(struct Student a[])
{
FILE *fp;
int n=0;
fp=fopen("score.dat", "r+" );
if(!fp) return 0;
fseek(fp,0,SEEK_END);
n=ftell(fp)/sizeof(struct Student);
fseek(fp,0,SEEK_SET);
fread(a,sizeof(struct Student),n,fp);
fclose(fp);
data_flag=1;
return n;
}
int writedata(struct Student a[],int n)
{
FILE *fp;
fp=fopen("score.dat","w+");
if(!fp) return 0;
fwrite(a,sizeof(struct Student),n,fp);
fclose(fp);
fileflag=0;
return 1;
}
void goodbye()
{
printf("\n谢谢使用,再见!");
}
int main() {
struct Student s, a[MAX_STUDENTS];
int counts[MAX_SUBJECTS];
int n, sel, pos, x, index, max_data, min_data, sum_data;
float average_data;
char ch;
data_flag = 0;
do {
sel = menu();
if (sel == 1 || sel == 2 || sel == 3 || sel == 4 || sel == 5 || sel == 8 || sel == 11)
{
ls: printf("\n请选择一门课程: \n");
printf("------------\n");
printf("1: 数学\n2: 物理\n3: 英语\n4: 思政\n5: 编程\n");
printf("------------\n");
printf("选择哪一门课程: ");
scanf("%d", &index);
if (index < 1 || index > MAX_SUBJECTS) {
printf("\n课程号错误,请重新输入! ");
goto ls;
}
printf("\n");
}
if (sel == 0) break;
else if (sel == 1) {
max_data = max_grade(a, n, index - 1);
printf("最大数:%d\n", max_data);
printf("\n按任意键继续!");
}
else if (sel == 2) {
min_data = min_grade(a, n, index - 1);
printf("最小数:%d\n", min_data);
printf("\n按任意键继续!");
}
else if (sel == 3) {
average_data = average_grade(a, n, index - 1);
printf("平均数:%.2f\n", average_data);
printf("\n按任意键继续!");
}
else if (sel == 4) {
sum_data = sum_grades(a, n, index - 1);
printf("总和:%d\n", sum_data);
printf("\n按任意键继续!");
}
else if (sel == 5) {
sort_grades(a, n, index - 1);
output_data(a, n);
}
else if (sel == 6) {
output_data(a, n);
}
else if (sel == 7) {
n = input_all_data(a);
output_data(a, n);
}
else if (sel == 8) {
count_grades(a, n, counts, index - 1);
printf("------------\n");
printf("优秀人数:%d\n良好人数:%d\n一般人数:%d\n及格人数:%d\n不及格数:%d\n",
counts[0], counts[1], counts[2], counts[3], counts[4]);
printf("------------\n");
printf("\n按任意键继续!");
}
else if (sel == 9) {
if (n >= MAX_STUDENTS)
printf("\n表已满, 不能再插入了! ");
else {
l2: printf("请输入要插入的位置:");
scanf("%d", &pos);
if (pos < 1 || pos > n) {
printf("\n位置输入有错,请重新输入!");
goto l2;
}
printf("请输入要插入的值:");
s = input_data();
n = insert_student(a, n, pos, s);
printf("\n插入结果:\n");
output_data(a, n);
}
}
else if (sel == 10) {
l3: printf("请输入要删除的位置:");
scanf("%d", &pos);
if (pos < 1 || pos > n) {
printf("\n位置输入值有错,请重新输入!\n");
goto l3;
}
n = delete_student(a, n, pos);
if (n == 0) {
printf("成绩表被清空! \n");
data_flag = 0;
}
else {
printf("删除后的结果:\n");
output_data(a, n);
}
}
else if (sel == 11) {
l4: printf("请输入要查找的值:");
scanf("%d", &x);
if (x < 0 || x > 100) {
printf("\n输入值有错,请重新输入!\n");
goto l4;
}
pos = find_data(a, n, x, index - 1);
if (pos == 0) printf("\n要查找的数据不存在!\n");
else printf("\n该数据序号为%d\n", pos);
printf("\n按任意键继续!");
}
else if(sel==12) {
l6: n=opendata(a);
if(n==0) {
printf("文件不存在,请创建数据!\n");
goto l6;
}
else
output_data(a,n);
data_flag=1;
}
else if(sel==13) {
writedata(a,n);
printf("数据保存成功!\n");
}
fflush(stdin);
getchar();
} while (1);
goodbye();
return 0;
}
重点提炼
代码主要涉及以下几个方面:
- 结构体:代码定义了一个名为
Student
的结构体,用于存储学生的信息,包括学号、姓名、性别和成绩等。 - 数组:使用数组来存储多个学生的信息,以及用于统计成绩的计数器。
- 菜单选择:通过一个循环菜单让用户选择要执行的操作,如求最大数、最小数、平均数等。
- 函数:定义了多个函数来实现不同的功能,如
menu
函数用于显示菜单,input_data
函数用于输入学生数据,max_grade
函数用于求最大数等。 - 文件操作:使用文件来保存学生数据,通过
opendata
和writedata
函数实现数据的读取和写入。 - 条件判断和循环:在代码中使用了大量的条件判断和循环来控制程序的流程,如根据用户的选择执行相应的操作,对学生数据进行遍历和处理等。
- 指针:在
input_data
函数中使用了指针来动态分配内存,以存储输入的学生姓名。 - 数据验证:在输入学生数据时进行了数据验证,确保输入的学号、性别和成绩等符合要求。
- 数据排序:使用冒泡排序算法对学生数据按照指定的课程成绩进行排序。
- 数据统计:通过遍历学生数据,统计各课程成绩的优秀、良好、一般、及格和不及格人数。
总的来说,这段代码涵盖了 C 语言的基础知识,包括结构体、数组、函数、文件操作、条件判断、循环等,同时也涉及到一些数据处理和算法的应用。通过这段代码,可以更好地理解和掌握 C 语言的基本语法和编程思想。
运行结果
以下是部分功能的运行结果,您可以在完成代码后,自己试试完整的功能哦!