算法笔记:结构体

算法笔记:结构体

题目一

完成一个对候选人得票的统计程序。假设有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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值