C语言模拟投票程序流程图及代码解析
C语言模拟投票程序流程图及代码解析
本文将带您深入解析一段C语言代码,该代码模拟了一个简单的投票程序。我们将提供清晰易懂的流程图,并对代码的关键部分进行详细解释。
流程图
开始 -> 创建选手文件(createContestantFile()) -> 读取选手信息(readContestants()) -> 模拟投票过程(simulateVoting()) -> 对选手进行排序(sortContestants()) -> 分配排名(assignRanks()) -> 保存结果(saveResults()) -> 保存日志(saveLog()) -> 结束
代码解析c#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include 'Vote.h'
// 创建选手文件void createContestantFile() { FILE* file = fopen('contestant.txt', 'w'); if (file == NULL) { printf('Failed to create contestant.txt file. '); return; }
// 将选手信息写入文件 fprintf(file, '1 选手1
'); // ... 其他选手信息 fprintf(file, '9 选手9 ');
fclose(file);}
// 读取选手信息Contestant* readContestants(int* numContestants) { FILE* file = fopen('contestant.txt', 'r'); if (file == NULL) { printf('Failed to open contestant.txt file. '); return NULL; }
Contestant* contestants = NULL; char line[MAX_NAME_LENGTH + 10]; int i = 0;
// 从文件中读取选手信息 while (fgets(line, sizeof(line), file) != NULL) { (*numContestants)++; contestants = realloc(contestants, (*numContestants) * sizeof(Contestant));
sscanf(line, '%d %s', &(contestants[i].number), contestants[i].name); contestants[i].votes = 0; contestants[i].rank = 0; printf('%d %s
', contestants[i].number, contestants[i].name); i++; }
fclose(file);
return contestants;}
// 模拟投票过程void simulateVoting(Contestant* contestants, int numContestants) { printf('输入投票顺序(按0至结束): '); int vote;
while (1) { scanf('%d', &vote);
if (vote == 0) { break; }
if (vote < 1 || vote > numContestants) { printf('无效的参赛者号码。请再次投票.
'); continue; }
contestants[vote - 1].votes++; }}
// 对选手进行排序(使用冒泡排序)void sortContestants(Contestant* contestants, int numContestants) {
int i = 0, j = 0; for (i = 0; i < numContestants - 1; i++) { for (j = 0; j < numContestants - i - 1; j++) { if (contestants[j].votes > contestants[j + 1].votes) { Contestant temp = contestants[j]; contestants[j] = contestants[j + 1]; contestants[j + 1] = temp; } } }}
// 分配排名void assignRanks(Contestant* contestants, int numContestants) { int rank = 1, i = 0;
for (i = numContestants - 1; i >= 0; i--) { if (i < numContestants - 1 && contestants[i].votes < contestants[i + 1].votes) { rank++; } contestants[i].rank = rank; printf(' %d %s %d %d
', contestants[i].number, contestants[i].name, contestants[i].votes, contestants[i].rank); }}
// 保存结果void saveResults(Contestant* contestants, int numContestants) { FILE* file = fopen('result.txt', 'w'); if (file == NULL) { printf('Failed to create result.txt file. '); return; } int i = 0; for (i = 0; i < numContestants; i++) { fprintf(file, '%d %s %d %d ', contestants[i].number, contestants[i].name, contestants[i].votes, contestants[i].rank); }
fclose(file);}
// 保存日志void saveLog(char* action) { FILE* file = fopen('Log.txt', 'a'); if (file == NULL) { printf('Failed to open Log.txt file. '); return; }
time_t rawtime; struct tm* timeinfo; time(&rawtime); timeinfo = localtime(&rawtime);
fprintf(file, '[%02d:%02d:%02d] %s
', timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, action);
fclose(file);}
// ...主函数及其他代码省略
代码说明
- 文件操作: 代码使用了
fopen,fprintf,fscanf等函数进行文件读写操作,实现了选手信息的存储和读取,以及结果的保存。2. 动态内存分配: 使用realloc函数根据选手数量动态分配内存,提高了程序的灵活性。3. 排序算法: 代码采用了冒泡排序算法对选手根据票数进行排序,确定排名。4. 数据结构: 代码中可能定义了Contestant结构体,用于存储选手的编号、姓名、票数、排名等信息,使程序更加清晰易懂。
总结
本篇文章通过对C语言模拟投票程序代码的解析,向您展示了如何使用C语言进行简单的文件操作、排序、数据处理等操作。希望本文能够帮助您更好地理解C语言编程,并能够运用到实际项目中。
原文地址: https://www.cveoy.top/t/topic/bdrX 著作权归作者所有。请勿转载和采集!