/***5、模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用A、B、C、D表示,当选某候选人时,直接输入其编号(编号由计算机随机产生),
若输入的不是A、B、C、D则视为无效票,选举结束后按得票数从高到低输出候选人编号和所得票数。
*/
#if 1main(){
int person[5] = {0};
int personAddr[5] = {0};
int n = 0;
int temp = 0;
// int a = 0, b = 0, c = 0, d = 0, e = 0;
printf("输入n,n为投票人数");
scanf("%d", &n);
// 投票
for (int i = 0; i < n; i ++) {
temp = arc4random() % ('F' - 'A' + 1) + 'A';
if ('A' == temp) {
person[0] ++ ;
} else if ('B' == temp) {
person[1] ++;
} else if ('C' == temp) {
person[2] ++;
} else if ('D' == temp) {
person[3] ++;
} else {
person[4] ++;
}
}
// 得票人坐标
for (int i = 0; i < 5 ; i ++) {
printf("%d ", person[i]);
personAddr[i] = i;
}
printf("\n");
// test
for (int i = 0 ; i < 5; i ++) {
printf("%d ", personAddr[i]);
}
printf("\n");
// 排序 只变地址
for (int i = 0; i < 5 - 1; i ++) {
for (int j = 0 ; j < 5 - i - 1; j ++) {
if (person[j] < person[j + 1]) {
int temp = 0;
temp = personAddr[j + 1];
personAddr[j + 1] = personAddr[j];
personAddr[j] = temp;
printf("temp === %d\n",temp);
}
}
}
// 输出
for (int i = 0; i < 5; i ++) {
printf("%d ", personAddr[i]);
}
printf("\n");
for (int i = 0; i < 5; i ++) {
printf("%c get %d 票\n", personAddr[i] + 'a', person[personAddr[i]]);
}}概述:定义俩个数组,person[]来存放每个人获得得票数,personAddr[]来保存每个人得坐标,票数是随机获得得,其他部分都没问题,只看排序循环处,思路是每次比较票数之后,将他们得地址交换位置,最后按照地址寻得哪个人得多少票,表面上看起来没有问题,但是陷阱就在这里,看代码标记处,运用冒泡排序,比较票数之后,交换位置得是地址,但是问题就出在这里,当第一次循环之后,地址是交换了,可是person[]得值没有交换位置,由此导致第二次循环得时候,比较person[]值得时候,依然要交换已经交换过得位置,所以,这里应该是错误得。
解决方案: 再增加一组数组,来保存票数,其值应该跟person[]得值一样,最后根据地址再临时得数组里寻找对应得ABCD。
欢迎大家提出意见及建议!谢谢
本文介绍了一个模拟选举过程的程序,重点分析了其中的排序逻辑问题,并提出了改进方案。程序通过随机生成选票来模拟选举过程,使用数组记录每位候选人的得票数,并试图通过冒泡排序按得票数对候选人进行排序。

2846

被折叠的 条评论
为什么被折叠?



