C语言选民投票系统

提示:本文仅是对个人学习经历的一个记录

前言

作为一个小白,关于我的学习经历,我想在此做一个记录。

本文关于用C语言实现选民投票系统。

PS:目前作者在学习C语言结构体部分的内容,所以代码是基于C语言结构体部分知识编写的。


 一、结构体是什么?

        在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

看下面一段示例代码:

struct Student       //struct:告知系统是一个结构体
{                    //Student:结构体名称,编程习惯要大写开头
	int num;
	char name[];
	char sex;
	int age;         //成员列表
	double score;
	char sdd[32];
};                   //分号不能忘

 以上就是定义一个名称为Student的结构体,至于如何用可以参考后面的说明!

二、选民投票系统详解

        题目:有5个选民,3个候选者,每个选民只能投一票,投错姓名按弃票处理。 要求:编程输入候选者名单,记录每个候选者票数,选民弃票数,最后输出候选者成员名单,中选着姓名和票数。

        1、初始化候选者名单

        2、唱票环节,记录每位候选者票数,同时记录弃票数

        3、输出候选者及其票数列表

        4、投票结束,输出当选者结果

三、实现步骤

1、代码如下:

#include <stdio.h>
#include <string.h>

/*
    author: 		 nopd
	data: 			 2023.01.14
    funDescription:	 Ballot system  */

struct Candidate//候选者结构体
{
	char name[32];
	int tickrts;
};

int main()
{
	int i,j;
	int voter = 5;//记录选民人数
	char nameTmp[32];//用来临时记录选民选择的候选者姓名
	int abstain = 0;//记录弃票数
	int mark;//用于标记
    struct Candidate checked;//当选者
	struct Candidate list[3];//候选者列表
	int len = sizeof(list)/sizeof(list[0]);//计算候选者人数
	
	//初始化候选者
	for( i=0;i<len;i++){
		printf("请输入第%d个候选人姓名:\n",i+1);
		scanf("%s",list[i].name);
		list[i].tickrts = 0;//初始化候选者票数
	}
	
	//唱票环节
	for( j=0;j<5;j++){
		mark = 0;//先让标记等于0
		memset(nameTmp,'\0',sizeof(nameTmp));//每次使用后清空保存的姓名
		puts("请输入您所投人的姓名:");
		scanf("%s",nameTmp);
		for( i=0;i<len;i++){//记录选票
			if( strcmp(nameTmp,list[i].name)==0){
				list[i].tickrts++;
				mark = 1;//标记为1
			}
		}
		if( mark==0){//标记为0,也就是没变时,记录弃票数
			puts("没有此候选人,弃票!");
			abstain++;
		}
		
	}
	
	for( i=0;i<len;i++){//输出所有候选者及其票数
		printf("候选人 %s 共 %d 票。\n",list[i].name,list[i].tickrts);
	}
	
	checked = list[0];//先让当选者默认为第一个候选者
	for( i=0;i<len;i++){//比较选票更新checked
		if( checked.tickrts<list[i].tickrts){
			checked = list[i];
		}
	}
	//输出结果
	printf("本次投票共%d人投票,有效票数:%d 票,弃票数:%d 票。\n",voter,voter-abstain,abstain);
	printf("票数最高者是:%s ,共 %d 票,当选!!",checked.name,checked.tickrts);
	
	return 0;
}

2、运行结果:


 四、代码解析 

        代码很简单,注释也很详细,就不对代码流程进行解释了,这里对其中用到的一些知识点进行说明。

1、在C语言中struct用于创建一个结构体。struct 语句为程序定义了一个带有多个成员的新的数据类型。

struct Candidate//候选者结构体

2、 定义一个结构体变量checked,由于本文中checked用于指向结构体Candidate中的 tickrts,故这段代码可以简单看成 int checked,方便理解。

struct Candidate checked;//当选者

3、定义一个结构体变量 ,它与数值型数组几乎是一模一样的,只不过需要注意的是,结构体数组的每一个元素都是一个结构体类型的变量,都包含结构体中所有的成员项。定义结构体数组的方法很简单,同定义结构体变量是一样的,只不过将变量改成数组。或者说同普通数组的定义是一模一样的,如下:定义了一个结构体数组,共有 3个元素,每个元素都是一个结构体变量,都包含所有的结构体成员。

struct Candidate list[3];//候选者列表

4、sizeof( )的用法可以看我前一篇文章:C语言实现冒泡排序

int len = sizeof(list)/sizeof(list[0]);//计算候选者人数

 5、memset函数原型 void *memset(void *str, int c, size_t n);用法是:有三个参数,第1个参数是目标字符串,第2个参数是要替换成的字符,第3个参数是要替换的大小,也就是位数。没有返回值。总结就是可以把目标字符串的前多少位替换成选定的字符。这里是用于把临时存放名字的变量初始化。

memset(nameTmp,'\0',sizeof(nameTmp));//每次使用后清空保存的姓名

6、strcmp函数原型 intstrcmp(const char *s1,const char *s2);用法是:有两个参数,第1个参数是一个字符串,第2个参数也是一个字符串,如果s1 = s2,函数返回0,如果s1 < s2,函数返回 -1,如果s1 > s2,函数返回1;不过这个函数的源码是有问题的,至于是什么问题以后再说,感兴趣的同学可以自己去搜一搜这个函数的源码去看。这里是用于作为 if 语句成立的判断条件。

if( strcmp(nameTmp,list[i].name)==0)


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了基于C语言中结构体部分的知识实现选民投票。对我而言,这是我的第二篇文章,写的不是很好,我不是很满意,以后我会对其继续修改,让它能够实现更多的功能,流程更合理,结构更简单。如有错漏,望批评指正。让我们共同进步吧!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值