程序设计导论 ——第15讲 结构与结构数组
结构与结构数组 为什么要使用结构? 数组:其中的每一个元素都必须是相同类型的数据; 实际应用:常常需要将不同类型的数据放在一起,使处理起来更为直观方便。 例如:一个学生的信息,包括姓名、性别、出生年月日、身高和体重,如果能归在一起,对于统计个人信息会十分方便。 为此,引入结构体的概念
1. 结构体类型的定义 结构体可以用来表示一组不同类型的数据。尽管这些数据的类型不同,但却有内在的联系,比如学生的个人信息有如下5项: 姓名,汉语拼音,最多20个字符; 性别,M / F 生日,19841107(年月日) 身高,1.74(m) 体重,51.5(kg)
结构体类型的定义(2) 可以定义一个名为student的结构体,将5项信息包容在一起,构成学生的个人信息 struct student //名为student的结构类型 { char name[20]; //姓名 char sex; //性别 unsigned long birthday; //生日 float height; //身高 float weight; //体重 };
定义结构体类型的格式 struct 是结构体类型的标志,结构体名student是编程者自己选定的。 { 类型名 1 成员名 1; 类型名 2 成员名 2; . . . 类型名 n 成员名 n; } ; struct 是结构体类型的标志,结构体名student是编程者自己选定的。 大括号所括起来的5条语句是结构体中5个成员的定义。 结构体定义之后一定要跟一个“;”号。
2. 结构体变量的定义和引用 //********************************** //* 程 序 名:5-5.CPP * //* 作 者:wuwh * //* 编制时间:2002年11月20日 * //* 主要功能:学生个人信息 *
#include <stdio.h> struct student //定义结构 { char name[20]; //姓名 char sex; //性别 unsigned long birthday; //生日 float height; //身高 float weight; //体重 };
int main() // 主函数 { struct student my; // 定义my为student类的数组 printf( "输入自己的数据\n" ); // 提示信息 printf( "姓名(汉语拼音)\n" ); // 显示提示 printf( "性别:M/F\n" ); printf( "生日(年月日)\n" ); printf( "身高(米)\n" ); printf( "体重(kg)\n\n" );
scanf( "%s\n", my.name); scanf( "%c", &my.sex ); // 依次输入个人信息 scanf( "%s\n", my.name); scanf( "%c", &my.sex ); scanf( "%d", &my.birthday ); scanf( "%f", &my.height ); scanf( "%f", &my.weight );
// 依次输出个人信息 printf( "%s\n", my.name ); printf( "%c\n", my.sex ); printf( "%d\n", my.birthday ); printf( "%f\n", my.height ); printf( "%f\n", my.weight ); return 0; }
说明 struct student //此处为结构类型定义 struct student my; 定义类型不会分配内存空间 { char name[20]; //姓名 char sex; //性别 unsigned long birthday; //生日 float height; //身高 float weight; //体重 }; //结构变量my的定义,系统会为my分配内存空间 struct student my;
变量 my (my为变量的符号地址) my.name my.sex my.birthday my.height my.weight & my ( 变量的内存地址)
点操作符 “.”:用于对结构体变量的成员的引用 如: printf( “%s\n”, my.name) ; 这里 “ . ” 读作 “的”
3. 结构体变量的初始化 方法一:定义和初始化同时完成 struct person { char name[10]; per.name = “Liming”; per.birthday = 19821209; per.placeofbirth = “Beijing”; struct person { char name[10]; unsigned long birthday; char placeofbirth[20]; } per = { “Li ming”, 19821209, “Beijing”};
方法二:分开完成 struct person { char name[10]; unsigned long birthday; char piaceofbirth[20]; }; struct person per = {“Li ming”, 19821209, “Beijing”};
4. 结构数组 结构也可以构成数组,即每个数组元素是一个结构; 当然,要求这一类数组的全部元素都应该是同一类结构; 例如:同宿舍4名同学的数据,构成一个有4个元素的结构数组。
student Room [ 4 ] = { }; {“Li li”, ‘M’, 19840318, 1.82, 65.0 }, {“Mi mi”, ‘M’, 19830918, 1.75, 58.0 }, {“He lei”, ‘M’, 19841209, 1.83, 67.1 }, {“Ge li”, ‘M’, 19840101, 1.70, 59.0 } };
name name name name sex sex sex sex birthday birthday birthday birthday height height height height weight weight weight weigh 下标0 下标1 下标2 下标3 Room
Room[ 0 ] “Li li”, ‘M’, 19840318, 1.82, 65.0 Room[ 1 ] “Mi mi”, ‘M’, 19830918,1.75, 58.0 Room[ 2 ] “He lei”, ‘M’, 19841209, 1.83, 67.1 Room[ 3 ] “Ge li”, ‘M’, 19840101, 1.70, 59.0
//********************************** //* 程 序 名:5_6.cpp * //* 作 者:wuwh * //* 编制时间:2002年11月21日 * //* 主要功能:结构数组排序 * #include <stdio.h> struct student //名为student的结构类型 { char name[20]; //姓名 char sex; //性别 unsigned long birthday; //生日 float height; //身高 float weight; //体重 }; struct student Room [ 4 ] = { //定义全局student结构数组,并初始化 {“Li li”, ‘M’, 19840318, 1.82, 65.0 }, {“Mi mi”, ‘M’, 19830918, 1.75, 58.0 }, {“He lei”, ‘M’, 19841209, 1.83, 67.1 }, {“Ge li”, ‘M’, 19840101, 1.70, 59.0 }
int main() { struct student q; //结构变量q,用于交换时保存中间结果 int i = 0 ; int j =0; //按照年龄排序 for ( j = 0; j < 3; j = j+1 ) for ( i = 0; i < 3 – j ; i = i +1 ) if (Room[ i ].birthday > Room[i+1].birthday) q= Room[ i ]; //交换,结构变量赋值 Room[ i ]=Room[ i+1]; Room[ i+1]= q; } for( i = 0; i < 4; i = i + 1 ) //输出排序后的结果 printf( "%s\n", Room[i].name ); printf( "%c\n", Room[i].sex ); printf( "%d\n", Room[i].birthday ); printf( "%f\n", Room[i].height ); printf( "%f\n", Room[i].weight ); return 0;