C语言文件:数据文件a.txt中保存了若干个学生的学号、姓名和成绩。请编程读出显示文件内容并分类统计各等级人数,最后显示统计结果。

news2024/12/29 8:02:35

一、作者想先说一点废话(狗头表情)

想必经常看我博客的小伙伴们已经发现我最近的博客风格和以往有些不同。以往的博客都是“一本正经不敢胡来”,但近段时间,文章风格却变得“废话连篇放荡不羁”,究竟是为什么呢(坏笑表情)?原来是作者在写博客的时候把自己和这段代码的故事给代入进去了,这样就让博客更生动有趣,在讲故事的同时让大家学习到算法思路,同时也可以学习到一些经验,在今后的学习中避免再走作者走过的弯路。

二、题目

已知一个数据文件a.txt中保存了若干个学生的计算机等级考试成绩,包括学号、姓名和成绩。请编程读出显示文件内容并分类统计各等级人数,最后显示统计结果。成绩等级规则:大于等于90-A,大于等于80-B,大于等于70-C,大于等于60-D,60以下-E。

二、最初算法思路

时代背景:拿到这个题目的时候,我数据结构正好学完单链表。

以往作风:我学完洛必达就觉得万物皆可洛必达,学完单链表就觉得万物皆可单链表。说白了就是思维定式,不会转弯。

一个我自认为完美的算法思路:

1、储存学生信息的结构体。

2、尾插法建立单链表,并读取文件中学生信息存在链表中。

3、将链表中的学生成绩转化为五级制成绩,统计并显示各等级人数。

于是有了如下代码:

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

typedef struct students {//用于储存学生信息的结构体
	char id[20];//学号
	char name[20];//姓名
	char score[5];//成绩
	struct students* next;
};

void CreatList(students* list,FILE*pfile)//尾插法建立单链表,并读取文件中学生信息存在链表中
{
	printf("文件中的学生信息为:\n");
	printf("学号\t姓名\t成绩\n");
	students* r = list;
	while (!feof(pfile))//若文件未结尾,则读取文件内容
	{
		students* p = (students*)malloc(sizeof(students));
		fscanf(pfile, "%s %s %s\n", &p->id, &p->name, &p->score);//读取学生信息并存放在链表中
		printf("%s\t%s\t%s\n", p->id, p->name, p->score);
		r->next = p;
		r = r->next;
	}
	r->next = NULL;
}

void grade(students* list)
{
	students* p = list->next;//p指向首元结点
	int A = 0, B = 0, C = 0, D = 0, E = 0;//定义各等级人数,并初始化为0
	while (p)//若p不为空,则进入循环
	{
		int x = atoi(p->score) / 10;//atoi用于将成绩转化为整型
		switch (x)//分级
		{
			case 10:
			case 9:
				A++;
				break;
			case 8:
				B++;
				break;
			case 7:
				C++;
				break;
			case 6:
				D++;
				break;
			case 5:
			case 4:
			case 3:
			case 2:
			case 1:
			case 0:
				E++;
				break;
		}
		p = p->next;//p向下移动一位
	}
	printf("A等级学生人数为:%d\n", A);
	printf("B等级学生人数为:%d\n", B);
	printf("C等级学生人数为:%d\n", C);
	printf("D等级学生人数为:%d\n", D);
	printf("E等级学生人数为:%d\n", E);
}

int main()
{
	FILE* pfile;
	if ((pfile = fopen("a.txt", "r")) == NULL)//不要忘了pfile = fopen("a.txt", "r")外头的括号!
	{
		printf("不能打开文件!\n");
		exit(0);//相当于return 0;
	}
	students* list = (students*)malloc(sizeof(students));
	CreatList(list,pfile);//调用函数
	grade(list);//调用函数
	if (fclose(pfile))//程序结束用fclose关闭文件是一个良好的编程习惯
	{
		printf("不能正常关闭文件!\n");
		exit(0);
	}
	return 0;
}

三、优化算法代码

过了一段时间,有个同学找我帮忙调试代码。

我一看:不就是这题吗?

再一看:代码长度给我震惊了,这段代码怎么比我的简单这么多!?

又一看:我怎么辣么傻,当初的算法真是愚蠢至极,用什么单链表!真没必要……

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

void grade(FILE* pfile)
{
	char id[20];//学号
	char name[20];//姓名
	char score[5];//成绩
	int A = 0, B = 0, C = 0, D = 0, E = 0;//定义各等级人数,并初始化为0
	while (!feof(pfile))//若文件未结尾
	{
		fscanf(pfile, "%s %s %s\n", &id, &name, &score);//读取学生信息
		int x = atoi(score) / 10;//atoi用于将成绩转化为整型
		switch (x)//分级
		{
		case 10:
		case 9:
			A++;
			break;
		case 8:
			B++;
			break;
		case 7:
			C++;
			break;
		case 6:
			D++;
			break;
		case 5:
		case 4:
		case 3:
		case 2:
		case 1:
		case 0:
			E++;
			break;
		}
	}
	printf("A等级学生人数为:%d\n", A);
	printf("B等级学生人数为:%d\n", B);
	printf("C等级学生人数为:%d\n", C);
	printf("D等级学生人数为:%d\n", D);
	printf("E等级学生人数为:%d\n", E);
}

int main()
{
	FILE* pfile;
	if ((pfile = fopen("a.txt", "r")) == NULL)//不要忘了pfile = fopen("a.txt", "r")外头的括号!
	{
		printf("不能打开文件!\n");
		exit(0);//相当于return 0;
	}
	grade(pfile);//调用函数
	if (fclose(pfile))//程序结束用fclose关闭文件是一个良好的编程习惯
	{
		printf("不能正常关闭文件!\n");
		exit(0);
	}
	return 0;
}

四、运行结果

 

五、总结

思维定式快喊停,

思路开阔要跟紧;

时常踩坑别担心,

总结经验向前进!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/517993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

像素画板-第14届蓝桥杯省赛Scratch初级组真题第4题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第133讲。 像素画板&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程初级组真题第4题&#xf…

基于VCSEL红外激光,柔性AR隐形眼镜方案诞生

研发AR隐形眼镜有多难&#xff1f;从备受关注的Mojo Vision来看&#xff0c;这家公司成立了8年时间&#xff0c;累计融资超过2.26亿美元&#xff0c;但由于产品进展和融资受阻问题&#xff0c;不得不大幅裁员、重组&#xff0c;将重心从AR隐形眼镜转移到Micro LED显示业务。 为…

生态、遥感、大气、水文水资源、地下水土壤、人工智能等多领域教程

理论讲解案例实战动手实操讨论互动 针对 生态农林、遥感、语言土壤、统计、人工智能等领域全套教程。包含:InVEST模型、DSSAT模型、CENTURY模型、CASA模型、SWH蒸散模型、BGC模型、MAXENT模型、CLM模式、CLUE模型、PROSAIL模型、Biomod模型、Hydrus模型、Meta分析、ArcGIS、MAT…

黑马点评Redis实战(优惠卷秒杀)

本文是上一篇文章的后续&#xff0c;上一篇文章链接 马点评Redis实战(短信登录;商户查询缓存) 锁 一、优惠卷秒杀 id是一个订单必备的属性&#xff0c;而订单的id属性是必须唯一的&#xff0c;首先我们会想到使用数据库主键id&#xff0c;并设置为自增。这样似乎就能满足唯…

tracker_query_storage fail, error no: 28, error info: No space left on device

先说结论&#xff1a; 这个错误信息提示磁盘空间不足&#xff0c;导致tracker查询存储失败。错误代码28表示系统中没有足够的可用空间。这个问题的解决方法是清理磁盘空间&#xff0c;释放足够的存储空间。 [rootlocalhost fdfs]# fdfs_test /etc/fdfs/client.conf upload /h…

DNS域名解析,以及A、AAAA、CNAME、MX、NS、TXT、SRV、SOA、PTR说明

温故知新&#xff0c;最近网上开到相关文章&#xff0c;这里终结记录一下&#xff0c;供大家参考。 目录 1.A记录 2、CNAME&#xff1a; 两种域名解析方式 4、NS记录 5、TXT记录&#xff1a; 6、AAAA记录&#xff1a; 7、SRV记录&#xff1a; 8、SOA记录&#xff1a; …

MySQL基础(三十)PowerDesigner的使用

1 PowerDesigner的使用 PowerDesigner是一款开发人员常用的数据库建模工具&#xff0c;用户利用该软件可以方便地制作 数据流程图 、概念数据模型 、 物理数据模型&#xff0c;它几乎包括了数据库模型设计的全过程&#xff0c;是Sybase公司为企业建模和设计提供的一套完整的集…

统计学方法选择

统计学方法选择 参考资料什么是参数检验 参考资料 【如何选择统计学方法&#xff1f;T检验、单因素方差分析、秩和检验、卡方检验到底应该选择哪一个&#xff1f;一个视频轻松搞定】 https://www.bilibili.com/video/BV18X4y1k7GB/?share_sourcecopy_web&vd_sourced51021…

极智项目 | 实战OpenCV手势识别

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文带来一个实战项目 OpenCV手势识别&#xff0c;并提供完整项目工程源码。 本文介绍的实战OpenCV手势识别&#xff0c;提供完整的可以一键执行的项目工程源码&a…

Makefile基础教学(预定义变量)

文章目录 前言一、自动变量的概念二、自动变量在工程中的应用三、特殊变量的使用四、特殊变量在工程中的应用总结 前言 上篇文章讲解到了变量的使用&#xff0c;这篇文章继续讲解预定义变量。 一、自动变量的概念 在Makefile中&#xff0c;自动变量指的是可以在编写规则或命…

Webpack5 应用

文章目录 Webpack5 应用处理CSS文件使用css-loader和style-loader内联CSS安装配置webpack.config.js编写源代码编译打包 使用css-loader和mini-css-extract-plugin外部链接CSS安装配置webpack.config.js编译打包 处理图片资源自动清空上次打包内容 Webpack5 应用 处理CSS文件 …

(9)Qt---网络编程

目录 1. 复习 1.1 UDP 与TCP 1.2 IP地址与端口号 2. 前期准备 3. 编程内容 1. 复习 1.1 UDP 与TCP UDP TCP 协议相同点&#xff1a;都存在于传输层 TCP&#xff08;即传输控制协议&#xff09;&#xff1a; 是一种面向连接的传输层协议&#xff0c;它能提供高可靠性通信(即…

[WiFi] WiFi 5G DFS机制及认证

DFS机制及认证 DFS是Dynamic Frequency Selection (DFS)&#xff0c;动态频率选择&#xff08;DFS&#xff09;是指允许未经许可的设备&#xff08;尤其是在室外操作的设备&#xff09;共享已分配给雷达系统的5GHz频段而不会对这些雷达造成干扰的机制。启用DFS功能后&#xff0…

PostGIS的安装与建库(Windows)

PostGIS的安装与建库(Windows) 文档目录 PostGIS的安装与建库(Windows)安装PostgreSQL安装PostGIS构建空间数据库 安装PostgreSQL 首先&#xff0c;以管理员身份运行 postgresql-13.5-1-windows-x64。(下面是安装包下载链接) 链接:https://pan.baidu.com/s/1vr6_zwOzW4UW6zwf6…

Backpropagation(反向传播)

是一种高效计算梯度下降的方法。 Chain Rule&#xff08;链式法则&#xff09; 定义了一个loss function是所有training data的loss之和。 考虑某一个neuron的情况 Forward Pass z对w的偏微分就是输入x。 Backward Pass Case1- Output Layer 假设两个红色的neuron已经是outpu…

声音合成——Foley Sound——DECASE项目——多模态智能感知与应用——课程学习(5)

文章目录 概述一、Approaches And Challenges生成的声音是什么类型训练模型使用的是什么特征原始音频Raw Audio频谱图Spectrograms 声音生成模型常用的结构生成模型的输入 二、Autoencoders Explained Easily自动编码器的通俗解释PCA和编码器的区别如何训练一个编码器Deep Auto…

深眸科技|机器视觉加速渗透各行各业,推进制造业智能制造进程

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;机器视觉技术作为其重要分支&#xff0c;加速渗透进我国制造业生产环节&#xff0c;覆盖从装配到检测等高端复杂领域&#xff0c;推进我国从制造大国迈向制造强国的进程。 机器视觉技术在工业生产过程中具有多种应用&…

域名历史查询工具-批量域名历史注册记录查询

批量备案域查询 在互联网时代&#xff0c;域名备案已经成为一项必要工作&#xff0c;但是批量备案域名是一项繁琐和费力的工作。为了帮助企业和个人轻松应对域名备案&#xff0c;出现了一种新型的解决方案——批量备案域名查询监控软件。 这种软件的最大优势是自动化&#xf…

域名备案批量查询工具-域名备案查询

为什么域名要备案 域名备案是一种互联网服务管理制度。其主要目的是加强互联网信息管理&#xff0c;维护网络安全和公共利益&#xff0c;规范网站的使用和运营行为。备案对于网站和域名的合法性和正常运营都具有重要的意义。没有备案的域名无法在大陆境内访问&#xff0c;并可…

linux发行家族和发行版及安装软件方式

在Linux平台下&#xff0c;软件包的类型可以划分为两类&#xff1a;源码包、二进制包&#xff1b; 一个软件要在Linux上执行&#xff0c;必须是二进制文件&#xff1b; 源码包&#xff1a;即程序软件的源代码&#xff08;一般也叫Tarball&#xff0c;即将软件的源码以tar打包后…