全文目录
🍕2.8小节——C/C++快速入门->结构体(struct)
问题 A: C语言11.1
问题 B: C语言11.2
问题 C: C语言11.4
问题 D: C语言11.7
问题 E: C语言11.8
🥚2.10小节——C/C++快速入门->黑盒测试
问题 A: A+B 输入输出练习I
问题 B: A+B 输入输出练习II
问题 C: A+B 输入输出练习III
问题 D: A+B 输入输出练习IV
问题 E: A+B 输入输出练习V
问题 F: A+B 输入输出练习VI
问题 G: A+B 输入输出练习VII
问题 H: A+B 输入输出练习VIII
📑写在最后
🍕2.8小节——C/C++快速入门->结构体(struct)
地址合集: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
解题思路
每次读入进行比较,如果相等就加count就好了。注意字符串的比较需要strcmp()。
#include<cstdio> #include<cstring> struct person { char name[20]; int count; }leader[3] = {"Li", 0, "Zhang", 0, "Fun", 0}; int main(){ int n; char temp[10]; scanf("%d",&n); while(n--){ scanf("%s",temp); for(int i = 0;i < 3;i++) if(strcmp(leader[i].name,temp) == 0) leader[i].count++; } for(int i = 0;i < 3;i++) printf("%s:%d\n",leader[i].name,leader[i].count); return 0; }
问题 B: C语言11.2
题目描述
定义一个结构体student,存储学生的学号、名字、性别和年龄,读入每个学生的所有信息,保存在结构体中,并输出。结构体student的定义如下:
struct student {
int num;
char name[20];
char sex;
int age;
};
本题要求使用指向结构体数组的指针进行输入和输出。
输入
第一行有一个整数n,表示以下有n个学生的信息将会输入。保证n不大于20。
以后的n行中,每一行包含对应学生的学号、名字、性别和年龄,用空格隔开。保证每一个人名都不包含空格且长度不超过15,性别用M和F两个字符来表示。
输出
有n行,每行输出一个学生的学号、名字、性别和年龄,用空格隔开。
请注意行尾输出换行。
样例输入
3
10101 LiLin M 18
10102 ZhangFun M 19
10104 WangMin F 20
样例输出
10101 LiLin M 18
10102 ZhangFun M 19
10104 WangMin F 20
解题思路
很有意思,初始化的时候不能直接temp[n],必须要temp[15]才行0.0
#include<cstdio> #include<cstring> struct student { int num; char name[20]; char sex; int age; }; void scan(student *a){ scanf("%d %s %c %d",&a->num,a->name,&a->sex,&a->age); } void print(student *a){ printf("%d %s %c %d\n",a->num,a->name,a->sex,a->age); } int main(){ int n; student temp[15]; scanf("%d",&n); for(int i = 0;i < n;i++){ scan(&temp[i]); } for(int i = 0;i < n;i++){ print(temp + i); } return 0; }
问题 C: C语言11.4
题目描述
设有若干个人员的数据,其中包含学生和教师。学生的数据中包括:号码、姓名、性别、职业、班级。教师的数据包括:号码、姓名、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。现在要求把这些数据放在同一个表格中储存,使用结构体中的共用体实现。结构体定义如下:
struct {
int num;
char name[10];
char sex;
char job;
union {
int class;
char position[10];
}category;
};
在以上的结构体中,如果job项为s(学生),则第5项为class(班级);如果job项是t(教师),则第5项为position(职务)。
输入几个人员的数据,将其保存在以上包含共用体的结构体数组中,并输出。
输入
第一行有一个整数n,表示以下n行分别表示n个人员的数据。保证n不超过100。
之后的n行,每行有5项用空格隔开的内容。前4项分别为人员的号码(整数)、姓名(长度不超过9的无空格字符串)、性别(字符,m或f)和职业(字符,s或t)。如果第4项是s,则第5项为一个整数,表示班级;如果第4项是t,则第5项为一个长度不超过9的无空格字符串,表示职务。
输出
共有n行,与输入格式相同,输出读入的所有内容。
请注意行尾输出换行
样例输入
2
101 Li f s 501
102 Wang m t prof
样例输出
101 Li f s 501
102 Wang m t prof
解题思路
真坑。。。真滴坑。。。class是个关键字,所以不能直接使用需要改名。 然后结构体要有名字。共用体的使用没说 就这道题直接看看吧。
#include<cstdio> #include<cstring> struct member{ int num; char name[10]; char sex; char job; union { int asd; char position[10]; }category; }; void scan(member *a){ scanf("%d %s %c %c",&a->num,a->name,&a->sex,&a->job); if(a->job == 's') scanf("%d",&a->category.asd); else scanf("%s",a->category.position); } void print(member *a){ printf("%d %s %c %c ",a->num,a->name,a->sex,a->job); if(a->job == 's') printf("%d\n",a->category.asd); else printf("%s\n",a->category.position); } int main(){ int n; member temp[100]; scanf("%d",&n); for(int i = 0;i < n;i++){ scan(temp + i); } for(int i = 0;i < n;i++){ print(temp + i); } return 0; }