《算法笔记》2.8小节——C/C++快速入门->结构体(struct)的使用 问题 A: C语言11.1

225 阅读3分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

《算法笔记》2.8小节——C/C++快速入门->结构体(struct)的使用 问题 A: C语言11.1

题目描述

完成一个对候选人得票的统计程序。假设有3个候选人,名字分别为Li,Zhang和Fun。使用结构体存储每一个候选人的名字和得票数。记录每一张选票的得票人名,输出每个候选人最终的得票数。结构体可以定义成如下的格式: struct person { char name[20]; int count; }leader[3] = {“Li”, 0, “Zhang”, 0, “Fun”, 0};

输入

第一行有一个整数n,表示以下有n张选票信息将会输入。保证n不大于100。 以后的n行中,每一行包含一个人名,为选票的得票人。保证每一个人名都是Li,Zhang和Fun中的某一个。

输出

有三行,分别为Li,Zhang和Fun每人的得票数。格式为首先输出人名,其后输出一个冒号,最后输出候选人的得票数。 请注意行尾输出换行。

样例输入

10
Li
Li
Fun
Zhang
Zhang
Fun
Li
Fun
Zhang
Li

样例输出

Li:4
Zhang:3
Fun:3

示例代码

#include<iostream>
#include<string.h>
using namespace std;
int main(){
	struct person {
    char name[20];
    int count;
	}leader[3] = {"Li", 0,"Zhang",0,"Fun",0};
	int n;
	scanf("%d",&n);
	char a[10]; 
	for(int i=0;i<n;i++){
		scanf("%s",&a);
		for(int j=0;j<3;j++){
			if(strcmp(leader[j].name,a)==0){
				leader[j].count++;
			} 
		}	
	}
	for(int j=0;j<3;j++){
		printf("%s:%d",leader[j].name,leader[j].count);
		printf("\n");
	}
	return 0;
} 

借鉴代码

#include<stdio.h> 
#include<string.h>
int main()
{
    struct person {
    char name[20];
    int count;
    }leader[3] = {"Li",0,"Zhang",0,"Fun",0};

    int n;
    scanf("%d",&n) ;

    char a[20];
    for(int i=0;i<n;i++){
        scanf("%s",&a);//此处若写成 gets(a); 上一句for的条件就得变成 i<=n; 还没明白为啥
        for(int j=0;j<3;j++){
            if(!strcmp(a,leader[j].name)) leader[j].count++;
        }
    }

    for(int i=0;i<3;i++){
        printf("%s:%d\n",leader[i].name,leader[i].count);
    }

    return 0;
 } 

结构体有关知识

结构体的定义

只有先完成结构体的定义,才能声明并使用结构体变量,正如只有确定了名片上要印什么内容,才能开始印刷名片。结构体的定义即是为了说明结构体变量要存储什么信息的过程。

C语言提供了关键字struct来定义一个结构,一般形式的结构定义为:


struct 
结构名称                                                   /*
也称结构标识*/
{
存储数据列表;                                         /*
也称成员变量列表*/
}
;

注意 在定义结构时,一定不要忘记花括号后的分号,因为结构的定义是一条完整的语句,否则编译器会报错。

举例来说。


struct person
{
        char name[20];
        int age;
        char email[50];
};

上述代码定义了一个结构person,这相当于将name、age和email这3个数据打包,统一管理,这样,person可以像int、double型变量一样。利用person声明person类型的结构体变量,每个person型结构体变量都包括name、age和email这3个数据成员。 声明结构体变量

以上面的person结构为例,定义完毕后,person就可以看成是一种类型,可以通过以下形式声明结构体变量zhangsan。


struct person zhangsan
;

注意区分person和zhangsan。person只是结构体定义,是种规范说明,编译器并不为其分配内存空间。而zhangsan是实实在在的结构体变量,占据一定的内存空间。

在定义结构体的同时也可以完成一个或多个结构体变量的声明。举例来说。


struct person
{
        char name[20];
        int age;
        char email[50];
}zhangsan
,lisi
,wangwu
,*zhaoliu;

上述代码在定义结构体person的同时,一口气声明了3个结构体变量:zhangsan,lisi,wangwu,甚至还声明了一个指向person结构的指针zhaoliu。