C语言谭浩强第三版第十一章例题及课后题:结构体和共用体

 

eg11.2设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果(结构体数组应用)

/*
Li
Li
Fun
Zhang
Zhang
Fun
Li
Fun
Zhang
Li
*/

#include<stdio.h>
#include<string.h>

struct person{
	char name[20];
	int num;
};

void main(void){
	struct person a[3] = {"Li", 0, "Zhang", 0, "Fun", 0};
	int i, j;
	char s[20];
	
	printf("请依次输入得票的候选人:\n");
	for(i = 0; i < 10; i++){
		printf("No.%d:", i+1);
		gets(s);
		
		for(j = 0; j < 3; j++){
			if(strcmp(s, a[j].name) == 0){ //if(strcmp(s, a[i].name) == 0){
				a[j].num++; //a[i].num++;
				break;
			}
		}
		//printf("各个候选人的得票是:\n%s:%d\n%s:%d\n%s:%d\n\n", a[0].name, a[0].num, a[1].name, a[1].num, a[2].name, a[2].num);
	}
	printf("\n各个候选人的得票是:\n%s:%d\n%s:%d\n%s:%d\n\n", a[0].name, a[0].num, a[1].name, a[1].num, a[2].name, a[2].num);
} 

eg11.3指向结构体变量的指针的应用

这3种形式等价:

结构体变量.成员名

(*p).成员名

p->成员名

#include<stdio.h>
#include<string.h>

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

void main(void){
	struct student stu1;
	struct student *p;
	
	p = &stu1;
	
	stu1.num = 1001;
	strcpy(stu1.name, "Li Lin");
	stu1.sex = 'M';
	stu1.age = 18;
	
	printf("No	Name		sex	age\n");
	printf("%d	%s		%c	%d\n", stu1.num, stu1.name, stu1.sex, stu1.age);
	printf("%d	%s		%c	%d\n", (*p).num, (*p).name, (*p).sex, (*p).age);
	printf("%d	%s		%c	%d\n", p->num, p->name, p->sex, p->age);
}

eg11.4指向结构体数组元素的指针的应用

#include<stdio.h>
#include<string.h>

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

void main(void){
	struct student stu[3] = {1001, "安安", 'F', 18, 1002, "苏苏", 'M', 25, 1003, "鑫鑫", 'M', 19};
	struct student *p;
	
	
	printf("No	Name	sex	age\n");
	for(p = stu; p < stu+3; p++){
		printf("%d	%s	%c	%d\n", p->num, p->name, p->sex, p->age);	
	}
}

eg11.5用结构体变量作函数参数的应用

eg11.6用指向结构体的指针作函数参数

/*
有一个结构体变量stu,内含学生学号、姓名和3门课程的成绩。
要求在main函数中赋予值,在另一函数print中将它们输出。 
*/

 

#include<stdio.h>
#include<string.h>

struct student{
    int num;
    char name[20];
    float score[3];
};

 

void print(struct student  stu);

 

void print(struct student  stu){
    printf("%d\n%s\n%.2f\n%.2f\n%.2f\n", stu.num, stu.name, stu.score[0], stu.score[1], stu.score[2]);
    printf("\n");
}

void main(void){
    struct student  stu;
    
    stu.num = 12;
    strcpy(stu.name, "AnAn");
    stu.score[0] = 67.5;
    stu.score[1] = 89;
    stu.score[2] = 78.6;
    
    print(stu);

/*
有一个结构体变量stu,内含学生学号、姓名和3门课程的成绩。
要求在main函数中赋予值,在另一函数print中将它们输出。 
*/
//12 AnAn 67.5  89  99.4

 

#include<stdio.h>
#include<string.h>

struct student{
    int num;
    char name[20];
    float score[3];
};

void print(struct student  *p);

 

void print(struct student  *p){
    printf("%d\n%s\n%.2f\n%.2f\n%.2f\n", p->num, p->name, p->score[0], p->score[1], p->score[2]);
    printf("\n");
}

void main(void){
    struct student  stu;
    
    scanf("%d%s%f%f%f", &stu.num, stu.name, &stu.score[0], &stu.score[1], &stu.score[2]);
    
    printf("\n");    
    print(&stu);

值传递址传递
/*
有一个结构体变量stu,内含学生学号、姓名和3门课程的成绩。
要求在main函数中赋予值,在另一函数print中将它们输出。 
*/

#include<stdio.h>
#include<string.h>

struct student{
	int num;
	char name[20];
	float score[3];
};

void print(struct student  stu);

void print(struct student  stu){
	printf("%d\n%s\n%.2f\n%.2f\n%.2f\n", stu.num, stu.name, stu.score[0], stu.score[1], stu.score[2]);
	printf("\n");
}

void main(void){
	struct student  stu;
	
	stu.num = 12;
	strcpy(stu.name, "AnAn");
	stu.score[0] = 67.5;
	stu.score[1] = 89;
	stu.score[2] = 78.6;
	
	print(stu);
} 
/*
有一个结构体变量stu,内含学生学号、姓名和3门课程的成绩。
要求在main函数中赋予值,在另一函数print中将它们输出。 
*/
//12 AnAn 67.5  89  99.4

#include<stdio.h>
#include<string.h>

struct student{
	int num;
	char name[20];
	float score[3];
};

void print(struct student  *p);

void print(struct student  *p){
	printf("%d\n%s\n%.2f\n%.2f\n%.2f\n", p->num, p->name, p->score[0], p->score[1], p->score[2]);
	printf("\n");
}

void main(void){
	struct student  stu;
	
	scanf("%d%s%f%f%f", &stu.num, stu.name, &stu.score[0], &stu.score[1], &stu.score[2]);
	
	printf("\n");	
	print(&stu);
} 

11.1定义一个结构体变量(包括年月日)。计算该日在本年中是第几天

//同 8.18 
//2月,平年28天,闰年29天

/* 
#include<stdio.h>
typedef  unsigned  char    boolean;
#define TRUE    1
#define FALSE   0

typedef struct{
	int year;
	int month;
	int day;
}date;


boolean leapYear(int year);

boolean leapYear(int year){
	return (year%400==0 || (year%4==0 && year%100!=0));
}

void main(void){
	date d;
	int days = 0;
	
	printf("请输入年、月、日:");
	scanf("%d%d%d", &d.year, &d.month, &d.day);
		
	switch(d.month){
		case 12: days += 30;
		case 11: days += 31;
		case 10: days += 30 ;
		case 9: days += 31;
		case 8: days += 31;
		case 7: days += 30;
		case 6: days += 31;
		case 5: days += 30;
		case 4: days += 31;
		case 3: days += 28;
		case 2: days += 31;
		case 1: days += d.day;  break;		  
	}
	
	if(leapYear(d.year) == 1){
		printf("%d年是闰年\n", d.year);
		if(d.month > 2){
			days++;
		}		
	}else{
		printf("%d年不是闰年\n", d.year);
	}
	
	printf("%d月%d号是%d年中的第%d天\n", d.month, d.day, d.year, days);
} 
*/

#include<stdio.h>
typedef  unsigned  char    boolean;
#define TRUE    1
#define FALSE   0

typedef struct{
	int year;
	int month;
	int day;
}date;


boolean leapYear(int year);

boolean leapYear(int year){
	return (year%400==0 || (year%4==0 && year%100!=0));
}

void main(void){
	date d;
	int days = 0;
	int day_tab[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	int i;
	
	printf("请输入年、月、日:");
	scanf("%d%d%d", &d.year, &d.month, &d.day);
		
	for(i = 0; i < d.month-1; i++){
		days+=day_tab[i];
	}
	days+=d.day;
	
	if(leapYear(d.year) == 1){
		printf("%d年是闰年\n", d.year);
		if(d.month > 2){
			days++;
		}		
	}else{
		printf("%d年不是闰年\n", d.year);
	}
	
	printf("%d月%d号是%d年中的第%d天\n", d.month, d.day, d.year, days);
} 

11.2写一个函数,实现上题的计算

/*
11.2写一个函数,实现上题的计算
由主函数将年、月、日传递给days函数,计算后将日子数传回主函数输出 
*/

#include<stdio.h>
typedef  unsigned  char    boolean;
#define TRUE    1
#define FALSE   0

typedef struct{
	int year;
	int month;
	int day;
}date;


boolean leapYear(int year);
int dayS(date d);

int dayS(date d){
	int days = 0;
	int day_tab[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	int i;
	
	for(i = 0; i < d.month-1; i++){
		days+=day_tab[i];
	}
	days+=d.day;
	
	if(leapYear(d.year) == 1 && d.month > 2){
			days++;
	}
	
	return days;	
} 

boolean leapYear(int year){
	return (year%400==0 || (year%4==0 && year%100!=0));
}

void main(void){
	date d;
	
	printf("请输入年、月、日:");
	scanf("%d%d%d", &d.year, &d.month, &d.day);
			
	printf("%d月%d号是%d年中的第%d天\n", d.month, d.day, d.year, dayS(d));
} 

11.3编写一个函数printf,打印一个学生的成绩数组

/*
11.3编写一个函数printf,打印一个学生的成绩数组
该数组中有5个学生的数据记录,每个记录包括num、name、score[3],
用主函数输入这些记录,用print函数输出这些记录 
*/

/*
101 Li 90 79 89
102 Ma 97 90 68
103 Wang 77 70 78
104 Fun 67 89 56
105 Xue 87 65 69 
*/

#include<stdio.h>

#define   N    5

typedef struct{
	int num;
	char name[20];
	float score[3];
}student;

void print(student stu[], int n); //n表示总共有几个学生   

void print(student stu[], int n){
	int i;
	
	printf("\n学号	姓名	成绩1	成绩2	成绩3\n");
	for(i = 0; i < N; i++){
		printf("%-8d%-8s%-8.2f%-8.2f%-8.2f\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
	}
	
} 
 

void main(void){
	student stu[N];
	int i;
	
	printf("请输入学生记录(按学号、姓名、成绩1、成绩2、成绩3的顺序输入):\n");
	for(i = 0; i < N; i++){
		printf("第%d个学生:", i+1);
		scanf("%d%s%f%f%f", &stu[i].num, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
	}
	
	print(stu, N);	
} 

11.4在上题的基础上,编写一个input函数,用来输入5个学生的数据记录

/*
101 Li 90 79 89
102 Ma 97 90 68
103 Wang 77 70 78
104 Fun 67 89 56
105 Xue 87 65 69 
*/

#include<stdio.h>

#define   N    5

typedef struct{
	int num;
	char name[20];
	float score[3];
}student;

void input(student stu[], int n);
void print(student stu[], int n); //n表示总共有几个学生   

void print(student stu[], int n){
	int i;
	
	printf("\n学号	姓名	成绩1	成绩2	成绩3\n");
	for(i = 0; i < N; i++){
		printf("%-8d%-8s%-8.2f%-8.2f%-8.2f\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
	}
	
} 
 
void input(student stu[], int n){
	int i;
	
	printf("请输入学生记录(按学号、姓名、成绩1、成绩2、成绩3的顺序输入):\n");
	for(i = 0; i < n; i++){
		printf("第%d个学生:", i+1);
		scanf("%d%s%f%f%f", &stu[i].num, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
	}
	
}

void main(void){
	student stu[N];
	
	input(stu, N);
	print(stu, N);	
} 

11.5处理10个学生的数据,求总平均成绩等

/*
有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,
从键盘输入10个学生数据,要求输出3门课程总平均成绩,
以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数) 
*/

/*
101 Wang 93 89 87
102   Li 85 80 78 
103 Zhao 65 70 59
104   Ma 77 70 83
105  Han 70 67 60 
106 Zhang 99 97 95
107 Zhou 88 89 88
108 Chen 87 88 85
109 Yang 72 70 69
110 Liu 78 80 83
*/

#include<stdio.h>

#define   N    10

typedef struct{
	int num;
	char name[20];
	float score[3];
}student;

void input(student stu[], int n);
void print(student stu[], int n); //n表示总共有几个学生 
float totalAverage(student stu[], int n);
void printOneStudent(student stu[], int n, int num);
void maxScore(student stu[], int n);


void maxScore(student stu[], int n){
	int i, j;
	int imax = 0, jmax = 0;
	
	for(i = 0; i < n; i++){
		for(j = 0; j < 3; j++){
			if(stu[i].score[j] > stu[imax].score[jmax]){
				imax = i;
				jmax = j;
				//printf("imax=%d,jmax=%d\n", imax, jmax);
			}
		}
	}	
	
	printOneStudent(stu, n, stu[imax].num);
}

void printOneStudent(student stu[], int n, int num){
	float average = 0;
	int i, j;
	
	printf("学号	姓名	成绩1	成绩2	成绩3	平均分\n");	
	for(i = 0; i < n; i++){
		if(num == stu[i].num){
			for(j = 0; j < 3; j++){
				average += stu[i].score[j]/3;
			}
			printf("%-8d%-8s%-8.2f%-8.2f%-8.2f%-8.2f\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], average);
		}
	}	
}

float totalAverage(student stu[], int n){
	int i, j;
	float sum = 0;
	
	for(i = 0; i < n; i++){
		for(j = 0; j < 3; j++){
			sum+=stu[i].score[j];
		}
	}
	
	return sum/(3*n);
}  

void print(student stu[], int n){
	int i;
	
	printf("学号	姓名	成绩1	成绩2	成绩3\n");
	for(i = 0; i < N; i++){
		printf("%-8d%-8s%-8.2f%-8.2f%-8.2f\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
	}
	
} 
 
void input(student stu[], int n){
	int i;
	
	printf("(按学号、姓名、成绩1、成绩2、成绩3的顺序输入):\n");
	for(i = 0; i < n; i++){
		printf("第%2d个学生:", i+1);
		scanf("%d%s%f%f%f", &stu[i].num, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
	}
	
}

void main(void){
	student stu[N];
	
	printf("请输入学生记录");
	input(stu, N);
	
	printf("\n****学生记录****\n");
	print(stu, N);	
	
	printf("\n总平均成绩为:%.2f\n", totalAverage(stu, N));
	
	printf("\n****最高分的学生对应的数据记录****\n");
	maxScore(stu, N);
	 
} 

 

 

 

 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安安csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值