C语言程序设计 课件 于红 模块四 编程高级应用_第1页
C语言程序设计 课件 于红 模块四 编程高级应用_第2页
C语言程序设计 课件 于红 模块四 编程高级应用_第3页
C语言程序设计 课件 于红 模块四 编程高级应用_第4页
C语言程序设计 课件 于红 模块四 编程高级应用_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计基础与实践模块四编程高级应用任务4.1数组C语言程序设计基础与实践课程组04技能点拓展03技能点详解02技能点分析目录CONTENTS任务4.1数组01问题引入05技能点检测一问题引入足球场上,双方球员在快速奔跑,抢断,为了团队的荣誉拼搏。作为观众的我们,无法看见球员的面孔,我们通过球衣的颜色和图案区别球队。但是,如何区别哪一位球员呢?有的时候解说员在解说比较激烈的场面的时候,通常喊的是球员身后的号码,当我们看到号码的时候,就知道是哪位球员,比如C罗的7号,马拉多拉的10号。这种用球队多少号球员的命名方式,在C语言中就是数组的命名方式。那么数组在使用时我们应该注意哪些事项呢?04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.1数组二技能点分析1.掌握一维数组的应用2.掌握多维数组初始化的3.掌握访问数组元素的方法学习目标1.什么是数组?2.如何声明一维数组和二维数组?3.数组如何被初始化?4.如何访问数组元素?元素的索引是什么?学期预习04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.1数组数组是一组具有相同数据类型的变量集合,它是一系列相同类型的变量。一维数组的定义typename[size1];C语言支持多维数组。多维数组声明的一般形式如下:typename[size1][size2]...[sizeN];数组中的每一项称为数组的元素,每个元素都有对应的下标(n),用于表示元素在数组中的位置序号,下标从0开始。数组的声明是声明一个数组变量,有一个统一的名称,比如定义一个数组name,然后用name[n]的形式访问其中的每一个变量,称为数组元素。三技能点详解——数组数组中的每一项称为数组的元素,每个元素都有对应的下标(n),用于表示元素在数组中的位置序号,下标从0开始。数组的声明是声明一个数组变量,有一个统一的名称,比如定义一个数组name,然后用name[n]的形式访问其中的每一个变量,称为数组元素。三技能点详解——数组1)声明数组在C中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:typearrayName[arraySize];这叫做一维数组。[]中的arraySize必须是一个大于零的整数常量,type可以是任意有效的C数据类型。要声明一个类型为float的包含6个元素的数组b,声明语句如下:floatb[6];现在b是一个可用的数组,可以容纳6个类型为float的数字。三技能点详解——1一维数组三技能点详解——1一维数组2)初始化数组(1)直接对数组中的所有元素赋值。需要注意的是:大括号{}中的值的数目不能大于我们在数组声明时在方括号[]中指定的元素数目。比如下例中定义的数组b长度是5,那么初始化的值的数目最多也只能是5个。floatb[5]={9990.0,1.0,5.0,7.0,56.0};(2)只对数组中的一部分元素赋值。

结果是给b[0],b[1]赋了初始值,其他元素没有初始值(也可以理解为是个随机数值)floatb[5]={9990.0,1.0};(3)对数组全部元素赋值,但不指定长度。如果省略掉了数组的大小,这时数组的长度等于初始化时元素的个数。floatb[]={9990.0,1.0,5.0,7.0,56.0};这将创建一个数组,虽然没有指定数组长度,它与前一个实例中所创建的数组是完全相同的,也是5个数组元素。3)访问数组元素

数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。b[4]=56.0;这个语句把数组中第五个元素的值赋为56.0,b[4]可以看作是一个独立的变量,我们可以通过这个变量直接修改数组中的元素值或者引用其中的值。三技能点详解——1一维数组1)声明二维数组声明一个x行y列的二维整型数组,形式如下:typearrayName[m][n];其中,type可以是任意有效的C数据类型,arrayName

是一个有效的C标识符。一个二维数组在逻辑上就是一个m行和n列的表格。下面是一个二维数组,包含4行和3列:inta[4][3];因此,数组中的每个元素是使用形式为a[m][n]的元素名称来标识的,其中a是数组名称,m和n是唯一标识数组a中每个元素的下标。三技能点详解——2二维数组2)初始化二维数组inta[3][4]={{0,1,2,3},//初始化索引号为0的行 {4,5,6,7},//初始化索引号为1的行 {8,9,10,11}//初始化索引号为2的行 };多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有3行4列的数组。内部嵌套的括号是可选的,下面的初始化与上面是等同的:之所以可以这样初始化,是因为数组的物理结构还是一个数据列表,数组中的数据存放在内存中时还是按照线性结构顺序存储在内存空间中的。例如上例中的a数组在内存中的结构实际是这样的:三技能点详解——2二维数组二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。例如:int

val=a[2][3];上面的语句将获取数组中第3行第4个元素赋值给变量val。3)访问二维数组元素三技能点详解——2二维数组三技能点详解——1访问二维数组元素二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。例如:intval=a[2][3];上面的语句将获取数组中第3行第4个元素赋值给变量val。案例4.1.1读写一维数组/****************************************************内容简述:一位数组初始化和输出***************************************************/#include

<stdio.h>

//头文件

intmain(void){

intn[10]; //n是一个包含10个整数的数组

int

i,j;

for(i=0;i<10;i++) //初始化数组元素 { n[i]=i+100; //设置元素

i

i+100 }

for(j=0;j<10;j++) //输出数组中每个元素的值 {

printf("Element[%d]=%d\n",j,n[j]); }

return0;}三技能点详解——案例三技能点详解——案例实例4.1.2读写二维数组/****************************************************内容简述:二维数组初始化和输出***************************************************/#include

<stdio.h>

intmain(void){

/*一个带有5行2列的数组*/

inta[5][2]={{0,0},{1,2},{2,4},{3,6},{4,8}};

inti,j;

for(i=0;i<5;i++)//输出数组中每个元素的值{

for(j=0;j<2;j++){printf("a[%d][%d]=%d\n",i,j,a[i][j]);}}

return0;}三技能点详解——案例04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.1数组四技能点拓展——1数组越界数组的下标都有一个范围,即“0~[数组长度-1]”,假设数组的长度为:5,其下标范围为0~4。当访问数组中的元素时,下标不能超出这个范围,否则程序会出错。/****************************************************内容简述:数组越界显示问题***************************************************/#include

<stdio.h>

//头文件intmain(void){

inta[5]={1,2,3,4,5};//一维数组的5个元素

int

i;

for(i=0;i<6;i++)//输出5个数值 {

printf("a[%d]=%d\n",i,a[i]); }

return0;}四技能点拓展——2字符数组字符数组是由字符类型的元素所组成的数组,字符串就存储在字符数组中,在访问字符数组时,可使用下标法读取指定位置的字符。字符数组定义方式与整型数组类似:chararrname[size];//一维字符数组定义字符数组:charcha[6];charchb[5]={'a','b','c','d','e'};//定义一个字符数组并初始化数组元素四技能点拓展——3字符串数组字符串是由数字、字母、下划线、空格等各种字符组成的一串字符,由一对英文半角状态下的双引号(“”)括起来,例如”abcde”。字符串在C语言中,字符串的存储和处理都是通过字符数组来实现的,存储字符串的字符数组必须以空字符’\0’(空字符)结尾。当把一个字符串存入一个字符数组时,也把结束符’\0’存入数组,因此该字符数组的长度是字符串实际字符数加1。字符串由字符数组进行存储,那么可以直接使用一个字符串常量来为一个字符数组赋值。charcha[11]={"helloworld"};charchb[]={"helloworld"};上述两个字符数组的大小都是11,这是因为字符串末尾有一个’\0’结束符。04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.1数组五技能点检测完成课堂任务,在线提交;完成技能检测,在线提交;C语言程序设计基础与实践模块四编程高级应用任务4.2指针C语言程序设计基础与实践课程组04技能点拓展03技能点详解02技能点分析目录CONTENTS任务4.2指针01问题引入05技能点检测一问题引入现实生活中,我们总会碰到很多指示牌,它们的作用是告诉寻路者要找到一个地方应该怎么走,以便我们找到自己的目的地或者所需的东西,比如车站出口、物品摆放地等等。在程序设计中,有时也需要“指示牌”,告诉程序所需要的数据、代码在哪,以便于更好的调用数据、代码。那么指针在使用时我们应该注意哪些事项呢?04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.2指针二技能点分析1.指针概念2.指针运算3.指针与数组学习目标1.什么是指针?2.如何声明指针?3.指针的算术运算有哪些?4.什么是指针数字?如何定义一维指针数组?学期预习04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.2指针指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:type*v_name;type是指针的基类型,它必须是一个有效的C数据类型,v_name是指针变量的名称。用来声明指针的星号*与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。int*intp;/*一个整型的指针*/double*doup;/*一个double型的指针*/float*flop;/*一个浮点型的指针*/char*chp;/*一个字符型的指针*/三技能点详解——指针不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。例如一个int型变量inta:编译器会根据变量inta的类型int,为其分配4个字节地址连续的存储空间。假如这块连续空间的首地址为0x0048EFAA,那么这个变量占据0x0048EFAA~0x0048EFAD这四个字节的空间,0x0048EFAA就是变量inta的地址。三技能点详解——指针三技能点详解——1指针的算术运算1)取址运算符在程序中定义变量时系统会为变量在内存中开辟一段空间,用于存储该变量的值,每个变量的存储空间都有唯一的编号,这个编号就是变量的内存地址。C语言支持以取址运算符“&”获得变量的地址。&符号的使用方法:&vary_name;intinta=99;//定义变量intaint*intp=&inta;//定义int类型的指针intp,并取变量inta的地址赋值给intp三技能点详解——1指针的算术运算2)取值运算符指针变量存储的数值是一个地址,直接对地址操作容易出错,针对指针变量的取值并非取出它所存储的地址,而是间接取得该地址中存储的值。C语言支持通过使用一元运算符*来返回位于操作数所指定地址的变量的值。*符号使用方法:*指针表达式。案例如下:通过上述代码,最终实现变量intb的值也是99。其效果等同于intb=inta。intinta=99;//定义变量intaint*intp=&inta;//定义int类型的指针intp,并取变量inta的地址赋值给intpintintb=*intp;//定义int型变量intb,并取指针变量p中存储的变量值赋给intb三技能点详解——1指针的算术运算3)指针的算术运算C指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。指针的每一次递增,它其实会指向下一个元素的存储单元。指针的每一次递减,它都会指向前一个元素的存储单元。指针在递增和递减时跳跃的字节数取决于指针所指向变量数据类型长度,比如int型就是4个字节,char型就移动1个字节。3)指针的比较指针可以用关系运算符进行比较,如==、<和>。如果intp1和intp2指向两个相关的变量,比如同一个数组中的不同元素,则可对intp1和intp2进行大小比较。三技能点详解——1指针的算术运算1)指针与一维数组定义了指向数组的指针,则指针可以像使用数组名一样,使用下标取值法对数组中的元素进行访问,指针还可以通过“*”符号访问数组元素,还可以直接移动指针访问数组中的数据。三技能点详解——2指针与数组charcha1[6]="hello";//定义一个字符数组,长度为6,hello后还要有一个/0字符char*chp,t; //定义一个chp字符指针和字符型变量tchp=cha1; //将数组地址赋值给指针chpt=chp[4]; //通过下标访问字符数组中的’o’字符,赋值给字符变量tt=*(p+4)//不移动指针,通过指针运算访问数组元素’o’字符

/***************************************移动指针,通过指针p+4后指向数组元素’o’字符,*然后通过*取值运算符访问字符****************************************/p=p+4;t=*p;2)指针与二维数组在二维数组arr中,arr[0]就表示第一行数据,arr[1]表示第二行数据。arr[0]、arr[1]相当于二维数组中一维数组的数组名,指向二维数组对应行的第一个元素,arr[0]=&arr[0][0],arr[1]=&arr[1][0]。在二维数组中,arr+i虽然指向的是该行元素的首地址,但它代表的是整行数据元素,只是一个地址,并不表示某一元素的值。*(arr+i)仍然表示一个地址,与arr[i]等价。*(arr+i)+j表示二维数组元素arr[i][j]的地址,等价于&arr[i][j],也等价于arr[i]+j。三技能点详解——2指针与数组通过ptr访问二维数组arr中的第2行第2列的元素:ptr[1][1]*(ptr[1]+1)*(*(ptr+1)+1)案例4.1.1一维数组指针/*******************************************内容简述:在程序中经常看到使用指针代替数组,*因为变量指针可以递增,而数组不能递增,数组*可以看成一个指针常量。下面的程序递增变量指*针,以便顺序访问数组中的每一个元素******************************************/#include

<stdio.h>intmain(){

int

arr[]={100,200,300};

int

i,*ptr;

ptr=arr; /*指针中的数组地址*/

for(i=0;i<3;i++){

printf("地址值:arr[%d]=%p\n",i,ptr);

printf("存储值:arr[%d]=%d\n",i,*ptr);

ptr++; /*通过自增运算让指针指向下一个位置*/}

return0;}三技能点详解——案例实例4.1.2二维数组指针通过指针数组p和一维数组a构成一个3×2的二维数组,并为a数组赋初值2、4、6、8、…。要求先按行的顺序输出此“二维数组”,然后再按列的顺序输出它。/****************************************内容简述:利用数组指针访问二维数组**************************************/#include

<stdio.h>intmain(){int

i,j,a[3][2]={2,4,6,8,10,12},*p[3];//定义一个指针数组*p[]

for(i=0;i<3;i++) p[i]=a[i];//利用指针p[i]获取每行数组a[i]的地址

for(i=0;i<3;i++){for(j=0;j<2;j++)

printf("%4d",p[i][j]);

printf("\n");}

for(i=0;i<2;i++){for(j=0;j<3;j++)

printf("%4d",p[j][i]);

printf("\n");}}三技能点详解——案例04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.2指针四技能点拓展——1NULL指针在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个NULL值是一个良好的编程习惯。赋为NULL值的指针被称为空指针。NULL指针是一个定义在标准库中的值为零的常量。在大多数的操作系统上,程序不允许访问地址为0的内存,因为该内存是操作系统保留的。然而,内存地址0有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。如需检查一个空指针,您可以使用if语句,如下所示:if(ptr)/*如果ptr非空,则完成后续操作*/if(!ptr)/*如果ptr为空,则完成后续操作*/四技能点拓展——2指向指针的指针指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向int类型指针的指针:int**vptr;四技能点拓展——3

无类型指针使用void*修饰的指针。无类型指针指向一块内存,但其类型不定,程序无法根据这种定义确定为该指针指向的变量分配多少存储空间,所以若要使用该指针为其他基类指针赋值,必须先转换成其他类型的指针。void *p1=NULL,*q1;//定义一个无类型的指针变量int *m1=(int*)p1;//将无类型的指针变量p强制转换为int*型再赋值四技能点拓展——3

案例1

/****************************************在程序中经常看到使用指针代替数组,因为变量*指针可以递增,而数组不能递增,数组可以看成*一个指针常量。下面的程序递增变量指针,以便*顺序访问数组中的每一个元素***************************************/#include

<stdio.h>intmain(){

intarr[]={100,200,300};

inti,*ptr;ptr=arr; /*指针中的数组地址*/

for(i=0;i<3;i++){printf("地址值:arr[%d]=%p\n",i,ptr);printf("存储值:arr[%d]=%d\n",i,*ptr);ptr++; /*通过自增运算让指针指向下一个位置*/}

return0;}四技能点拓展——3

案例2

/****************************************利用数组指针访问二维数组**************************************/#include

<stdio.h>intmain(){inti,j,a[3][2]={2,4,6,8,10,12},*p[3];//定义一个指针数组*p[]

for(i=0;i<3;i++) p[i]=a[i];//利用指针

p[i]获取每行数组a[i]的地址

for(i=0;i<3;i++){for(j=0;j<2;j++) printf("%4d",p[i][j]);printf("\n");}

for(i=0;i<2;i++){for(j=0;j<3;j++) printf("%4d",p[j][i]);printf("\n");}}04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.2指针五技能点检测完成课堂任务,在线提交;完成技能检测,在线提交;C语言程序设计基础与实践模块四编程高级应用任务4.3结构体C语言程序设计基础与实践课程组04技能点拓展03技能点详解02技能点分析目录CONTENTS任务4.3结构体01问题引入05技能点检测一问题引入现实生活中,我们对某一个物体的描述往往都是通过多个信息的组合来完成,比如一个人,他要有姓名、性别、身高、体重等等基本信息,否则无法完整描述一个人的所有特征。再比如描述书本的信息、动物的信息等等,也是如此。为了描述这类数据,在C语言中设计了一类数据,它描述的是一个对象的信息,但是是通过多种基本类型信息组合来完成,这种数据我们称之为“结构体”,那么结构体在使用时我们应该注意哪些事项呢?04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.3结构体二技能点分析1.结构体类型2.结构体与函数3.结构体数组学习目标1.什么是结构体?2.如何声明结构体?3.结构体变量访问有哪些方式?4.如何定义结构体数组?学期预习04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.3结构体C数组允许定义可存储相同类型数据项的变量,结构是C编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性:标题作者小标题出版号……struct结构体类型名称{

数据类型

成员1;

数据类型

成员2;

数据类型

成员n;}变量1,…变量n;三技能点详解——结构体三技能点详解——1结构体类型声明(1)结构体类型声明以关键字struct开头,后面跟的是结构体类型的名称,该名称的命名规则与变量名相同;(2)结构体类型与整型、浮点型、字符型等类似,只是数据类型,而非变量。(3)声明好一个结构体类型后,编译器并不为其分配内存。structBook{

chartitle[250]; //书的标题

charauthor[250]; //书的作者

charsubject[200]; //书的主题

int

bookid; //书的出版号}三技能点详解——2结构体变量定义1)先声明结构体类型,再声明结构体变量,例如:structBookbk1={“C语言编程”,“王教授”,“入门技术”,20220001},bk2={“BASIC语言编程”,“张教授”,“高级技术”,20220002};三技能点详解——2结构体变量定义2)在定义结构体类型的同时定义结构体变量structBook{

chartitle[250]; //书的标题

charauthor[250]; //书的作者

charsubject[200]; //书的主题

int

bookid; //书的出版号}bk1,bk2; //Book类型变量bk1,bk2三技能点详解——2结构体变量定义3)结构体变量初始化结构体变量初始化的方式和其他类型变量没有太多区别,主要有两种,就是先声明后初始化和定义事同时初始化两种形式/*声明结构体变量的同时对其进行初始化*/structBook{

chartitle[250];

charauthor[250];

charsubject[200];

int

bookid;

}bk1={“c语言编程”,”王教授”,”入门技术”,20220001};/*使用声明后的结构体类型定义结构体变量并对结构体变量初始化*/structBookbk2={“BASIC语言编程”,”张教授”,”高级技术”,202200022};三技能点详解——2结构体变量定义4)结构体数组的访问定义并初始化结构体变量的目的是使用结构体变量中的成员。在C语言中,访问结构体变量中成员的方式如下所示:结构体变量名.成员名例如访问上述定义的structstudentstu变量中的成员:/*声明结构体变量bk1,bk2,并对bk2初始化*/structBookbk1,bk2={“BASIC语言编程”,”张教授”,”高级技术”,202200022};/*通过bk1.titlel访问结构体的成员值赋值给bk1.title*/bk1.title=bk1.titlel;

三技能点详解——案例1/***************************************利用结构体类型编制一程序,实现输入一个学生*的数学期中和期末成绩。**************************************/#include

<stdio.h>voidmain(){structstudy{intmid;

intend;

intaverage; }math; printf("%s","请输入学生的期中和期末数学成绩:"); scanf("%d%d",&math.mid,&math.end); math.average=(math.mid+math.end)/2; printf("学生的期中和期末数学平均成绩是=%d\n",math.average);}三技能点详解——案例2

实例4.3.2

/*******************************************建立一个带有头结点的单向链表,链表结点中的数据*通过键盘输入,当输入数据为-1时,表示输入结束。*链表表空的条件是ph->next=’\0’)。******************************************/#include

<stdio.h>#include

<stdlib.h>//定义一个单向链表类型结构体,其中一个是int数值成员,另一个next是指针,用于指向下一个结点元素

structlist{

intdata; //储存数据的字段

structlist*next; //指向下一个structlist类型数据的指针

};

structlist*creatlist() /定义一个

structlist型指针函数creatlist(){structlist*p,*q,*ph;

inta;

/************************************************malloc()用于分配一个structlist类型存储空间,并*返回空间的地址存储在ph中********************************************/ph=(structlist*)malloc(sizeof(structlist));/********************************************创建单向链表,ph记录头指针,p记录新创建的节点,*q记录尾部节点*******************************************/p=q=ph; printf("输入整数,输入–1结束输入

:\n");scanf("%d",&a); //输入一个数据存储在a中

if(a!=-1) //如果第一个数不是-1,开始创建链表

{ph->data=a; //输入数据存储在a中

ph->next='\0'; //节点的next指针置为空'\0'三技能点详解——案例2

scanf("%d",&a);

while(a!=-1) //如果输入的数不是-1,继续创建链表 /*malloc()分配一个structlist类型存储空间作为新节点,地址存储在p中*/{p=(structlist*)malloc(sizeof(structlist)); p->data=a; //a赋值给新创建的链表节点的data成员中

q->next=p; //q节点的next指针指向新创建的节点

q=p; //q指针移动新创建的节点上,作为新的尾部节点

scanf("%d",&a); } p->next='\0'; //最后一个节点的next指针置为空'\0'

}

return(ph); //返回ph中的地址作为函数的返回值

}voidmain(){structlist*head,*p;head=creatlist(); p=head;

while(p!='\0') //通过p指针的移动访问、输出列表中的数据成员的值

{ printf("%d",p->data); p=p->next; //p指针的移动到下一个节点

};}04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.2指针四技能点拓展——1结构体与函数在函数间不仅可以传递简单的变量、数组、指针等类型的数据,还可以传递结构体类型的数据。结构体变量作为函数参数的用法与普通变量类似,都需要保证调用函数的实参类型和被调用函数的形参类型相同。可以把结构作为函数参数,传参方式与其他类型的变量或指针类似。函数间不仅可以传递一般的结构体变量,还可以传递结构体数组。使用结构体数组作为函数参数传递数据。四技能点拓展——2

typedef的使用C语言提供了typedef关键字,您可以使用它来为类型取一个新的名字。例如前面所学过的结构体、指针、数组、int、double等都可以使用typedef关键字为它们另取一个名字。使用typedef关键字可以方便程序的移植,减少对硬件的依赖性。基本用法如下typedef数据类型别名;四技能点拓展——3

指向结构的指针结构体指针变量用于存放结构体变量的首地址,所以将指针作为函数参数传递时,其实就是传递结构体变量的首地址。案例4.3.2的creatlist()函数设计中,就利用函数传递了structlist*类型的指针数据。04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.2指针五技能点检测完成课堂任务,在线提交;完成技能检测,在线提交;C语言程序设计基础与实践模块四编程高级应用任务4.4枚举和共用体C语言程序设计基础与实践课程组04技能点拓展03技能点详解02技能点分析目录CONTENTS任务4.4枚举和共用体01问题引入05技能点检测一问题引入有一类团体型的数据集合,比如一周7天的名称,天干地支名称,这些名称往往是组团使用的,或者有些特殊使用场合的信息。这类信息在C语言里可以使用自定义的枚举型来进行组织设计。此外,现实生活中,我们装很多东西时,一般是用大箱子装大东西,小箱子装小东西,但是也有些时候我们只需要装一个东西,但是不确定要装的东西是多大,我们就准备一个大箱子,小的可以装,大的也可以装,这样就不必准备大大小小的多个箱子。这类信息在C语言里可以使用共用体来进行组织设计。那么枚举和共用体在使用时有哪些注意事项呢?04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.4枚举和共用体二技能点分析1.枚举和共用体类型2.枚举的遍历3.共用体的定义与使用4.访问共用体成员学习目标1.什么是枚举?2.枚举可以遍历么?3.什么是共用体?4.结构体和共用体的区别?学期预习04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.4枚举和共用体枚举是C语言中的一种基本数据类型,它可以让数据更简洁,更易读。第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。三技能点详解——1枚举类型定义与使用枚举语法定义格式为:enum枚举名{枚举元素1,枚举元素2,……};enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。我们在这个实例中把第一个枚举成员的值定义为1,第二个就为2,enumDAY{MON,TUE,WED=7,THU,FRI,SAT,SUN};前面我们只是声明了枚举类型,接下来我们看看如何定义枚举变量。我们可以通过以下三种方式来定义枚举变量。(1)先定义枚举类型,再定义枚举变量enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};enumDAYday;(2)定义枚举类型的同时定义枚举变量enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN}day;(3)省略枚举名称,直接定义枚举变量enum

{MON=1,TUE,WED,THU,FRI,SAT,SUN}day1;三技能点详解——2共用体类型定义1)先声明公用体类型,再声明公用体变量定了定义共用体,您必须使用union语句,方式与定义结构类似。union语句定义了一个新的数据类型,带有多个成员。union语句的格式如下:union

共用体类型名称{

数据类型

成员名1;

数据类型

成员名2;……

数据类型

成员名n;};unionData{int

i;floatf;charstr[20];}; //定义共用体DataunionDatad1; //定义一个unionData类型变量d1三技能点详解——2共用体类型定义2)在定义结构体类型的同时定义结构体变量unionData{int

i;floatf;charstr[20];}d1; //定义共用体unionData同时定义变量d13)共用体成员的访问与使用为了访问共用体的成员,我们使用成员访问运算符(.)。成员访问运算符是共用体变量名称和我们要访问的共用体成员之间的一个句号。共用体变量名.成员名三技能点详解——2共用体类型定义在下面的例子中,我们会发现最先被访问和赋值的d1.i和d1.f是无法打印出来的,因为我们最后访问和赋值的d1.str把之前访问并赋值的成员数据都给覆盖了。#include

"stdio.h"#include

"string.h"unionData{

int

i;

floatf;

chars[100];};intmain(){unionDatad1; //定义共用体unionData变量datad1.i=10; //访问成员i并赋值d1.f=100.0; //访问成员f并赋值

strcpy(d1.s,"C程序设计"); //访问成员str

printf("d1.i:%d\n",d1.i);

printf("d1.f:%f\n",d1.f);

printf("d1.s:%s\n",d1.str);

return0;}三技能点详解——案例图4.4.1共用体变量d1的内部结构

#include

<stdio.h>#include

<stdlib.h>intmain(){/*声明一个包括3个英文颜色的enumcolor数据类型*/enumcolor{red=1,green,blue};

enumcoloruser_color; printf("请输入你喜欢的颜色:(1.red,2.green,3.blue):");scanf("%u",&user_color);

switch(user_color)

{

casered: //此处red=1printf("OK!喜欢的颜色是:红色");

break;

casegreen: //此处green=2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论