C语言程序设计:学生成绩管理系统 “初学者的编程里程碑:C语言学生成绩管理系统项目“ “编程与逻辑的结合:C语言学生成绩管理系统开发实例“

是不是还觉得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库函数。

希望以上内容对大家有所帮助!!!


 

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值