大家好,欢迎来到无限大的频道。
今天带领大家来学习c语言。
题目要求:
设计一个进行候选人的选票程序。假设有三位候选人,在屏幕上输入要选择的候选人姓名,有10次投票机会,最后输出每个人的得票结果。好的,我们可以设计一个简单的选票程序,允许用户为三个候选人投票。以下是问题分析及解题思路,并最终给出 C 语言解决方案。
问题分析
我们需要对三个候选人进行投票,每位候选人有一个唯一的名称。用户有 10 次投票机会,在每次投票时输入一个候选人的姓名。在所有投票完成后,程序需要统计并输出每个候选人获得的票数。解题思路
定义候选人:我们需要一个字符数组来存储每个候选人的名称,另一个整数数组来存储每个候选人的票数。初始化票数:在程序开始时,将所有候选人的票数初始化为 0。进行投票:使用循环让用户进行投票,输入候选人的姓名,如果输入合法,则票数加 1。输出结果:在投票结束后,输出每个候选人的得票结果。C 语言实现
以下是实现该程序的 C 语言代码:
#include <stdio.h>#include <string.h>#define CANDIDATE_COUNT 3#define VOTE_COUNT 10int main() { char candidates[CANDIDATE_COUNT][20] = {"Alice", "Bob", "Charlie"}; int votes[CANDIDATE_COUNT] = {0, 0, 0}; char input[20]; printf("请投票,您可以选择以下候选人(输入候选人姓名):\n"); for (int i = 0; i < CANDIDATE_COUNT; i++) { printf("%s\n", candidates[i]); } // 进行投票 for (int i = 0; i < VOTE_COUNT; i++) { printf("投票 %d/%d 请输入候选人姓名: ", i + 1, VOTE_COUNT); scanf("%s", input); // 统计票数 int found = 0; for (int j = 0; j < CANDIDATE_COUNT; j++) { if (strcmp(input, candidates[j]) == 0) { votes[j]++; found = 1; break; } } if (!found) { printf("无效的候选人姓名,请重新输入。\n"); i--; // 重新进行这次投票 } } // 输出投票结果 printf("\n投票结果:\n"); for (int i = 0; i < CANDIDATE_COUNT; i++) { printf("%s: %d 票\n", candidates[i], votes[i]); } return 0;}
运行结果如下
代码说明
使用char candidates[CANDIDATE_COUNT][20]
数组存储候选人姓名。使用 int votes[CANDIDATE_COUNT]
数组初始化候选人票数为 0。通过循环,用户输入候选人姓名进行投票,若输入无效则要求重新输入。最后输出每位候选人的得票情况。 问题优化
候选人数由用户决定:在程序开始时询问用户输入候选人数。候选人姓名由用户决定:用户输入每位候选人的姓名。使用数字选举候选人:用户通过输入对应的候选人数字进行投票,而不需要输入姓名。优化后的 C 语言代码
#include <stdio.h>#include <stdlib.h>int main() { int candidate_count; // 询问用户输入候选人数 printf("请输入候选人人数: "); scanf("%d", &candidate_count); // 动态分配内存以存储候选人姓名和票数 char **candidates = malloc(candidate_count * sizeof(char *)); int *votes = malloc(candidate_count * sizeof(int)); // 初始化每个候选人的姓名和票数 for (int i = 0; i < candidate_count; i++) { candidates[i] = malloc(20 * sizeof(char)); // 假设每个名字最大为20个字符 printf("请输入第 %d 位候选人的姓名: ", i + 1); scanf("%s", candidates[i]); votes[i] = 0; // 初始化票数为0 } printf("\n请根据编号投票,您可以选择以下候选人:\n"); for (int i = 0; i < candidate_count; i++) { printf("%d. %s\n", i + 1, candidates[i]); } int vote_count = 10; // 投票次数 for (int i = 0; i < vote_count; i++) { int choice; printf("投票 %d/%d 请输入候选人编号 (1-%d): ", i + 1, vote_count, candidate_count); scanf("%d", &choice); // 统计票数 if (choice >= 1 && choice <= candidate_count) { votes[choice - 1]++; } else { printf("无效的候选人编号,请重新输入。\n"); i--; // 重新进行这次投票 } } // 输出投票结果 printf("\n投票结果:\n"); for (int i = 0; i < candidate_count; i++) { printf("%s: %d 票\n", candidates[i], votes[i]); } // 释放动态分配的内存 for (int i = 0; i < candidate_count; i++) { free(candidates[i]); } free(candidates); free(votes); return 0;}
运行结果如下
代码说明
动态内存分配:使用malloc
动态分配存储候选人姓名和票数的内存,这样可以根据用户输入的候选人数调整内存大小。获取候选人数和姓名:用户在程序开始时输入候选人数,然后输入每位候选人的姓名。使用数字进行投票:用户在投票时根据候选人的编号(1到候选人数)进行投票。输入验证:验证用户输入的编号是否在有效范围内,若无效则提示并重试。内存释放:在程序结束前释放动态分配的内存,以防止内存泄漏。 优化结果
通过这些改进,程序变得更加灵活和用户友好,用户可以自定义候选人及其数量,并通过简单的数字输入进行投票。