第十二章 结构体
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(¤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);
}
专题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(¤t); //取得当前时间
local = localtime(¤t); //转换为本地时间的结构体
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);
}