结构(1)-初识结构数据
1.两类结构化数据管理
我们需要存储一个信息,分别表示人的姓名、性别、身高、体重。
1.1使用循环分支储存信息
#include <stdio.h>
int main()
{
// 第一个人
char name1[20];
int gender1;
double height1;
double weight1;
// 第二个人
char name2[20];
int gender2;
double height2;
double weight2;
// 第三个人
char name3[20];
int gender3;
double height3;
double weight3;
// 输入人员信息
printf("input name gender height weight:\n");
scanf("%s %d %lf %lf", name1, &gender1, &height1, &weight1);
scanf("%s %d %lf %lf", name2, &gender2, &height2, &weight2);
scanf("%s %d %lf %lf", name3, &gender3, &height3, &weight3);
// 显示人员信息
printf("display personal information\n");
printf("name gender height weight:\n");
printf("%s %d %.2f %.2f\n", name1, gender1, height1, weight1);
printf("%s %d %.2f %.2f\n", name2, gender2, height2, weight2);
printf("%s %d %.2f %.2f\n", name3, gender3, height3, weight3);
return 0;
}
上面的代码灵活性非常差,而且耗费非常多的代码
1.2使用数组存储信息
#include <stdio.h>
int main()
{
// 使用数组存储人员信息
// 姓名数组,每个名字最多20个字节,最多10个名字。
char name[10][20];
int gender[10];
double height[10];
double weight[10];
// 人员数量
int numOfPerson = 0;
// 有多少人?
printf("How many people?\n");
scanf("%d", &numOfPerson);
// 输入人员信息
printf("input name gender height weight:\n");
for(int i = 0; i < numOfPerson; i++)
{
scanf("%s %d %lf %lf", name[i], &gender[i], &height[i], &weight[i]);
}
// 显示人员信息
printf("display personal information\n");
printf("name gender height weight:\n");
for(int i = 0; i < numOfPerson; i++)
{
printf("%s %d %.2f %.2f\n", name[i], gender[i], height[i], weight[i]);
}
return 0;
}
我们使用数组来存储数据,灵活性大大提高,但是这段代码只能一次性输入所有人的人员信息,如果以后人数变动了,无法继续增加人员信息,所以我们需求更加通用化。
2.交互式程序设计
我们首先设计三个选项:
- 输入用户信息
- 显示用户信息
- 退出程序
2.1system库函数介绍
system是头文件stdlib.h
中的一个函数,它的参数是一串字符串,这个字符串是命令行中的一串命令。
在这里介绍两个命令:
- “cls”命令:用于清空控制台屏幕
- “pause”命令:用于暂停程序执行,按任意键后继续执行
2.2程序设计
我们先打印用户页面,初始化系统设置
#include<stdio.h>
#include<stdlib.h>
void menu()
{
printf("******************************\n");
printf("********输入1录入信息*********\n");
printf("********输入2查取信息*********\n");
printf("********输入3退出程序*********\n");
printf("******************************\n");
}
int main()
{
int input = 0;
do
{
system("cls");//每一次循环后都清空屏幕
menu();
scanf("%d", &input);
switch (input)
{
case 1:
case 2:
case 3:
default:
}
} while (input);
return 0;
}
接着,我们将用户的信息录入查看代码加入
#include<stdio.h>
#include<stdlib.h>
void menu()
{
printf("******************************\n");
printf("********输入1录入信息*********\n");
printf("********输入2查取信息*********\n");
printf("********输入0退出程序*********\n");
printf("******************************\n");
}
int main()
{
// 使用数组存储人员信息
// 姓名数组,每个名字最多20个字节,最多10个名字。
char name[10][20];
int gender[10];
double height[10];
double weight[10];
int input = 0;
int i = 0;
do
{
system("cls");
menu();
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入姓名 性别 身高 体重");
scanf("%s %d %lf %lf", &name[i], &gender[i], &height[i], &weight[i]);
i++;
break;
case 2:
printf("name gender height weight:\n");
for (int j = 0; j <i ; j++)
{
printf("%s %d %.2f %.2f\n", name[j], gender[j], height[j], weight[j]);
}
system("pause");
case 0:
printf("退出成功"); break;
default:printf("非法输入");system("pause"); break;
}
} while (input);
return 0;
}
3.聚合数据
C语言中能否将不同类型的数据聚合在一个实体当作呢?可以,不过我们需要引入一个新的关键词struct
。
char name1[20];
int gender1;
double height1;
double weight1;
struct {
char name[20];
int gender;
double height;
double weight;}
右边的代码利用struct将数据聚合在一起。
现在,我们有了一个新数据类型。这种由不同类型聚合而成的数据被称之为结构。关键词 struct 取
自 structure ,中文翻译为结构。
结构的定义和数组比较相似,我们自然可以从数组的一些角度去理解结构
struct {
char name[20];
int gender;
double height;
double weight;
}arr[10];
这就是结构的命名,我们将这四个数据整合的结构命名为arr[10],表明每个数据存储在一个arr的数组中,数组最大元素为10,观察到name[20]的数组,因此对于name形成了一个二维数组。
4.结构的访问
我们可以使用arr[0]
访问一大块元素。
我们也可以使用成员运算符 .
结合上 字段名 来访问聚合物种的每一项成员
arr[0].name;
arr[0].gender;
arr[0].height;
arr[0].weight;
演示一下:
struct {
char name[20];
int gender;
double height;
double weight;
}arr[1];
scanf("%s %d %lf %lf", arr[0].name, &arr[0].gender, &arr[0].height, &arr[0].weight);
printf("%s %d %.2f %.2f\n", arr[0].name, arr[0].gender, arr[0].height, arr[0].weight);
5.结构化的交互式程序
5.1改变数组的繁琐
/*char name[10][20];
int gender[10];
double height[10];
double weight[10];*/
struct{
char name[20];
int gender;
double height;
double weight;
}arr[10];
第二步,我们改变录入数据和打印数据的方式
//scanf("%s %d %lf %lf", &name[i], &gender[i], &height[i], &weight[i]);
scanf("%s %d %lf %lf", arr[i].name, &arr[i].gender, &arr[i].height, &arr[i].weight);
//printf("%s %d %.2f %.2f\n", name[j], gender[j], height[j], weight[j]);
printf("%s %d %.2f %.2f\n", arr[i].name, arr[i].gender, arr[i].height, arr[i].weight);
这样做除了结构更清晰,还有什么好处呢?
我们仅用了一个数组就表示了所有的信息,不仅利于信息的录入,更利于信息的查找。