高级语言程序设计第2次实验(大作业)报告
学号:******* 姓名:******* 专业: *******
课程代码:SCAI000812
实验(大作业)题目:班长及团支书选举系统开发
提交截止日期:2023年 月 日()
系统设计描述 (20%) | 大作业反思(30%) | 源程序及注释(40%) | 排版质量(10%) | 总分(100%) | 批阅人签字及批阅日期 |
|
|
|
|
|
|
本次实验报告打印与装订要求:A4双面打印。
实验目的:
- 掌握程序设计的基本算法和简单数据结构基础,能够综合运用基本控制语句、算法和数据结构,以及自顶向下、逐步求精的模块化设计方法,能够设计具有一定规模的系统级C语言程序,提高系统编程能力;
- 针对班级管理建设实际需要,根据所学程序设计知识使用恰当的算法和数据结构,完成计算、统计、排序、检索等相关的软件系统的设计、编码、测试。
实验要求:
- 掌握常用的程序调试和测试方法。
- 采用自顶向下、逐步求精的模块化设计思想设计一个班长及团支书选举系统。
- 报告要求解释①说明采用了什么数据结构和算法,②为什么选择这种数据结构或算法(系统设计描述),③系统实现过程中遇到了哪些问题,这些问题是如何解决的,还有什么问题尚未解决,今后打算从哪几个方面进行改进,④本设计的亮点和难点在哪里,实验结果如何,⑤有哪些收获和学习体会(大作业反思);
- 编写程序完成以下实验(大作业)内容并完成实验报告。
实验内容:
假设你所在的班级(班级人数最多30人)要进行班长和团支书选举,为此开发如下选举系统。
- 系统初始化
运行选举系统后,首先从键盘输入候选人数目m(3£m£8),然后屏幕显示提示信息“请输入第i个候选人姓名:”(i=1,2,…, m),并依次输入m个候选人姓名,将输入的m个候选人姓名存于字符串数组。其中,候选人姓名允许使用中文;
- 学生投票
系统在屏幕显示提示信息“请输入学号完成投票(输入-1结束):”,投票学生输入学号后,系统显示当前m个候选人的姓名及已得票数,已得票数显示方式形如:3/8,其中3表示得3票,8表示总共8名学生已投票;
系统在屏幕显示提示信息“请输入你选择的班长:”,完成班长输入(输入形式可采用姓名或候选人编号);
系统在屏幕显示提示信息“请输入你选择的团支书:”,完成团支书输入(输入形式可采用姓名或候选人编号);若团支书与该生已选择的班长是同一候选人,提示“你选择的团支书与班长不允许是同一人,请重新输入你选择的团支书:”,继续输入团支书;
系统在屏幕显示提示信息“你已完成投票,谢谢!”,然后再次显示“请输入学号完成投票(输入-1结束):”,重复上述过程,若输入的学号已投票,显示“该学号已完成投票!”,然后继续显示“请输入学号完成投票(输入-1结束):”;
若输入学号为-1,表示结束当前学生投票过程,进入(3)。
(3)投票结果显示
系统显示如下菜单:
- 显示投票学生人数和学号清单
完成投票学生人数和学号清单显示
- 显示候选人得票情况
显示格式形如:
共10人投票,
张三(班长得6票,团支书得1票)
李四(班长得3票,团支书得0票)
…
- 显示班长选举结果
按得票数由大至小显示班长各候选人的得票,形如:
班长:
张三(6/10)
李四 (3/10)
…
4.显示团支书选举结果
显示格式与3.类似
5.继续投票
再次进入(2)功能;
6.保存投票结果*(投票数据存于字符文件,此功能不要求必须实现)
①说明采用了什么数据结构和算法
// 结构体定义:候选人信息
struct Candidate {
char name[50];
int votesForChairman;
int votesForSecretary;
};
本实验在主函数内用case选择要进行的操作,各功能用不同函数实现
// 函数声明
void initializeSystem(); //系统初始化
void displayMenu();// 显示系统菜单
void vote(); // 学生投票
void displayCandidates(); // 显示候选人得票情况
void displayResults(const char* position, int maxCandidates); // 显示选举结果
void continueVoting(); // 继续投票
②系统实现过程中遇到了哪些问题,这些问题是如何解决的,还有什么问题尚未解决,今后打算从哪几个方面进行改进,
在本次设计中,学生投票部分,一开始要求的功能没有全部实现,不知道怎么处理投票重复,经过搜查解决了。未解决问题:学生投票可以投姓名也可以投候选人编号部分,只能进行编号投票,姓名投票未实现;保存投票结果此功能没有解决,运行结果只能在控制台界面。
改进方面:美化功能界面,候选人为3-8,不过本设计显示候选人后还会显示其他行,共8个,需要解决美化界面;解决上述投票时可以姓名也可以编号的问题;增加保存投票结果到文件的功能。
③本设计的亮点和难点在哪里,实验结果如何
本设计要求的功能基本实现,难点有学生投票功能的实现,较为复杂,要求较多,不过本部分要求已基本解决完成。实验结果符合预期,程序能正常运行,运行结果在报告最后有截图。
④有哪些收获和学习体会(大作业反思);
熟悉并掌握了自顶向下、逐步求精的模块化设计方法,能够设计具有一定规模的系统级C语言程序,提高系统编程能力,对本学期学习的内容有了进一步熟悉。
#include <stdio.h>
#include <string.h>
#define MAX_CANDIDATES 30
#define MAX_STUDENTS 30
// 结构体定义:候选人信息
struct Candidate {
char name[50];
int votesForChairman;
int votesForSecretary;
};
// 全局变量:候选人数组
struct Candidate candidates[MAX_CANDIDATES];
// 全局变量:已投票学生学号数组
int votedStudents[MAX_STUDENTS];
int votedStudentsCount = 0;
// 函数声明
void initializeSystem();
void displayMenu();// 显示系统菜单
void vote(); // 学生投票
void displayCandidates(); // 显示候选人得票情况
void displayResults(const char* position, int maxCandidates); // 显示选举结果
void continueVoting(); // 继续投票
int main() {
initializeSystem();
int option;
do {
displayMenu();
scanf("%d", &option);
switch (option) {
case 1:
// 显示投票学生人数和学号清单
printf("总共投票学生人数:%d\n", votedStudentsCount);
printf("已投票学生学号:");
for (int i = 0; i < votedStudentsCount; ++i) {
printf("%d ", votedStudents[i]);
}
printf("\n");
break;
case 2:
// 显示候选人得票情况
displayCandidates();
break;
case 3:
// 显示班长选举结果
displayResults("班长", MAX_CANDIDATES);
break;
case 4:
// 显示团支书选举结果
displayResults("团支书", MAX_CANDIDATES);
break;
case 5:
// 继续投票
continueVoting();
break;
case 6:
// 保存投票结果(此功能未实现)
printf("正在保存投票结果...(此版本未实现)\n");
break;
case 0:
// 退出系统
printf("退出系统。谢谢使用!\n");
break;
default:
printf("无效选项,请重试。\n");
}
} while (option != 0);
return 0;
}
// 系统初始化
void initializeSystem() {
printf("请输入候选人数目(3到8人):");
int numCandidates;
scanf("%d", &numCandidates);
if (numCandidates < 3 || numCandidates > 8) {
printf("无效的候选人数。正在退出系统。\n");
return;
}
printf("请输入候选人姓名:\n");
for (int i = 0; i < numCandidates; ++i) {
printf("请输入第 %d 个候选人姓名:", i + 1);
scanf("%s", candidates[i].name);
candidates[i].votesForChairman = 0;
candidates[i].votesForSecretary = 0;
}
}
// 显示系统菜单
void displayMenu() {
printf("\n选举系统菜单:\n");
printf("1. 显示投票学生人数和学号清单\n");
printf("2. 显示候选人得票情况\n");
printf("3. 显示班长选举结果\n");
printf("4. 显示团支书选举结果\n");
printf("5. 继续投票\n");
printf("6. 保存投票结果\n");
printf("0. 退出\n");
printf("请选择操作:");
}
// 学生投票
void vote() {
printf("请输入学号进行投票(输入-1结束):");
int studentID;
scanf("%d", &studentID);
while (studentID != -1) {
if (studentID < 1 || studentID > 30) {
printf("无效的学号。请重新输入有效的学号。\n");
} else {
// 检查学生是否已投票
int alreadyVoted = 0;
for (int i = 0; i < votedStudentsCount; ++i) {
if (votedStudents[i] == studentID) {
alreadyVoted = 1;
break;
}
}
if (alreadyVoted) {
printf("该学号已完成投票!\n");
} else {
// 显示候选人信息
printf("候选人信息:\n");
for (int i = 0; i < MAX_CANDIDATES; ++i) {
printf("%d. %s\n", i + 1, candidates[i].name);
}
// 选择班长
printf("请输入你选择的班长(可以输入姓名或候选人编号):");
int chairmanChoice;
scanf("%d", &chairmanChoice);
if (chairmanChoice < 1 || chairmanChoice > MAX_CANDIDATES) {
printf("班长选择无效。请重试。\n");
continue;
}
candidates[chairmanChoice - 1].votesForChairman++;
// 选择团支书
int secretaryChoice;
do {
printf("请输入你选择的团支书(可以输入姓名或候选人编号):");
scanf("%d", &secretaryChoice);
if (secretaryChoice < 1 || secretaryChoice > MAX_CANDIDATES) {
printf("团支书选择无效。请重试。\n");
} else if (secretaryChoice == chairmanChoice) {
printf("你选择的团支书不能和班长是同一人,请重新输入你选择的团支书:\n");
} else {
candidates[secretaryChoice - 1].votesForSecretary++;
break;
}
} while (1);
// 记录已投票学生
votedStudents[votedStudentsCount] = studentID;
votedStudentsCount++;
printf("你已完成投票,谢谢!\n");
}
}
printf("请输入学号进行投票(输入-1结束):");
scanf("%d", &studentID);
}
}
// 显示候选人得票情况
void displayCandidates() {
printf("候选人得票情况:\n");
for (int i = 0; i < MAX_CANDIDATES; ++i) {
printf("%s(班长得票:%d,团支书得票:%d)\n", candidates[i].name,
candidates[i].votesForChairman, candidates[i].votesForSecretary);
}
}
// 显示选举结果
void displayResults(const char* position, int maxCandidates) {
printf("%s选举结果:\n", position);
// 冒泡排序按得票数排序
for (int i = 0; i < maxCandidates - 1; ++i) {
for (int j = 0; j < maxCandidates - i - 1; ++j) {
int totalVotes1 = candidates[j].votesForChairman + candidates[j].votesForSecretary;
int totalVotes2 = candidates[j + 1].votesForChairman + candidates[j + 1].votesForSecretary;
if (totalVotes1 < totalVotes2) {
struct Candidate temp = candidates[j];
candidates[j] = candidates[j + 1];
candidates[j + 1] = temp;
}
}
}
// 显示排序后的结果
for (int i = 0; i < maxCandidates; ++i) {
printf("%s:%s(%d/%d)\n", position, candidates[i].name,
candidates[i].votesForChairman + candidates[i].votesForSecretary,
votedStudentsCount);
}
}
// 继续投票
void continueVoting() {
vote();
}