C语言项目实战 --学生成绩管理系统

项目开发基本流程

  • 可行性分析和项目开发计划
    技术可行性:软硬件、技术人员条件、项目是否能实现
    经济可行性:成本估算、开发时间、经济效益评估,看这个项目是否有开发价值
    社会可行性:审批、法律操作是否可行
  • 需求分析
    问题分析与识别
    • 功能需求:软件要具备和实现的功能
    • 性能需求:软件技术性能指标
    • 环境需求:软件运行需要额软硬件环境
      分析与综合,到处软件的逻辑模型:
      在分析与综合中,逐步细化软件模型,划分各个子功能采用图文混合的方式建立系统的逻辑模型
      编写文档
  • 概要设计
    设计软件及系统结构:
    经一个复杂的系统按功能进行模块划分,高内聚、低耦合。
    确定每个模块的功能混合模块之间的调用关系。
    确定模块之间的接口。
    数据结构及数据库设计:
    数据结构、模块接口之间通信的数据结构
    编写概要设计文档:
    测试计划、测试用例
  • 详细设计
    为每个模块进行详细的算法设计、处理过程使用算法描述出来
    模块内的数据结构设计与定义
    对数据库进行物理设计
    编写详细设计说明书
    使用伪代码来描述模块算法和细节处理
  • 编码
    在前一阶段的基础上,选择合适的语言进行物理实验
    • 程序语言设计的选择
      项目应用领域
      软件开发的方法
      软件执行的环境
      软件发开人员的知识储备
    • 程序设计风格
      源程序的编码规范
      数据说明(注释)
      效率
  • 测试
    • 测试的重要性
      测试原则与分类
    • 测试流程
      单元测试
      集成测试
      压力测试
      版本发布
      a阶段:Alpha测试,主要看有么有功能上的缺失或者系统上的大错误
      b阶段:Beta测试,给用户使用测试,Beta1–Beta2
      c阶段:Rc测试(release candidate)Rc1 --Rc2–Rc3 基本稳定版本,没有大的修改了
  • 软件发布、维护与运营

一、可行性分析及项目开发计划

可行性分析
  • 技术可行性:
    硬件:c高级语言,跟硬件平台无关,编写的程序可以在任何硬件平台运行
    软件:纯软件的业务逻辑操作,只依赖C标准库,软件上没有什么问题
    技术人员的要求:只要有c语言的基础
    综上所述,项目可以实现
  • 经济可行性:
  • 社会可行性:
    方便电子化管理、无纸化绿色低碳环保办公
项目开发计划
  • 时间进度安排
    资源安排
    人力
    软硬件资源
    经费
    成本风险评估

二、需求分析

问题分析与识别
  • 功能需求:
    实现学生信息的添加、删除、查询、修改等功能
    学生成绩的磁盘保存
    方便的人机交互功能
  • 性能需求:
    软件运行稳定
    速度快、效率高
    可移植性好,在不同的处理器的操作系统平台上都可以正常使用
    健壮性:对于出错处理完善
    人机交互友好,操作简单易用,容易上手
    扩展性好:采用模块化编程、添加删除新功能模块方便
分析与综合,导出软件的逻辑模型
  • 菜单人际交互
  • 存储模块
  • 成绩添加
  • 成绩删除
  • 成绩查询
  • 成绩打印
编写文档

《需求规格说明书》

三、概要设计

  • 学生成绩管理系统结构设计

模块划分
菜单及人机交互模块、成绩存储模块、成绩打印、成绩添加、成绩删除、成绩修改、成绩统计等

模块功能
void student_save();
void student_add();
void student_delete();
void student_print();
void student_tongji();
void student_modify();
void student_menu();

模块之间的调用关系:
菜单模块根据用户输入选择调用其他模块的函数,实现各种操作。
模块之间的接口:
结构体数组 :struct student stu[50];
数组的长度:int actual_len;
链表

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

}

  • 编写概要设计文档
    首先main函数里面通过主菜单模块,根据用户的输入,执行不同的操作;成绩添加、删除、查询、打印、保存等,每个模块功能通过每个模块定义的函数回来实现,具体的参数可以根据实际的需要动态修改,

程序运行时,首先从数据文件中读取学生信息,使用一个全局的结构体数组,来保存学生的信息,每个数组元素代表一个学生的信息,同事全局变量actual_len表示当前处理的学生人数,当进行添加、修改、删除等操作,学生人数和信息会动态发生变化,药剂师保存到磁盘文件中,与磁盘文件保持一致。

四、详细设计

  • 模块详细设计

  • 菜单及人机交互
    1:首先要打印菜单,提醒用户输入操作选项
    2:处理用户输入,根据用户选择调用不同的模块
    3:清屏,然后重新打印菜单,进入循环,再次提醒用户输入
    4:模块函数
    void student_save(int *len,struct student stu[]));
    void student_add(int *len,struct student stu[]));
    void student_delete(int *len,struct student stu[]));
    void student_print(int len,struct student stu[]));
    void student_tongji(int len,struct student stu[]));
    void student_modify(int len,struct student stu[]));
    void student_menu();

  • 成绩添加
    void student_add(int *len,struct student stu[])
    {
    首先我们要定义一个结构体变量:
    提醒用户输入学生信息:
    把这个结构体变量保存到数组中
    更新数组的实际长度:更新实际的学生人数
    刷新到文件中
    }

  • 成绩删除
    void student_delete(int *len,struct student stu[])
    {
    提示用户输入学生信息
    根据学号还是根据姓名
    找到这个变量在数组中的位置
    删除这个数组元素
    后边的数组元素迁移
    更改数组的当前实际长度
    刷新到文件中
    }

  • 成绩查询
    void student_find(int len,struct student stu[])
    {
    提醒用户根据学好还是根据姓名查找
    用户选择
    根据姓名或者学号找到在数组中的位置
    打印整个数组元素的信息
    }

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

}

  • 成绩保存
    void student_save(int len ,struct student stu[])
    {
    以写的方式,打开当前的文件
    将数组元素逐个写入到文件
    关闭文件
    }

  • 成绩统计
    void student_tongji(int len,struct student stu[]))
    {
    逐个对数组元素进行计算

}

编码(1)

main.c

#include<stdio.h>
#include"student.h"int actual_len = 0;
struct student stu[50];
struct student std[2] = {{1001,"Xun",'M',18,99,98,97},{1002,"Jan",'M',18,99,98,97},
};
int main() {student_menu();}
void student_menu()
{while (1) {printf("---------------------------------------------------------------------------\n");printf("\t\t欢迎使用学生成绩管理系统\n");printf("\t1:成绩添加\t2:成绩删除\n");printf("\t3:成绩查询\t4:成绩修改\n");printf("\t5:成绩统计\t6:返主菜单\n");printf("---------------------------------------------------------------------------\n");int sec = 0;printf("请输入选项:");scanf("%d", &sec);switch (sec){case 1:student_array_add(&actual_len, stu);break;case 2:student_array_delate(&actual_len, stu);break;case 3:student_find(actual_len, stu);break;case 4:student_modify(actual_len, stu);break;case 5:student_count(actual_len, stu);case 6:system("cls");student_menu();default:printf("输入错误!");}
}}int main01() {#if  0//查看内存文件中的真实数据模块//storgeprintf("actual_len = %d\n", actual_len);student_array_init(&actual_len, stu);printf("actual_len = %d\n", actual_len);student_print(actual_len, stu);
#endif#if 0  //保存与删除模块student_array_add(&actual_len, stu);//student_array_delate(&actual_len, stu);
#endif#if 0student_find(actual_len, stu);#endif#if 0student_modify(actual_len, stu);#endif
#if  0student_count(actual_len, stu);#endif // }

stduent.c

#include<stdio.h>
#include<string.h>
#include"student.h" void array_print(struct student stu)
{printf("学号\t姓名\t性别\t年龄\t语文\t\t英语\t\t数学\n");printf("%d\t%s\t%c\t%d\t%f\t%f\t%f\n", stu.no, stu.name, stu.sex, stu.age, stu.chinese, stu.english, stu.math);}void student_print(int len,struct student stu[])
{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\n",stu[i].no, stu[i].name, stu[i].sex, stu[i].age, stu[i].chinese, stu[i].english, stu[i].math);}
int student_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", "ab+"))== NULL){printf("文件打开失败!\n");return -1;}int i = 0;fread(&stu[i], sizeof(struct student), 1, fp);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_array_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);rewind(stdin);printf("性别(M/F):");scanf("%c", &std.sex);    printf("年龄:");scanf("%d", &std.age); printf("语文:");scanf("%f", &std.chinese); printf("英语:");scanf("%f", &std.english);printf("数学:");scanf("%f", &std.math);stu[*len] = std;(*len)++;}student_save(*len, stu);student_print(*len, stu);return 0;
}int stu_del_by_name(char name[], int* len, struct student stu[])
{int i = 0;for (i; i < *len; i++){if (strcmp(name, stu[i].name) == 0){break;}}if(i == *len){printf("error:无法找到学生%s的信息!\n",name);return -1;}for (i; i < *len - 1; i++){stu[i] = stu[i + 1];(*len)--;return 0;}return 0;
}int stu_del_by_no(int no,int* len, struct student stu[])
{int i;for (i = 0; i < *len; i++){if (stu[i].no == 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;
}
int student_array_delate(int* len, struct student stu[])
{student_array_init(len, stu);student_print(*len, stu);int select;printf("------------------------------\n");printf("请选择查询删除的方式:\n");printf("1:根据学生姓名查找删除\n2:根据学生学号查找删除\n(1/2):");scanf("%d", &select);if (select == 1){char name[20];printf("请输入要删除的学生姓名:");scanf("%s", name);stu_del_by_name( name, len, stu);}else if (select == 2){int no;printf("请输入要删除的学生学号");scanf("%d", &no);stu_del_by_no(no,len, stu);}else{printf("无效输入!\n");return -1;}student_save(*len, stu);student_print(*len, stu);return 0;
}int stu_find_by_name(char name[], int  len, struct student stu[])
{int i;for (i=0; i < len; i++){if (strcmp(name, stu[i].name) == 0)break;}if (i == len){printf("error:无法找到学生%s的信息!\n", name);return -1;}printf("查找成功,该学生信息:\n");array_print(stu[i]);return 0;
}int stu_find_by_no(int no, int len, struct student stu[])
{int i;for (i = 0; i < len; i++){if (no == stu[i].no)break;}if (i == len){printf("查询失败,无法找到学号%d的信息!\n", no);return -1;}printf("查找成功,该学生信息:\n");array_print(stu[i]);return 0;
}int student_find(int len, struct student stu[])
{int select;printf("------------------------------\n");printf("请选择查询的方式:\n");printf("1:根据学生姓名查询\n2:根据学生学号查询\n(1/2):");scanf("%d", &select);if (select == 1){char name[20];printf("请输入要查询的学生姓名:\n");scanf("%s", name);stu_find_by_name(name, len, stu);}else if (select == 2){int no;printf("请输入要查询的学生学号:\n");scanf("%d", &no);stu_find_by_no(no, len, stu);}else{printf("无效输入!\n");return -1;}return 0;
}int stu_modify_by_name(char name[], int len, struct student stu[])
{int i;for (i = 0; i < len; i++){if (strcmp(name, stu[i].name) == 0)break;}if (i == len){printf("error:无法找到学生%s的信息!\n", name);return -1;}array_print(stu[i]);printf("请输入需要修改的成员:\n");printf("1:修改学号\n2:修改姓名\n3:修改性别\n4:修改年龄\n5:修改语文\n6:修改英语\n7:修改数学");int num;scanf("%d", &num);switch (num){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].chinese);break;case 6:printf("将英语修改为:");scanf("%f", &stu[i].english);break;case 7:printf("将数学修改为:");scanf("%f", &stu[i].math);break;default:printf("输入错误!");}return 0;
}int stu_modify_by_no(int no, int len, struct student stu[])
{int i;for (i = 0; i < len; i++){if (no == stu[i].no)break;}if (i == len){printf("查询失败,无法找到学号%d的信息!\n", no);return -1;}array_print(stu[i]);printf("请输入需要修改的成员:\n");printf("1:修改学号\n2:修改姓名\n3:修改性别\n4:修改年龄\n5:修改语文\n6:修改英语\n7:修改数学\n:");int num;scanf("%d", &num);switch (num){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].chinese);break;case 6:printf("将英语修改为:");scanf("%f", &stu[i].english);break;case 7:printf("将数学修改为:");scanf("%f", &stu[i].math);break;default:printf("输入错误!");}return 0;
}int student_modify(int len, struct student stu[])
{int select;printf("------------------------------\n");printf("请选择查找修改的方式:\n");printf("1:根据学生姓名查找修改\n2:根据学生学号查找修改\n(1/2):");scanf("%d", &select);if (select == 1){char name[20];printf("请输入要修改的学生姓名:\n");scanf("%s", name);stu_modify_by_name(name, len, stu);}else if (select == 2){int no;printf("请输入要修改的学生学号:\n");scanf("%d", &no);stu_modify_by_no(no, len, stu);}else{printf("无效输入!\n");return -1;}student_save(len, stu);student_print(len, stu);return 0;
}int student_count(int len, struct student stu[])
{student_array_init(&len, stu);float  chinese_avr = 0, english_avr = 0, math_avr = 0;int chinese_fail = 0, english_fail = 0, math_fail = 0;for (int i = 0; i < len ;i++){chinese_avr += stu[i].chinese;english_avr += stu[i].english;math_avr += stu[i].math;}chinese_avr /= len;english_avr /= len;math_avr    /= len;for (int i = 0; i < len; i++){if (stu[i].chinese < 60)chinese_fail++;if (stu[i].english < 60)english_fail++;if (stu[i].math < 60)math_fail++;}printf("------------------------------------------------------------------\n");printf("语文平均成绩为:%f\n英语平均成绩为:%f\n数学平均成绩为:%f\n", chinese_avr, english_avr, math_avr);printf("------------------------------------------------------------------\n");printf("语文不及格人数为:%d\n", chinese_fail);printf("英语不及格人数为:%d\n", english_fail);printf("数学不及格人数为:%d\n", math_fail);printf("------------------------------------------------------------------\n");return 1;
}

stduent.h

#pragma once
#ifndef __STUDENT_H__
#define __STUDENT_H__
struct student {unsigned int no;char name[10];char sex;int age;float chinese;float english;float math;
};void array_print(struct student stu);        //一种简单的结构体打印方式,直接传结构体名称(首地址)就能打印
void student_print(int len, struct student stu[]);//结构体数组打印,第一个参数是结构体数组长度,第二个参数是结构体数组的地址
int student_save(int len, struct student stu[]);//把结构体数组保存到文件中
int student_array_init(int* len, struct student stu[]);//把文件中的结构体数组读取到stu[]
int student_array_add(int* len, struct student stu[]);//向文件中添加结构体数组int student_array_delate(int* len, struct student stu[]);//1:删除文件中的一个结构体数组
int stu_del_by_no(int no,int *len, struct student stu[]);//2:按照学号删除文件中的一个结构体数组(属于1中的一个小函数)
int stu_del_by_name(char name[], int* len, struct student stu[]);//3:按照姓名删除文件中的一个结构体数组(属于1中的一个小函数)int student_find(int len, struct student stu[]);//查询文件中的结构体,
int stu_find_by_name(char name[], int len, struct student stu[]);
int stu_find_by_no(int no, int len, struct student stu[]);int student_modify(int len, struct student stu[]);
int stu_modify_by_name(char name[],int len,struct student stu[]);
int stu_modify_by_no(int no, int len, struct student stu[]);int student_count(int len, struct student stu[]);void student_menu();#endif     

C语言项目实战——学生成绩系统管理相关推荐

  1. 《c语言项目》学生成绩管理系统(devc++)

    链接一: 链表模版链接地址 链接二: 学生成绩管理详细说明 <c语言项目>学生成绩管理系统(devc++) 1.分模块编程分别命名 main.cpp #include<stdio.h ...

  2. C语言学生成绩简单,C语言实现简单学生成绩管理系统.pdf

    C语言实现简单学生成绩管理系统 这篇文章主要为大家详细介绍了C语言实现简单学生成绩管理系统,具有 定的参考价值,感兴趣的小伙伴们可以 参考 下 本文实例为大家分享了C语言实现学生成绩管理系统的具体代码 ...

  3. 项目的数据存储c语言,C语言项目实战项目8__项目中学生数据的存储与重用.ppt

    C语言项目实战项目8__项目中学生数据的存储与重用 项目8 技能目标 能用fopen函数和fclose函数打开和关闭文件 能正确地读写文件 能用文件定位函数对文件进行正确的定位操作 能用格式化读写函数 ...

  4. 用C语言实现一个学生成绩管理系统 实现学生信息管理。包括:录入、查询、排序等功能。 要求: 用数据文件保存学生基本信息(学号 姓名 课程1 课程2 课程3…) ,利用菜单可以循环实现各个功能。

    用C语言实现一个学生成绩管理系统 题目: 学生成绩管理系统 功能: 实现学生信息管理.包括:录入.查询.排序等功能. 要求: 用数据文件保存学生基本信息(学号 姓名 课程1 课程2 课程3-) ,利用 ...

  5. 哈工大C语言大作业-学生成绩管理系统

    哈工大C语言大作业-学生成绩管理系统 完整项目地址:https://github.com/944613709/Student-Performance-Management-System-ByC 说明 ...

  6. [开源] C语言项目实战 - 虚拟鼠标 - VirtualMouse

    C语言项目实战 - 虚拟鼠标 - VirtualMouse 目录 关于软件 软件介绍 使用帮助 项目介绍 源码及软件下载 知识点扫描 热键的使用 鼠标事件的模拟 字体的选用 开机自启动的设置 为软件添 ...

  7. c语言用链表实现成绩管理系统,C语言写的学生成绩管理系统(链表)

    <C语言写的学生成绩管理系统(链表)>由会员分享,可在线阅读,更多相关<C语言写的学生成绩管理系统(链表)(6页珍藏版)>请在人人文库网上搜索. 1.include#inclu ...

  8. C语言项目实战:24点游戏计算器(基于结构体、指针、函数、数组、循环等知识点)

    文章目录 C语言项目实战:24点游戏计算器(基于结构体.指针.函数.数组.循环等知识点) 前言:24点游戏计算器的规则如下 一.项目的创建标 1.选择项目 2.输入项目名称和路径 3.创建头文件Mai ...

  9. c语言课程设计查找分数与删除元素,c语言课程设计学生成绩管理系统

    <c语言课程设计学生成绩管理系统>由会员分享,可在线阅读,更多相关<c语言课程设计学生成绩管理系统(31页珍藏版)>请在人人文库网上搜索. 1.河南理工大学计算机科学与技术学院 ...

最新文章

  1. 【系列】EOS开发3 EOS提供的程序和工具
  2. PHP设计模式 -- 策略模式
  3. 腾讯NExT Studios万字解读:我们是怎样将一款偏硬核的Roguelike游戏大众化的?
  4. 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录
  5. 自学Android!Android高级工程师面试题-字节跳动,附答案
  6. Java对象序列化文件追加对象的问题,以及Java的读取多个对象的问题解决方法。
  7. Temporal注解笔记
  8. 天语手机android 4.4.4,天语 V8 4.4.4 ROM刷机包 MIUI 6 合作版
  9. 马云怒赞的93年网红区块链工程师,教你如何用3年时间实现逆袭
  10. 【面试】基于二叉树层次遍历相关问题的求解
  11. 云计算里的家校互联平台
  12. Byte,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb,Bb单位换算
  13. php addslash,php addslashes用法详解
  14. php 字符串 strpos,PHP字符串处理函数:strpos() -- 内置函数
  15. [拼搏到底之龟兔赛跑--Day 16]一套兽医作家写的小说--“大地”系列
  16. oracle 截取时间年或月
  17. vue3中的ref 和 reactive 定义数组
  18. 双人成型无法连接远程计算机,《双人成行》无法连接到EA服务器怎么办 无法连接到EA服务器解决办法...
  19. 用python做归结演绎推理_Python中惯用的一些操作总结(未完待续)
  20. Oracle数据库,建库建表

热门文章

  1. longvalue_Java Number longValue()方法及示例
  2. Cookie怎么设置了不生效
  3. 迅视财经-备受瞩目新计划 恒大健康
  4. Android Studio 每次运行都会再下载一遍
  5. cellpadding的用法和定义
  6. selenium与python爬虫(四)【鼠标行为(目标3)】
  7. java常用类库---对象克隆技术
  8. Oracle 18c ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege
  9. 图数据库Neo4j技术原理探秘
  10. JavaScript中绑定事件监听函数的通用方法[ addEvent() ]