前言
本文为业余学习《明解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);
}