明解C语言入门篇_第12章_结构体

前言

本文为业余学习《明解C语言入门篇》的记录,包含代码清单和练习题。
开始学习时间:2022年8月21日
+++++++++++++++++++++++++++++++
第1章 初识C语言
第2章 运算和数据类型
第3章 分支结构程序
第4章 程序的循环控制
第5章 数组
第6章 函数
第7章 基本数据类型
第8章 动手编写各种程序吧
第9章 字符串的基本知识
第10章 指针
第11章 字符串和指针
第12章 结构体
第13章 文件处理
+++++++++++++++++++++++++++++++

第12章 结构体

12-1 结构体

代码清单 12-1

//对5名学生的“姓名和身高”按身高进行升序排列

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

#define NUMBER 5
#define NAME_LEN 64

void swap_int(int *x,int *y);
void swap_str(char *sx,char *sy);
void sort(int num[],char str[][NAME_LEN],int n);

int main()
{
	char name[][NAME_LEN]={"Sato","Sanaka","Takao","Mike","Masaki"};
	int height[]={178,175,173,165,179};
	int i;

	for(i=0;i<NUMBER;i++)
	{
		printf("%2d :%-8s%4d\n",i+1,name[i],height[i]);
	}

	sort(height,name,NUMBER);

	puts("\n按身高进行升序排列");
	for(i=0;i<NUMBER;i++)
	{
		printf("%2d :%-8s%4d\n",i+1,name[i],height[i]);
	}

	return 0;
}

void swap_int(int *x,int *y)
{
	int temp=*x;
	*x=*y;
	*y=temp;
}

void swap_str(char *sx,char *sy)
{
	char temp[NAME_LEN];
	strcpy(temp,sx);
	strcpy(sx,sy);
	strcpy(sy,temp);
}

void sort(int num[],char str[][NAME_LEN],int n)
{
	int i,j;

	for(i=0;i<n-1;i++)
	{
		for(j=n-1;j>i;j--)
		{
			if(num[j-1]>num[j])
			{
				swap_int(&num[j-1],&num[j]);
				swap_str(str[j-1],str[j]);
			}
		}
	}
}

代码清单 12-2

//用表示学生的结构体来显示佐中的信息

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

#define NAME_LEN 64

struct student
{
	char name[NAME_LEN];
	int height;
	float weight;
	long schols;
};

int main()
{
	struct student sanaka;

	strcpy(sanaka.name,"Sanaka");
	sanaka.height=175;
	sanaka.weight=62.5;
	sanaka.schols=73000;

	printf("姓名 = %s\n",sanaka.name);
	printf("身高 = %d\n",sanaka.height);
	printf("体重 = %.1f\n",sanaka.weight);
	printf("奖学金 = %ld\n",sanaka.schols);

	return 0;
}

代码清单 12-3

//用表示学生的结构体来显示高尾的信息

#include <stdio.h>

#define NAME_LEN 64

struct student
{
	char name[NAME_LEN];
	int height;
	float weight;
	long schols;
};

int main()
{
	struct student takao={"Takao",173,86.2};

	printf("姓名 = %s\n",takao.name);
	printf("身高 = %d\n",takao.height);
	printf("体重 = %.1f\n",takao.weight);
	printf("奖学金 = %ld\n",takao.schols);

	return 0;
}

练习 12-1

//在代码清单12-3的基础上,编写显示对象takao各成员地址的程序

#include <stdio.h>

#define NAME_LEN 64

struct student
{
	char name[NAME_LEN];
	int height;
	float weight;
	long schols;
};

int main()
{
	struct student takao={"Takao",173,86.2};

	printf("姓名   = %-6s\t地址:%p\n",takao.name,takao.name);
	printf("身高   = %d\t地址:%p\n",takao.height,&takao.height);
	printf("体重   = %.1f\t地址:%p\n",takao.weight,&takao.weight);
	printf("奖学金 = %ld\t地址:%p\n",takao.schols,&takao.schols);

	return 0;
}

代码清单 12-4

//拥有超能力的洋子

#include <stdio.h>

#define NAME_LEN 64

struct student
{
	char name[NAME_LEN];
	int height;
	float weight;
	long schols;
};

void hiroko(struct student *std);

int main()
{
	struct student sanaka={"Sanaka",175,62.5,73000};

	hiroko(&sanaka);

	printf("姓  名= %s\n",sanaka.name);
	printf("身  高= %d\n",sanaka.height);
	printf("体  重= %.1f\n",sanaka.weight);
	printf("奖学金= %ld\n",sanaka.schols);

	return 0;
}

void hiroko(struct student *std)
{
	if((*std).height<180)
	{
		(*std).height=180;
	}
	if((*std).weight>80)
	{
		(*std).weight=80;
	}
}

代码清单 12-5

//拥有超能力的洋子(在结构体中引入typedef名)

#include <stdio.h>

#define NAME_LEN 64

typedef struct
{
	char name[NAME_LEN];
	int height;
	float weight;
	long schols;
}student;

void hiroko(student *std);

int main()
{
	student sanaka={"Sanaka",175,62.5,73000};

	hiroko(&sanaka);

	printf("姓  名=%s\n",sanaka.name);
	printf("身  高=%d\n",sanaka.height);
	printf("体  重=%.1f\n",sanaka.weight);
	printf("奖学金=%ld\n",sanaka.schols);

	return 0;
}

void hiroko(student *std)
{
	if(std->height<180)
	{
		std->height=180;
	}
	if(std->weight>80)
	{
		std->weight=80;
	}
}

代码清单 12-6

//返回结构体的函数

#include <stdio.h>

struct xyz
{
	int     x;
	long    y;
	double  z;
};

struct xyz xyz_of(int x,long y,double z);

int main()
{
	struct xyz s={0,0,0};

	s=xyz_of(12,7654321,35.689);

	printf("xyz.x = %d\n",s.x);
	printf("xyz.y = %ld\n",s.y);
	printf("xyz.z = %f\n",s.z);

	return 0;
}

struct xyz xyz_of(int x,long y,double z)
{
	struct xyz temp;

	temp.x=x;
	temp.y=y;
	temp.z=z;

	return temp;
}

练习 12-2

//结构体各成员的值从键盘输入

#include <stdio.h>

#define NAME_LEN 64

typedef struct
{
	char name[NAME_LEN];
	int height;
	float weight;
	long schols;
}student;

void hiroko(student *std);

int main()
{
	student sanaka;

	printf("姓名:");	scanf("%s",sanaka.name);
	printf("身高:");	scanf("%d",&sanaka.height);
	printf("体重:");	scanf("%f",&sanaka.weight);
	printf("奖学金:");	scanf("%ld",&sanaka.schols);

	hiroko(&sanaka);

	printf("姓  名=%s\n",sanaka.name);
	printf("身  高=%d\n",sanaka.height);
	printf("体  重=%.1f\n",sanaka.weight);
	printf("奖学金=%ld\n",sanaka.schols);

	return 0;
}

void hiroko(student *std)
{
	if(std->height<180)
	{
		std->height=180;
	}
	if(std->weight>80)
	{
		std->weight=80;
	}
}

练习 12-3

//从键盘输入int、long、double型的值,将这些值作为xyz结构体的成员,返回该结构体的值

#include <stdio.h>

typedef struct
{
	int x;
	long y;
	double z;
}xyz;

xyz scan_xyz(void);

int main()
{
	xyz a;

	a=scan_xyz();

	printf("x = %d\n",a.x);
	printf("y = %ld\n",a.y);
	printf("z = %f\n",a.z);

	return 0;
}

xyz scan_xyz(void)
{
	xyz temp;

	printf("请输入int型值:");		scanf("%d",&temp.x);
	printf("请输入long型值:");		scanf("%ld",&temp.y);
	printf("请输入double型值:");	scanf("%lf",&temp.z);
	
	return temp;
}

代码清单 12-7

//将5名学生的身高按升序排列

#include <stdio.h>

#define NUMBER 5
#define NAME_LEN 64

typedef struct
{
	char name[NAME_LEN];
	int height;
	float weight;
	long schols;
}student;

void swap_student(student *x,student *y);
void sort_by_height(student *s,int n);

int main()
{
	int i;
	student std[]=
	{
		{"Sato",178,61.2,80000},
		{"Sanaka",175,62.5,73000},
		{"Takao",173,86.2,0},
		{"Mike",165,72.3,70000},
		{"Masaki",179,77.5,70000}
	};

	for(i=0;i<NUMBER;i++)
	{
		printf("%-8s %6d%6.1f%7ld\n",std[i].name,std[i].height,std[i].weight,std[i].schols);
	}

	sort_by_height(std,NUMBER);

	puts("\n按身高排序。");

	for(i=0;i<NUMBER;i++)
	{
		printf("%-8s %6d%6.1f%7ld\n",std[i].name,std[i].height,std[i].weight,std[i].schols);
	}

	return 0;
}

void swap_student(student *x,student *y)
{
	student temp=*x;
	*x=*y;
	*y=temp;
}

void sort_by_height(student *s,int n)
{
	int i,j;

	for(i=0;i<n-1;i++)
	{
		for(j=n-1;j>i;j--)
		{
			if(s[j-1].height>s[j].height)
			{
				swap_student(&s[j-1],&s[j]);
			}
		}
	}
}

练习 12-4

//将5名学生的身高按升序排列

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

#define NUMBER 5
#define NAME_LEN 64

typedef struct
{
	char name[NAME_LEN];
	int height;
	float weight;
	long schols;
}student;

void swap_student(student *x,student *y);
void sort_by_height(student *s,int n);
void sort_by_name(student *s,int n);

int main()
{
	int i;
	int Select;
	student std[NUMBER];

	for(i=0;i<NUMBER;i++)
	{
		printf("第%d名学生姓名:",i+1);	scanf("%s",std[i].name);
		printf("第%d名学生身高:",i+1);	scanf("%d",&std[i].height);
		printf("第%d名学生体重:",i+1);	scanf("%f",&std[i].weight);
		printf("第%d名学生奖学金:",i+1);	scanf("%ld",&std[i].schols);
	}

	for(i=0;i<NUMBER;i++)
	{
		printf("%-8s %6d%6.1f%7ld\n",
			std[i].name,std[i].height,std[i].weight,std[i].schols);
	}

	do
	{
		printf("\n请选择按身高还是姓名排序?[1]身高/[2]姓名:");
		scanf("%d",&Select);
	}while(Select<1||Select>2);

	if(Select==1)
	{
		sort_by_height(std,NUMBER);
		puts("\n按身高排序。");
	}
	else if(Select==2)
	{
		sort_by_name(std,NUMBER);
		puts("\n按姓名排序。");
	}
	else
	{
		printf("输入错误!\n");
		return 0;
	}

	for(i=0;i<NUMBER;i++)
	{
		printf("%-8s %6d%6.1f%7ld\n",
			std[i].name,std[i].height,std[i].weight,std[i].schols);
	}

	return 0;
}

void swap_student(student *x,student *y)
{
	student temp=*x;
	*x=*y;
	*y=temp;
}

void sort_by_height(student *s,int n)
{
	int i,j;

	for(i=0;i<n-1;i++)
	{
		for(j=n-1;j>i;j--)
		{
			if(s[j-1].height>s[j].height)
			{
				swap_student(&s[j-1],&s[j]);
			}
		}
	}
}

void sort_by_name(student *s,int n)
{
	int i,j;

	for(i=0;i<n-1;i++)
	{
		for(j=n-1;j>i;j--)
		{
			if(strcmp(s[j-1].name,s[j].name)>0)
			{
				swap_student(&s[j-1],&s[j]);
			}
		}
	}
}

12-2 作为成员的结构体

代码清单 12-8

//计算两点之间的距离

#include <stdio.h>
#include <math.h>

#define sqr(n) ((n)*(n))

typedef struct
{
	double x;
	double y;
}point;

double distance_of(point pa,point pb);

int main()
{
	point crnt,dest;

	printf("当前地点的X坐标:");	scanf("%lf",&crnt.x);
	printf("          Y坐标:");	scanf("%lf",&crnt.y);
	printf("目的地的X坐标:");		scanf("%lf",&dest.x);
	printf("        Y坐标:");		scanf("%lf",&dest.y);

	printf("到目的地的距离为%.2f。\n",distance_of(crnt,dest));

	return 0;
}

double distance_of(point pa,point pb)
{
	return sqrt(sqr(pa.x-pb.x)+sqr(pa.y-pb.y));
}

代码清单 12-9

//汽车行驶

#include <stdio.h>
#include <math.h>

#define sqr(n) ((n)*(n))

typedef struct
{
	double x;
	double y;
}point;

typedef struct
{
	point pt;
	double fuel;
}car;

double distance_of(point pa,point pb);
void put_info(car c);
int move(car *c,point dest);

int main()
{
	car mycar={{0.0,0.0},90.0};

	while(1)
	{
		int select;
		point dest;

		put_info(mycar);

		printf("开动汽车吗【Yes---1/No---0】:");
		scanf("%d",&select);
		if(select != 1)
		{
			break;
		}

		printf("目的地的X坐标:");	scanf("%lf",&dest.x);
		printf("        Y坐标:");	scanf("%lf",&dest.y);
		if(!move(&mycar,dest))
		{
			puts("\a燃料不足无法行驶。");
		}
	}

	return 0;
}

double distance_of(point pa,point pb)
{
	return sqrt(sqr(pa.x-pb.x)+sqr(pa.y-pb.y));
}

void put_info(car c)
{
	printf("当前位置:(%.2f,%.2f)\n",c.pt.x,c.pt.y);
	printf("剩余燃料:%.2f升\n",c.fuel);
}

int move(car *c,point dest)
{
	double d=distance_of(c->pt,dest);

	if(d>c->fuel)
	{
		return 0;
	}
	c->pt=dest;
	c->fuel -= d;

	return 1;
}

练习 12-5

//改写代码清单12-9,可选择输入绝对坐标或相对坐标的方法

#include <stdio.h>
#include <math.h>

#define sqr(n) ((n)*(n))

typedef struct
{
	double x;
	double y;
}point;

typedef struct
{
	point pt;
	double fuel;
}car;

double distance_of(point pa,point pb);
void put_info(car c);
int move(car *c,point dest);

int main()
{
	car mycar={{0.0,0.0},90.0};

	while(1)
	{
		int SelectDR;
		int SelectZB;
		point dest;
		double X,Y;

		put_info(mycar);

		printf("开动汽车吗【Yes...1/No...0】:");
		scanf("%d",&SelectDR);
		if(SelectDR != 1)
		{
			break;
		}
		
		printf("请选择行驶距离的方法【1...绝对坐标法/2...相对坐标法】:");
		scanf("%d",&SelectZB);
		switch(SelectZB)
		{
		case 1:
			printf("目的地的X坐标:");	scanf("%lf",&dest.x);
			printf("        Y坐标:");	scanf("%lf",&dest.y);
			break;
		case 2:
			printf("X方向的距离:");	scanf("%lf",&X);
			printf("X方向的距离:");	scanf("%lf",&Y);
			dest.x=mycar.pt.x+X;
			dest.y=mycar.pt.y+Y;
			break;
		default:
			puts("选择错误!");
			break;
		}

		if(!move(&mycar,dest))
		{
			puts("\a燃料不足无法行驶。");
		}
	}

	return 0;
}

double distance_of(point pa,point pb)
{
	return sqrt(sqr(pa.x-pb.x)+sqr(pa.y-pb.y));
}

void put_info(car c)
{
	printf("当前位置:(%.2f,%.2f)\n",c.pt.x,c.pt.y);
	printf("剩余燃料:%.2f升\n",c.fuel);
}

int move(car *c,point dest)
{
	double d=distance_of(c->pt,dest);

	if(d>c->fuel)
	{
		return 0;
	}
	c->pt=dest;
	c->fuel -= d;

	return 1;
}

总结

summary

//表示日期的结构体和表示人的结构体

#include <stdio.h>

#define NAME_LEN 64

struct date
{
	int y;
	int m;
	int d;
};

typedef struct
{
	char name[NAME_LEN];
	struct date birthday;
}human;

void print_human(const human *h);

int main()
{
	int i;
	struct date today;

	human member[]=
	{
		{"张三",{1904,11,18}},
		{"李四",{1963,11,18}},
		{"王五",{1980,11,18}},
	};

	puts("请输入今天的日期。");
	printf("年:");	scanf("%d",&today.y);
	printf("月:");	scanf("%d",&today.m);
	printf("日:");	scanf("%d",&today.d);

	printf("今天是%04d年%02d月%02d日。\n",today.y,today.m,today.d);

	puts("---会员一览表---");
	for(i=0;i<sizeof(member)/sizeof(member[0]);i++)
	{
		print_human(&member[i]);
	}

	return 0;
}

void print_human(const human *h)
{
	printf("%s (%04d年%02d月%02d日生)\n",
		h->name,h->birthday.y,h->birthday.m,h->birthday.d);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值