第12章 结构体
示例代码:
示例代码12-1
/*
将5名学生的“身高”按升序排列
*/
#include <stdio.h>
#define NUMBER 5 // 学生人数
// 交换x和y指向的整数值
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
// 将数组data的前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
/*
对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", "Sanka", "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
/*
用表示学生的结构体来显示佐中的信息
*/
#include <stdio.h>
#include <string.h>
struct gstudent {
char name[20]; // 姓名
int height; // 身高
float weight; // 体重
long school; // 奖学金
};
int main(void)
{
struct gstudent sanaka;
strcpy(sanaka.name, "Sanaka"); // 姓名
sanaka.height = 175; // 身高
sanaka.weight = 60.5; // 体重
sanaka.school = 70000; // 奖学金
printf("姓 名 = %s\n", sanaka.name);
printf("身 高 = %d\n", sanaka.height);
printf("体 重 = %f\n", sanaka.weight);
printf("奖学金 = %ld\n", sanaka.school);
return (0);
}
示例代码12-4
/*
对表示学生的结构体成员佐中进行初始化
*/
#include <stdio.h>
struct gstudent {
char name[20]; // 姓名
int height; // 身高
float weight; // 体重
long school; // 奖学金
};
int main(void)
{
struct gstudent sanaka = {"Sanaka", 175, 60.5, 70000};
printf("姓 名 = %s\n", sanaka.name);
printf("身 高 = %d\n", sanaka.height);
printf("体 重 = %f\n", sanaka.weight);
printf("奖学金 = %ld\n", sanaka.school);
return (0);
}
示例代码12-5
/*
拥有超能力的洋子
*/
#include <stdio.h>
struct gstudent {
char name[20]; // 姓名
int height; // 身高
float weight; // 体重
long school; // 奖学金
};
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.school);
return (0);
}
示例代码12-6
/*
拥有超能力的洋子 (其二)
*/
#include <stdio.h>
// 表示学生的结构体
typedef struct {
char name[20]; // 姓名
int height; // 身高
float weight; // 体重
long school; // 奖学金
} student;
void hiroko(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};
hiroko(&sanaka);
printf("姓 名 = %s\n", sanaka.name);
printf("身 高 = %d\n", sanaka.height);
printf("体 重 = %f\n", sanaka.weight);
printf("奖学金 = %ld\n", sanaka.school);
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 school; // 奖学金
} 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].school);
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(¤t); // 取得当前时间
local = localtime(¤t); // 转换为本地时间的结构体
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);
}
练习代码:
练习代码e12-1
/*
编写如下函数,显示当前时间
*/
#include <time.h>
#include <stdio.h>
void put_time(void)
{
time_t current;
struct tm *now;
time(¤t); // 取得当前时间
now = localtime(¤t); // 转换为本地时间的结构体
printf("%02d:%02d:%02d", now->tm_hour // 时
, now->tm_min // 分
, now->tm_sec); // 秒
}
int main(void)
{
printf(" 现在是");
put_time();
printf("。\n");
return (0);
}