《C语言程序设计教程》第三版 习题七

目录

一、习题

7.3 职工数据包括:职工号、职工姓名、性别、年龄、工龄、工资、地址。(1)为其定义一个结构体变量。(2)对上述定义的变量,从键盘输入所需的具体数据,然后通过printf函数显示出来。(3)定义一个职工数据的结构体数组,从键盘输入每个结构体元素所需的数据,然后逐个输出这些元素的数据(为了简单起见,可设数组只有3个元素)。

7.4 设计一个用于人事管理的结构体。(1)每个人的数据包括:职工号、职工姓名、性别、出生日期。(2)性别和出生日期用位段表示。

7.5 有n个学生,每个学生的数据包括学号(num)、姓名(name[20])、性别(sex)、年龄(age)、三门课程成绩(score[3])。要求在m ain函数中输入学生的这几个数据,再调用一个函数count,在该函数中计算出每个学生的总分和平均分,然后打印出所有各项数据(包括原有的和新求解的)。

7.6 有4名学生,每个学生的属性包括学号、姓名、成绩,要求通过指针方法找出成绩最高者的姓名和成绩。

7.7 建立一个链表,每个结点所包含的成员为:职工号、工资。

(1)用malloc函数开辟新结点。要求链表包含5个结点,从键盘输入结点中的有效数据,然后把这些结点的数据打印出来。要求使用函数creat来建立函数,用list函数来输出数据。这5个职工的号码依次为0601、0603、 0605、 0607、 0609。

(2)在(1)的基础上,新增加一个职工的数据。这个新结点不放在最后,而是按职工号的顺序插入,新职工号为0606。编写一个函数insert来插入新结点。

(3)在(1)、(2)的基础上,编写一个函数delete,用来删除一个结点(按照所指定的职工号删除)。要求删除职工号为0606的结点。

7.8 有一个unsignedlong类型整数(4 B),想分别将前两个字节和后两个字节作为两个unsignedshort类型输出(各占2B)。

7.9 将4 个字符“拼”成一个long 型数,这4 个字符为“a”、“b”、“c”、“d”。编写一函数,把由这4个字符连续组成的4 B 内容作为一个longint型数输出。

7.11 口袋中有红、黄、兰、白、黑五种颜色的球若干,每次从口袋中取出3个球。问得到三种不同颜色球的可能选取方法,打印出三种颜色的各种组合(提示:用枚举类型)。

二、注意

2.1 声明枚举变量三种方法


一、习题

7.3 职工数据包括:职工号、职工姓名、性别、年龄、工龄、工资、地址。(1)为其定义一个结构体变量。(2)对上述定义的变量,从键盘输入所需的具体数据,然后通过printf函数显示出来。(3)定义一个职工数据的结构体数组,从键盘输入每个结构体元素所需的数据,然后逐个输出这些元素的数据(为了简单起见,可设数组只有3个元素)。

#include<stdio.h>
struct employee{
	char eno[20];
	char ena[20];
	char esex[2];
	int eage;
	int esalary;
	char eplace[20];
}e[3];

int main(){
	int i;
	for(i=0; i<3; i++)
		scanf("%s %s %s %d %d %s", 
			&e[i].eno, &e[i].ena, &e[i].esex, &e[i].eage, &e[i].esalary, &e[i].eplace);
	printf("编号\t姓名\t性别\t年龄\t工资\t地址\n");
	for(i=0; i<3; i++)
		printf("%s\t%s\t%s\t%d\t%d\t%s\n", 
			e[i].eno, e[i].ena, e[i].esex, e[i].eage, e[i].esalary, e[i].eplace);
	return 0;
}

7.4 设计一个用于人事管理的结构体。
(1)每个人的数据包括:职工号、职工姓名、性别、出生日期。
(2)性别和出生日期用位段表示。

struct date{
	unsigned int day : 5;
	unsigned int month : 4;
	unsigned int year : 15;
}
struct employee{
	char eno[20];
	char ena[20];
	unsigned int esex : 1;
	struct date ebirth;
};

7.5 有n个学生,每个学生的数据包括学号(num)、姓名(name[20])、性别(sex)、年龄(age)、三门课程成绩(score[3])。要求在m ain函数中输入学生的这几个数据,再调用一个函数count,在该函数中计算出每个学生的总分和平均分,然后打印出所有各项数据(包括原有的和新求解的)。

#include<stdio.h>
#define N 3
struct student{
	char num[20];
	char name[20];
	char sex[2];
	int age;
	float score[3];
	float sum;
	float avg;
}s[N];

//方法一:变量
//void count(struct student s){
//	int i;
//	s.sum = 0;
//	for(i=0; i<N; i++)
//		s.sum += s.score[i];
//	s.avg = s.sum / 3;
//	printf("%s\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n", 
//		s.num, s.name, s.sex, s.age, 
//		s.score[0], s.score[1], s.score[2], s.sum, s.avg);
//}
//int main(){
//	int i;
//	for(i=0; i<N; i++){
//		scanf("%s %s %s %d %f %f %f", 
//			&s[i].num, &s[i].name, &s[i].sex, &s[i].age, 
//			&s[i].score[0], &s[i].score[1], &s[i].score[2]);
//	}
//	printf("学号\t姓名\t性别\t年龄\t成绩1\t成绩2\t成绩3\t总分\t平均分\n");
//	for(i=0; i<N; i++){
//		count(s[i]);
//	}
//	return 0;
//}


//方法二:指针
void count(struct student *s){
	int i;
	s->sum = 0;
	for(i=0; i<N; i++)
		s->sum += s->score[i];
	s->avg = s->sum / 3;
	printf("%s\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n", 
		s->num, s->name, s->sex, s->age, 
		s->score[0], s->score[1], s->score[2], s->sum, s->avg);
}
int main(){
	struct student *p;
	for(p = s; p < s + N; p++){
		scanf("%s %s %s %d %f %f %f", 
			&p->num, &p->name, &p->sex, &p->age, 
			&p->score[0], &p->score[1], &p->score[2]);
	}
	printf("学号\t姓名\t性别\t年龄\t成绩1\t成绩2\t成绩3\t总分\t平均分\n");
	for(p = s; p < s + N; p++){
		count(p);
	}
	return 0;
}

7.6 有4名学生,每个学生的属性包括学号、姓名、成绩,要求通过指针方法找出成绩最高者的姓名和成绩。

#include<stdio.h>
#define N 4
struct student{
	char num[20];
	char name[20];
	float score;
}s[N];

int main(){
	struct student *p, *q;
	for(p = q = s; p < s + N; p++){
		scanf("%s %s %f", &p->num, &p->name, &p->score);
		if(p->score > q->score)
			q = p;
	}
	printf("姓名\t成绩\n");
	printf("%s\t%.1f\n", q->name, q->score);
	return 0;
}

7.7 建立一个链表,每个结点所包含的成员为:职工号、工资。

(1)用malloc函数开辟新结点。要求链表包含5个结点,从键盘输入结点中的有效数据,然后把这些结点的数据打印出来。要求使用函数creat来建立函数,用list函数来输出数据。这5个职工的号码依次为0601、0603、 0605、 0607、 0609。
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct employee{
	char num[20];
	float wage;
	struct employee *next;
};
struct employee *creat(int n){//创建一个有n个结点的链表
	int i;
	struct employee *head, *p, *q;
	if(n == 0) return NULL;//无结点
	for(i = 0; i < n; i++){
		p = (struct employee *)malloc(sizeof(struct employee));//建立第i个结点
		printf("输入第%d个职工的号码和工资:", i+1);
		scanf("%s %f", &p->num, &p->wage);
		if(i == 0) head = q = p;
		else{
			q->next = p;
			q = p;
		}
	}
	q->next = NULL;//尾结点
	return head;
}
void list(struct employee *p){//打印数据
	if(p == NULL){
		printf("没有职工数据!\n");
		return;
	}
	printf("职工号\t工资\n");
	while(p != NULL){
		printf("%s\t%.1f\n", p->num, p->wage);
		p = p->next;
	}
}

int main(){
	struct employee *head;
	head = creat(N);
	list(head);
	return 0;
}

(2)在(1)的基础上,新增加一个职工的数据。这个新结点不放在最后,而是按职工号的顺序插入,新职工号为0606。编写一个函数insert来插入新结点。
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct employee{
	char num[20];
	float wage;
	struct employee *next;
};
struct employee *creat(int n){//创建一个有n个结点的链表
	int i;
	struct employee *head, *p, *q;
	if(n == 0) return NULL;//无结点
	for(i = 0; i < n; i++){
		p = (struct employee *)malloc(sizeof(struct employee));//建立第i个结点
		printf("输入第%d个职工的号码和工资:", i+1);
		scanf("%s %f", &p->num, &p->wage);
		if(i == 0) head = q = p;
		else{
			q->next = p;
			q = p;
		}
	}
	q->next = NULL;//尾结点
	return head;
}
void list(struct employee *p){//打印数据
	if(p == NULL){
		printf("没有职工数据!\n");
		return;
	}
	printf("职工号\t工资\n");
	while(p != NULL){
		printf("%s\t%.1f\n", p->num, p->wage);
		p = p->next;
	}
}
struct employee *insert(struct employee *p){//在p指向的链表中插入结点
	int flag;
	struct employee *head, *p, *q, 
		*r = (struct employee *)malloc(sizeof(struct employee));
	printf("输入要插入职工的号码和工资:");
	scanf("%s %f", &r->num, &r->wage);
	for(head = p, q = r, flag = 0; p && r->num > p->num; q = p, p = p->next, flag = 1);
	q->next = r;
	r->next = p;
	return flag? head : q;//flag = 0 指表头处插入
}

int main(){
	struct employee *head;
	head = creat(N);
	list(head);
	head = insert(head);
	list(head);
	return 0;
}

(3)在(1)、(2)的基础上,编写一个函数delete,用来删除一个结点(按照所指定的职工号删除)。要求删除职工号为0606的结点。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 5
struct employee{
	char num[20];
	float wage;
	struct employee *next;
};
struct employee *creat(int n){//创建一个有n个结点的链表
	int i;
	struct employee *head, *p, *q;
	if(n == 0) return NULL;//无结点
	for(i = 0; i < n; i++){
		p = (struct employee *)malloc(sizeof(struct employee));//建立第i个结点
		printf("输入第%d个职工的号码和工资:", i+1);
		scanf("%s %f", &p->num, &p->wage);
		if(i == 0) head = q = p;
		else{
			q->next = p;
			q = p;
		}
	}
	q->next = NULL;//尾结点
	return head;
}
void list(struct employee *p){//打印数据
	if(p == NULL){
		printf("没有职工数据!\n");
		return;
	}
	printf("职工号\t工资\n");
	while(p != NULL){
		printf("%s\t%.1f\n", p->num, p->wage);
		p = p->next;
	}
}
struct employee *insert(struct employee *p){//在p指向的链表中插入结点
	int flag;
	struct employee *head, *p, *q, 
		*r = (struct employee *)malloc(sizeof(struct employee));
	printf("输入要插入职工的号码和工资:");
	scanf("%s %f", &r->num, &r->wage);
	for(head = p, q = r, flag = 0; p && r->num > p->num; q = p, p = p->next, flag = 1);
	q->next = r;
	r->next = p;
	return flag? head : q;//flag = 0 指表头处插入
}
struct employee *del(struct employee *p, char num[]){
	struct employee *q, *r;
	if(p == NULL){
		printf("没有职工数据!\n");
		return;
	}
	printf("输入要删除职工的号码:");
	scanf("%s", &q->num);
	for(q = p; q && strcmp(q->num, num) != 0; r = q, q = q->next);
	if(strcmp(q->num, num) == 0){
		if(q == p) p = q->next;
		else r->next = q->next;
		free(q);
		printf("记录已删除!\n");
	}
	else
		printf("未找到记录!\n");
	return p;
}

int main(){
	struct employee *head;
	char c[20];
	head = creat(N);
	list(head);
	head = insert(head);
	list(head);
	head = del(head, c);
	list(head);
	return 0;
}

7.8 有一个unsignedlong类型整数(4 B),想分别将前两个字节和后两个字节作为两个unsignedshort类型输出(各占2B)。

//联合体用于拆分
#include<stdio.h>
union longshort{
	unsigned long l;
	unsigned short s[2];
};
void convert(unsigned long l){
	union longshort ls;
	ls.l = l;
	printf("转换后的两个短整型为:%d,%d\n", ls.s[0], ls.s[1]);
}

int main(){
	unsigned long l;
	printf("输入长整型:");
	scanf("%ld", &l);
	convert(l);
	return 0;
}

7.9 将4 个字符“拼”成一个long 型数,这4 个字符为“a”、“b”、“c”、“d”。编写一函数,把由这4个字符连续组成的4 B 内容作为一个longint型数输出。

//联合体用于拼接
#include<stdio.h>
union charlong{
	char c[4];
	unsigned long l;
};
void convert(char ch[]){
	union charlong cl;
	int i;
	for(i = 0; i < 4; i++){
		cl.c[i] = ch[i];
	}
	printf("转换后的长整型为:%ld\n", cl.l);
}

int main(){
	char ch[4];
	int i;
	printf("输入四个字符:");
	for(i = 0; i < 4; i++){
		scanf("%c", &ch[i]);
	}
	convert(ch);
	return 0;
}

7.11 口袋中有红、黄、兰、白、黑五种颜色的球若干,每次从口袋中取出3个球。问得到三种不同颜色球的可能选取方法,打印出三种颜色的各种组合(提示:用枚举类型)。

#include<stdio.h>
enum ball{red, yellow, blue, white, black};

int main(){
	int i, j, k;
	int n = 0, temp, loop;
	for(i = red; i <= black; i++){
		for(j = red; j <= black; j++){
			if(i != j){
				for(k = red; k <= black; k++){
					if(k != i && k != j){
						n++;
						printf("第%-2d种:", n);
						for(loop = 1; loop <= 3; loop++){//三个球
							switch(loop){
							case 1: temp = i; break;
							case 2: temp = j; break;
							case 3: temp = k; break;
							default: break;
							}
							switch(temp){
							case red: printf("red\t"); break;
							case yellow: printf("yellow\t"); break;
							case blue: printf("blue\t"); break;
							case white: printf("white\t"); break;
							case black: printf("black\t"); break;
							default: break;
							}
						}
						printf("\n");
					}
				}
			}
		}
	}
	printf("\nTotal is : %d\n\n",n);
	return 0;
}

二、注意

2.1 声明枚举变量三种方法

声明枚举变量三种方法
1、先声明枚举类型后定义枚举类型变量
enum WeekdayType  
{  
    sun,mou,tue,wed,thu,fri,sat  
};  
enum WeekdayType today,yesterday,tomorrow;

2、声明枚举类型的同时定义枚举类型变量
enum WeekdayType  
{  
    sun,mou,tue,wed,thu,fri,sat   
}today,yesterday,tomorrow;

3、直接定义枚举类型变量
enum  
{  
    sun,mou,tue,wed,thu,fri,sat  
}today,yesterday,tomorrow;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值