C基础项目(学生成绩管理系统)

目录

一、项目要求

二、完整代码实例

三、分文件编写代码实例

一、项目要求

1.系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令

2.开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示"成绩表为空!请先使用命令 T 录入学生成绩

3.输入命令 T,调用Type子函数录入成绩。界面提示输入学生人数

输入n提示输入n名学生的3门课成绩,列出成绩单的表头"学号 语文 数学 英语",学号自动生成

4.输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。

5.输入命令 A ,调用Average子函数计算平均分,提示"平均分已计算。请使用命令L查看。" Average子函数调用结束,返回。提示输入命令。

6.输入命令 P ,调用Sort子函数将各学生记录按平均分由高到低排序,提示"完成排序。请使用命令L查看。" Sort子函数调用结束,返回。提示输入命令。

7.输入命令 S ,调用Search子函数查询学生成绩,提示"输入要查询的学生学号"。输入n,找到n号学生的成绩并输出。Search子函数调用结束,返回。提示输入命令。

8.输入命令C, 执行清屏函数语句system("clear");

9.输入命令H,调用Help子函数显示帮助菜单。Help子函数调用结束,返回。提示输入命令。

10.输入命令Q, 则退出系统。

注意:

(1)输出数组元素时,要将学号单独处理,输出为整数(即保留0位小数)。同理,在计算成绩时也要将第1列的学号撇开,只计算第2列之后的。成绩保留1位小数。

(2)学生人数n贯穿始终,通过n的值判断当前命令的子函数是否能够调用执行。例如:当n=0时,说明还没有录入成绩。而一旦输入命令T,也即调用Type子函数录入了成绩,则n的值就不再是0。当n!=0时,就可以进行其他的成绩操作,但不能再执行录用成绩的操作。所以当用户输入的命令无法执行时,应当给出提示。

二、完整代码实例

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct
{
    int id;
    float chinese;
    float math;
    float english;
    float average;
} Student;

Student students[MAX];

int num = 0;

void Type();
void List();
void Average();
void Sort();
void Search();
void ClearScreen();
void Help();

int main()//主函数
{
    char c;
    printf("****************************************\n");
    printf("*\t学生成绩管理系统------帮助菜单\t*\n");
    printf("****************************************\n");
    printf(" *\tH = 显示帮助菜单\n");
    printf(" *\tT = 成绩录入\n");
    printf(" *\tA = 计算学生平均分\n");
    printf(" *\tL = 列出成绩表\n");
    printf(" *\tP = 按平均成绩由高到低排序\n");
    printf(" *\tS = 按学号查询学生成绩\n");
    printf(" *\tC = 清屏\n");
    printf(" *\tQ = 退出系统\n");
    printf("****************************************\n");
    while (1)
    {
        printf("请输入命令:");
        scanf("%c", &c);
        getchar();
        switch (c)
        {
        case 'T':
            Type();
            break;
        case 'L':
            List();
            break;
        case 'A':
            Average();
            break;
        case 'P':
            Sort();
            break;
        case 'S':
            Search();
            break;
        case 'C':
            ClearScreen();
            break;
        case 'H':
            Help();
            break;
        case 'Q':
            printf("退出系统。\n");
            return 0;
        }
    }
    return 0;
}
void Type()//输入学生人数和信息
{
    if (num != 0)
    {
        printf("成绩表不为空,无法录入学生成绩。\n");
        return;
    }
    printf("请输入学生人数:");
    scanf("%d", &num);
    getchar();
    printf("请输入%d名学生的三门课成绩:\n", num);
    printf("学号\t语文\t数学\t外语\n");
    for (int i = 0; i < num; i++)
    {
        students[i].id = i + 1;
        printf("%d\t", students[i].id);
        scanf("%f\t%f\t%f", &students[i].chinese, &students[i].math, &students[i].english);
        getchar();
    }
}

void List()//展示学生成绩信息
{
    if (num == 0)
    {
        printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
        return;
    }
    printf("学号\t语文\t数学\t英语\t平均分\n");
    for (int i = 0; i < num; i++)
    {
        printf("%d\t%.1f\t%.1f\t%.1f\t%.1f\n", students[i].id, students[i].chinese, students[i].math, students[i].english, students[i].average);
    }
}

void Average()//求平均分
{
    if (num == 0)
    {
        printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
        return;
    }
    for (int i = 0; i < num; i++)
    {
        students[i].average = (students[i].chinese + students[i].math + students[i].english) / 3.0;
    }
    printf("平均分已计算。请使用命令 L 查看。\n");
}

void Sort()//按平均分由大到小排序
{
    if (num == 0)
    {
        printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
        return;
    }
    for (int i = 0; i < num - 1; i++)
    {
        for (int j = 0; j < num - 1 - i; j++)
        {
            if (students[j].average < students[j + 1].average)
            {
                Student t = students[j];
                students[j] = students[j + 1];
                students[j + 1] = t;
            }
        }
    }
    printf("完成排序。请使用命令 L 查看。\n");
}

void Search()//查询学生成绩信息
{
    if (num == 0)
    {
        printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
        return;
    }
    int sid;
    printf("输入要查询的学生学号:");
    scanf("%d", &sid);
    getchar();
    for (int i = 0; i < num; i++)
    {
        if (students[i].id == sid)
        {
            printf("学号:%d\t语文:%.1f\t数学:%.1f\t英语:%.1f\t平均分:%.1f\n", students[i].id, students[i].chinese, students[i].math, students[i].english, students[i].average);
            return;
        }
    }
    printf("未找到该学生的成绩。\n");
}

void ClearScreen()//清屏
{
    system("clear");
}

void Help()//帮助菜单
{
    printf("****************************************\n");
    printf("*\t学生成绩管理系统------帮助菜单\t*\n");
    printf("****************************************\n");
    printf(" *\tH = 显示帮助菜单\n");
    printf(" *\tT = 成绩录入\n");
    printf(" *\tA = 计算学生平均分\n");
    printf(" *\tL = 列出成绩表\n");
    printf(" *\tP = 按平均成绩由高到低排序\n");
    printf(" *\tS = 按学号查询学生成绩\n");
    printf(" *\tC = 清屏\n");
    printf(" *\tQ = 退出系统\n");
    printf("****************************************\n");
}

三、分文件编写代码实例

头文件head.h

cpp 复制代码
#ifndef _HEAD_H_
#define _HEAD_H_
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct
{
    int id;
    float chinese;
    float math;
    float english;
    float average;
} Student;

extern int num;

Student students[MAX];
void Type();
void List();
void Average();
void Sort();
void Search();
void ClearScreen();
void Help();

#endif

主函数main.c

cpp 复制代码
#include "head.h"
int num = 0;
int main()
{
    char c;
    printf("****************************************\n");
    printf("*\t学生成绩管理系统------帮助菜单\t*\n");
    printf("****************************************\n");
    printf(" *\tH = 显示帮助菜单\n");
    printf(" *\tT = 成绩录入\n");
    printf(" *\tA = 计算学生平均分\n");
    printf(" *\tL = 列出成绩表\n");
    printf(" *\tP = 按平均成绩由高到低排序\n");
    printf(" *\tS = 按学号查询学生成绩\n");
    printf(" *\tC = 清屏\n");
    printf(" *\tQ = 退出系统\n");
    printf("****************************************\n");
    while (1)
    {
        printf("请输入命令:");
        scanf("%c", &c);
        getchar();
        switch (c)
        {
        case 'T':
            Type();
            break;
        case 'L':
            List();
            break;
        case 'A':
            Average();
            break;
        case 'P':
            Sort();
            break;
        case 'S':
            Search();
            break;
        case 'C':
            ClearScreen();
            break;
        case 'H':
            Help();
            break;
        case 'Q':
            printf("退出系统。\n");
            return 0;
        }
    }
    return 0;
}

输入学生人数和成绩的type.c

cpp 复制代码
#include "head.h"

void Type()
{
    if (num != 0)
    {
        printf("成绩表不为空,无法录入学生成绩。\n");
        return;
    }
    printf("请输入学生人数:");
    scanf("%d", &num);
    getchar();
    printf("请输入%d名学生的三门课成绩:\n", num);
    printf("学号\t语文\t数学\t外语\n");
    for (int i = 0; i < num; i++)
    {
        students[i].id = i + 1;
        printf("%d\t", students[i].id);
        scanf("%f\t%f\t%f", &students[i].chinese, &students[i].math, &students[i].english);
        getchar();
    }
}

显示学生成绩信息的list.c

cpp 复制代码
#include "head.h"
void List()
{
    if (num == 0)
    {
        printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
        return;
    }
    printf("学号\t语文\t数学\t英语\t平均分\n");
    for (int i = 0; i < num; i++)
    {
        printf("%d\t%.1f\t%.1f\t%.1f\t%.1f\n", students[i].id, students[i].chinese, students[i].math, students[i].english, students[i].average);
    }
}

求平均成绩的average.c

cpp 复制代码
#include "head.h"
void Average()
{
    if (num == 0)
    {
        printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
        return;
    }
    for (int i = 0; i < num; i++)
    {
        students[i].average = (students[i].chinese + students[i].math + students[i].english) / 3.0;
    }
    printf("平均分已计算。请使用命令 L 查看。\n");
}

按照平均成绩由大到小排序的sort.c(冒牌排序)

cpp 复制代码
#include "head.h"
void Sort()
{
    if (num == 0)
    {
        printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
        return;
    }
    for (int i = 0; i < num - 1; i++)
    {
        for (int j = 0; j < num - 1 - i; j++)
        {
            if (students[j].average < students[j + 1].average)
            {
                Student t = students[j];
                students[j] = students[j + 1];
                students[j + 1] = t;
            }
        }
    }
    printf("完成排序。请使用命令 L 查看。\n");
}

查询学生成绩信息的search.c

cpp 复制代码
#include "head.h"
void Search()
{
    if (num==0) 
    {
        printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
        return;
    }
    int sid;
    printf("输入要查询的学生学号:");
    scanf("%d",&sid);
    getchar();
    for(int i=0;i<num;i++)
    {
        if(students[i].id==sid)
        {
            printf("学号:%d\t语文:%.1f\t数学:%.1f\t英语:%.1f\t平均分:%.1f\n",students[i].id,students[i].chinese,students[i].math,students[i].english,students[i].average);
            return;
        }
    }
    printf("未找到该学生的成绩。\n");
}

清屏的clearscreen.c

cpp 复制代码
#include "head.h"
void ClearScreen()
{
    system("clear");
}

显示帮助菜单的help.c

cpp 复制代码
#include "head.h"
void Help()
{
    printf("****************************************\n");
    printf("*\t学生成绩管理系统------帮助菜单\t*\n");
    printf("****************************************\n");
    printf(" *\tH = 显示帮助菜单\n");
    printf(" *\tT = 成绩录入\n");
    printf(" *\tA = 计算学生平均分\n");
    printf(" *\tL = 列出成绩表\n");
    printf(" *\tP = 按平均成绩由高到低排序\n");
    printf(" *\tS = 按学号查询学生成绩\n");
    printf(" *\tC = 清屏\n");
    printf(" *\tQ = 退出系统\n");
    printf("****************************************\n");
}

使用Make进行编译:

makefile文件

cpp 复制代码
CC=gcc
CFLAGS=-c -g -Wall
OBJS=main.o type.o list.o average.o sort.o search.o clearscreen.o help.o 
 
xscjglxt:$(OBJS)
	$(CC) $^ -o $@
%.o:%.c
	$(CC) $(CFLAGS) $< -o $@
 
.PHONY:clean
clean:
	$(RM) *.o xscjglxt

B站讲解视频

http://【C基础(学生成绩管理系统)】 https://www.bilibili.com/video/BV1gTi7eUEc3/?share_source=copy_web&vd_source=f25867d1b9870033386a3e5ea1bbca6e

相关推荐
张暮笛2 分钟前
抓取手机HCI日志
linux
大猫和小黄4 分钟前
Windows、CentOS环境下搭建自己的版本管理资料库:GitBlit
linux·服务器·windows·git
Joyner20188 分钟前
【Linux】ubuntu通过远程命令行启动桌面应用
linux·服务器·ubuntu
向宇it10 分钟前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎
ghostwritten11 分钟前
Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon
linux·运维·服务器
我是唐青枫13 分钟前
Linux xargs 命令使用教程
linux·运维·服务器
Eric.Lee202118 分钟前
ubuntu paddle ocr 部署bug问题解决
ubuntu·ocr·paddle
m0_7482567818 分钟前
WebGIS实战开源项目:智慧机场三维可视化(学习笔记)
笔记·学习·开源
是娜个二叉树!27 分钟前
图像处理基础 | 格式转换.rgb转.jpg 灰度图 python
开发语言·python
Schwertlilien30 分钟前
图像处理-Ch5-图像复原与重建
c语言·开发语言·机器学习