统计选票练习题

 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 }
原文地址:https://www.cnblogs.com/wangchaomahan/p/9597844.html