是不是还觉得C语言很难?学生成绩管理系统几乎是大学生编程入门的一项任务之一 当你有针对性地认真学之后 或许你会发现C语言并没有那么难(主页还有python版本的学生成绩管理系统!!!)
### 灵感来源:(为了完成老师布置的期末作业!!!我只能毫不犹豫投入战场,奋笔疾书,终于写下如此小规模的代码!一开始我真的是要吐了。。。不过好在经过努力终于按时提交了作业)
1. **教育需求**:学校和教育机构需要有效管理学生成绩。
2. **技术挑战**:初学者可以通过实现一个实际应用来提高编程技能。
3. **个人项目**:作为个人学习项目,加深对编程语言和软件开发的理解。
4. **开源贡献**:为开源社区贡献代码,帮助改进现有的教育软件。
### 初学者编写系统的作用:
1. **基础知识巩固**:通过实际编写代码,加深对C语言基础的理解,包括数据类型、控制结构、函数等。
2. **文件操作实践**:学习如何在C语言中进行文件的读写操作,理解文件流的概念。
3. **数据结构应用**:使用结构体来组织和存储学生信息,实践数组和结构体的高级应用。
4. **算法实现**:实现排序和搜索算法,提高逻辑思维和问题解决能力。
5. **界面交互设计**:设计用户界面和交互流程,学习如何创建用户友好的应用程序。
6. **软件工程实践**:体验软件开发的全过程,包括需求分析、设计、编码、测试和维护。
7. **错误处理和调试**:学习如何识别和修复代码中的错误,提高调试技巧。
8. **项目管理**:学习如何规划和管理一个小型项目,包括时间管理和资源分配。
9. **团队合作**:如果与他人合作开发,可以学习团队协作和沟通技巧。
10. **职业准备**:为将来的职业生涯打下基础,特别是在软件开发和技术领域。
11. **创新思维**:鼓励创新和自主学习,探索不同的解决方案和优化方法。
12. **技术文档编写**:学习编写技术文档和注释,提高代码的可读性和可维护性。
编写学生成绩管理系统不仅是一个技术实践,也是一次全面的学习经历。通过这个过程,初学者可以逐步建立起对软件开发的深刻理解,并为将来更复杂的项目打下坚实的基础。
代码功能介绍:
### 1. `shuru()` 函数:输入功能
这个函数允许用户输入学生信息,并将信息写入到文件中。您已经实现了基本的输入逻辑,但请注意,使用 `gets()` 函数是不安全的,应该使用 `fgets()` 代替。
### 2. `xiugai()` 函数:修改功能
这个函数允许用户修改已存在学生的信息。实现中存在一些问题,比如没有正确处理文件的读写和学生信息的定位。需要修正这些问题。
### 3. `shanchu()` 函数:删除功能
这个函数允许用户根据学号删除学生信息。实现中同样需要修正文件操作和学生数组的处理。
### 4. `xianshi()` 函数:显示功能
这个函数显示所有学生的信息。已经实现了基本的显示逻辑,但需要确保文件操作正确。
### 5. `chaxun()` 函数:查询功能
这个函数允许用户根据学号查询学生信息。实现中需要修正查询逻辑和文件操作。
### 6. `paixu()` 函数:排序功能
这个函数根据总分对学生信息进行排序。已经实现了排序逻辑,但需要确保排序后的数据正确写回文件。
### 7. `tuichu()` 函数:退出功能
这个函数允许用户退出程序。实现是正确的。
### 8. `save_total()` 函数:
这个函数用于保存学生总数到文件。实现是正确的。
### 9. `menu()` 函数:
这个函数显示菜单选项。实现是正确的。
### 10. `main()` 函数:
主函数中包含了程序的主循环和菜单显示。实现基本正确,但需要注意输入处理和循环控制。
代码实现:(各位热爱编程的大神,该代码或有少许瑕疵,敬请谅解!)
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#define N 50
void menu();
void shuru();
void xiugai();
void shanchu();
void xianshi();
void chaxun();
void paixu();
void tuichu();
void save_total();
struct student
{
int stu_ID;
char name[20];
int yingyu;
int yuwen;
int shuxue;
int total_score;
}stu[100];
int total=0;
int num;
void main()
{
char ch,c;
FILE* fp;
if((fp=fopen("score1.txt","r"))==NULL)
fp=fopen("score1.txt","w");
else
fscanf(fp,"%d",&total);
fclose(fp);
menu();
do
{
fflush(stdin);
if((ch=getchar())!='\n');
{
switch(ch)
{
case '1':
shuru();
break;
case '2':
xiugai();
break;
case '3':
shanchu();
break;
case '4':
xianshi();
break;
case '5':
chaxun();
break;
case '6':
paixu();
break;
case '7':
tuichu();
break;
default:printf("\n输入错误!按任意键继续:\n");
}
c=getch();
system("cls");
menu();
}
}while(1);
}
void menu()
{
printf(" ******************************菜单****************************\n\n");
printf(" * 1. 输 入 功 能 *\n\n");
printf(" * 2. 修 改 功 能 *\n\n");
printf(" * 3. 删 除 功 能 *\n\n");
printf(" * 4. 显 示 功 能 *\n\n");
printf(" * 5. 查 找 功 能 *\n\n");
printf(" * 6. 排 序 功 能 *\n\n");
printf(" * 7. 退 出 功 能 *\n\n");
printf(" **************************************************************\n\n");
printf(" 请输入功能序号:");
}
void shuru()// 输入功能
{
char z,tem[20];
int num,i;
FILE* fp;
system("cls");
fp=fopen("score.txt","w");
if(fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
system("cls");
printf("请输入要写入的学生个数:");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("请依次输入学号、姓名、语文成绩、数学成绩、英语成绩:\n");
fflush(stdin);
printf("学号:");
scanf("%d",&stu[i].stu_ID);
fflush(stdin);
printf("姓名:");
gets(tem);
strcpy(stu[i].name,tem);
printf("语文成绩:");
scanf("%d",&stu[i].yuwen);
getchar();
printf("数学成绩:");
scanf("%d",&stu[i].shuxue);
getchar();
printf("英语成绩:");
scanf("%d",&stu[i].yingyu);
putchar('\n');
stu[i].total_score=stu[i].yuwen+stu[i].shuxue+stu[i].yingyu;
fprintf(fp,"%d\t%s\t%d\t%d\t%d\t%d\n",stu[i].stu_ID,stu[i].name,stu[i].yuwen,stu[i].shuxue,stu[i].yingyu,stu[i].total_score);
}
fclose(fp);
total=num;
save_total(total);
printf("输入成功!按任意键回到主菜单:");
}
void xiugai() //修改功能
{
int i,k,h,num;
char sex1,HHH[h+1],AAA[h+1],BBB[h+1],CCC[h+1];
int W;
FILE *fp;
fp=fopen("score.txt","w+");
printf("请输入要修改的学生的学号:\n");
scanf("%s",HHH);
printf("1.修改姓名\n");
printf("2.修改学号\n");
printf("3.修改语文成绩\n");
printf("4.修改数学成绩\n");
printf("5.修改英语成绩\n");
printf("6.退出本功能\n");
while(1)
{
printf("请选择功能序号:");
scanf("%d",&k);
switch(k)
{
case 1:
printf("请输入新的姓名:\n");
scanf("%s",AAA);
strcpy(stu[i].name,AAA);
break;
case 2:
printf("请输入新的学号: \n");
scanf("%d",stu[i].stu_ID);
break;
case 3:
printf("请输入新的语文成绩: \n");
scanf("%d",&W);
stu[i].yuwen=W;
break;
case 4:
printf("请输入新的数学成绩: \n");
scanf("%d",&W);
stu[i].shuxue=W;
break;
case 5:
printf("请输入新的英语成绩: \n");
scanf("%d",&W);
stu[i].yingyu=W;
break;
case 6:
return;
}
}
fclose(fp);
printf("修改成功,按任意键回到主菜单:\n");
system("pause");}
void shanchu()//删除功能
{
int i,m,stu_ID,flag=0,num;
char name[20];
FILE* fp;
fp=fopen("score.txt","r+");
if(fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
for(i=0;i<total;i++)
{
fscanf(fp,"%d\t%s\t%d\t%d\t",&stu[i].stu_ID,stu[i].name,&stu[i].yuwen,&stu[i].shuxue);
fscanf(fp,"%d\t%d\n",&stu[i].yingyu,&stu[i].total_score);
}
fclose(fp);
system("cls");
printf("请输入学号:");
scanf("%d",&stu_ID);
for(i=0;i<total;i++)
{
if(stu_ID==stu[i].stu_ID)
{
flag=1;
num=i;
break;
}
}
if(flag!=1)
{
printf("无此学号!");
}
else
{
if(num==(total-1))
total--;
else
{
for(i=num;i<(total-1);i++)
stu[i]=stu[i+1];
total--;
}
}
save_total(total);
fp=fopen("score.txt","w+");
if(fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
for(i=0;i<total;i++)
{
fprintf(fp,"%d\t%s\t%d\t%d\t%d\t%d\n",stu[i].stu_ID,stu[i].name,stu[i].yuwen,stu[i].shuxue,stu[i].yingyu,stu[i].total_score);
}
fclose(fp);
printf("删除成功!按任意键回到主菜单:");
}
void xianshi()//显示功能
{
int i,j;
FILE* fp;
fp=fopen("score.txt","w+");
if(fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
for(i=0;i<total;i++)
{
fprintf(fp,"%d\t%s\t%d\t%d\t%d\t%d\n",stu[i].stu_ID,stu[i].name,stu[i].yuwen,stu[i].shuxue,stu[i].yingyu,stu[i].total_score);
}
fclose(fp);
system("cls");
printf("学号 姓名 语文 数学 英语 总分 \n");
for(j=0;j<total;j++)
{
printf("%-10d%-10s%-10d%-10d%-10d%-10d\n",stu[j].stu_ID,stu[j].name,stu[j].yuwen,stu[j].shuxue,stu[j].yingyu,stu[j].total_score);
}
printf("按任意键回到主菜单:");
}
void chaxun()//查询功能
{
int i,m,stu_ID,flag=0,num;
char name[20];
FILE* fp;
fp=fopen("score.txt","r+");
if(fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
for(i=0;i<total;i++)
{
fscanf(fp,"%d\t%s\t%d\t%d\t",&stu[i].stu_ID,stu[i].name,&stu[i].yuwen,&stu[i].shuxue);
fscanf(fp,"%d\t%d\n",&stu[i].yingyu,&stu[i].total_score);
}
fclose(fp);
system("cls");
printf("请输入学号:");
scanf("%d",&stu_ID);
for(i=0;i<total;i++)
{
if(stu_ID==stu[i].stu_ID)
{
flag=1;
num=i;
break;
}
}
if(flag!=1)
{
printf("无此学号!按任意键回到主菜单:");
}
else
{
printf("\n学号 姓名 语文 数学 英语 总分\n");
printf("%-10d%-10s%-10d%-10d%-10d%-10d\n",stu[i].stu_ID,stu[i].name,stu[i].yuwen,stu[i].shuxue,stu[i].yingyu,stu[i].total_score);
printf("查找成功!按任意键回到主菜单:");
}
fclose(fp);
}
void paixu()//排序功能
{
struct student stu1;
int i,j,k,temp[100];
char ch;
FILE* fp;
fp=fopen("score.txt","r+");
if(fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
system("cls");
printf("按总分排序如下:\n");
for(i=1;i<total;i++)
{
for(k=0;k<total-i;k++)
{
if(stu[k].total_score<stu[k+1].total_score)
{
stu1=stu[k];
stu[k]=stu[k+1];
stu[k+1]=stu1;
}
}
}
printf("\n学号 姓名 语文 数学 英语 总分\n");
for(j=0;j<total;j++)
{
printf("%-10d%-10s%-10d%-10d%-10d%-10d\n",stu[j].stu_ID,stu[j].name,stu[j].yuwen,stu[j].shuxue,stu[j].yingyu,stu[j].total_score);
}
fclose(fp);
printf("按任意键回到主菜单:");
}
void tuichu()//退出功能
{
system("cls");
exit(0);
}
void save_total(int total)//
{
FILE *fp;
fp=fopen("score1.txt","w+");
if(fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
fprintf(fp,"%d",total);
fclose(fp);
}
代码改进建议:
- 替换 `gets()` 为 `fgets()` 以避免缓冲区溢出。
- 在 `xiugai()` 和 `shanchu()` 函数中,需要正确定位要修改或删除的学生信息,并更新文件内容。
- 确保在修改、添加或删除操作后,更新 `total` 变量,并调用 `save_total()` 函数保存最新的学生总数。
- 在所有文件操作后,检查 `fscanf()` 和 `fprintf()` 的返回值,确保操作成功。
- 在 `main()` 函数中,使用 `getchar()` 替代 `getch()`,因为 `getch()` 不是标准C库函数。
希望以上内容对大家有所帮助!!!