明解C语言【日】 柴田望洋 第十二章 结构体

第十二章 结构体
12-1 结构体
12-2 作为成员的结构体
代码清单 12-1

//将5名学生的成绩按“身高”按升序排列
#include <stdio.h>

#define NUMBER		5		//学生人数

//---交换x和y指向的整数值---
void swap(int *x, int *y)
{
	int temp = *x;
	*x = *y;
	*y = temp;
 } 
 
 //---将数组date的前n个元素按升序排列
 void sort(int data[], int n)
 {
 	int k = n - 1;
 	while (k >= 0){
 		int i, j;
 		for (i = 1, j = -1; i <= k; i++)
 			if (data[i - 1] > data [i]){
 				j = i - 1;
 				swap(&data[i], &data[j]);
			 }
			 k = j;
	 }
  } 
  
  int main(void)
  {
  	int i;
  	int height[] = {178, 175, 173, 165, 179};
  	
  	sort(height, NUMBER);
  	
  	for (i = 0; i < NUMBER; i++)
  		printf("%2d:%4d\n", i + 1, height[i]);
  		
  	return (0);
  }

代码清单 12-2

//代码清单12-2
//对5名学生的“姓名和身高”按身高进行升序排列
#include <stdio.h>
#include <string.h>

#define 	NUMBER	5		//学生人数
//---交换x和y指向的整数值
void swap(int *x, int *y)
{
		int temp = *x;
		  *x = *y;
		  *y = temp;
 } 
 //---将sx和sy指向的字符串进行交换
 void swaps(char sx[], char sy[])
 {
 	char temp[256];
 	
 	strcpy(temp, sx);
 	strcpy(sx, sy);
 	strcpy(sy, temp);
  } 
  //---对数组data和name的前n个元素进行升序排列
 void sort(int data[], char name[][20], int n)
 {
 	int k = n - 1;
 		while (k >= 0){
 			int i, j;
 			for (i = 1, j = -1; i <= k; i++)
 				if (data[i - 1] > data[i]){
 					j = i - 1;
 					swap(&data[i], &data[j]);
 					swaps(name[i], name[j]);
				 }
				 k = j;
		 }
  } 
 int main(void)
 {
 	int i;
 	int height[] = {178, 175, 173, 165, 179};
	char name[][20] = {"Sato", "Sanaka", "Takao", "Mike", "Masaki"};
	 
	 sort(height, name , NUMBER);
	 
	 for (i = 0; i < NUMBER; i++)
	printf("%2d : %-8s%4d\n", i + 1, name[i], height[i]);
		 
	return (0); 
 }

代码清单 12-3

//代码清单12-3
//勇表示学生的结构体来显示佐中的信息
#include <stdio.h>
#include <string.h>

struct gstudent{
	char	name[20];		//姓名
	int 	height;			//身高
	float	weight;			//体重
	long	schols;			//奖学金 
};

int main(void)
{
	struct gstudent	sanaka;
	
	strcpy(sanaka.name, "Sanaka");		//姓名
	sanaka.height = 175;				//身高
	sanaka.weight = 60.5;				//体重
	sanaka.schols = 7000;				//奖学金
	
	printf("姓 名 = %s\n", sanaka.name);
	printf("身 高 = %d\n", sanaka.height);
	printf("体 重 = %f\n", sanaka.weight);
	printf("奖学金= %ld\n", sanaka.schols);
	
	return (0); 
 } 

代码清单 12-4

//对表示学生的结构体的成员佐中进行初始化
#include <stdio.h>
struct gstudent{
	char name[20];	//姓名 
	int  height;	//身高
	float weight;	//体重
	long schols;	//奖学金 
}; 

int main(void)
{
	struct gstudent sanaka = {"Sanaka", 175, 60.5};
	
	printf("姓 名 = %s\n", sanaka.name);
	printf("身 高 = %d\n", sanaka.height);
	printf("体 重 = %f\n", sanaka.weight);
	printf("奖学金= %ld\n", sanaka.schols);
	
	return (0);
}

代码清单 12-5

//拥有超能力的洋子
#include <stdio.h>
struct gstudent{
	char	name[20];		//姓名 
	int		height;			//身高
	float	weight;			//体重
	long	schols;			//奖学金			
}; 

//---能改变人的身高和体重的洋子
void hiroko(struct gstudent *std)
{
	if ((*std).height < 180)	(*std).height = 180;
	if ((*std).weight > 80)		(*std).weight = 80;
 } 
 
 int main(void)
 {
 	struct gstudent sanaka = {"Sanaka", 175, 60.5, 70000};
 	
 	hiroko(&sanaka);
 	printf("姓 名 = %s\n",		sanaka.name);
 	printf("身 高 = %d\n",		sanaka.height);
 	printf("体 重 = %f\n",		sanaka.weight);
 	printf("奖学金= %ld\n",		sanaka.schols);
 	
 	return (0);
 }

代码清单 12-6

//拥有能力的洋子(其二) 
#include <stdio.h>

//----表示学生的结构体
typedef struct{
	char	name[20];	//姓名 
	int 	height;		//身高 
	float	weight;		//体重 
	long	schols;		//奖学金 
} student;

//能够改变人身高和体重的洋子
void heroko(student *std)
{
	if (std->height < 180)	std->height = 180;
	if (std->weight > 80)	std->weight = 80;
 } 
 
 int main(void)
 {
 	student sanaka = {"Sanaka", 175, 60.5, 70000};
 	
 	heroko(&sanaka);
 	
 	printf("姓 名 = %s\n", sanaka.name);
 	printf("身 高 = %d\n", sanaka.height);
 	printf("体 重 = %f\n", sanaka.weight);
 	printf("奖学金= %ld\n", sanaka.schols);
 	
 	return (0);
 }
 

代码清单 12-6-1

//命名空间
#include <stdio.h>
int main(void)
{
	struct x{
		int x;
		int y;
	}x, y;
		x.x = 5;
	x:
		printf("%d\n",x.x);
		
	return (0);
 } 

代码清单 12-7

//返回结构体的函数
#include <stdio.h>

struct xyz {
	int		mx;
	long 	my;
	double 	mz;
}; 
//---返回结构体xyz---
struct xyz set_xyz(int x, long y, double z)
{
	struct xyz	temp;
	temp.mx = x;
	temp.my = y;
	temp.mz = z;
	return (temp);
 } 
 
 int main(void)
 {
 	struct xyz xyz = {0,0,0};
 	
 	xyz = set_xyz(10, 320, 35.6);
 	printf("xyz.mx = %d\n", xyz.mx);
 	printf("xyz.my = %ld\n", xyz.my);
 	printf("xyz.mz = %f\n", xyz.mz);
 	
 	return (0);
 }

代码清单 12-8

//将5名学生按身高升序排列
#include <stdio.h>

#define NUMBER	5		//学生人数

typedef struct{
	char 	name[20];	//姓名 
	int 	height;		//身高 
	float	weight;		//体重 
	long	schols;		//奖学金 
	
} student;

//对x和y的学生进行调换
void swap(student *x, student *y)
{
	student temp = *x;
	*x = *y;
	*y = temp;
 } 
 
 //对数组data前n个元素进行升序排列
 void sort(student data[], int n)
 {
 	int k = n - 1;
 	while (k >= 0){
 		int i, j;
 		for (i = 1, j = -1; i <= k; i++)
 			if(data[i - 1].height > data[i].height){
 				j = i - 1;
 				swap(&data[i], &data[j]);
			 }
		k = j;
	 }
  } 
  
  int main(void)
  {
  	int i;
  	student std[] = {
	  {"Sato", 178, 61.0, 80000},			//佐藤 
	  {"Sanaka", 175, 60.5, 70000},			//佐中 
	  {"Takao", 173, 80.0, 0},				//高尾 
	  {"Mike", 165, 72.0, 70000},			//平木 
	  {"Masaki", 179, 77.5, 70000},			//真崎 
	  };
	  
	  sort(std, NUMBER);
	  puts("-----------------------------");
	  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);
		puts("-----------------------------");
		
		return (0);
		
  }

代码清单 12-9

//显示当天日期
#include <time.h>
#include <stdio.h>

void put_date(void)
{
	time_t		current;
	struct	tm	*local;
	char wday_name[][7] = {"日", "一", "二", "三", "四", "五", "六"};
	
	time(&current);					//取得当前的时间 
	local = localtime(&current);
	printf("%4d年%02d月%02d日(星期%s)", local->tm_year + 1900	//年
								 , local->tm_mon + 1		//月
								 , local->tm_mday			//日
								 , wday_name[local->tm_wday]	//星期 
	);
 } 
 
 int main(void)
 {
 	printf("今天是");
 	put_date();
 	printf("。\n");
 	
 	return (0);
 }

代码清单 12-10

//计算两点之间的距离
#include <math.h>
#include <stdio.h> 

#define sqr(n)		((n) * (n))		//计算乘方

typedef struct{		//点 
	int x; 			//x坐标
	int y;			//y坐标 
} point;

//返回点pa和pb之间的距离
double distanceof(point pa, point pb)
{
	return (sqrt(sqr(pa.x - pb.x) + sqr(pa.y - pb.y)));
 } 
 
 int main(void)
 {
 	point p1, p2;
	
	printf("点1的x坐标:");	scanf("%d", &p1.x);
	printf("     y坐标:");	scanf("%d", &p1.y);
	printf("点2的x坐标:");	scanf("%d", &p2.x);
	printf("     y坐标:");	scanf("%d", &p2.y);
	
	printf("两点之间的距离为%.2f。\n", distanceof(p1, p2));
	
	return (0); 	
 }

代码清单 12-11

//汽车行驶与燃料消耗
#include <math.h>
#include <stdio.h>

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

typedef struct{		//点 
	int x;		//x点 
	int y;		//y点 
} point; 

typedef struct{		//汽车 
	double fuel;	//剩余燃料 
	point pt;		//当前位置 
}car ;

//---显示当前位置和剩余燃料---
void put_info(car c)
{
	printf("当前位置:(%d,%d)\n", c.pt.x, c.pt.y);
	printf("剩余燃料:%.2f升\n", c.fuel);
 } 
 
 //---向x和y方向行驶(dx,dy)距离 ---
 int move(car *c, int dx, int dy)
 {
 	double dist = sqrt(sqr(dx) + sqr(dy));//行驶距离 
 	if (dist > c->fuel)
 		return (0);					//无法行驶
 	c->pt.x += dx;	c->pt.y += dy;	c->fuel -= dist;		 
 	return (1);				//成功行驶 
 }
 
 int main(void)
 {
 	car mycar = {90.0, {0, 0}};
 	while (1){
 		int slct;
 		int dx, dy;		//行驶距离 
 		
 		put_info(mycar);
 		printf("开动汽车吗【Yes…1/No…0】:");
 		scanf("%d", &slct);
 		if (slct != 1)	break;
 		printf("X方向的驾驶距离:");	scanf("%d", &dx);
 		printf("Y方向的驾驶距离:");	scanf("%d", &dy);
 		
 		if(!move(&mycar, dx, dy))
 			puts("\a燃料不足无法行驶。");
	 }
	 return (0);
 }

专题12-1-1

//专题12-1基本的排序法1.

#include <stdio.h>
#define NUMBER		10
//---插入排序法---
void insertion(int a[], int n) 
{
	int i, j;
	for (i = 1; i < n; i++){
		int tmp = a[i];
		for (j = i; j > 0 && a[j - 1] > tmp; j--)
			a[j] = a[j - 1];
		a[j] = tmp;
	}
}

int main(void)
{
	int vc[NUMBER];
	int i;
	
	printf("请输入要排序的数据:");
	for (i = 0; i < NUMBER; i++)
		scanf("%d",&vc[i]);
	
	insertion(vc, NUMBER);
	for (i = 0; i < NUMBER; i++)
		printf("%2d : %4d\n", i + 1, vc[i]);
		
	return (0); 
}

专题12-1-2

//冒泡排序法
#include <stdio.h>
#define NUMBER	10

//--交换x和y指向的整数值
void swap(int *x, int *y)
{
	int  temp = *x;
	*x = *y;
	*y = temp;
 } 
//---冒泡排序---
void bubble(int a[], int n)
{
	int i, j;
	for (i = 0; i < n - 1; i++){
		for(j = 1; j <= n - i; j++)
			if (a[j - 1] > a[j])
				swap(&a[j - 1], &a[j]);
	}
 }
 int main(void)
 {
 	int vc[NUMBER];
 	int i;
	 
	 printf("请输入要排序数据:");
	 for (i = 0; i < NUMBER; i++)
	 	scanf("%d", &vc[i]);
		 
	bubble(vc, NUMBER);
	for (i = 0; i < NUMBER; i++)
		printf("%2d : %4d\n", i + 1, vc[i]);
		
	return (0); 
  } 

专题12-1-3

//---选择排序法---
#include <stdio.h>
#define	NUMBER	10
//交换x和y指向的整数值
void swap(int *x, int *y)
{
	int temp = *x;
		  *x = *y;
		  *y = temp;
 } 
 //选择排序法
 void selection(int a[], int n)
 {
 	int i, j;
 	for (i = 0; i < n; i++){
 		int 	min = i;
 		for (j = i + 1; j < n; j++)
 			if(a[j] < a[min])
 				min = j;
 			swap(&a[min], &a[i]);
	 }
 }
 int main(void)
 {
 	int i;
 	int vc[NUMBER];
	 
	 printf("请输入您要排序的数据:");
	 for (i = 0; i < NUMBER; i++)
	 	scanf("%d", &vc[i]);
		 
	selection(vc, NUMBER);
	for (i = 0; i < NUMBER; i++)
		printf("%2d : %4d\n", i + 1, vc[i]);
		
	return (0); 
 }

练习代码 12-1

//编写函数显示当前时间
#include <time.h>
#include <stdio.h>

void put_time(void)
{
	time_t		current;
	struct 	tm *local;
	
	time(&current);					//取得当前时间 
	local = localtime(&current);	//转换为本地时间的结构体 
	printf("%d时%02d分%02d秒", local->tm_hour		//时 
							 , local->tm_min		//分 
							 , local->tm_sec);		//秒 
 } 
 
 int main(void)
 {
 	printf("现在的时间是:");
 	put_time();
 	printf("。\n");
 	
 	return (0);
 }

练习代码 12-2

//描述一个长方体的长、宽、高、体积、面积
#include <stdio.h>

struct	abcvs{
	int ma, mb, mc;
	long mv;
	double ms;
}; 

struct abcvs set_abcvs(int a, int b ,int c,long v, double s)
{
	struct abcvs temp;
	temp.ma = a;
	temp.mb = b;
	temp.mc = c;
	temp.mv = v;
	temp.ms = s;
	return (temp);
}

int main(void)
{
	struct abcvs	abcvs = {0, 0, 0 ,0, 0};
	
	abcvs = set_abcvs(3, 4, 5, 60, 94);
	
	printf("这个长方体的数据是:");
	printf("长abcvs.ma = %d\n", 		abcvs.ma);
	printf("宽abcvx.mb = %d\n",		abcvs.mb);
	printf("高abcvs.mc = %d\n",		abcvs.mc);
	printf("体积abcvs.mv = %ld\n",		abcvs.mv);
	printf("面积abcvs.ms = %f\n",		abcvs.ms);
	
	return (0);
	
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值