c语言第一次出现得bug(陷阱)

本文介绍了一个模拟选举过程的程序,重点分析了其中的排序逻辑问题,并提出了改进方案。程序通过随机生成选票来模拟选举过程,使用数组记录每位候选人的得票数,并试图通过冒泡排序按得票数对候选人进行排序。

/***5、模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用A、B、C、D表示,当选某候选人时,直接输入其编号(编号由计算机随机产生),
     若输入的不是A、B、C、D则视为无效票,选举结束后按得票数从高到低输出候选人编号和所得票数。
 */
#if 1
main(){
    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。

欢迎大家提出意见及建议!谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值