/*
=========
投票系统
=========
*/
//vote投票;elector候选人;voter投票人;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Vote
{
char name[64]; //指定多少个人参选,则就是定义一个结构体数组,人数固定,不能想输入几个人参选就几个人;
int tickets;
};
void initElector(struct Vote **p, int *electorNum) //二级指针,用来存放一级指针的地址,可以返回空类型,从而在地址上进行改变数值,不需要返回数值;
{
int i;
if (*p == NULL){
printf("请您输入参选的人数:\n");
scanf("%d", electorNum);
*p = (struct Vote *)malloc((*electorNum)*sizeof(struct Vote)); //因为需要外部输入多少个人,所以需要动态的分配内存;
}
for (i=0; i<*electorNum; i++){
printf("请您输入第%d位参选者的姓名:\n", i+1);
scanf("%s", (*p)->name);
(*p)++;
}
*p = *p-*electorNum;
printf("\n参加的选民基本信息如下所示:\n");
for (i=0; i<*electorNum; i++){
printf("第%d位参选人的名字:%s\n", i+1, (*p)->name);
(*p)++;
}
*p = *p-*electorNum;
}
int initVoter(struct Vote *q, int electorNum)
{
int i, j;
int mark; //标记,检测弃票错票;
int error = 0;
char tempname[64]; //定义数组来存放字符串;
int voterNum;
printf("\n请您输入投票的人数:\n");
scanf("%d", &voterNum);
for (i=0; i<voterNum; i++){
mark = 0; //要在for内部进行置0;
memset(tempname, '\0', sizeof(tempname)); //将临时名字内清0,每次都要输入新的名字;
printf("请第%d个人写下你想投票的名字:\n", i+1);
scanf("%s", tempname);
for (j=0; j<electorNum; j++){ //开始拿存放在临时名字内的名字与现有的名字进行比较,并且进行计次tickets,遍历len次,即参选人数;
if (strcmp(tempname, q->name) == 0){
(q->tickets)++;
mark = 1;
}
q++;
}
q = q-electorNum; //不能去掉,很重要!每次都要重头开始遍历比较;
if (mark == 0){
printf("此票作为弃票!\n");
error++;
}
}
return error;
}
void printResult(struct Vote *pp, int error, int electorNum)
{
int i;
struct Vote *max;
max = pp;
printf("\n");
for (i=0; i<electorNum; i++){
printf("名字:%s,票数:%d\n", pp->name, pp->tickets);
pp++;
}
pp = pp-electorNum; //不能去掉;为了下面pp->tickets的pp开始从第一个遍历;
printf("弃票数:%d\n", error);
for (i=0; i<electorNum; i++){
if (max->tickets < pp->tickets){
max = pp;
}
pp++;
}
printf("最终%s以%d票竞选成功\n", max->name, max->tickets);
}
int main()
{
int electorNum = 0; //定义一个候选(参选)人数;
struct Vote *elector = NULL; //结构体类型的指针变量,其内部也包含了结构体的所有变量;NULL指向空指针,防止悬挂;
int error = 0;
struct Vote **pelector = &elector; //二级指针,pelector存放的是elector的地址,则*pelector=(elector这个地址内存放的内容),而这个内容是NULL,所以*pelector=NULL;
//下面一行传地址就可以不用返回值,直接修改地址上的数据,均变化;
initElector(&elector, &electorNum); //函数功能:确定候选人数,姓名和年龄;将elector候选人传入函数内,在函数内部进行赋值,初始化候选人;
error = initVoter(elector, electorNum); //函数功能:确定投票人数以及唱票;
printResult(elector, error, electorNum); //函数功能:打印投票结果;
return 0;
}
//结果:
请您输入参选的人数:
3
请您输入第1位参选者的姓名:
aa
请您输入第2位参选者的姓名:
bb
请您输入第3位参选者的姓名:
cc
参加的选民基本信息如下所示:
第1位参选人的名字:aa
第2位参选人的名字:bb
第3位参选人的名字:cc
请您输入投票的人数:
5
请第1个人写下你想投票的名字:
aa
请第2个人写下你想投票的名字:
cc
请第3个人写下你想投票的名字:
bb
请第4个人写下你想投票的名字:
dd
此票作为弃票!
请第5个人写下你想投票的名字:
bb
名字:aa,票数:1
名字:bb,票数:2
名字:cc,票数:1
弃票数:1
最终bb以2票竞选成功
投票系统(结构体二级指针,数组,函数综合应用)
于 2023-04-14 16:56:42 首次发布