首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言百題練習第 45 題:選票統計——三候選人得票排序輸出

     編輯:關於C語言

題目描述

三候選人 A、B、C,N 人投票(字符串,大小寫不敏感),非 ABC 字符視為棄權。按得票數降序輸出候選人字母與票數,票數相同按字母序輸出。

解題思路

  1. 統計三候選人得票:count['A']、count['B']、count['C']
  2. 構造結構體數組包含字母與票數
  3. 自定義比較函數:票數降序、字母升序
  4. 排序後依次輸出

優化版 C 代碼

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

typedef struct {
    char name;
    int votes;
} Candidate;

int cmp(const void *a, const void *b) {
    Candidate *p1 = (Candidate *)a;
    Candidate *p2 = (Candidate *)b;
    if (p1->votes != p2->votes)
        return p2->votes - p1->votes; // 票數降序
    return p1->name - p2->name;       // 字母升序
}

int main(void) {
    int n;
    scanf("%d", &n);
    getchar(); // 吸收換行
    
    Candidate c[3] = {{'A',0}, {'B',0}, {'C',0}};
    char ch;
    
    for (int i = 0; i < n; i++) {
        ch = getchar();
        ch = toupper(ch);
        if (ch >= 'A' && ch <= 'C')
            c[ch - 'A'].votes++;
    }
    
    qsort(c, 3, sizeof(Candidate), cmp);
    
    for (int i = 0; i < 3; i++)
        printf("%c %d\n", c[i].name, c[i].votes);
        
    return 0;
}

關鍵技術點

  • toupper() 統一大小寫,ctype.h
  • 直接用字母索引 ch - 'A' 更新計數,無需多重 if
  • qsort + 比較函數實現多關鍵字排序,代碼簡潔可擴展
  • 結構體數組初始化確保三候選人全部輸出(即使 0 票)

原代碼問題分析

  • 手寫 max/min 函數繁瑣且易錯,排序邏輯硬編碼難維護
  • 字符數組 a[1000] 讀取時 i<=n 可能越界(應 i<n)
  • 未處理大小寫統一(原代碼用 || 判斷,toupper 更優雅)
  • 輸出格式:題目要求每行「字母 空格 票數」,原代碼邏輯複雜且可能重複輸出

測試樣例

輸入:
6
abcA1b

輸出:
A 2
B 2
C 1
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved