提示:本文仅是对个人学习经历的一个记录
前言
作为一个小白,关于我的学习经历,我想在此做一个记录。
本文关于用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语言中结构体部分的知识实现选民投票。对我而言,这是我的第二篇文章,写的不是很好,我不是很满意,以后我会对其继续修改,让它能够实现更多的功能,流程更合理,结构更简单。如有错漏,望批评指正。让我们共同进步吧!!