c语言项目实战之学生成绩管理系统笔记

c语言项目实战之学生成绩管理系统
1.项目简介
    实现一个学生成绩管理系统,要求可扩展、数据可保持、维护性好
    可以对学生成绩进行管理:
    成绩添加、删除、查询、修改、保持、统计等基本功能
    成绩在磁盘上保持
    系统可扩展性好:可以很方便扩展其他功能
    系统健壮性好:对于不同的非法操作都可以应对,系统不崩溃
    系统兼容性好:可以在不同的硬件平台及操作系统上都可以正常运行
3.用工程化的方法去开发软件--软件工程
3.1 什么是软件工程?
    软件工程师为创造高质量软件提供的一个框架。
    将一些系统化、规范化、可度量的方法应用于软件的开发、运行和维护
就是将工程化应用于软件开发中。
(1)软件开发基本流程
(2)可行性分析及项目开发计划
(3)需求分析
(4)详细设计
(5)编码
(6)测试
3.2 为什么要使用工程化的方法去开发软件?
3.2.1 当前开发中遇到的问题
3.2.2 通过工程化的方法去开发
    框架设计
    需求分析
    胸有成竹
    一步一步去填
    统计表明,一个软件项目开发周期中,debug的时间是最多的,前期需求分析

    
第二节  软件开发基本流程
1.可行性分析和项目开发计划
    技术可行性:软硬件、技术人员条件下,项目能否实现
    经济可行性:成本估算、开发时间、经济效益评估、看这个项目是否有开发价值
    社会可行性:审批、法律、操作是否可行
2.需求分析
    问题分析与识别
        功能需求:软件要具备和实现的功能
        性能需求:软件的技术性能指标
        环境需求:软件运行需要的软硬件环境
    分析与综合,导出软件的逻辑模型
        在分析与综合中,逐步细化软件功能,划分各个子功能
        采用图文混合的方式建立系统的逻辑模型
    编写文档
        需求文档
        
3.概要设计
    设计软件系统结构
    数据结构及数据库设计
    编写概要设计文档
4.详细设计
    为每一个模块进行详细的算法设计、处理过程使用算法描述出来
    模块内的数据结构设计与定义
    对数据库进行物理设计
    编写详细设计说明书
    使用伪代码来描述模块算法和细节处理
5.编码
    在前一阶段的基础上,选择合适的语言进行物理实现
    程序语言设计的选择
        项目的应用领域
        软件开发的方法
        软件执行的环境
        软件开发人员的知识储备
    程序设计风格
        源程序的编码规范
        数据说明(注释)
        效率
6. 测试
    测试的重要性
    测试原则与分类
    测试流程
        单元测试
        集成测试
        系统测试
        压力测试
        版本发布
            a阶段
            b阶段
            c阶段
            
7.软件发布、维护与运营

    

五 概要设计

1.模块功能
    void student_save();
    void student_add();
    void student_delete();
    void student_print();
    void student_count();
    void student_modify();
    void student_menu();
模块之间的调用关系
    菜单模块根据用户输入选择调用其他模块的函数,实现各种操作。
模块之间的接口
    结构体数组:struct student stu[50];  长度不可变
    数组的长度:int actual_len;
    //链表,好处是长度可变

2.数据结构设计
struct student
{
    unsigned int no;
    char name[10];
    char sex;
    unsigned char age;
    float english;
    float chinese;
    float math;
}    

成绩保存        主菜单人机交互        成绩排序
成绩打印                              成绩统计
成绩查询                              成绩添加
成绩修改                              成绩删除

3.编写概要设计文档
    首先main函数里面通过主菜单模块,根据用户的输入,执行不同的操作
    :成绩添加、删除、修改、查询、打印、保存等,每个模块功能通过
    每个模块定义的函数来实现,具体的参数可以根据实际需要动态修改。
    
    程序运行时,首先从数据文件中读取学生信息,使用一个全局的结构体数组来保存
    学生的信息,每个数组元素代表一个学生的信息,同时全局变量actual_len表示当前
    处理的学生人数,当进行添加、修改、删除等操作时,学生人数和信息会动态发生变化。
    要及时保存到磁盘文件中,与磁盘文件保持一致。

六 详细设计
模块详细设计:
菜单及人机交互:
    首先要打印菜单,提醒用户输入操作选项
    处理用户输入,根据用户选择调用不同的模块
    清屏,然后重新打印菜单,进入循环,再次提醒用户输入,
模块函数:
    void student_save();
    void student_add();
    void student_delete();
    void student_print();
    void student_count();
    void student_modify();
    void student_menu();

结构体数组:struct student stu[50];  长度不可变
数组的长度:int actual_len;
    
成绩添加    
void student_add(int *len, struct student stu[]);
{
    首先我们要定义一个结构体变量,要来存放学生的信息
    提醒用户输入学生信息
    把这个结构体变量保存到数组中
    更新数组的实际长度,更新实际的学生人数
    刷新到文件中
    用伪代码描述出来
}
    
    
成绩删除
void student_add(int *len, struct student stu[])
{
    提示用户输入学生信息
    根据学号还是根据姓名
    找到这个变量在数组中的位置
    删除这个数组元素
    后面的数组元素迁移
    更改数组的当前实际长度
    刷新到文件中
}    
    
成绩查找
void student_find(int len, struct student stu[])
{
    提醒用户根据学号还是根据姓名查找
    用户选择
    根据姓名或者学号找到在数组中的位置
    打印整个数组元素的信息
}    

成绩修改
void student_modify(int len, struct student stu[])    
{
    提醒用户输入姓名或者学号
    根据姓名或者学号找到学生在数组中的位置
    提醒用户修改选项
    根据用户修改选项,提醒用户输入修改值
    将修改的数组元素保存到文件中
}    

成绩保存
void student_save(int len, struct student stu[])
{
    以写的方式,打开当前的文件
    将数组元素逐个写入到文件
    关闭文件
}
    
成绩统计
void student_count(int len, struct student stu[])
{
    逐个对数组元素进行算术计算
}
    
七 编码
1. 模块开发
    功能实现
        工程创建及文件组织、打印模块
        成绩存储模块
        成绩添加、删除模块
        成绩查询模块
        成绩修改模块
    单元测试
2.系统集成
    菜单及人机交互
    模块集成
    集成测试

    
    
    main.c

 

#include <stdio.h>
#include <stdlib.h>
#include "student.h"

struct student stu[50];
int actual_len = 0;

int main()
{
    printf("请输入最大学生人数:\n");
    int max_len;
    scanf("%d",&max_len);
    struct student stu[max_len];
    int actual_len = 0;
    student_array_init(&actual_len,stu);
    student_menu();
    int select;
    while(1)
    {
            printf("请输入操作选项(0~9):");
            scanf("%d",&select);
            system("cls");
            student_menu();
            switch(select)
            {
                case 0:
                    system("cls");  //清屏 
                    student_menu();
                    break;
                case 1:
                    student_add(&actual_len,stu);
                    break;
                case 2:
                    student_delete(&actual_len,stu);
                    break;
                case 3:
                    student_find(actual_len,stu);
                    break;
                case 4:
                    student_statistic(actual_len,stu);
                    break;
                case 5:
                    student_modify(actual_len,stu);
                    break;
                case 6:
                    student_array_print(actual_len,stu);
                    break;
                case 9:
                     system("cls");
                     return 0;
                     break;
                 default:
                     printf("无效输入");
                     break;             
            }
    }

    return 0;
}

int main2(int argc, char *argv[])
{
    struct student std[2] = {{1000,"lilei",'M',20,56,67,78},
                             {1001,"Edison",'M',21,80,90,98}};
//print
#if 0
      student_array_print(2, std);
      student_array_save(2,std);
#endif      

#if 0
//storage
    printf("actual_len=%d\n", actual_len);
    student_array_init(&actual_len, stu);
    printf("actual_len=%d\n", actual_len);
    student_array_print(actual_len, stu);
#endif

#if 0
//    student_add(&actual_len, stu);
    student_delete(&actual_len, stu);
#endif

//find
#if 0
    student_find(actual_len, stu);
#endif 

//modify
#if 0
    student_modify(actual_len,stu);
#endif

//statictics
#if 1
    student_array_init(&actual_len, stu);
    student_statistic(actual_len,stu);
#endif
    return 0;
}

 

 

student.c

 

#include <stdio.h>
#include "student.h"
#include <string.h>

void student_menu()
{
    printf("\t\t欢迎使用学生成绩管理系统\n");
    printf("****************************************************\n");
    printf("\t1.成绩添加\t\t2.成绩删除\n");
    printf("\t3.成绩查询\t\t4.成绩统计\n");
    printf("\t5.成绩修改\t\t6.成绩打印\n");
    printf("\t0.成绩菜单\t\t9.成绩退出\n");
    printf("****************************************************\n");
}

void student_print(struct student std)
{
    printf("-------------------------------------------------------------------------------\n");
    printf("学号\t姓名\t性别\t年龄\t英语\t\t语文\t\t数学\n");
    printf("%d\t%s\t%c\t%d\t%f\t%f\t%f\t",std.no,std.name,std.sex,std.age,std.english,std.chinese,std.math);
    printf("-------------------------------------------------------------------------------\n");
}

void student_array_print(int len, struct student stu[])
{
    printf("-------------------------------------------------------------------------------\n");
    printf("学号\t姓名\t性别\t年龄\t英语\t\t语文\t\t数学\n");
    for(int i=0; i<len; i++)
    {
        printf("%d\t%s\t%c\t%d\t%f\t%f\t%f\t",stu[i].no,stu[i].name,stu[i].sex,stu[i].age,stu[i].english,stu[i].chinese,stu[i].math);
    }
    printf("-------------------------------------------------------------------------------\n");
//    printf("hello\n");
}

int student_array_save(int len,struct student stu[])
{
    FILE *fp;
    if((fp=fopen("student.dat","wb+"))==NULL)
    {
        printf("文件打开失败!\n");
        return -1;
    }
    for(int i=0; i<len; i++)
    {
        fwrite(&stu[i],sizeof(struct student),1,fp);
        if(ferror(fp))         //判断函数是否写得正确 
        {
            printf("数据写入文件失败!\n");
            return -2;
        }
    }
    fclose(fp);
    return 0;

}

int student_array_init(int *len, struct student stu[])
{
    FILE *fp;
    if((fp=fopen("student.dat","rb+"))==NULL)
    {
        printf("文件打开失败!\n");
        return -1;
    }
    fread(&stu[0],sizeof(struct student),1,fp);
    int i=0;                   //局部变量记得初始化 
    while(!feof(fp))
    {
        i++;
        fread(&stu[i],sizeof(struct student),1,fp);
        if(ferror(fp))         //判断读函数是否读正确 
        {
            printf("数据读取文件失败!\n");
            return -2;
        }
    }
    *len = i;
    fclose(fp);
    return 0;
}

int student_add(int *len, struct student stu[])
{
    struct student std;
    int num, i;
    printf("请输入学生人数:");
    scanf("%d", &num);
    for(i=0; i<num; i++)
    {
        printf("请输入第%d个学生的信息:\n", i+1);
        printf("请输入学号(1000):");
        scanf("%d", &std.no);
        printf("请输入姓名:");
        scanf("%s", std.name);
        fflush(stdin);
        printf("请输入性别:");
        scanf("%c", &std.sex);
        printf("请输入年龄:");
        scanf("%d", &std.age);
        printf("请输入英语成绩:");
        scanf("%f", &std.english);
        printf("请输入语文成绩:");
        scanf("%f", &std.chinese);
        printf("请输入数学成绩:");
        scanf("%f", &std.math);
        stu[*len] = std;
        (*len)++;    
    }
    student_array_save(*len, stu);
    student_array_print(*len, stu);
    return 0;
}

static int student_del_by_name(char name[], int *len, struct student stu[])
{
    int i=0;
    for(i=0; i<*len; i++)
    {
        if(strcmp(name,stu[i].name)==0)
            break;
    }
    if(i == *len)
    {
        printf("删除失败,无法找到学生%s的信息!\n",name);
        return -1;
    }
    for(i; i<*len-1; i++)
    {
        stu[i] = stu[i+1];
    }
    (*len)--;
    return 0;
}


static int student_del_by_no(unsigned int no, int *len, struct student stu[])
{
    int i=0;
    for(i=0; i<*len; i++)
    {
        if(no == stu[i].no)
            break;
    }
    if(i == *len)
    {
        printf("删除失败,无法找到学生%d的信息!\n",no);
        return -1;
    }
    for(i; i<*len-1; i++)
    {
        stu[i] = stu[i+1];
    }
    (*len)--;
    return 0;
}

static int student_find_by_name(char name[], int len, struct student stu[])
{
    int i=0;
    for(i=0; i<len; i++)
    {
        if(strcmp(name,stu[i].name)==0)
            break;
    }
    if(i == len)
    {
        printf("查询失败,无法找到学生%s的信息!\n",name);
        return -1;
    }
    printf("查找成功,该学生信息:\n");
    student_print(stu[i]);
    return 0;
}

static int student_find_by_no(unsigned int no, int len, struct student stu[])
{
    int i=0;
    for(i=0; i<len; i++)
    {
        if(no == stu[i].no)
            break;
    }
    if(i == len)
    {
        printf("查询失败,无法找到学生%s的信息!\n",no);
        return -1;
    }
    printf("查找成功,该学生信息:\n");
    student_print(stu[i]);
    return 0;
}

int student_delete(int *len, struct student stu[])
{
    student_array_print(*len, stu);
    printf("-------------------------\n");
    printf("1.通过姓名查找删除\n");
    printf("2.通过学号查找删除\n");
    printf("-------------------------\n");
    int select;
    printf("请输入删除选项:");
    scanf("%d", &select);
    if(select==1)
    {
        char name[20];
        printf("请输入要删除的学生姓名:");
        scanf("%s",name);
        student_del_by_name(name,len,stu);
    }
    if(select==2)
    {
        unsigned int no;
        printf("请输入要删除的学生学号:");
        scanf("%d",&no);
        student_del_by_no(no,len,stu);
    }
    else
    {
        printf("无效输入!\n");    
        return -1;
    }
    student_array_save(*len, stu);    
    student_array_print(*len, stu);
    
    return 0;
}

int student_find(int len, struct student stu[])
{
    printf("-------------------------\n");
    printf("1.通过姓名查找\n");
    printf("2.通过学号查找\n");
    printf("-------------------------\n");
    int select;
    printf("请输入查找选项:");
    scanf("%d", &select);
    if(select==1)
    {
        char name[20];
        printf("请输入要查找的学生姓名:");
        scanf("%s",name);
        student_find_by_name(name,len,stu);
    }
    else if(select==2)
    {
        unsigned int no;
        printf("请输入要查找的学生学号:");
        scanf("%d",&no);
        student_find_by_no(no,len,stu);
    }
    else
    {
        printf("无效输入!\n");    
        return -1;
    }
}

static int student_modify_by_name(char name[], int len, struct student stu[])
{
    int i=0;
    for(i=0; i<len; i++)
    {
        if(strcmp(name,stu[i].name)==0)
            break;
    }
    if(i == len)
    {
        printf("查询失败,无法找到学生%s的信息!\n",name);
        return -1;
    }
    printf("-----------------------\n");
    printf("1.修改学号\n");
    printf("2.修改姓名\n");
    printf("3.修改性别\n");
    printf("4.修改年龄\n");
    printf("5.修改英语\n");
    printf("6.修改语文\n");
    printf("7.修改数学\n");
    printf("-----------------------\n");
    printf("请输入修改选项:");
    int select;
    scanf("%d",&select);
    switch(select)
    {
        case 1:
            printf("请输入新学号:");
            scanf("%d",&stu[i].no);
            break;
        case 2:
            printf("请输入新姓名:");
            scanf("%s",stu[i].name);
            break;
        case 3:
            printf("请输入新性别:");
            scanf("%c",&stu[i].sex);
            break;
        case 4:
            printf("请输入新年龄:");
            scanf("%d",&stu[i].age);
            break;
        case 5:
            printf("请输入新英语:");
            scanf("%f",&stu[i].english);
            break;
        case 6:
            printf("请输入新语文:");
            scanf("%f",&stu[i].chinese);
            break;
        case 7:
            printf("请输入新数学:");
            scanf("%f",&stu[i].math);
            break;
        default:
            printf("无效输入!\n");
            break;
    }

    return 0;
}

static int student_modify_by_no(unsigned int no, int len, struct student stu[])
{
    int i=0;
    for(i=0; i<len; i++)
    {
        if(no==stu[i].no)
            break;
    }
    if(i == len)
    {
        printf("查询失败,无法找到学生%d的信息!\n",no);
        return -1;
    }
    printf("-----------------------\n");
    printf("1.修改学号\n");
    printf("2.修改姓名\n");
    printf("3.修改性别\n");
    printf("4.修改年龄\n");
    printf("5.修改英语\n");
    printf("6.修改语文\n");
    printf("7.修改数学\n");
    printf("-----------------------\n");
    printf("请输入修改选项:");
    int select;
    scanf("%d",&select);
    switch(select)
    {
        case 1:
            printf("请输入新学号:");
            scanf("%d",&stu[i].no);
            break;
        case 2:
            printf("请输入新姓名:");
            scanf("%s",stu[i].name);
            break;
        case 3:
            printf("请输入新性别:");
            scanf("%c",&stu[i].sex);
            break;
        case 4:
            printf("请输入新年龄:");
            scanf("%d",&stu[i].age);
            break;
        case 5:
            printf("请输入新英语:");
            scanf("%f",&stu[i].english);
            break;
        case 6:
            printf("请输入新语文:");
            scanf("%f",&stu[i].chinese);
            break;
        case 7:
            printf("请输入新数学:");
            scanf("%f",&stu[i].math);
            break;
        default:
            printf("无效输入!\n");
            break;
    }

    return 0;
}

int student_modify(int len, struct student stu[])
{
    printf("-------------------------\n");
    printf("1.通过姓名查找修改\n");
    printf("2.通过学号查找修改\n");
    printf("-------------------------\n");
    int select;
    printf("请输入查找选项:");
    scanf("%d", &select);
    if(select==1)
    {
        char name[20];
        printf("请输入要修改的学生姓名:");
        scanf("%s",name);
        student_modify_by_name(name,len,stu);
    }
    else if(select==2)
    {
        unsigned int no;
        printf("请输入要修改的学生学号:");
        scanf("%d",&no);
        student_modify_by_no(no,len,stu);
    }
    else
    {
        printf("无效输入!\n");    
        return -1;
    }
    student_array_save(len, stu);    
    student_array_print(len, stu);
}

int student_statistic(int len, struct student stu[])
{
    float chinese_avr = 0, english_avr = 0, math_avr = 0;
    int chinese_num = 0, english_num = 0, math_num = 0;
    int total_num = 0;        //总的不及格人数 
    float score_avr[len];     //每个学生的平均分 
    float avr = 0;
    int i;
    for(i=0; i<len; i++)
    {
        chinese_avr += stu[i].chinese;
        english_avr += stu[i].english;
        math_avr += stu[i].math;
        score_avr[i] = stu[i].chinese + stu[i].english + stu[i].math;
        score_avr[i] /= 3;
        if(stu[i].chinese < 60)
            chinese_num++;
        if(stu[i].english < 60)
            english_num++;
        if(stu[i].math<60)
            math_num++;    
    }
    chinese_avr /= len;
    english_avr /= len;
    math_avr     /= len;
    total_num = chinese_num + english_num + math_num;
    avr = (chinese_avr+english_avr+math_avr)/3;
    printf("\t\t\t学生成绩统计\n");
    printf("----------------------------------------------------------\n");
    printf("学号\t姓名\t平均分\n");
    for(i=0;i<len;i++)
        printf("%d\t%s\t%f\n",stu[i].no,stu[i].name,score_avr[i]);
    printf("----------------------------------------------------------\n");
    printf("语文平均成绩:%f\t\t不及格人数:%d\n",chinese_avr,chinese_num);
    printf("英语平均成绩:%f\t\t不及格人数:%d\n",chinese_avr,chinese_num);    
    printf("英语平均成绩:%f\t\t不及格人数:%d\n",chinese_avr,chinese_num);
    printf("----------------------------------------------------------\n");
    printf("总体平均分:%f\n",avr);
    printf("总体不及格人数:%d\n",total_num);
    printf("----------------------------------------------------------\n");
    return 0;
    
}

    student.h

 

#ifndef __STUDENT_H__
#define __STUDENT_H__

struct student
{
    unsigned int no;
    char name[10];
    char sex;
    unsigned char age;
    float english;
    float chinese;
    float math;
};

void student_menu();
void student_print(struct student std);
void student_array_print(int len, struct student stu[]);
int student_array_save(int len, struct student stu[]);
int student_array_init(int *len, struct student stu[]);
int student_add(int *len, struct student stu[]);
int student_delete(int *len, struct student stu[]);
int student_find(int len, struct student stu[]);
int student_modify(int len, struct student stu[]);
int student_statistic(int len, struct student stu[]);

#endif

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值