实验11结构体、共用体和枚举类型
- 格式:doc
- 大小:78.50 KB
- 文档页数:6
实验十一结构体(struct)与共用体(union)实验目的理解并掌握使用不同数据类型的变量组合成一个数据的组合体-结构体与共用体的定义与引用;正确使用结构体数组、结构体与函数及指向结构体的指针。
要点提示1.结构体定义的一般格式为:struct 结构体类型名{数据类型成员名1;数据类型成员名2;……数据类型成员名n;};2.结构体变量的说明struct 结构体类型名结构体变量名;3.引用结构体成员结构体变量名.成员名共用体与结构体有相似的使用形式实验内容●结构体的定义与引用●结构体与函数●结构体数组●指向结构体的指针●共用体的定义与引用实验步骤读懂并输入程序,完成填空后输出结果1.建立学习成绩单结构,并建立一个同学王林(wanglin)的记录。
#include <stdio.h>main(){struct grade /* 定义结构体类型*/{int number;char name;int math;int english;};struct 【】wanglin; /* 说明结构体变量*/printf("Please input the number, name, math, english:\n");scanf("%d,%d,%d",&【】,& wanglin. name,【】& wanglin.english);printf("wanglin 'grade is: %d/%d/%d\n", wanglin. number, , wanglin.math, wanglin.english);}程序执行过程与结果:Please input the number, name, math, english::26,A, 85,90wanglin ' grade is:#include <stdio.h>main(){struct grade /* 定义结构体类型*/{int number;char name;int math;int english;};struct grade wanglin; /* 说明结构体变量*/printf("Please input the number, name, math, english:\n");scanf("%d,%c,%d,%d",&wanglin. number,& wanglin. name,& wanglin. math,& wanglin.english);printf("wanglin 'grade is: %d/%c/%d/%d\n", wanglin. number, , wanglin.math, wanglin.english);}Please input the number, name, math, english:26,A,85,90wanglin 'grade is: 26/A/85/90Press any key to continue请再建立一个刘芳(liufang)的成绩记录, 比较一下。
C语言知识总结——宏,枚举,结构体,共用体1、define宏定义以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理阶段将用define定义的来内容进行了替换。
因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。
define定义的常量,预处理时只是直接进行了替换,,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
,因此在编译时它不对宏的定义进行检查,作用域不影响对常量的访问。
它的常量值只能是字符串或数字。
该命令有两种格式:一种是简单的常量宏定义, 另一种是带参数的宏定义。
不带参数的宏:#define< 名字 >< 值 > 要注意,没有结尾的分号,因为不是C的语句,名字必须是一个单词,值可以是各种东西,宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。
如有错误,只能在编译已被宏展开后的源程序时发现。
注意.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
宏定义其作用域为宏定义命令起到源程序结束。
如要终止其作用域可使用#undef命令带参数的宏:像函数的宏,一般的定义形式:带参宏定义的一般形式为:「#define 宏名」(形参表)字符串,也是没有结尾的分号,可以带多个参数,#define NB(a,b)((a)>(b)?(b):(a)), 也可以组合(嵌套)使用其他宏,注意带参数宏的原则一切都要有括号,参数出现的每个地方都要有括号。
带参数的宏在大型的程序的代码中使用非常普遍,在#和##这两个运算符的帮助下可以很复杂,如“产生函数”,但是有些宏会被inline函数代替(C++的函数)使用宏好处:“提高运行效”。
定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。
C语言——枚举类型定义符——typedef通过typedef创建一个新的类型,并为这个数据类型赋予一个名字,然后这个数据类型就可以再任何被允许的地方使用。
typedef int INTERGER;注意:通过typedef定义的标志符通常采用大写的形式。
例如:typedef char* STRING;STRING stringPtrAry[20];//char* stringPtrAry[20];枚举类型——enum枚举类型是一种基于标准整形类型的自定义类型。
在一个枚举类型中,每一个整形数值都被赋予一个标识符,而这个标识符就被称为枚举常量。
enum typeName{identifier list};关键字标志符枚举常量集合枚举名每一个枚举常量都被赋予一个整形数值。
如果程序员没有明确的位这些标识符赋值,编译器将自动为第一个标识符赋值为0,第二个为1,依次类推。
如果中间有一个元素被赋值,之后的元素值是前一元素值+1。
注意:枚举常量本质是个常量,不能再去定义一个同名的变量。
枚举类型——赋值C语言允许枚举常量赋予枚举常量(必须要是在这个常量前已经定义的枚举常量)和枚举变量、变量。
例如:enum color{RED, BLUE, GUEEN, WHITE};enum color x;x = BLUE;//1x = GUEEN;//2x = YELLOW;//错误,YELLOW不存在枚举变量可以赋予枚举常量,也可以赋予其他的常量,而且相互之间还可以进行运算,但是,C语言中并没有确保给枚举变量的赋值是合法的。
匿名枚举类型——常量如果在创建枚举类型的时候没有指定名字,那么这就是一个匿名枚举类型。
例如:enum {red, blue, green, white};由于枚举类型里的标示符都是常量,因此可以很方便的利用枚举类型声明常量。
C语言——结构体、共用体结构体——struct结构体是具有单一名字的相关元素的集合,而且这些元素可能是不同类型。
第十一章结构体、共用体和枚举数据类型【目的要求】一、了解:结构变量和结构指针作函数实参的区别;枚举型变量概念、特点与应用;typedef的用途二、理解:结构体、共用体的概念和特点;类型说明和变量定义的区别;单向链表的概念和作用三、学握:结构体、共用体的类型说切、变量定义及使用;结构体数组的定义和初始化(重点);链表的建立、删除和插入(难点)第一节结构体一、结构体的定义格式询而学过的变量都只能定义单一的数据类型,如字符型、整型、实型等等,但是对于复朵的数据,即包含有一个或者多个数据项,各数据项可以具有相同或者不同的类型,并且何个数据项的含义不同,以前的知识就不足了。
例如对于学生实体的描述,学牛有姓名,学号,成绩,性别等等。
我们要描述一个学生需要多个基本变量的组合(集成)。
这种数据类型在Pascal语言中称为记录,在C语言中称为结构体。
它们是数据库的雏形。
num Name S(2X age score address10010 Li Fun M18 87. 5 Beijing10011 Zhang San M21 67 Fuzhou10012 Li si F22 88 Jinan10013 Wang Hai M20 72 Haikou在上述的信息中,每一行代表一个人的信息,有学号、姓名、性别、年龄、成绩、地址等信息,以前学过的任何-•种数据类型均不能表示,而分别表示乂违背了信息的集成原则, 用起来也不方便。
数组的特征是每个元素都是同质(identical)的,不能表示不同的数据类型。
因此,为了把这么多种基本数据类型集合在一起,发明了结构体。
在Pascal语言中叫记录。
定义方式如下:struct student{ int num;char name[20];char sex;int age;float score;char addr[30];};上述并非定义一个变量,或者一个存储空间,而是定义了一个新的结构体类型structstudent (它的地位等同于i nt char等数据类型描述)。
实验11 结构体、共用体和枚举类型
一、实验目的:
1、掌握结构体类型定义和结构体变量定义、初始化的方法;
2、掌握结构体成员的访问方法,熟悉结构体嵌套定义方法;
3、掌握结构体数组的定义和使用方法,能够用模块化方法设计程序;
4、熟悉共用体类型、枚举类型、typedef的基本用法。
二、实验内容
1、下列程序的功能是:先定义结构体Book,再定义两个变量book1、book2,其中一个初始化,另一个从键盘输入数据,最后输出book1、book2的值。
程序运行结果如下:
请根据题意和注释填写下列程序所缺代码,并回答相关问题:
#include<stdio.h>
//定义结构体Book,成员有:书名(title),字符数组,长度为100;
//作者(authors),字符数组,长度为30;ISBN,字符数组,长度为20;
//页数(pages),整型;价格(price),单精度浮点数。
/*代码段_1*/
int main()
{
//定义两个Book型变量book1、book2,其中book1用我们本学期所使用教材的数据初始化/*代码段_2*/
//从键盘输入我们本学期所使用实验指导书的数据给book2
/*代码段_3*/
printf("请输入实验指导书的信息:书名、作者、ISBN、页数、作者:\n");
/*代码段_4*/
printf("\n教材、实验书信息如下:\n");
/*代码段_5*/
return 0;
}
问题:
(1)如何定义结构体类型?
(2)怎样定义结构体变量,并初始化?
(3)怎样输入、输出结构体变量各成员的值?
2、请按下列要求编程:
(1)先定义一个结构体Date,它包含三个成员:年(year,int)、月(month,int)、日(day,int);
(2)再定义一个结构体,它包含三个成员:姓名(name,char[10])、性别(sex,char类型,’m’为男,’f’为女)、出生时间(birthday,Date类型)、身份证号(ID,char[19])、电子邮箱(email,char[60]),并用typedef将该结构体命名为Person类型;
(3)然后定义一个Person类型的变量me,通过键盘输入自己的信息,然后输出me的各成员值。
程序执行如下图所示:
(提示:由于输入内容有字符串、字符、整数等,建议在scanf()中的格式控制符用空格隔开,例如scanf("%s %c %d %d %d %s %s",,…);)
3、学生有三门课程:A、B、C,3名学生的成绩如下表所示:
姓名 A B C 平均分
张三78 84 67
李四88 90 95
王五66 79 80
请先定义一个结构体Student,其成员包括:name(姓名)、A、B、C、aver(平均分),再定义一个Student类型的数组stud[3]来存放学生资料。
现欲先输入
学生三门课程成绩,再计算平均分,最后输出学生信息,要求用“模块化程序设计”方法来设计程序。
请根据题意、注释在代码段1-代码段5中填写程序所缺代码。
#include<stdio.h>
//定义结构体Student,学生姓名不超过10个字符
//三门课程成绩均为百分制,只取整数;平均分带小数
struct Student
{
//代码段1
};
int main()
{
//定义结构体数组stud[3]
//对input()、average()、print()三个函数进行声明
//调用input()、average()、print()三个函数
//代码段2
return 0;
}
//定义输入n名学生的姓名、三门课程成绩的函数。
void input(Student s[], int n)
{
//代码段3
printf("\n");
}
输入某一学生成绩的界面如下:
//定义计算n名学生三门课程平均分的函数
void average(Student s[], int n)
{
//代码段4
}
//定义输出n名学生的姓名、三门课程成绩、平均分的函数。
学生信息输出如下图所示
void print(Student s[], int n)
{
//代码段5
printf("\n");
}
输出结果界面如下:
4、共用体的使用:
几个不同的变量共享同一段内存的结构称为共用体,当然这几个变量不能同时存放,在每一瞬时只能存放其中一个变量。
如果换一个角度来看,也可以把同一个数,当做不同类型来看待,输出结果也不同。
我们知道VC++中,float型数据与unsigned int都占用4字节,但它们的存储形式不同,可以利用共用体,给它赋予一个float型数据,再将它看作是一个unsigned int数据来输出(用十六进制表示),以观察float数据存储是否与理论值一致?浮点数的存储格式见《IEEE754标准.doc》文档。
并回答相关问题:#include<stdio.h>
int main()
{
union
{
float r;
unsigned int n;
}x;
x.r=178.125;
printf("float型数据: %f 存储数据与unsigned int: %X H相同。
\n\n",x.r,x.n);
return 0;
}
问题:
(1)存储内容为3F580000H时,对应的float值是多少?
(2)float型数据在计算机内部是以什么方式存储的?
5、枚举类型的使用:
阅读、分析、运行程序,其结果是否与预计的相同?如果不相同,是什么原因造成的?并回答相关问题:
#include<stdio.h>
enum Season
{
spring, summer=100, fall=96, winter
};
typedef enum
{
Sunday,Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }
Weekday;
int main()
{
/* Season */
printf("%d \n", spring);
printf("%d, %c \n", summer, summer);
printf("%d \n", fall+winter);
Season mySeason=winter;
if(winter==mySeason)
printf("mySeason is winter \n");
int x=100;
if(x==summer)
printf("x is equal to summer\n");
printf("%d bytes\n", sizeof(spring));
/* Weekday */
printf("sizeof Weekday is: %d \n", sizeof(Weekday));
Weekday today = Saturday;
Weekday tomorrow;
if(today == Saturday)
tomorrow = Sunday;
else
tomorrow = (Weekday) (today + 1);
printf("tomorrow is: %d \n", tomorrow);
return 0;
}
并回答下列问题:
(1)枚举类型如何定义?其中的是元素是字符串吗?各元素间用什么符号分隔?
(2)上述代码定义了几个枚举类型?
(3)枚举类型中各元素的值是整数吗?默认值从什么开始?能够在定义时改变
吗?。