c语言学生成绩管理系统

 此篇博客内容与百度文库中 https://wenku.baidu.com/view/3cb7659332d4b14e852458fb770bf78a65293ad0 均为本人个人所写,希望大家支持点击获得浏览量!

#include //编译预处理指令

#include //定义处理字符串函数

#include //宏指令的声明

#include //定义通过控制台进行数据输入以及输出

#define N 2000 //最多的人数人

#define M 3 //统计成绩

typedef struct student //定义类型

{ char number[10]; //保存所有人的学号

char name[20]; //保存学生姓名

char sex[10]; //保存性别

float score[M]; //保存所有课程成绩

float aver; //保存每个人的平均成绩

float total; //总计成绩

}STU;

STU stu[N];

int n;

void inputscore(void); //学生成绩新建

void savescore(void); //学生成绩保存

void avergescore(void); //学生平均成绩

void total(void); //学生成绩总计

void modifyscore(void); //学生成绩修改

void lookscore(void); //学生成绩查看

void searchscore(void); //学生成绩查询

void statistic(void); //学生成绩统计

void add(void); //学生成绩添加

void modify(void); //学生成绩修改

void delscore(void); //学生成绩删除

void menu(void); //学生成绩菜单

void main()

{ short int flag=0;

menu();

do

{ flag=1;

switch(getch())

{ case '1' : inputscore();break; //在菜单界面输入1,调用i函数nputscore()实现输入学生成绩信息功能

case '2' : lookscore();break; //在菜单界面输入2,调用函数lookscore()实现学生成绩按平均分高低排序输出,同时lookscore()函数调用avregescore()函数实现各个学生的平均分计算

case '3' : searchscore();break; //在菜单界面输入3,调用searchscore()函数实现通过学号查找学生成绩信息功能

case '4' : statistic();break; //在菜单界面输入4,调用statistic()函数输出每一门课程的最高分,平均分以及不及格人员

case '5' : modify();break; //在菜单界面输入5,调用modify()函数实现通过学号修改学生成绩的功能

case '6' : add();break; //在菜单界面输入6,调用add()函数实现添加学生成绩

case '7' : delscore();break; //在菜单界面输入7,调用delscore()函数实现删除指定学生的成绩

case '8' : savescore();break; //在菜单界面输入8,调用savescore()函数将学生成绩信息保存

case '9' :exit(0); break; //在菜单界面输入9,退出成绩管理系统

default : printf("输入有误n");

}

printf("按任意键继续n");

getch(); //按任意键继续,起到暂停的作用,函数头文件conio.h已经定义过

menu(); // 菜单

}while (flag==1);

}

void menu(void)

{

system("cls"); //清屏

printf("n");

printf(" ★★★★★★★欢迎进入学生成绩管理系统★★★★★★★n");

printf(" 菜单 n");

printf(" ☆输入成绩-------------------------------------1n");

printf(" ☆查看成绩及成绩排序---------------------------2n");

printf(" ☆查询学生成绩---------------------------------3n");

printf(" ☆成绩统计-------------------------------------4n");

printf(" ☆修改成绩-------------------------------------5n");

printf(" ☆添加成绩-------------------------------------6n");

printf(" ☆删除成绩-------------------------------------7n");

printf(" ☆保存成绩-------------------------------------8n");

printf(" ☆退出系统-------------------------------------9n");

printf(" ★★★★★★★★★★★★★★★★★★★★★★★★n");

printf(" 请输入您的选择(1~9)n");

}

/***************输入各个同学的学生信息******************************/

void inputscore(void) //输入成绩

{ int i,j;

system("cls"); //清屏专用,以下出现位置作用相同

printf(" 已经转到输入成绩菜单n");

printf("请输入学生总数:n");

scanf("%d",&n);

printf("提示:输入学号时请输入9位学生编号:图书借阅证上的学号n"); //因二维表上下需对正故有此要求

for(i=0;i

{ printf("n");

printf("请输入第%d位学生的学号:n",i+1);

scanf("%s",stu[i].number); //输入学生学号

printf("姓名:n");

scanf("%s",stu[i].name); //输入学生名字

printf("请输入该学生性别n");

scanf("%s",stu[i].sex); //输入性别

printf("请输入学生成绩:n");

printf("高数分t英语分tC语言分n");

for(j=0;j

scanf("%f",&stu[i].score[j]); //输入高数、英语、C语言的成绩

}

printf(" 成功输入(按任意键继续后请输入8进行保存)n");

}

/*****************计算各个同学的总分*****************************/

void total(void)

{ int i,j; //定义变量i,j;i用来表示学生个数,j则用来表示学生每门课的分数

for(i=0;i

{ stu[i].total=0;

for(j=0;j

{

stu[i].total+=stu[i].score[j];

}

}

}

/*****************计算各个同学的平均分*****************************/

void avergescore(void)

{ int i,j; //定义变量i,j;i用来表示学生个数,j则用来表示学生每门课的分数

for(i=0;i

{ stu[i].aver=0;

for(j=0;j

{

stu[i].aver+=stu[i].score[j];

}

stu[i].aver=stu[i].aver/M; //计算平均分

}

}

/************查看学生成绩及根据平均分对学生进行排序*********************/

void lookscore(void)

{ int i,j,k; // i,j,k都表示学生成绩比较用来调换顺序

STU t;

total(); // 此处用来对调用函数的声明

avergescore();

system("cls"); // 清屏专用

printf(" 已经转到查看成绩及成绩排序菜单n");

for(i=0;i

{ for(k=i,j=i+1;j

if(stu[j].aver>stu[k].aver)

k=j;

if(k!=j)

{ t=stu[k];

stu[k]=stu[i];

stu[i]=t;

}

}

printf("名次t学号tt姓名t性别t高数分t英语分tC语言分t总分t平均分n");

for(i=0;i

{ printf("%dt%st%st%st",i+1,stu[i].number,stu[i].name,stu[i].sex);

for(j=0;j

printf("%4.2ft",stu[i].score[j]);

printf("%4.2ft",stu[i].total);

printf("%4.2f",stu[i].aver);

printf("n");

}

}

/*****************通过输入学号查找学生成绩***************************/

void searchscore(void)

{ char a[10]; //定义数组a的类型可输入数字,字母或字符

int i,j;

system("cls"); //清屏

printf(" 已经转到查询学生成绩菜单n");

printf("请输入需查询的学生学号n");

scanf("%s",a);

for(i=0;i

{ if(strcmp(a,stu[i].number)==0) //如果输入的学号为真则输出相关信息

{ printf("名次t学号tt姓名t性别t高数分t英语分tC语言分t总分t平均分n");

printf("%dt%st%st%st",stu[i].aver);

printf("n");

break; //找到该学生成绩信息后跳出for循环

}

else

printf("未找到该学生信息n");

}

}

/*******统计学生成绩信息,计算出每一门课的最高分****************/

void statistic()

{

int i,j=0,k=0,c1;

char str[2];

float average[M],sum=0; printf("没有可被查找的记录n"); //

system("cls");

if(M==0) //如果没有输入成绩则输出没有可查找的记录

printf("没有可被查找的记录n");

else

{

while(1)

{

printf("下面将统计考试成绩n");

printf("请选择你要统计哪科的成绩 1.高数t2.英语t3.C语言n");

scanf("%d",&c1);

printf("t一共有%d个记录n",M); /*总共记录数*/

switch(c1)

{

case 1: //用来判断高数的最高分,平均分,输出不及格人员名单

for(i=0;i

{

sum+=stu[i].score[0];

if(stu[k].score[0]>stu[i].score[0]) k=i;

if(stu[j].score[0]

}

average[0]=sum/M;

printf("t高数的最高分:n");

printf("tt学号:%s 姓名:%s 分数:%.2fn",stu[j].number,stu[j].name,stu[j].score[0]);

printf("t高数的最低分是:n");

printf("tt学号:%s 姓名:%s 分数:%.2fn",stu[k].number,stu[k].name,stu[k].score[0]);

printf("t高数的平均分是 %5.2fn",average[0]);

printf("平均分低于60分的学生成员名单n");

for(i=0;i

{

if(stu[i].score[0]<60)

printf("%sn",stu[i].name);

}

break;

case 2: // 用来判断英语的最高分,平均分,输出不及格人员名单

for(i=0;i

{

sum+=stu[i].score[1];

if(stu[k].score[1]>stu[i].score[1]) k=i;

if(stu[j].score[1]

}

average[1]=sum/M;

printf("t英语的最高分:n");

printf("tt学号:%s 姓名:%s 分数:%.2fn",stu[j].score[1]);

printf("t英语的最低分是:n");

printf("tt学号:%s 姓名:%s 分数:%.2fn",stu[k].score[1]);

printf("t英语的平均分是 %5.2fn",average[1]);

printf("平均分低于60分的学生成员名单n");

for(i=0;i

{

if(stu[i].score[1]<60)

printf("%sn",stu[i].name);

}

break;

case 3: //用来判断C语言的最高分,平均分,输出不及格人员名单

for(i=0;i

{

sum+=stu[i].score[2];

if(stu[k].score[2]>stu[i].score[2]) k=i;

if(stu[j].score[2]

}

average[2]=sum/M;

printf("tC语言的最高分:n"); /*最高分*/

printf("tt学号:%s 姓名:%s 分数:%.2fn",stu[j].score[2]);

printf("tC语言的最低分是:n"); /*最低分*/

printf("tt学号:%s 姓名:%s 分数:%.2fn",stu[k].score[2]);

printf("tC语言的平均分是 %5.2fn",average[2]);

printf("平均分低于60分的学生成员名单n");

for(i=0;i

{

if(stu[i].score[2]<60)

printf("%sn",stu[i].name);

}

break;

default: //如果输入的数字不符合要求则显示错误信息

printf("输入错误!请输入1~3之间的数n");

}

sum=0;

getchar();

printf("是否继续进行统计?(y/n)");

gets(str);

if(str[0]=='y'||str[0]=='Y') statistic();

else break;

}

}

}

/***************修改学生成绩*****************/

void modify(void)

{

char a[10];

int i,j;

system("cls");

printf(" 已经转到修改成绩菜单n");

printf("请输入需要修改成绩的学生学号n");

scanf("%s",stu[i].number)==0)

{ printf("名次t学号tt姓名t性别t高数分t英语分tC语言分t总分t平均分n");

printf("%dt%st%st%st",stu[i].score[j]);

printf("%4.2f",stu[i].aver);

printf("n");

printf("请重新输入该学生的姓名:n");

scanf("%%s",stu[i].number);

printf("n");

scanf("%s",stu[i].name);

printf("请输入该学生性别n");

scanf("%s",stu[i].sex);

printf("请重新输入该学生成绩:n");

printf("高数分t英语分tC语言分n");

for(j=0;j

scanf("%f",&stu[i].score[j]);

printf("修改成功n");

break; //找到该学生成绩后进行修改,跳出for循环

}

else

printf("请确认该学生是否为该校学生!n");

}

}

/*****************添加学生成绩********************/

void add(void)

{

int a,i,j; //i定义为学生,j为学生分数,a代表加入学生的数量

system("cls");

printf(" 已经转到添加成绩菜单n");

printf("请输入新增加的学生人数:n");

scanf("%d",&a);

n=n+a;

for(i=n-a;i

{ printf("n");

printf("请输入第%d位学生的学号:n",stu[i].number);

printf("姓名:n");

scanf("%s",stu[i].name);

printf("输入该学生性别n");

scanf("%s",stu[i].sex);

printf("请输入学生成绩:n");

printf("高数分t英语分tC语言分n");

for(j=0;j

scanf("%f",&stu[i].score[j]);

printf("添加成功n");

}

}

/*******************删除学生成绩*************************/

void delscore(void)

{

int i,c;

char m,a[10]; //m用来存放后面输入删除的字母y或n

system("cls");

printf(" 已经转到删除成绩菜单n");

printf("请输入学生学号n");

scanf("%s",stu[i].aver);

printf("n");

c=i;

break;

}

else

printf("未找到该学生信息n");

}

printf("是否删除该学生成绩(y/n)n");

scanf("%s",&m);

if(m=='y')

{

for(i=c;i

stu[i]=stu[i+1]; //结构体整体赋值将后一位学生成绩信息拷贝进入前一位学生信息的存储位置

n=n-1; //删除该学生信息后学生总数减一

printf("删除成绩成功n");

}

else

printf("删除成绩失败n");

}

/******************保存学生成绩************************/

void savescore(void)

{

FILE *fp; //定义指针

int i,flag=1;

char m;

system("cls");

printf(" 已经转到保存成绩菜单n");

puts("是否保存学生成绩(y/n)");

scanf("%s",&m);

if(m=='y')

{ if((fp=fopen("score.dat","wb"))==NULL) //从文件score中打开

{ printf("文件打开失败n");

return;

}

for(i=0;i

if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) //学生成绩写入

{ printf("保存失败n");

flag=0;

}

if(flag==1)

printf("保存成功!n");

fclose(fp); //界面关闭

}

else

return;

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件的解析。本文会介绍CsvHelper、TextFieldParser、正则表达式三种解析CSV文件的方法,顺带也会介绍一下CSV文件的写方法。 CSV文件标准 在介绍CSV文件的读写方法前,我们需要了解一下CSV文件的格式。 文件示例 一
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的人能快速转入Halcon平台下,通过文中的示例开发者能快速了解一个Halcon项目开发的基本步骤,让开发者能把精力完全集中到算法的开发上面。 首先,你需要安装Halcon,HALCON 18.11.0.1的安装包会放在文章末尾。安装包分开发和
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期使用。 设置dll路径 参考C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁中间的 方法一:配置App.config文件的privatePath : &lt;runtime&gt; &lt;assemblyBinding xml
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——NET的流行高性能JSON框架,当然也可以使用.NET自带的 System.Text.Json(.NET5)、DataContractJsonSerializer、JavaScriptSerializer(不推荐)。
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。&#xA;EventBus维护一个事件的字典,发布者、订阅者在事件总线中获取事件实例并执行发布、订阅操作,事件实例负责维护、执行事件处理程序。
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api/trans/vip/translate,使用方法参考通用翻译API接入文档 。&#xA;请求方式可使用 GET 或 POST 方式(Content-Type 请指定为:application/x-www-for
词云”由美国西北大学新闻学副教授、新媒体专业主任里奇·戈登(Rich Gordon)于2006年最先使用,是通过形成“关键词云层”或“关键词渲染”,对文本中出现频率较高的“关键词”的视觉上的突出。词云图过滤掉大量的文本信息,使浏览者只要一眼扫过文本就可以领略文本的主旨。&#xA;网上大部分文章介绍的是使用P
微软在.NET中对串口通讯进行了封装,我们可以在.net2.0及以上版本开发时直接使用SerialPort类对串口进行读写操作。&#xA;为操作方便,本文对SerialPort类做了一些封装,暂时取名为**SerialPortClient**。
简介 管道为进程间通信提供了平台, 管道分为两种类型:匿名管道、命名管道,具体内容参考.NET 中的管道操作。简单来说,匿名管道只能用于本机的父子进程或线程之间,命名管道可用于远程主机或本地的任意两个进程,本文主要介绍命名管道的用法。 匿名管道在本地计算机上提供进程间通信。 与命名管道相比,虽然匿名
目录自定义日志类NLog版本的日志类Serilog版本的日志类 上个月换工作,新项目又要重新搭建基础框架,把日志实现部分单独记录下来方便以后参考。 自定义日志类 代码大部分使用ChatGPT生成,人工进行了测试和优化,主要特点: 线程安全,日志异步写入文件不影响业务逻辑 支持过期文件自动清理,也可自
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机自动启动的两种常用方法](https://blog.csdn.net/weixin_42288432/article/details/120059296),将里面中的第一种方法做了封装成**AutoStart**类,使
简介 FTP是FileTransferProtocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。 FTP
使用特性,可以有效地将元数据或声明性信息与代码(程序集、类型、方法、属性等)相关联。 将特性与程序实体相关联后,可以在运行时使用反射这项技术查询特性。&#xA;在 C# 中,通过用方括号 ([]) 将特性名称括起来,并置于应用该特性的实体的声明上方以指定特性。
# 简介 主流的识别库主要有ZXing.NET和ZBar,OpenCV 4.0后加入了QR码检测和解码功能。本文使用的是ZBar,同等条件下ZBar识别率更高,图片和部分代码参考[在C#中使用ZBar识别条形码](https://www.cnblogs.com/w2206/p/7755656.htm
C#中Description特性主要用于枚举和属性,方法比较简单,记录一下以便后期使用。 扩展类DescriptionExtension代码如下: using System; using System.ComponentModel; using System.Reflection; /// &lt;
本文实现一个简单的配置类,原理比较简单,适用于一些小型项目。主要实现以下功能:保存配置到json文件、从文件或实例加载配置类的属性值、数据绑定到界面控件。&#xA;一般情况下,项目都会提供配置的设置界面,很少手动更改配置文件,所以选择以json文件保存配置数据。
前几天用SerialPort类写一个串口的测试程序,关闭串口的时候会让界面卡死。网上大多数方法都是定义2个bool类型的标记Listening和Closing,关闭串口和接受数据前先判断一下。我的方法是DataReceived事件处理程序用this.BeginInvoke()更新界面,不等待UI线程
约束告知编译器类型参数必须具备的功能。 在没有任何约束的情况下,类型参数可以是任何类型。 编译器只能假定 System.Object 的成员,它是任何 .NET 类型的最终基类。 如果客户端代码使用不满足约束的类型,编译器将发出错误。 通过使用 where 上下文关键字指定约束。&#xA;最常用的泛型约束为
protobuf-net是用于.NET代码的基于契约的序列化程序,它以Google设计的“protocol buffers”序列化格式写入数据,适用于大多数编写标准类型并可以使用属性的.NET语言。&#xA;protobuf-net可通过NuGet安装程序包,也可直接访问github下载源码:https:/
工作中经常遇到需要实现TCP客户端或服务端的时候,如果每次都自己写会很麻烦且无聊,使用SuperSocket库又太大了。这时候就可以使用SimpleTCP了,当然仅限于C#语言。&#xA;SimpleTCP是一个简单且非常有用的 .NET 库,用于处理启动和使用 TCP 套接字(客户端和服务器)的重复性任务