1 # include <stdio.h> 2 # include <string.h> 3 /* 4 题目:3个候选人,每个选民只能投票选一人,要求编写一个统计选票的程序,先后输入被选人的名字,最后输出各人得票的结果 5 解题思路:每个候选人的名字和得票 组成一个结构体变量。3个候选人就需要一个结构体数组。定义一个结构体数组arr,每个元素中的得票初始化为0. 6 投票输入候选人名字,候选人的得票+1,一直循环,直至投票结束。最后输出候选人的姓名和得票的结果。用for循环来解决这个问题 7 程序编写:..... 8 2018年3月23日(星期五) 9 */ 10 # define N 3 //一共有3个候选人 11 # define J 4 //一共有4个选民,每人投一张选票 12 void input(struct student * arr); 13 void input1(char (*p)[20]); 14 void input2(struct student * arr,char (* arr1)[20]); 15 struct student //声明结构体 16 { 17 char name[20];//名字 18 int conut; //得票数 19 }; 20 21 int main(void) 22 { 23 struct student arr[N]; //定义结构体数组arr 24 25 struct student * p = arr; // 定义一个struct student 指针p 使p指向arr数组的首元素地址。 26 27 char arr1[J][20]; 28 29 // char (*p1)[J] = &arr1; 30 31 input(p); //调用input 函数初始化3个候选人的信息。 32 printf("华丽***********************分割线 "); 33 input1(arr1); //调用inptu1 函数来初始化10张选票的信息 34 input2(p,arr1); //调用input2 函数计算选票,然后输出每个候选人的信息 35 36 return 0; 37 } 38 39 void input(struct student * arr) 40 { 41 42 int i = 0; 43 do 44 { 45 printf("请输入备选人的信息 姓名 初始票数 "); 46 scanf("%s%d",arr[i].name,&arr[i].conut); 47 ++i; 48 } 49 while(i < N); 50 } 51 52 void input1(char (*p)[20]) 53 { 54 int i = 0; 55 do 56 { 57 printf("请输入%d张选票的信息 姓名 ",J); 58 scanf("%s",p+i); 59 ++i; 60 } 61 while(i < J); 62 } 63 64 void input2(struct student * arr,char (* arr1)[20]) 65 { 66 int i,j; 67 for(i = 0;i < J;++i) 68 { 69 for(j = 0;j < N;++j) 70 { 71 if(strcmp(*(arr1+i),arr[j].name) == 0)//写成:if(strcmp(arr1+i,arr[j].name) == 0) 是错误的,arr1 是个二级指针,虽然地址相同但类型不同 72 arr[j].conut++; //必须降低维度,使指针指向里层首元素的首地址,即要将二级指针转化成一级指针才能正确的打印字符串 73 } 74 75 } 76 for(i = 0;i < N;++i) 77 { 78 printf("%s %d票 ",arr[i].name,arr[i].conut); 79 } 80 }