算法笔记:结构体
题目一
完成一个对候选人得票的统计程序。假设有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每人的得票数。格式为首先输出人名,其后输出一个冒号,最后输出候选人的得票数。
请注意行尾输出换行。
代码
#include <stdio.h>
#include <string.h>
struct person {
char name[20];
int count;
}leader[3] = {"Li", 0, "Zhang", 0, "Fun", 0};
int main(){
int n;
char name[20];
scanf("%d",&n);
for(int i= 0;i< n ;i++){
scanf("%s",name);
for(int i =0;i<3;i++){
if(strcmp(name,leader[i].name) == 0){ // 比较字符串
leader[i].count += 1;
}
}
}
for(int i =0;i<3;i++){
printf("%s:%d\n",leader[i].name,leader[i].count);
}
return 0;
}
题目二
定义一个结构体student,存储学生的学号、名字、性别和年龄,读入每个学生的所有信息,保存在结构体中,并输出。结构体student的定义如下:
struct student {
int num;
char name[20];
char sex;
int age;
};
本题要求使用指向结构体数组的指针进行输入和输出。
输入
第一行有一个整数n,表示以下有n个学生的信息将会输入。保证n不大于20。
以后的n行中,每一行包含对应学生的学号、名字、性别和年龄,用空格隔开。保证每一个人名都不包含空格且长度不超过15,性别用M和F两个字符来表示。
输出
有n行,每行输出一个学生的学号、名字、性别和年龄,用空格隔开。
请注意行尾输出换行。
代码
#include <stdio.h>
struct student {
int num;
char name[20];
char sex;
int age;
};
int main(){
int n;
scanf("%d",&n);
struct student stu[n],*p;
// 记得加上 & 符号,字符串就不需要加,但是字符要加
for(p=stu;p<stu+n;p++){
scanf("%d %s %c %d",&p->num,p->name,&p->sex,&p->age);
}
for(p=stu;p<stu+n;p++){
printf("%d %s %c %d\n",p->num,p->name,p->sex,p->age);
}
return 0;
}
题目三
设有若干个人员的数据,其中包含学生和教师。学生的数据中包括:号码、姓名、性别、职业、班级。教师的数据包括:号码、姓名、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。现在要求把这些数据放在同一个表格中储存,使用结构体中的共用体实现。结构体定义如下:
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行,与输入格式相同,输出读入的所有内容。
请注意行尾输出换行。
代码
#include <stdio.h>
struct Person{
int num;
char name[10];
char sex;
char job;
union {
int classes;
char position[10];
}category;
};
int main(){
int n;
scanf("%d",&n);
struct Person person[n];
for(int i =0;i<n;i++){
scanf("%d %s %c %c",&person[i].num,person[i].name,&person[i].sex,&person[i].job);
if(person[i].job == 's'){
// 用category来引出union中的变量
scanf("%d",&person[i].category.classes);
}
else{
scanf("%s",person[i].category.position);
}
}
for(int i=0;i<n;i++){
if(person[i].job == 's'){
printf("%d %s %c %c %d\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.classes);
}
else{
printf("%d %s %c %c %s\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.position);
}
}
return 0;
}
题目四
编写两个函数input和print,分别用来输入5个学生的数据记录和打印这5个学生的记录。对于每一个学生,其记录包含了学号、名字、3门课程的成绩共5项。用主函数分别调用input和print函数进行输入和输出。
要求使用结构体数组实现,结构体中包括了每个学生的5项记录。
代码
#include <stdio.h>
struct student{
int num;
char name[20];
int grade[3];
};
void input(student stu[]){
for(int i=0;i<5;i++){
scanf("%d %s %d %d %d",&stu[i].num,stu[i].name,&stu[i].grade[0],&stu[i].grade[1],&stu[i].grade[2]);
}
}
void output(student stu){
printf("%d %s %d %d %d\n",stu.num,stu.name,stu.grade[0],stu.grade[1],stu.grade[2]);
}
struct student stu[5];
int main(){
input(stu);
for(int i =0;i<5;i++){
output(stu[i]);
}
return 0;
}
题目五
有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩。读入这10个学生的数据,要求输出3门课程的总平均成绩,以及个人平均分最高的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。
输出
第一行包含了3个实数,分别表示3门课程的总平均成绩,保留2位小数,每个数之后输出一个空格。
第二行输出个人平均分最高的学生的数据,与输入数据格式相同。如果有多位个人平均分最高的学生,输出按照输入顺序第一个最高分的学生数据。
请注意行尾输出换行。
代码
#include<stdio.h>
struct Student{
int num;
char name[20];
int score[3];
};
//输入
void input(struct Student stu[]){
for(int i=0;i<10;i++){
scanf("%d",&stu[i].num);
scanf("%s",stu[i].name);
for(int j=0;j<3;j++){
scanf("%d",&stu[i].score[j]);
}
}
}
void print(struct Student stu[]){
double sum[3],sum2[10]={0};
for(int j=0;j<3;j++){
sum[j]=0;
for(int i=0;i<10;i++){
sum[j]=sum[j]+stu[i].score[j];
}
printf("%.2f ",sum[j]/10);
}
printf("\n");
for(int i=0;i<10;i++){
for(int j=0;j<3;j++){
sum2[i]=sum2[i]+stu[i].score[j];
}
}
int max=sum2[0],q;
for(int i=1;i<10;i++){
if(max<sum2[i]){
max=sum2[i];
q=i;
}
}
printf("%d %s %d %d %d\n",stu[q].num,stu[q].name,stu[q].score[0],stu[q].score[1],stu[q].score[2]);
}
int main(){
struct Student stu[10];
input(stu);
print(stu);
return 0;
}