栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

结构体使用—成绩单

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

结构体使用—成绩单

昨天到今天做了一道有关结构体的题  

根据示例,大体思路是使用结构体分别存储姓名和成绩

程序很快就写出来了,它长这样

#include 
#include 
struct ScoreStruct {
	unsigned char name[20];
	unsigned int Score;
};                                                      //声明一个存储姓名和成绩的结构体
int main() {
	int n, t, i;
	scanf("%d", &n);
	struct ScoreStruct score[20], m;                    //声明一个结构体数组和临时变量m
	for (t = 0; t < n; t ++) {                          //循环读取数据
		scanf("%s%d", &score[t].name, &score[t].Score);
	}
	while (t --) {                                      //使用冒泡排序思路
		for (i = 0; i < n; i ++) {                      //比较大小并交换
			if (score[i + 1].Score < score[i].Score) {
				m = score[i + 1];
				score[i + 1] = score[i];
				score[i] = m;
			}
		}
	}
	for (t = n; t >= 0; t --) {                         //输出排名
		printf("%s %dn", score[t].name, score[t].Score);
	}
	return 0;
}

编译器的运行结果是这样

看似没什么问题,提交答案时却提示段错误

 再次运行程序,发现返回值异常

在站内搜索,提示问题出在指针指向的地址有误

更换另一编译器,发现其输出如右图所示

那么问题应该出在最后的零上,经过检查,是输出出现了问题 

//for (t = n; t >= 0; t --) {
//for (t = n; t > 0; t --) {
//for (t = n - 1; t > 0; t --) {
  for (t = n - 1; t >= 0; t --) {
		printf("%s %dn", score[t].name, score[t].Score);
}

调试过后再次提交,显示输出错误 

在这里纠结了一个下午,后来偶然发现了一个问题

在冒泡排序中,我的判断条件是t

while (t --) {
//		for (i = 0; i < n; i ++) {
		for (i = 0; i < n - 1; i ++) {
			if (score[i + 1].Score < score[i].Score) {
				m = score[i + 1];
				score[i + 1] = score[i];
				score[i] = m;
			}
		}
	}

修改后的完整代码如下,排序那里我使用了更麻烦的方法,其实照上面代码块修改也是可以的

#include 
#include 
#include                                      //strcmp()函数所对应的库文件
struct ScoreStruct {
	unsigned char name[25];                             //为防止数据溢出,使用25位
	unsigned int Score;
};                                                      //声明一个存储姓名和成绩的结构体
int main() {
	int n, t, i;
	scanf("%d", &n);                                    //输入学生数
	struct ScoreStruct score[25], m;                    //声明一个结构体数组和临时变量m
	for (t = 0; t < n; t ++) {                          //循环读取数据
		scanf("%s%d", &score[t].name, &score[t].Score);
	}
	while (t --) {                                      //使用冒泡排序思路
		for (i = 1; i < n; i ++) {                      //比较大小并交换
			if (score[i].Score < score[i - 1].Score || (score[i].Score == score[i - 1].Score && strcmp(score[i].name, score[i - 1].name) > 0)) {
				m = score[i];                           //由于审题有误,一开始没有加同分数下字典排序的判断,在这里补上
				score[i] = score[i - 1];
				score[i - 1] = m;
			}
		}
	}
	for (t = n - 1; t >= 0; t --) {                     //输出排名
		printf("%s %dn", score[t].name, score[t].Score);
	}
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/512307.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号