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: nopddata: 2023.01.14funDescription: 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;//先讓標記等于0memset(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++){//比較選票更新checkedif( 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語言中結構體部分的知識實現選民投票。對我而言,這是我的第二篇文章,寫的不是很好,我不是很滿意,以后我會對其繼續修改,讓它能夠實現更多的功能,流程更合理,結構更簡單。如有錯漏,望批評指正。讓我們共同進步吧!!
總結
- 上一篇: VR技术在教育中的应用:如何帮助学生更好
- 下一篇: IDEA快捷键200+分类汇总