西南交大高级语言程序设计第二次实验报告-班长及团支书选举系统开发

高级语言程序设计第2次实验(大作业)报告

 

学号:*******         姓名:*******         专业: *******

课程代码:SCAI000812

实验(大作业)题目:班长及团支书选举系统开发

提交截止日期:2023年  月  日()                           

系统设计描述 (20%)

大作业反思(30%)

源程序及注释(40%)

排版质量(10%)

总分(100%)

批阅人签字及批阅日期

 

 

 

 

 

 

本次实验报告打印与装订要求:A4双面打印。

实验目的:

  1. 掌握程序设计的基本算法和简单数据结构基础,能够综合运用基本控制语句、算法和数据结构,以及自顶向下、逐步求精的模块化设计方法,能够设计具有一定规模的系统级C语言程序,提高系统编程能力;
  2. 针对班级管理建设实际需要,根据所学程序设计知识使用恰当的算法和数据结构,完成计算、统计、排序、检索等相关的软件系统的设计、编码、测试。

实验要求:

  1. 掌握常用的程序调试和测试方法。
  2. 采用自顶向下、逐步求精的模块化设计思想设计一个班长及团支书选举系统。
  3. 报告要求解释说明采用了什么数据结构和算法,为什么选择这种数据结构或算法(系统设计描述),系统实现过程中遇到了哪些问题,这些问题是如何解决的,还有什么问题尚未解决,今后打算从哪几个方面进行改进,本设计的亮点和难点在哪里,实验结果如何,有哪些收获和学习体会(大作业反思)
  4. 编写程序完成以下实验(大作业)内容并完成实验报告。

实验内容:

假设你所在的班级(班级人数最多30人)要进行班长和团支书选举,为此开发如下选举系统。

  1. 系统初始化

运行选举系统后,首先从键盘输入候选人数目m(3£m£8),然后屏幕显示提示信息“请输入第i个候选人姓名:”(i=1,2,…, m),并依次输入m个候选人姓名,将输入的m个候选人姓名存于字符串数组。其中,候选人姓名允许使用中文;

  1. 学生投票

系统在屏幕显示提示信息“请输入学号完成投票(输入-1结束):”,投票学生输入学号后,系统显示当前m个候选人的姓名及已得票数,已得票数显示方式形如:3/8,其中3表示得3票,8表示总共8名学生已投票;

系统在屏幕显示提示信息“请输入你选择的班长:”,完成班长输入(输入形式可采用姓名或候选人编号);

系统在屏幕显示提示信息“请输入你选择的团支书:”,完成团支书输入(输入形式可采用姓名或候选人编号);若团支书与该生已选择的班长是同一候选人,提示“你选择的团支书与班长不允许是同一人,请重新输入你选择的团支书:”,继续输入团支书;

系统在屏幕显示提示信息“你已完成投票,谢谢!”,然后再次显示“请输入学号完成投票(输入-1结束):”,重复上述过程,若输入的学号已投票,显示“该学号已完成投票!”,然后继续显示“请输入学号完成投票(输入-1结束):”;

若输入学号为-1,表示结束当前学生投票过程,进入(3)。

(3)投票结果显示

         系统显示如下菜单:

  1. 显示投票学生人数和学号清单

完成投票学生人数和学号清单显示

  1. 显示候选人得票情况

显示格式形如:

共10人投票,

张三(班长得6票,团支书得1票)

李四(班长得3票,团支书得0票)

  1. 显示班长选举结果

按得票数由大至小显示班长各候选人的得票,形如:

班长:

张三(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();

}

 

 

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2301_78980207

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值