#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 100 //一个班最多的人数
#define MAXM 3 //成绩的课程门数
int R;
void input(); //1.学生成绩新建
void sort(); //2.学生成绩插入
void load(); //3.学生成绩修改
void print(); //4.学生成绩删除
void total(); //5.学生成绩统计
void search(); //6.学生成绩查询
void save(); //7.学生成绩保存
void end(); //8.结束
struct student
{
char name[20]; //保存全班姓名
char num[12]; //保存全班学号
float score[MAXM]; //保存全班所有课程成绩
float sum; //保存全班每个人的总成绩
float avg; //保存每个人的平均成绩
};
struct student s[MAXN];
struct http
{
char subject[20]; //保存全班所有课程
};
struct http c[MAXM];
int main() //欢迎首界面
{
int select,l;
system("cls");
while(1)
{
system("cls");
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(" ******************************************************\n");
printf("\n"); printf("\n 请输入您的选择编号,回车键继续:\n");
printf(" ---------------------------------------------------------------------------\n");
scanf("%d",&select);
{
if(select<1||select>8)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d",&select);
}
l=select;
}
while(l<1||l>8);
switch(select)
{
case 1:input();break; //1.输入学生成绩
case 2:sort(); break; //2.学生成绩插入
case 3:load(); break; //3.学生成绩修改
case 4:print(); break; //4.学生成绩删除
case 5:total();break; //5.学生成绩统计
case 6:search();break; //6.学生成绩查询
case 7:save();break; //7.学生成绩保存
case 8: end();break; //8.结束
default:printf(" 请按相应数学选择系统功能:");
}
}
}
void input() //1学生成绩输入成绩模块
{
int i,j,b;
float a=0;
printf(" 请输入该班同学的人数:\n");
printf(" 班同学的人数在1~%d之间:\n",MAXN);
scanf("%d",&R);
{
if(R<1||R>100)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d",&R);
}
b=R;
}
while(b<1||b>100);
for(i=0;i<MAXM;i++)
{
printf(" 请输入该班同学的第%d门课程名称为:\n",(i+1));
scanf("%s", &c[i].subject);
}
for(i=0;i<R;i++)
{
printf(" 请输入第%d个同学的姓名:\n",(i+1));
scanf("%s",&s[i].name);
printf(" 请输入第%d个同学的学号:\n",(i+1));
scanf("%s",&s[i].num);
printf(" 请依次输入%d门学科的成绩:\n",MAXM);
for(j=0;j<MAXM;j++)
{
printf(" 请输入课程%s的成绩为:\n",c[j].subject);
scanf("%f",&s[i].score[j]);
a=a+s[i].score[j];
}
s[i].sum=a;
s[i].avg=s[i].sum/MAXM;
a=0;
}
}
void sort() //2学生成绩插入成绩模块
{
int i,j,k,b;
float a=0;
printf(" 请输入要插入的学生的位置1~%d号:\n",R);
printf(" 第几个学生的位置之后:\n");
scanf("%d",&k);
{
if(k<1||k>R)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d",&k);
}
b=k;
}
while(b<1||b>R);
R=R+1;
for(i=R;i>k;i--)
{
strcpy(s[i].name,s[i-1].name);
strcpy(s[i].num,s[i-1].num);
s[i].sum=s[i-1].sum;
s[i].avg=s[i-1].avg;
for(j=0;j<MAXM;j++)
{
s[i].score[j]=s[i-1].score[j];
}
}
printf(" 请输入第%d个同学的姓名:\n",(k+1));
scanf("%s",&s[k].name);
printf(" 请输入第%d个同学的学号:\n",(k+1));
scanf("%s",&s[k].num);
printf(" 请依次输入%d门学科的成绩:\n",MAXM);
for(j=0;j<MAXM;j++)
{
printf(" 请输入课程%s的成绩为:\n",&c[j].subject);
scanf("%f", &s[k].score[j]);
a=a+s[k].score[j];
}
s[k].sum=a;
s[k].avg=s[k].sum/MAXM;
}
void load() //3学生成绩修改
{
float a=0,h[MAXM];
int i,j,b;
printf(" 请输入修改学生的位置1~%d 号: \n",R);
scanf("%d",&i);
do
{
if(i<1||i>R)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d",&i);
}
b=i;
}
while(b<1||b>R);
printf(" 请输入%d号的新学号: \n",i);
scanf("%s",&s[i-1].name);
printf(" 请输入%d号的新姓名: \n",i);
scanf("%s",&s[i-1].num);
for(j=0;j<MAXM;j++)
{
printf(" 请输入课程%s的成绩为:\n",&c[j].subject);
scanf("%f",&h[j]);
s[i-1].score[j] =h[j];
a=a+s[i-1].score[j];
}
s[i-1].sum=a;
s[i-1].avg=s[i-1].sum/MAXM;
}
void print() //4学生成绩删除
{
int i,j,k,b;
printf(" 请输入删除学生的位置1~%d 号:\n",R);
scanf("%d",&k);
do
{
if(k<1||k>R)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d",&k);
}
b=k;
}
while(b<1||b>R);
i=k-1;
for(i;i<R;i++)
{
strcpy(s[i].name,s[i+1].name);
strcpy(s[i].num,s[i+1].num);
s[i].sum=s[i+1].sum;
s[i].avg=s[i+1].avg;
for(j=0;j<MAXM;j++)
{
s[i].score[j]=s[i+1].score[j];
}
}
R=R-1;
printf("删除成功! \n");
}
void total() //5.学生成绩统计
{
int i,j;
float a[MAXM],b=0;
printf("学号: 姓名:课程%s的分数: 课程%s的分数: 总成绩: 平均成绩:\n",c[0].subject,c[1].subject);
for(i=0;i<R;i++)
{
printf("%s%10.2s%16.2f%16.2f%16.2f%16.2f\n",s[i].num, s[i].name,s[i].score[0] ,s[i].score[1],s[i].sum,s[i].avg);
}
for(i=0;i<MAXM;i++)
{
for(j=0;j<R;j++)
{
b=b+s[j].score[i];
}
a[i]=b/R;
b=0;
}
for(i=0;i<MAXM;i++)
{
printf(" 全班课程%s的平均分为:%f \n",c[i].subject,a[i]);
}
printf("排序完毕.\n");
system("pause");
}
void search() //6查询成绩模块
{
int search1();
int search2();
int select,index,b;
while(1)
{
printf(" *************************************************************\n");
printf(" * 1.按学号查询 * \n");
printf(" * 2.按姓名查询 * \n");
printf(" * 0.返回 * \n");
printf(" * 请输入您的选择编号: * \n");
printf(" *************************************************************\n");
scanf("%d",&select);
do
{
if(select<0||select>2)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d",&select);
}
b=select;
}
while(b<0||b>2);
switch(select)
{
case 1:index=search1(); break;
case 2:index=search2();break;
case 0:return;
}
if(index!=-1)
{
int i;
printf(" *****************************************************************\n");
printf(" 学号:%s \n", s[index].num);
printf(" 姓名:%s \n", s[index].name);
printf(" 总成绩:%f \n", s[index].sum);
printf(" 平均成绩:%f \n", s[index].avg);
for(i=0;i<MAXM;i++)
printf(" 课程%s的成绩为:%f \n", c[i].subject,s[index].score[i]);
printf(" *****************************************************************\n");
}
else printf("没有这个同学。\n");
}
}
int search1() //按学号查询模块
{
int i;
char s_num[12];
printf(" 请输入要查询的学号:");
scanf("%s",&s_num);
for(i=0;i<MAXN;i++)
if(strcmp(s[i].num,s_num)==0)
break;
if(i<MAXN)
return i;
else return -1;
}
int search2() //按姓名查询模块
{
int i;
char s_name[10];
printf(" 请输入要查询的姓名:");
scanf("%s",&s_name);
for(i=0;i<MAXN;i++)
if(strcmp(s[i].name,s_name)==0)
break;
if(i<MAXN)
return i;
else return -1;
}
void save() //7保存成绩模块
{
FILE *fp;
int i,j,k=0;
if((fp=fopen("十一组2.csv", "w"))=NULL);
fprintf(fp, "该班学生数和所修课程数分别为:%d,%d\n\n",R,MAXM);
fprintf(fp, "该班所修的课程有:\n");
for(j=0;j<MAXM;j++)
fprintf(fp, "课程%d:%s\n",1+j,c[j].subject);
fprintf(fp, "下面是该班学生信息:\n\n");
for(i=0;i<R;i++)
{
fprintf(fp, "学号:%s 姓名:%s\n",s[i].num,s[i].name);
for(j=0;j<MAXM;j++)
{
fprintf(fp, "%s:%5.2f\n",c[j].subject,s[k].score[j]);
}
fprintf(fp, "学生总成绩:%5.2f\n学生平均成绩:%5.2f\n\n",s[i].sum,s[i].avg);
k++;
}
fclose(fp);
printf("\n\n 保存成功\n\n\n\n");
fclose(fp);
printf("保存完毕.\n");
}
void end() //8.结束
{
printf("\n\n 谢谢您的使用。BYE!!!\n\n\n\n\n\n\n\n");
system("color f2");
system("color f1");
system("color f3");
system("color fE");
system("color fB");
system("color f5");
system("color f9");
system("color f6");
system("color f1");
system("color f3");
system("color fE");
system("color fB");
system("color f5");
system("color f9");
system("color f6");
system("color f1");
system("color f3");
system("color f5");
system("color f9");
system("color f6");
exit(0);
}
void load() //3.学生成绩修改
{
int i, j, k;
char num[12];
printf("请输入要修改成绩的学生学号:\n");
scanf("%s", num);
for (i = 0; i < R; i++)
{
if (strcmp(num, s[i].num) == 0)
{
printf("该学生的原成绩:\n");
printf("学生姓名\t 学号\t 课程1\t 课程2\t 课程3\t 总成绩\t 平均成绩\t\n");
printf("%s\t %s\t", s[i].name, s[i].num);
for (j = 0; j < MAXM; j++)
{
printf(" %.1f\t", s[i].score[j]);
}
printf("%.1f\t%.1f\n", s[i].sum, s[i].avg);
参考GPT和自己的思路,代码中有几个警告提示:
1 第36行:
scanf("%s", &c[i].subject);
这里应该去掉&符号,因为字符串数组名本身就是指针。
正确写法:
scanf("%s", c[i].subject);
2 第43行:
scanf("%s",&s[i].name);
scanf("%s",&s[i].num);
同样的问题,应该去掉&符号。
正确写法:
scanf("%s", s[i].name);
scanf("%s", s[i].num);
3 第53行:
s[i].avg=s[i].sum/MAXM...
这里应该在MAXM后面加上一个小数点和0,即MAXM.0,否则除法会按整数除法处理,结果会丢失小数部分。
正确写法:
s[i].avg=s[i].sum/MAXM.0;
如果对您有帮助,请给与采纳,谢谢。
可以在定义struct student时添加一个count变量,用来记录已经输入的学生个数。然后在输入学号之前,循环遍历之前输入的学号,如果当前输入的学号已经存在,就输出错误提示并要求重新输入
struct student添加 count变量记录学生个数,
然后 循环遍历
以下答案基于ChatGPT与GISer Liu编写:
这个程序看起来功能比较完整,但是有一些问题需要注意和改进:
在输入学号的时候,目前没有判断学号是否重复。可以在输入学号时,使用一个循环来遍历已经输入的学生学号,如果发现输入的学号已经存在,就要提示用户重新输入。
在输入学生信息时,没有对用户输入的有效性进行判断。比如输入的姓名或学号长度超过了数组的最大限制,就会导致程序出错。可以通过添加判断语句来限制输入的长度或者使用动态内存分配来避免这个问题。
当输入学生信息时,如果用户输入的不是数字,程序会崩溃。可以使用scanf函数的返回值来判断输入的是否是数字,如果不是数字就清空缓存区并提示用户重新输入。
在程序中存在一些魔数,比如100和3。可以使用宏定义来定义这些魔数,方便代码的维护和修改。
在输入学生信息时,如果用户输入的是非法字符,比如中文、标点符号等,程序会崩溃。可以使用正则表达式来对用户输入进行验证,只允许输入数字和字母。
在进行文件读写时,没有进行错误处理。比如文件不存在、文件打开失败等情况,可以通过判断fopen函数的返回值来判断是否打开成功,通过feof函数来判断是否读到文件结尾。
在统计学生信息时,没有考虑到有些学生没有成绩,这可能会导致程序出错。可以在计算平均成绩时,先判断该学生是否有成绩,如果没有成绩就跳过。
在进行文件读写时,文件名是写死的,这会导致无法保存多个班级的信息。可以通过让用户输入文件名的方式来保存多个班级的信息。
在输出学生信息时,使用了魔数,比如%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n。可以使用宏定义或者结构体的成员名来替代这些魔数,提高代码的可读性。
在输出学生信息时,没有进行格式化,导致输出结果不美观。可以使用printf函数的格式化输出功能,比如%s\t表示输出字符串并且使用tab键进行对齐,%f表示输出浮点数。
在代码中存在一些不必要的空格和换行,这会影响代码的可读性。可以使用代码格式化工具来自动格式化代码。
修改了不少地方,您看看合适不?仅供参考,谢谢!
有个小的知识点是,相同的结构体可以直接赋值的,就像普通变量一样直接赋值交换,无需关心内部的成员等细节问题。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 100 //一个班最多的人数
#define MAXM 3 //成绩的课程门数
int R;
void input(); //1.学生成绩新建
void sort(); //2.学生成绩插入
void load(); //3.学生成绩修改
void print(); //4.学生成绩删除
void total(); //5.学生成绩统计
void search(); //6.学生成绩查询
void save(); //7.学生成绩保存
void end(); //8.结束
struct student
{
char name[20]; //保存全班姓名
char num[12]; //保存全班学号
float score[MAXM]; //保存全班所有课程成绩
float sum; //保存全班每个人的总成绩
float avg; //保存每个人的平均成绩
}s[MAXN];
struct http
{
char subject[20]; //保存全班所有课程
}c[MAXM];
int main() //欢迎首界面
{
int select;
system("cls");
while (1)
{
system("cls");
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(" ******************************************************\n");
printf("\n");
printf("\n 请输入您的选择编号,回车键继续:\n");
printf(" ---------------------------------------------------------------------------\n");
do
{
scanf("%d", &select);
if (select < 1 || select > 8)
puts("输入有误!请重新输入!");
} while (select < 1 || select > 8);
switch (select)
{
case 1:
input();
break; //1.输入学生成绩
case 2:
sort();
break; //2.学生成绩插入
case 3:
load();
break; //3.学生成绩修改
case 4:
print();
break; //4.学生成绩删除
case 5:
total();
break; //5.学生成绩统计
case 6:
search();
break; //6.学生成绩查询
case 7:
save();
break; //7.学生成绩保存
case 8:
end();
break; //8.结束
default:
printf(" 请按相应数学选择系统功能:");
}
}
}
void input() //1学生成绩输入成绩模块
{
int i, j;
float a = 0;
printf(" 请输入该班同学的人数:\n");
printf(" 班同学的人数在1~%d之间:\n", MAXN);
do
{
scanf("%d", &R);
if (R < 1 || R > 100)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
}
}while (R< 1 || R> 100);
for (i = 0; i < MAXM; i++)
{
printf(" 请输入该班同学的第%d门课程名称为:\n", (i + 1));
scanf("%s", c[i].subject);
}
for (i = 0; i < R; i++)
{
printf(" 请输入第%d个同学的姓名:\n", (i + 1));
scanf("%s", s[i].name);
printf(" 请输入第%d个同学的学号:\n", (i + 1));
scanf("%s", s[i].num);
printf(" 请依次输入%d门学科的成绩:\n", MAXM);
for (j = 0; j < MAXM; j++)
{
printf(" 请输入课程%s的成绩为:\n", c[j].subject);
scanf("%f", &s[i].score[j]);
a = a + s[i].score[j];
}
s[i].sum = a;
s[i].avg = s[i].sum / MAXM;
a = 0;
}
}
void sort() //2学生成绩插入成绩模块
{
if(R<1)
{
puts("目前系统还没有任何信息呢!请在主菜单第1选项中录入!");
getchar();
getchar();
return;
}
int i, j, k;
float a = 0;
printf(" 请输入要插入的学生的位置1~%d号:\n", R);
printf(" 第几个学生的位置之后:\n");
do
{
scanf("%d", &k);
if (k < 1 || k > R)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
}
}while (k < 1 || k > R);
R = R + 1;
for (i = R-2; i >= k; i--)
{
s[i+1]=s[i];
for (j = 0; j < MAXM; j++)
{
s[i+1].score[j] = s[i].score[j];
}
}
printf(" 请输入第%d个同学的姓名:\n", (k + 1));
scanf("%s", s[k].name);
printf(" 请输入第%d个同学的学号:\n", (k + 1));
scanf("%s", s[k].num);
printf(" 请依次输入%d门学科的成绩:\n", MAXM);
for (j = 0; j < MAXM; j++)
{
printf(" 请输入课程%s的成绩为:\n", c[j].subject);
scanf("%f", &s[k].score[j]);
a = a + s[k].score[j];
}
s[k].sum = a;
s[k].avg = s[k].sum / MAXM;
}
void load() //3学生成绩修改
{
float a = 0;
int i, j;
printf(" 请输入修改学生的位置1~%d 号: \n", R);
do
{
scanf("%d", &i);
if (i < 1 || i > R+1)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
}
} while (i< 1 || i > R+1);
printf(" 请输入%d号的新姓名: \n", i);
scanf("%s", s[i - 1].name);
printf(" 请输入%d号的新学号: \n", i);
scanf("%s", s[i - 1].num);
for (j = 0; j < MAXM; j++)
{
printf(" 请输入课程%s的成绩为:\n", c[j].subject);
scanf("%f", &s[i - 1].score[j]);
a = a + s[i - 1].score[j];
}
s[i - 1].sum = a;
s[i - 1].avg = s[i - 1].sum / MAXM;
}
void print() //4学生成绩删除
{
int i, j, k;
printf(" 请输入删除学生的位置1~%d 号:\n", R);
do
{
scanf("%d", &k);
if (k < 1 || k > R)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
}
} while (k < 1 || k > R);
for (i = k - 1; i < R; i++)
{
s[i]=s[i+1];
for (j = 0; j < MAXM; j++)
{
s[i].score[j] = s[i + 1].score[j];
}
}
R = R - 1;
printf("删除成功! \n");
}
void total() //5.学生成绩统计
{
int i, j;
float a[MAXM], b = 0;
printf("学号: 姓名:课程%s的分数: 课程%s的分数: 课程%s的分数: 总成绩: 平均成绩:\n", c[0].subject, c[1].subject, c[2].subject );
for (i = 0; i < R; i++)
{
printf("%s%10s%16.2f%16.2f%16.2f%16.2f%16.2f\n", s[i].num, s[i].name, s[i].score[0], s[i].score[1], s[i].score[2],s[i].sum, s[i].avg);
}
for(i=0;i<MAXM;i++)
{
for (j = 0; j < R; j++)
{
b = b + s[j].score[i];
}
a[i] = b / R;
b = 0;
}
for (i = 0; i < MAXM; i++)
{
printf(" 全班课程%s的平均分为:%f \n", c[i].subject, a[i]);
}
printf("排序完毕.\n");
system("pause");
}
void search() //6查询成绩模块
{
int search1();
int search2();
int select, index, b;
while (1)
{
printf(" *************************************************************\n");
printf(" * 1.按学号查询 * \n");
printf(" * 2.按姓名查询 * \n");
printf(" * 0.返回 * \n");
printf(" * 请输入您的选择编号: * \n");
printf(" *************************************************************\n");
scanf("%d", &select);
do
{
if (select < 0 || select > 2)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d", &select);
}
b = select;
} while (b < 0 || b > 2);
switch (select)
{
case 1:
index = search1();
break;
case 2:
index = search2();
break;
case 0:
return;
}
if (index != -1)
{
int i;
printf(" *****************************************************************\n");
printf(" 学号:%s \n", s[index].num);
printf(" 姓名:%s \n", s[index].name);
printf(" 总成绩:%f \n", s[index].sum);
printf(" 平均成绩:%f \n", s[index].avg);
for (i = 0; i < MAXM; i++)
printf(" 课程%s的成绩为:%f \n", c[i].subject, s[index].score[i]);
printf(" *****************************************************************\n");
}
else
printf("没有这个同学。\n");
}
}
int search1() //按学号查询模块
{
int i;
char s_num[12];
printf(" 请输入要查询的学号:");
scanf("%s", &s_num);
for (i = 0; i < MAXN; i++)
if (strcmp(s[i].num, s_num) == 0)
break;
if (i < MAXN)
return i;
else
return -1;
}
int search2() //按姓名查询模块
{
int i;
char s_name[10];
printf(" 请输入要查询的姓名:");
scanf("%s", &s_name);
for (i = 0; i < MAXN; i++)
if (strcmp(s[i].name, s_name) == 0)
break;
if (i < MAXN)
return i;
else
return -1;
}
void save() //7保存成绩模块
{
FILE *fp;
int i, j;
if ((fp = fopen("十一组2.csv", "w")) == NULL)
{
puts("保存失败!");
getchar();
getchar();
return;
}
fprintf(fp, "该班学生数和所修课程数分别为:%d,%d\n\n", R, MAXM);
fprintf(fp, "该班所修的课程有:\n");
for (j = 0; j < MAXM; j++)
fprintf(fp, "课程%d:%s\n", 1 + j, c[j].subject);
fprintf(fp, "下面是该班学生信息:\n\n");
for (i = 0; i < R; i++)
{
fprintf(fp, "学号:%s 姓名:%s\n", s[i].num, s[i].name);
for (j = 0; j < MAXM; j++)
{
fprintf(fp, "%s:%5.2f\n", c[j].subject, s[i].score[j]);
}
fprintf(fp, "学生总成绩:%5.2f\n学生平均成绩:%5.2f\n\n", s[i].sum, s[i].avg);
}
fclose(fp);
printf("\n\n 保存成功\n\n\n\n");
}
void end() //8.结束
{
printf("\n\n 谢谢您的使用。BYE!!!\n\n\n\n\n\n\n\n");
system("color f2");
system("color f1");
system("color f3");
system("color fE");
system("color fB");
system("color f5");
system("color f9");
system("color f6");
system("color f1");
system("color f3");
system("color fE");
system("color fB");
system("color f5");
system("color f9");
system("color f6");
system("color f1");
system("color f3");
system("color f5");
system("color f9");
system("color f6");
exit(0);
}
对 int search1(char* num = NULL); int search2(char* name = NULL); 两个函数做了修改,同时在void sort() //2学生成绩插入成绩模块里,利用search1() 和 search2() 函数,实现输入学号 或 姓名,有重复提示或者报错的提示的功能,及其他问题修改完善,详细改动处见注释,供参考:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
//#include <windows.h>
#define MAXN 100 //一个班最多的人数
#define MAXM 3 //成绩的课程门数
int R;
void input(); //1.学生成绩新建
void sort(); //2.学生成绩插入
void load(); //3.学生成绩修改
void print(); //4.学生成绩删除
void total(); //5.学生成绩统计
void search(); //6.学生成绩查询
int search1(char* num = NULL); //修改
int search2(char* name = NULL); //修改
void save(); //7.学生成绩保存
void end(); //8.结束
struct student
{
char name[20]; //保存全班姓名
char num[12]; //保存全班学号
float score[MAXM]; //保存全班所有课程成绩
float sum; //保存全班每个人的总成绩
float avg; //保存每个人的平均成绩
};
struct student s[MAXN];
struct http
{
char subject[20]; //保存全班所有课程
};
struct http c[MAXM];
int main() //欢迎首界面
{
int select; // l; 修改
system("cls");
while (1)
{
system("cls");
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(" ******************************************************\n");
printf("\n"); printf("\n 请输入您的选择编号,回车键继续:\n");
printf(" ---------------------------------------------------------------------\n");
do{ //修改
scanf("%d", &select);
if (select < 1 || select > 8)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
//scanf("%d", &select); 修改
}
//l = select; 修改
}while (select < 1 || select > 8); //修改 (l < 1 || l>8);
switch (select)
{
case 1:input(); break; //1.输入学生成绩
case 2:sort(); break; //2.学生成绩插入
case 3:load(); break; //3.学生成绩修改
case 4:print(); break; //4.学生成绩删除
case 5:total(); break; //5.学生成绩统计
case 6:search(); break; //6.学生成绩查询
case 7:save(); break; //7.学生成绩保存
case 8: end(); break; //8.结束
default:printf(" 请按相应数学选择系统功能:");
}
printf("按任意键继续...");
_getch();
}
}
void input() //1学生成绩输入成绩模块
{
int i, j, b;
float a = 0;
printf(" 请输入该班同学的人数:\n");
printf(" 班同学的人数在1~%d之间:\n", MAXN);
do{ // 修改
scanf("%d", &R);
if (R < 1 || R > 100)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
//scanf("%d", &R); 修改
}
//b = R; 修改
}while (R < 1 || R > 100); //(b < 1 || b>100) 修改
for (i = 0; i < MAXM; i++)
{
printf(" 请输入该班同学的第%d门课程名称为:\n", (i + 1));
scanf("%s", c[i].subject); //scanf("%s", &c[i].subject); 修改
}
for (i = 0; i < R; i++)
{
printf(" 请输入第%d个同学的姓名:\n", (i + 1));
scanf("%s", s[i].name); //scanf("%s", &s[i].name); 修改
printf(" 请输入第%d个同学的学号:\n", (i + 1));
scanf("%s", s[i].num); //scanf("%s", &s[i].num); 修改
printf(" 请依次输入%d门学科的成绩:\n", MAXM);
for (j = 0; j < MAXM; j++)
{
printf(" 请输入课程%s的成绩为:\n", c[j].subject);
scanf("%f", &s[i].score[j]);
a = a + s[i].score[j];
}
s[i].sum = a;
s[i].avg = s[i].sum / MAXM;
a = 0;
}
}
void sort() //2学生成绩插入成绩模块
{
int i, j, k, b;
float a = 0;
struct student stmp_k;
if (R == 0) { //修改
printf("数据库为空,返回上级!\n");
return;
}
printf(" 请输入要插入的学生的位置1~%d号:\n", R);
//printf(" 第几个学生的位置之后:\n"); 修改
do{ //修改
scanf("%d", &k);
if (k < 1 || k > R)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
//scanf("%d", &k); 修改
}
//b = k;修改
}while (k < 1 || k > R); //修改
printf(" 请输入第%d个同学的姓名:\n", k); //(k + 1)修改
scanf("%s", stmp_k.name); //scanf("%s", &s[k].name);修改
i = search2(stmp_k.name); //修改
if (i != -1) { //修改
printf("该同学信息已存在,请输入正确的信息!\n");
return;
}
printf(" 请输入第%d个同学的学号:\n", k); //(k + 1)修改
scanf("%s", stmp_k.num); //scanf("%s", &s[k].num); 修改
i = search1(stmp_k.num); //修改
if (i != -1) { //修改
printf("该同学信息已存在,请输入正确的信息!\n");
return;
}
printf(" 请依次输入%d门学科的成绩:\n", MAXM);
for (j = 0; j < MAXM; j++)
{
printf(" 请输入课程%s的成绩为:\n", c[j].subject);// &c[j].subject); 修改
scanf("%f", &stmp_k.score[j]); //scanf("%f", &s[k].score[j]);修改
a = a + stmp_k.score[j]; //a = a + s[k].score[j];修改
}
stmp_k.sum = a; //s[k].sum = a; 修改
stmp_k.avg = stmp_k.sum / MAXM; //s[k].avg = s[k].sum / MAXM;修改
for (i = R; i > k - 1; i--) //for (i = R; i > k; i--) 修改
{
s[i] = s[i - 1];
//strcpy(s[i].name, s[i - 1].name); 修改
//strcpy(s[i].num, s[i - 1].num);
//s[i].sum = s[i - 1].sum;
//s[i].avg = s[i - 1].avg;
//for (j = 0; j < MAXM; j++)
//{
// s[i].score[j] = s[i - 1].score[j];
//}
}
s[k - 1] = stmp_k;
R = R + 1; //修改
}
void load() //3学生成绩修改
{
float a = 0, h[MAXM];
int i, j, b;
if (R == 0) { //修改
printf("数据库为空,返回上级!\n");
return;
}
printf(" 请输入修改学生的位置1~%d 号: \n", R);
do{
scanf("%d", &i);
if (i < 1 || i > R)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
//scanf("%d", &i); 修改
}
//b = i; 修改
} while (i < 1 || i > R); // (b < 1 || b > R)修改
printf(" 请输入%d号的新学号: \n", i);
scanf("%s", s[i - 1].num); //scanf("%s", &s[i - 1].name); 修改
printf(" 请输入%d号的新姓名: \n", i);
scanf("%s", s[i - 1].name); //scanf("%s", &s[i - 1].num); 修改
for (j = 0; j < MAXM; j++)
{
printf(" 请输入课程%s的成绩为:\n", c[j].subject); // &c[j].subject 修改
scanf("%f", &h[j]);
s[i - 1].score[j] = h[j];
a = a + s[i - 1].score[j];
}
s[i - 1].sum = a;
s[i - 1].avg = s[i - 1].sum / MAXM;
}
void print() //4学生成绩删除
{
int i, j, k, b;
if (R == 0) { //修改
printf("数据库为空,返回上级!\n");
return;
}
printf(" 请输入删除学生的位置1~%d 号:\n", R);
do{
scanf("%d", &k); //修改
if (k < 1 || k > R)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
//scanf("%d", &k); 修改
}
//b = k; 修改
} while (k < 1 || k > R); // while (b<1 || b>R); 修改
for (i = k - 1; i < R - 1; i++) //for (i = k - 1; i < R; i++) 修改
{
s[i] = s[i + 1]; // 修改
//strcpy(s[i].name, s[i + 1].name); 修改
//strcpy(s[i].num, s[i + 1].num);
//s[i].sum = s[i + 1].sum;
//s[i].avg = s[i + 1].avg;
//for (j = 0; j < MAXM; j++)
//{
// s[i].score[j] = s[i + 1].score[j];
//}
}
R = R - 1;
printf("删除成功! \n");
}
void total() //5.学生成绩统计
{
int i, j;
float a[MAXM], b = 0;
if (R == 0) { //修改
printf("数据库为空,返回上级!\n");
return;
}
printf("%12s%12s ", "学号:", "姓名:"); //修改
for (i = 0; i < MAXM; i++)
printf(" 课程%s的分数: ", c[i].subject);//修改
printf(" 总成绩: 平均成绩:\n");
for (i = 0; i < R; i++)
{
printf("%12s%10s", s[i].num, s[i].name); //修改
for (j = 0; j < MAXM; j++) //修改
printf("%16.2f", s[i].score[j]);
printf("%16.2f%16.2f\n", s[i].sum, s[i].avg);//修改
}
for (i = 0; i < MAXM; i++)
{
for (j = 0; j < R; j++)
{
b = b + s[j].score[i];
}
a[i] = b / R;
b = 0;
}
for (i = 0; i < MAXM; i++)
{
printf(" 全班课程%s的平均分为:%f \n", c[i].subject, a[i]);
}
//printf("排序完毕.\n"); //修改
//system("pause"); //修改
}
void search() //6查询成绩模块
{
//int search1(); //修改
//int search2(); //修改
int select, index, b;
while (1)
{
printf(" *************************************************************\n");
printf(" * 1.按学号查询 * \n");
printf(" * 2.按姓名查询 * \n");
printf(" * 0.返回 * \n");
printf(" * 请输入您的选择编号: * \n");
printf(" *************************************************************\n");
do
{
scanf("%d", &select); //修改
if (select < 0 || select > 2)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
//scanf("%d", &select); 修改
}
//b = select; 修改
} while (select < 0 || select > 2); //while (b < 0 || b>2); 修改
switch (select)
{
case 1:index = search1(); break;
case 2:index = search2(); break;
case 0:return;
}
if (index != -1)
{
int i;
printf(" *****************************************************************\n");
printf(" 学号:%s \n", s[index].num);
printf(" 姓名:%s \n", s[index].name);
printf(" 总成绩:%f \n", s[index].sum);
printf(" 平均成绩:%f \n", s[index].avg);
for (i = 0; i < MAXM; i++)
printf(" 课程%s的成绩为:%f \n",
c[i].subject, s[index].score[i]);
printf(" *****************************************************************\n");
}
else
printf("没有这个同学。\n");
}
}
int search1(char* num) //按学号查询模块
{
int i, flg = 0; //修改
//char s_num[12]; 修改
if (!num) { //修改
num = (char*)malloc(sizeof(char) * 12);
printf(" 请输入要查询的学号:");
scanf("%s", num); //scanf("%s", &s_num); 修改
flg = 1;
}
for (i = 0; i < R; i++) //for (i = 0; i < MAXN; i++) 修改
if (strcmp(s[i].num, num) == 0)
break;
if (flg) free(num); //修改
if (i < R) //if (i < MAXN) 修改
return i;
else
return -1;
}
int search2(char* name) //按姓名查询模块
{
int i, flg = 0; //修改
//char s_name[10]; 修改
if (!name) { //修改
name = (char*)malloc(sizeof(char) * 20);
printf(" 请输入要查询的姓名:");
scanf("%s", name); //scanf("%s", &s_name); 修改
flg = 1;
}
for (i = 0; i < R; i++) //for (i = 0; i < MAXN; i++) 修改
if (strcmp(s[i].name, name) == 0)
break;
if (flg) free(name); //修改
if (i < R) //if (i < MAXN) 修改
return i;
else
return -1;
}
void save() //7保存成绩模块
{
FILE* fp;
int i, j, k = 0;
if ((fp = fopen("十一组2.csv", "w")) == NULL) return; //修改
//if ((fp = fopen("十一组2.csv", "w")) = NULL);
fprintf(fp, "该班学生数和所修课程数分别为:%d,%d\n\n", R, MAXM);
fprintf(fp, "该班所修的课程有:\n");
for (j = 0; j < MAXM; j++)
fprintf(fp, "课程%d:%s\n", 1 + j, c[j].subject);
fprintf(fp, "下面是该班学生信息:\n\n");
for (i = 0; i < R; i++)
{
fprintf(fp, "学号:%s 姓名:%s\n", s[i].num, s[i].name);
for (j = 0; j < MAXM; j++)
{
fprintf(fp, "%s:%5.2f\n", c[j].subject, s[i].score[j]); // s[k].score[j] 修改
}
fprintf(fp, "学生总成绩:%5.2f\n学生平均成绩:%5.2f\n\n", s[i].sum, s[i].avg);
//k++; 修改
}
fclose(fp);
printf("\n\n 保存成功\n\n\n\n");
//fclose(fp); 修改
//printf("保存完毕.\n"); 修改
}
void end() //8.结束
{
printf("\n\n 谢谢您的使用。BYE!!!\n\n\n\n\n\n\n\n");
system("color f2");
system("color f1");
system("color f3");
system("color fE");
system("color fB");
system("color f5");
system("color f9");
system("color f6");
system("color f1");
system("color f3");
system("color fE");
system("color fB");
system("color f5");
system("color f9");
system("color f6");
system("color f1");
system("color f3");
system("color f5");
system("color f9");
system("color f6");
exit(0);
}
主要是输入有问题
帮你改了下
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 100 //一个班最多的人数
#define MAXM 3 //成绩的课程门数
int R;
void input(); //1.学生成绩新建
void sort(); //2.学生成绩插入
void load(); //3.学生成绩修改
void print(); //4.学生成绩删除
void total(); //5.学生成绩统计
void search(); //6.学生成绩查询
void save(); //7.学生成绩保存
void end(); //8.结束
struct student
{
char name[20]; //保存全班姓名
char num[12]; //保存全班学号
float score[MAXM]; //保存全班所有课程成绩
float sum; //保存全班每个人的总成绩
float avg; //保存每个人的平均成绩
};
struct student s[MAXN];
struct http
{
char subject[20]; //保存全班所有课程
};
struct http c[MAXM];
int main() //欢迎首界面
{
int select,l;
system("cls");
while(1)
{
system("cls");
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(" ******************************************************\n");
printf("\n");
printf("\n 请输入您的选择编号,回车键继续:\n");
printf(" ---------------------------------------------------------------------------\n");
scanf("%d",&select);
{
if(select<1||select>8)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d",&select);
}
l=select;
}
while(l<1||l>8);
switch(select)
{
case 1:
input();
break; //1.输入学生成绩
case 2:
sort();
break; //2.学生成绩插入
case 3:
load();
break; //3.学生成绩修改
case 4:
print();
break; //4.学生成绩删除
case 5:
total();
break; //5.学生成绩统计
case 6:
search();
break; //6.学生成绩查询
case 7:
save();
break; //7.学生成绩保存
case 8:
end();
break; //8.结束
default:
printf(" 请按相应数学选择系统功能:");
}
}
}
void input() //1学生成绩输入成绩模块
{
int i,j,b;
float a=0;
printf(" 请输入该班同学的人数:\n");
printf(" 班同学的人数在1~%d之间:\n",MAXN);
scanf("%d",&R);
{
if(R<1||R>100)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d",&R);
}
b=R;
}
while(b<1||b>100);
for(i=0; i<MAXM; i++)
{
printf(" 请输入该班同学的第%d门课程名称为:\n",(i+1));
fflush(stdin);
scanf("%s", c[i].subject);
}
for(i=0; i<R; i++)
{
printf(" 请输入第%d个同学的姓名:\n",(i+1));
fflush(stdin);
scanf("%s",s[i].name);
printf(" 请输入第%d个同学的学号:\n",(i+1));
fflush(stdin);
scanf("%s",s[i].num);
printf(" 请依次输入%d门学科的成绩:\n",MAXM);
for(j=0; j<MAXM; j++)
{
printf(" 请输入课程%s的成绩为:\n",c[j].subject);
scanf("%f",&s[i].score[j]);
a=a+s[i].score[j];
}
s[i].sum=a;
s[i].avg=s[i].sum/MAXM;
a=0;
}
}
void sort() //2学生成绩插入成绩模块
{
int i,j,k,b;
float a=0;
printf(" 请输入要插入的学生的位置1~%d号:\n",R);
printf(" 第几个学生的位置之后:\n");
scanf("%d",&k);
{
if(k<1||k>R)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d",&k);
}
b=k;
}
while(b<1||b>R);
R=R+1;
for(i=R; i>k; i--)
{
strcpy(s[i].name,s[i-1].name);
strcpy(s[i].num,s[i-1].num);
s[i].sum=s[i-1].sum;
s[i].avg=s[i-1].avg;
for(j=0; j<MAXM; j++)
{
s[i].score[j]=s[i-1].score[j];
}
}
printf(" 请输入第%d个同学的姓名:\n",(k+1));
scanf("%s",&s[k].name);
printf(" 请输入第%d个同学的学号:\n",(k+1));
scanf("%s",&s[k].num);
printf(" 请依次输入%d门学科的成绩:\n",MAXM);
for(j=0; j<MAXM; j++)
{
printf(" 请输入课程%s的成绩为:\n",&c[j].subject);
scanf("%f", &s[k].score[j]);
a=a+s[k].score[j];
}
s[k].sum=a;
s[k].avg=s[k].sum/MAXM;
}
void load() //3学生成绩修改
{
float a=0,h[MAXM];
int i,j,b;
printf(" 请输入修改学生的位置1~%d 号: \n",R);
scanf("%d",&i);
do
{
if(i<1||i>R)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d",&i);
}
b=i;
}
while(b<1||b>R);
printf(" 请输入%d号的新学号: \n",i);
scanf("%s",&s[i-1].name);
printf(" 请输入%d号的新姓名: \n",i);
scanf("%s",&s[i-1].num);
for(j=0; j<MAXM; j++)
{
printf(" 请输入课程%s的成绩为:\n",&c[j].subject);
scanf("%f",&h[j]);
s[i-1].score[j] =h[j];
a=a+s[i-1].score[j];
}
s[i-1].sum=a;
s[i-1].avg=s[i-1].sum/MAXM;
}
void print() //4学生成绩删除
{
int i,j,k,b;
printf(" 请输入删除学生的位置1~%d 号:\n",R);
scanf("%d",&k);
do
{
if(k<1||k>R)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d",&k);
}
b=k;
}
while(b<1||b>R);
i=k-1;
for(i; i<R; i++)
{
strcpy(s[i].name,s[i+1].name);
strcpy(s[i].num,s[i+1].num);
s[i].sum=s[i+1].sum;
s[i].avg=s[i+1].avg;
for(j=0; j<MAXM; j++)
{
s[i].score[j]=s[i+1].score[j];
}
}
R=R-1;
printf("删除成功! \n");
}
void total() //5.学生成绩统计
{
int i,j;
float a[MAXM],b=0;
printf("学号: 姓名:课程%s的分数: 课程%s的分数: 总成绩: 平均成绩:\n",c[0].subject,c[1].subject);
for(i=0; i<R; i++)
{
printf("%s%10.2s%16.2f%16.2f%16.2f%16.2f\n",s[i].num, s[i].name,s[i].score[0] ,s[i].score[1],s[i].sum,s[i].avg);
}
for(i=0; i<MAXM; i++)
{
for(j=0; j<R; j++)
{
b=b+s[j].score[i];
}
a[i]=b/R;
b=0;
}
for(i=0; i<MAXM; i++)
{
printf(" 全班课程%s的平均分为:%f \n",c[i].subject,a[i]);
}
printf("排序完毕.\n");
system("pause");
}
void search() //6查询成绩模块
{
int search1();
int search2();
int select,index,b;
while(1)
{
printf(" *************************************************************\n");
printf(" * 1.按学号查询 * \n");
printf(" * 2.按姓名查询 * \n");
printf(" * 0.返回 * \n");
printf(" * 请输入您的选择编号: * \n");
printf(" *************************************************************\n");
scanf("%d",&select);
do
{
if(select<0||select>2)
{
printf(" 您输入有误,请重新输入,谢谢!!!\n");
scanf("%d",&select);
}
b=select;
}
while(b<0||b>2);
switch(select)
{
case 1:
index=search1();
break;
case 2:
index=search2();
break;
case 0:
return;
}
if(index!=-1)
{
int i;
printf(" *****************************************************************\n");
printf(" 学号:%s \n", s[index].num);
printf(" 姓名:%s \n", s[index].name);
printf(" 总成绩:%f \n", s[index].sum);
printf(" 平均成绩:%f \n", s[index].avg);
for(i=0; i<MAXM; i++)
printf(" 课程%s的成绩为:%f \n", c[i].subject,s[index].score[i]);
printf(" *****************************************************************\n");
}
else printf("没有这个同学。\n");
}
}
int search1() //按学号查询模块
{
int i;
char s_num[12];
printf(" 请输入要查询的学号:");
scanf("%s",&s_num);
for(i=0; i<MAXN; i++)
if(strcmp(s[i].num,s_num)==0)
break;
if(i<MAXN)
return i;
else return -1;
}
int search2() //按姓名查询模块
{
int i;
char s_name[10];
printf(" 请输入要查询的姓名:");
scanf("%s",&s_name);
for(i=0; i<MAXN; i++)
if(strcmp(s[i].name,s_name)==0)
break;
if(i<MAXN)
return i;
else return -1;
}
void save() //7保存成绩模块
{
FILE *fp;
int i,j,k=0;
if((fp=fopen("十一组2.csv", "w"))=NULL);
fprintf(fp, "该班学生数和所修课程数分别为:%d,%d\n\n",R,MAXM);
fprintf(fp, "该班所修的课程有:\n");
for(j=0; j<MAXM; j++)
fprintf(fp, "课程%d:%s\n",1+j,c[j].subject);
fprintf(fp, "下面是该班学生信息:\n\n");
for(i=0; i<R; i++)
{
fprintf(fp, "学号:%s 姓名:%s\n",s[i].num,s[i].name);
for(j=0; j<MAXM; j++)
{
fprintf(fp, "%s:%5.2f\n",c[j].subject,s[k].score[j]);
}
fprintf(fp, "学生总成绩:%5.2f\n学生平均成绩:%5.2f\n\n",s[i].sum,s[i].avg);
k++;
}
fclose(fp);
printf("\n\n 保存成功\n\n\n\n");
fclose(fp);
printf("保存完毕.\n");
}
void end() //8.结束
{
printf("\n\n 谢谢您的使用。BYE!!!\n\n\n\n\n\n\n\n");
system("color f2");
system("color f1");
system("color f3");
system("color fE");
system("color fB");
system("color f5");
system("color f9");
system("color f6");
system("color f1");
system("color f3");
system("color fE");
system("color fB");
system("color f5");
system("color f9");
system("color f6");
system("color f1");
system("color f3");
system("color f5");
system("color f9");
system("color f6");
exit(0);
}