Codeup《算法笔记》2.8结构体的使用-嵌套结构体,最大值,指针

问题 A: C语言11.1

[命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 32 MB

题目描述
完成一个对候选人得票的统计程序。假设有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每人的得票数。格式为首先输出人名,其后输出一个冒号,最后输出候选人的得票数。
请注意行尾输出换行。
样例输入 Copy
10
Li
Li
Fun
Zhang
Zhang
Fun
Li
Fun
Zhang
Li
样例输出 Copy
Li:4
Zhang:3
Fun:3

#include<bits/stdc++.h>
using namespace std;

struct person{
    
    
	char name[20];
	int count;
}leader[3]={
    
    "Li",0,"Zhang",0,"Fun",0};

int main(){
    
    
	int n; 
	//输入n 
	cin>>n;
	//存放name 
	char temp[20];
	for(int i = 0; i <= n; i++){
    
    
		//输入字符串!!!!用gets要i<=10 
		//gets(a)以回车判断结束,所以输入10之后的换行被读进去了,导致最后会少读一个数,而需要多走一次循环。
		gets(temp);
		//与三个name值依次比较
		for(int j = 0; j < 3; j++){
    
    
			if(strcmp(temp,leader[j].name)==0){
    
    
				leader[j].count++;
			}
		} 
	}
	//输出
	for(int i = 0; i < 3; i++){
    
    
//错误写法:  printf(leader[i].name,":",leader[i].count);
		printf("%s:%d\n",leader[i].name,leader[i].count);
	
	} 
	return 0;
} 

注意:

	1.设置一个数组,存放三组数据:leader[3]={"Li",0,"Zhang",0,"Fun",0};名字有对应0,1,2;count有对应0,1,2。
	2.gets(a)以回车判断结束,所以输入10之后的换行被读进去了,导致最后会少读一个数,而需要多走一次循环。
	要用scanf("%s",&a),就不用多一次循环了。
	3.char temp[20];事先设置存放接收字符串的数组。

问题 B: C语言11.2

[命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 32 MB

题目描述
定义一个结构体student,存储学生的学号、名字、性别和年龄,读入每个学生的所有信息,保存在结构体中,并输出。结构体student的定义如下:
struct student {
int num;
char name[20];
char sex;
int age; }; 本题要求使用指向结构体数组的指针进行输入和输出。

输入 第一行有一个整数n,表示以下有n个学生的信息将会输入。保证n不大于20。
以后的n行中,每一行包含对应学生的学号、名字、性别和年龄,用空格隔开。保证每一个人名都不包含空格且长度不超过15,性别用M和F两个字符来表示。

输出 有n行,每行输出一个学生的学号、名字、性别和年龄,用空格隔开。 请注意行尾输出换行。

样例输入 Copy
3
10101 LiLin M 18
10102 ZhangFun M 19
10104 WangMin F 20
样例输出 Copy
10101 LiLin M 18
10102 ZhangFun M 19
10104 WangMin F 20

方法1:

	使用数组,stu[i].num的方式
#include<bits/stdc++.h>
using namespace std;

struct student {
    
    
	int num;
	char name[20];
	char sex;
	int age;	
}stu[30];

int main(){
    
    
	int n;
	scanf("%d",&n);
	
	for(int i = 0; i < n; i++){
    
    
		cin>>stu[i].num>>stu[i].name>>stu[i].sex>>stu[i].age;
	}
	for(int i = 0; i < n; i++){
    
    
		cout<<stu[i].num<<" "<<stu[i].name<<" "<<stu[i].sex<<" "<<stu[i].age<<endl;
	}
	return 0;
} 

方法2:

	使用指针=数组地址的方法 ,p++
#include<bits/stdc++.h>
using namespace std;

struct student {
    
    
	int num;
	char name[20];
	char sex;
	int age;
}*p,stu[30];

int main(){
    
    
	int n;
	scanf("%d",&n);
	p=stu;//设置p是指向stu地址的
	
	for(int i = 0; i < n; i++){
    
    
		cin>>p->num>>p->name>>p->sex>>p->age;
		p++;//在i++中,使用p++,p->next不正确 
	} 

	p=p-n;//经过循环,p已经改变了,要回到起始位置。 

	for(int i = 0; i < n; i++){
    
    
		cout<<p->num<<" "<<p->name<<" "<<p->sex<<" "<<p->age<<endl; 
		p++;
	}
	return 0;
}

方法3:

#include<bits/stdc++.h>
using namespace std;

struct student {
    
    
	int num;
	char name[20];
	char sex;
	int age;
	student* next;//next是自己定义的,C++中本身不存在next 
};

int main(){
    
    
	int n; 
	scanf("%d",&n);
	student* head = new student;//重新创建了一个对象 
	cin>>head->num>>head->name>>head->sex>>head->age;//输入第一个人 
	head->next=NULL;//大写NULL!设置下一个人暂时为空 
	student *p = head;//为头部指针 ,定义结构体,=head 
	for(int i = 1; i < n; i++){
    
    //循环n-1次 
		student *t = new student;//下一部分的指针 
		cin>>t->num>>t->name>>t->sex>>t->age;//输入下一个人的信息 
		t->next=NULL;
		p->next=t;
		p=p->next;
	}
	for(p=head; p!=NULL; p=p->next){
    
    
		cout<<p->num<<" "<<p->name<<" "<<p->sex<<" "<<p->age<<endl;
	}
	return 0;
}

问题 C: C语言11.4

[命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 32 MB

题目描述
设有若干个人员的数据,其中包含学生和教师。学生的数据中包括:号码、姓名、性别、职业、班级。教师的数据包括:号码、姓名、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。现在要求把这些数据放在同一个表格中储存,使用结构体中的共用体实现。结构体定义如下:
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行,与输入格式相同,输出读入的所有内容。 请注意行尾输出换行。

样例输入 Copy
2
101 Li f s 501
102 Wang m t prof

样例输出	Copy
101 Li f s 501
102 Wang m t prof

思路:

	在总的结构体里嵌套一个结构体,供选择使用一个;要给用户输入的类型做一个判断,用int还是char数组来存储。即要根据输入的类型来选择存储类型。
#include<bits/stdc++.h>
using namespace std;

struct {
    
    
	int num;
	char name[10];
	char sex;
	char job;
	union {
    
    
		int Class;
		char position[10];
	}category;
}a[105]; 

int main(){
    
    
	int n;
	scanf("%d",&n);
	
	for(int i = 0; i < n; i++){
    
    
		cin>>a[i].num>>a[i].name>>a[i].sex>>a[i].job;
		if(a[i].job=='s'){
    
    
			cin>>a[i].category.Class;
		}
		else if(a[i].job=='t'){
    
    
			cin>>a[i].category.position;
		}
	} 
	for(int i = 0; i < n; i++){
    
    
		cout<<a[i].num<<" "<<a[i].name<<" "<<a[i].sex<<" "<<a[i].job;
		if(a[i].job=='s'){
    
    
			cout<<a[i].category.Class<<endl;
		}
		else if(a[i].job=='t'){
    
    
			cout<<a[i].category.position<<endl;
		}
		
	}
	return 0;
}
	第二种:也可将所有的category去掉。a[i].category.position--->a[i].position

问题 D: C语言11.7

[命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 32 MB

题目描述
编写两个函数input和print,分别用来输入5个学生的数据记录和打印这5个学生的记录。对于每一个学生,其记录包含了学号、名字、3门课程的成绩共5项。用主函数分别调用input和print函数进行输入和输出。

要求使用结构体数组实现,结构体中包括了每个学生的5项记录。

输入 共有5行,每行包含了一个学生的学号(整数)、名字(长度不超过19的无空格字符串)和3门课程的成绩(0至100之间的整数),用空格隔开。

输出 与输入格式相同,每行输出一个学生的所有记录。 请注意行尾输出换行。

样例输入 Copy
101 AAA 80 81 82
102 BBB 83 84 85
103 CCC 86 87 88
104 DDD 89 90 91
105 EEE 92 93 94
样例输出	Copy
101 AAA 80 81 82
102 BBB 83 84 85
103 CCC 86 87 88
104 DDD 89 90 91
105 EEE 92 93 94
#include<bits/stdc++.h> 
using namespace std;

struct student{
    
    
	int num;
	char name[20];
	int score1;
	int score2;
	int score3;
}stu[5];

void input (){
    
    
	for(int i = 0; i < 5; i++){
    
    
		cin>>stu[i].num>>stu[i].name>>stu[i].score1>>stu[i].score2>>stu[i].score3;
	} 
}

void print(){
    
    
	for(int i = 0; i < 5; i++){
    
    
		cout<<stu[i].num<<" "<<stu[i].name<<" "<<stu[i].score1<<" "<<stu[i].score2<<" "<<stu[i].score3<<endl;
	}
}
int main(){
    
    
	input();
	print();
	return 0;
}

问题 E: C语言11.8

[命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 32 MB

题目描述
有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩。读入这10个学生的数据,要求输出3门课程的总平均成绩,以及个人平均分最高的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。

输入
共有10行,每行包含了一个学生的学号(整数)、名字(长度不超过19的无空格字符串)和3门课程的成绩(0至100之间的整数),用空格隔开。

输出 第一行包含了3个实数,分别表示3门课程的总平均成绩,保留2位小数,每个数之后输出一个空格。
第二行输出个人平均分最高的学生的数据,与输入数据格式相同。如果有多位个人平均分最高的学生,输出按照输入顺序第一个最高分的学生数据。
请注意行尾输出换行。

样例输入 Copy
101 AAA 80 81 82
102 BBB 83 84 85
103 CCC 86 87 88
104 DDD 89 90 91
105 EEE 92 93 94
106 FFF 80 90 100
107 GGG 85 90 95
108 HHH 80 85 90
109 III 90 91 92
110 JJJ 91 88 87
样例输出	Copy
85.60 87.90 90.40 
105 EEE 92 93 94
#include<bits/stdc++.h>
using namespace std;

struct student {
    
    
	int num;
	char name[20];
	int score1;
	int score2;
	int score3;
}stu[10];

int main(){
    
    
	for(int i = 0; i < 10; i++){
    
    
		cin>>stu[i].num>>stu[i].name>>stu[i].score1>>stu[i].score2>>stu[i].score3;
	}
	double avg1;
	double avg2;
	double avg3;
	int sum1 = 0;
	int sum2 = 0;
	int sum3 = 0;
	double avg[10];
	for(int i = 0; i < 10; i++){
    
    
		sum1+=stu[i].score1;
		sum2+=stu[i].score2;
		sum3+=stu[i].score3;
		
		avg[i]=(double)(stu[i].score1+stu[i].score2+stu[i].score3)/(double)3;
	}
	avg1=double(sum1)/double(10);
	avg2=double(sum2)/double(10);
	avg3=double(sum3)/double(10);
//	printf("%.2f %.2f %.2f\n",avg1,avg2,avg3);
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<avg1<<" ";
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<avg2<<" ";
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<avg3<<endl;
	
	double max=0;
	int num;
	for(int i = 0; i < 10; i++){
    
    
		if(avg[i]>max){
    
    
			max=avg[i];
			num = i;
		}
	}
	printf("%d %s %d %d %d",stu[num].num,stu[num].name,stu[num].score1,stu[num].score2,stu[num].score3);
	
	return 0;
}

注意:

	1.保留两位小数:
		①printf("%.2f %.2f %.2f\n",avg1,avg2,avg3);
		②cout<<setiosflags(ios::fixed)<<setprecision(2)<<avg1;
	2.寻找数组最大数,以及输出最大数的相关信息:设置存储下标的变量num!
		for(int i = 0; i < 10; i++){
		if(avg[i]>max){
			max=avg[i];
			num = i;
		}
	}
	3.char数组的输入输出都是"%s";double输入"%lf",输出"%f"

猜你喜欢

转载自blog.csdn.net/weixin_44926962/article/details/109493713