版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计活页式教程项目二:存储不同类型的数据项目任务知识目标学习目标任务1:用5个变量存储学生信息任务2:用运算符统计成绩任务3:输入和输出任务4:用结构体变量存储学生信息任务5:认识指针、枚举、共用体和空类型(1)了解信息在计算机内的存储形式。(2)了解标识符的意义和命名规则。(3)掌握常见的数据类型。(4)掌握常量和变量的定义和使用。(5)能够选择合适的数据类型变量,来存储相关数据。任务准备任务实施任务描述任务1用5个变量存储学生信息任务描述本任务要求定义5个变量存储学生的学号、姓名、性别、年龄、身高信息。要完成本任务,必须了解C语言中的变量、常量、数据类型等概念,因此,本任务将花大量篇幅讲解标识符、变量、常量、数据类型、运算符等基础知识,让学生初步具备用C语言操作常见数据的能力。任务准备任务实施Part
1Part
2Part
3任务描述任务准备1.标识符标识符是指用来标识某个实体(如变量名、常量名、函数名、数组名、数据类型名等)的一个符号。标识符的命名规则如下:(1)标识符只能由英文字母、数字和下划线组成,并且不能以数字开头。(2)标识符是区分大小写的,如XYZ与xyz、Xyz、xYZ是不同标识符。(3)自定义标识符不能使用系统的关键字。(4)标识符的长度是任意的,不同编译器要求不同。(5)标识符命名应该做到“见名知意”,最好用英文字母命名,切忌用中文命名。书写有大小写混排(如getAge)、小写加下划线(如get_age)等风格。任务准备关键字又称保留字,是指被C语言编译器所预定义的、具有特殊含义的标识符。这些关键字不能用作变量名、函数名或其他标识符的名称。下表是C语言中的全部32个关键字:autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile表2-1C语言的关键字任务准备2.数据类型C语言程序中的变量、常量、函数都需要指定数据类型。不同类型的数据在数据的存储形式、取值范围、占用内存大小及可参与的运算种类等方面都有所不同。C语言提供的数据类型分类如图2-1所示,主要有四种数据类型:基本类型、构造类型、指针类型和空类型。任务准备基本类型是不可再分的数据类型,包括整型、浮点型、字符型。基本类型的常量或变量通常代表单个数据。构造类型是由已知的基本类型通过一定的构造方法构造出来的类型,包括数组类型、结构体类型、枚举类型、共用体类型等。构造类型的常量或变量通常代表一批数据。指针类型实际上是地址类型,指针类型的数据就是内存中某个存储单元的地址。指针类型用于构造更复杂的数据结构,如链表、树等。空类型代表无类型,意味着该数据类型不包含任何可用值。它通常用于表示不返回值的函数、不指向任何地址的指针变量以及一些特殊的应用场景。任务准备(1)字符型字符型数据描述单个字符,它的类型名是char。字符型常量是用一对单引号括起来的字符,如'a'、'A'、'+'、'$'、'?'、'\n'都是合法的字符常量。在C语言中,字符型数据有以下特点:①字符常量是用单引号括起来的单个字符或转义字符,用双引号括起来的零个或多个字符是字符串常量。②每个字符数据在内存中占用1个字节,用于存储它的ASCII码值。③字符数据具有数值特征,可以像整数一样参加运算,此时相当于对它的ASCII码值进行运算。④字符'9'与整数9是不同的,字符'9'的ASCII码值是57。'9'-9的值是48,'9'-'0'的值是9。⑤小写字母的ASCII码值比大写字母的ASCII码值大32,字符'a'的ASCII码值是97,字符'A'的ASCII码值是65,'a'-'A'的值是32,'z'-'a'的值是25。⑥转义字符用于表示控制符(如回车、换行等)和不可见字符,以'\'开头,后面跟一个字符或用八进制数、十六进制数表示的ASCII码值。'\'的作用是改变后面的字符或ASCII码值的原有意义,转义为另外的含义。任务准备常用转义字符及其含义如表2-2所示。字符含义字符含义'\n'换行'\a'响铃报警'\r'回车(指来到行首位置)'\"'一个双引号'\0'空字符,用作字符串结束标志'\''单引号'\t'水平制表符'\\'一个反斜杠'\v'垂直制表符'\?'问号'\b'退格'\f'走纸换页'\ddd'1~3位八进制ASCII码值所代表的字符'\xhh'1~2位十六进制ASCII码值所代表的字符表2-2常见转义字符任务准备(2)整型整型类型用于描述整数。在C语言中,整型又可分为短整型、整型、长整型、无符号短整型、无符号整型和无符号长整型六种,其中整型最常用。C语言标准没有规定各类整型数据所占内存的字节数,各种类型的数据所占内存的大小随编译系统的不同而有差异,可以使用sizeof运算符计算某种数据类型占用内存的大小。在devcpp环境下,各种整型的关键字、占用内存字节数和取值范围如表2-3所示。整型常量即整数,包括正整数、零和负整数。在C语言中,整型常量可以用十进制、八进制和十六进制数表示。十进制数由数字0~9和正负号组成,如255、-864等。十进制数的特点是“逢十进一”。八进制数以数字0为前缀,由数字0~7组成,如0173、045等。八进制数的特点是“逢八进一”。十六进制数以0X或0x为前缀,由数字0~9、A、B、C、D、E、F(字母大小写均可,其中A~F分别代表10~15)组成,如0x45DE、0XA8C等。十六进制数的特点是“逢十六进一”。任务准备各种整型类型及其特点如表2-3所示。表2-3各种整型类型关键字类型占字节数取值范围shortint短整型2-32768~32767(-215~215-1)int整型4-2147483648~2147483647(-231~231-1)long长整型4-2147483648~2147483647(-231~231-1)unsignedshort无符号短整型20~65535(0~216-1)unsignedint无符号整型40~4294967295(0~232-1)unsignedlong无符号长整型40~4294967295(0~232-1)任务准备(3)浮点型浮点型也称为实型,是一种用于表示带有小数部分数值的数据类型,它可以存储非整数的数值,包括小数形式、指数形式的数值等。小数形式的浮点型数据由整数部分、小数点和小数部分组成,如12.345、-0.23等。指数形式的浮点型数据由尾数部分、字母e或E、指数部分组成,如5.79e-4、3.14E+5分别表示5.79×10-4、3.14×105。常见的浮点型数据类型有单精度浮点型(float)和双精度浮点型(double)。单精度浮点型使用4个字节共32位存储,可以表示约7位有效数字的数值,取值范围是-3.4e-38~3.4e+38。双精度浮点型使用8个字节共64位存储,可以表示约16位有效数字的数值,取值范围是-1.7e-308~1.7e+308。在C语言中,浮点型常量默认是double型,如果要使用float型常量,请在数值后面加字母f或F,如12.345f、-0.23F等。与整型表示一个准确的数值不同,浮点型数值在计算机上是近似表示的,单精度浮点型的近似程度比较低,而双精度型的近似得度比较高。任务准备浮点型数据在计算机编程中广泛应用于需要处理小数的场景,例如科学计算、金融计算、图形处理等。由于浮点数的存储方式和精度限制,它们可能存在一些精度损失和舍入误差的问题。在进行浮点数计算时,需要注意避免由于精度问题导致的计算错误。单精度浮点型与双精度浮点型的区别如表2-4所示。表2-4常见浮点型关键字类型占字节数取值范围常量举例float单精度浮点型4-3.4×10-38~3.4×103812.345f-1.7e4Fdouble双精度浮点型8-1.7×10-308~1.7×1030812.3455.79e-4任务准备(4)数组类型数组类型是一种构造类型,数组是相同类型数据的有序集合,数据类型可以是整型、浮点型、字符型这样的基础类型,也可以是结构体、指针等复杂类型。数组中的每个数据我们称之为“元素”,数组元素在内存中是连续存储的。一维数组的定义形式为:
数据类型数组名[数组长度];在定义数组时给数组元素集体赋值,称为数组的初始化。数组的初始化只能在定义数组时进行,之后只能给单个元素赋值。一维数组初始化的形式如下:
数据类型数组名[数组长度]={初值表};任务准备常见类型的数组定义和初始化如下:inta[10];intb[10]={0,1,2,3,4,5,6,7,8,9};doublec[6]={1.23,0.5,-4.3,5.55,3.14,6.3};charch1[5]={'a','b','c','d','e'};charch2[10]="abcde";/*直接用字符串常量给字符数组赋初值*/charch3[]="abcde";上述数组代码中,int、double、char都是基础类型,[]是数组的标志,a、b、c、ch1、ch2、ch3都是数组的名称。数组a是能存储10个整型数据的数组,但这10个整型数据是随机值;数组b能存储10个整型数据,它们分别是0~9;数组c能存储6个双精度浮点型数据,它们分别是1.23、0.5、-4.3、5.55、3.14、6.3;数组ch1能存储5个字符,它们分别是a、b、c、d、e;数组ch2能存储10个字符,它可以在定义时用字符串常量"abcde"赋初值,并自动在末尾添加'\0'作为字符串的结束标志,因此ch2还有4个元素没有赋值;数组ch3没有给出能存储的字符个数,它的存储空间大小由初始值"abcde"来决定。一般用字符数组来存储字符串,而且要求该字符数组的空间足够大。本任务中学生的学号、姓名就是字符串,用字符数组来存储。任务准备3.常量在C语言中有三种形式的常量,它们分别是直接常量、符号常量和const常量。(1)直接常量直接常量又分字符型常量、整型常量、浮点型常量和字符串常量。字符型常量是用单引号括起来的单个字符或转义字符,可以是'a'、'A'、'+'、'$'、'?'、'\n'等。整型常量可以是十进制整数255、-864,也可以是八进制整数0173、045,还可以是十六进制整数0x45DE、0XA8C。浮点型常量可以是单精度浮点数12.345f、-0.23f、-1.7e4F,也可以是双精度浮点数12.345、-3.14、5.79e-4。因为浮点数默认是双精度浮点型,所以单精度浮点数后面要加f或F来区分。字符串常量是用双引号括起来在的零个或多个字符,如""、"abcde"都是字符串常量,它们存储在内存中时会自动在末尾添加'\0'作为结束标志。通常用字符数组来存储字符串常量,因此,可以像访问数组元素一样访问字符串中的每一个字符。需要注意的是,在C语言中只有字符串常量,没有字符串变量。任务准备(2)符号常量符号常量也称宏常量,是指用一个标识符代表一个常量,这时该标识符与常量等价。符号常量在使用之前必须先定义,一般形式为:#define标识符常量值其中,“#define”是C语言的一个预处理指令,“define”为宏定义命令,“标识符”为所定义的宏名,三个组成部分均用空格隔开。#define的作用类似于替换,用“标识符”替换“常量值”。例如:#definePRICE20#definePI3.14159#definePI23.14159;上述代码中,符号常量PRICE的值是20,程序中该命令之后出现的所有标识符PRICE均用20代替。符号常量PI的值是“3.14159”,而符号常量PI2的值却是“3.14159;”,因此,除非特殊需要,符号常量的值一般不出现分号。任务准备(3)const常量const是C语言的关键字,用const修饰的标识符为常量。const常量只能在定义时赋初值,在程序中只能读取它的值,不能修改。const常量的定义形式为:
const数据类型常量名=常量值;例如:constdoublePI=3.14159;constintLEN=25;在之后的程序代码中,无法修改常量PI和LEN的值,只能读取。当程序中多次用到某个常量值,后续修改时需要修改很多处代码,这时就可以考虑将该常量值定义成const常量或符号常量。const常量与#define定义的符号常量也有区别:const常量有数据类型,会对常量值的类型进行检查,还可以对const常量进行调试;而符号常量只进行字符串替换,不进行类型检查,且不能对符号常量进行调试。任务准备3.变量变量是指在程序运行期间其值可以发生变化的量。变量用于从外部接数据、保存一些不断变化的值、保存中间结果及最终结果,而这些都无法用常量来实现。一个变量应该有一个名字即变量名,在内存中占据一定的存储单元,在该存储单元中存放变量的值。程序在编译时由系统给变量分配一定的内存空间,程序中对变量进行处理时,实际上是通过变量名找到相应的内存空间,读取或修改其中的数据,也就是变量的值。在C语言中,变量必须遵循“先定义后使用”的原则,即每个变量在使用之前都要先定义,在定义时指明该变量的数据类型。变量定义语句有如下几种形式:数据类型变量名;数据类型变量名=初始值;数据类型变量名1,变量名2,…,变量名n;数据类型变量名1,变量名2=初始值2,…,变量名n;定义单个变量时,要给出数据类型和变量名,中间用逗号隔开;在定义变量时可以赋初值,在变量名后面用等号连接初始值;多个同类型的变量可以一起定义,变量名中间用逗号隔开;多个同类型的变量一起定义时,也可以给部分变量名赋初值。任务准备【实例1】定义一个char变量、int变量、float变量、double变量和char数组并赋初值,然后输出到屏幕。#include<stdio.h>intmain(){ charch1='\n',ch2='A'; intx=100; floatf=1.78F; doubled=3.14; charname[20]="zhangsan"; printf("ch1=%c,ch2=%c,x=%d,f=%f,d=%lf,name=%s",ch1,ch2,x,f,d,name); return1;}编译运行结果如图2-2所示:图2-2实例1运行结果任务准备任务实施Part
1Part
2Part
3任务描述任务实施【任务1】用5个变量存储学生信息:学号10001、姓名zhangsan、性别m或f、年龄19、身高1.75,然后输出学生信息。1.任务分析本任务考查不同类型数据的存储、变量的定义和输出。学生的学号、姓名、性别、年龄和身高数据,分别对应C语言中不同数据类型,因此本任务首先要确定学生信息所对应的类型。任务实施学生的学号、姓名的值是字符串常量,用字符数组存储,并且要求字符数组的容量足够大。初学者很容易将由数字组成的数据都归为整数类型或浮点数类型,而实际上学号、身份证号、电话号码、准考证号等都由数字组成,但它们并不代表大小,也不参与算术运算,这些数字只是组成一定意义的字符串。因此,在编程中常用字符数组来存储表示学号、身份证号、电话号码、准考证号的字符串常量。一些号码如果用整型变量存储会引起歧义甚至导致编译错误,如果准考证号“0004321”被赋值给整型变量,它会被编译系统认为是一个八进制整数,与字符串“0004321”完全不同。学生的性别用char类型变量来存储,值只能是字符“M”或“F”,分别表示Male(男性的)和Female(女性的)。在C语言中,char类型数据占1个字节,而汉字“男”占2个字节,因此性别的值不能是汉字“男”或“女”。但在Java语言中,char类型占2个字节,可以存储一个汉字。学生的年龄用int型变量存储,身高用浮点型变量存储,单精度或双精度均可。任务实施2.任务实现本任务的实现代码如下,请将代码中定义变量的类型补充完整。#include<stdio.h>intmain(){
xh[20]="10001"; /*学号不超过20个字符*/
xm[50]="zhangsan"; /*姓名不超过50个字符*/
xb='m'; /*性别是一个字符,用单引号*/
nl=19; /*年龄*/
sg=1.75f; /*身高*/ printf("学号:%s,姓名:%s,性别:%c,年龄:%d,身高:%.2f\n",xh,xm,xb,nl,sg); return100;}编译运行的结果如图2-3所示:图2-3输出学生信息任务实施3.任务总结本任务要求学号不超过20个字符,姓名不起过50个字符。用库函数printf()输出时,格式字符串(即第1个参数)中的%s、%s、%c、%d、%.2f分别对应字符数组xh、字符数组xm、字符变量xb、整型变量nl、单精度浮点型变量sg的值,其中%.2f表示输出的浮点型数据精确到小数点后两位。任务准备任务实施任务描述任务2:用运算符统计成绩任务描述本任务要求用数组存储某学生的语文、数学、英语、物理、化学课程的成绩,统计五门课程的平均分,并判断平均分是否及格。完成本任务需要定义数组,掌握下标运算符、算术运算符、强制转换运算符、条件运算符的使用。因此,本任务将讲解算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符、强制类型转换运算符、分量运算符、下标运算符的基础知识,让学生初步具备用使用运算符操作数据的能力。任务准备任务实施Part
1Part
2Part
3任务描述任务准备1.算术运算符算术运算符有+、-、*、/、%,它们分别对应数学运算的加、减(或取反)、乘、除、取余,其中“-”即是减法运算符(双目),也是取反运算符(单目)。两个整数进行算术运算的结果仍是整数,例如7+3得10,7-3得4,7*3得21,7/3得2,7%3得1。用算术运算符将操作数连接起来的式子,称为算术表达式。在C语言中两个整数相除的结果仍然是整数,没有小数部分。只有将某个操作数先变成小数再参与除法运算,才能得到小数的结果。因此,欲得到7/3的小数结果,可以采用7.0/3、1.0*7/3或(double)7/3运算,其中(double)7是将整数7强制转换成双精度浮点数7.0。参与取余运算(%)的两个操作数必须是整数,运算的结果是整除后所得的余数。例如7%3的结果是1,12%7的结果是5。任务准备各算术运算符中,-(取反)的优先级最高,其次是*、/、%,最后是+、-(减法)。在同优先级的算术运算符中,运算顺序是从左向右。详细说明如表2-5所示。表2-5算术运算符的优先级和结合性运算符类型优先级结合性备注-单目高
低从右向左计算取反*/%双目从左向右计算乘除取余+-双目从左向右计算加减任务准备【实例1】给定一个圆的半径,求出该圆的面积,然后输出到屏幕。#include<stdio.h>#definePI3.14159intmain(){ doubler=5,s; s=PI*r*r; printf("半径为%lf的圆面积是:%lf\n",r,s); return1;}编译运行结果如图2-4所示:图2-4求圆的面积任务准备2.关系运算符C语言提供了<、<=、>、>=、==、!=共6种关系运算符,它们分别对应小于、小于等于、大于、大于等于、等于、不等于共6种关系。用关系运算符将操作数连接起来的式子,称为关系表达式。例如a>b、m==0、x!=5、y<=10等都是关系表达式,它们大多用作判断条件。关系表达式的结果是“真”或“假”,代表条件成立或不成立。在C语言中,用0表示“假”,用1表示“真”,任何非零值都能够被系统解释为“真”。关系表达式大多用在if语句、for语句和while语句中,例如:if(x>0){……} /*如果x>0成立,则执行{}中的代码*/for(i=0;i<10;i++){……} /*重复执行{}中代码的条件是i<10成立*/while(i<10){……} /*重复执行{}中代码的条件是i<10成立*/任务准备3.逻辑运算符逻辑运算也称布尔运算,C语言提供了&&、||、!三种逻辑运算符,它们分别是逻辑与、逻辑或、逻辑非。用逻辑运算符将操作数连接起来的式子,称为逻辑表达式。逻辑与运算连接两个条件表达式,表达“并且”的含义。当两个条件表达式都成立时,逻辑与表达式的结果为真(即成立);只要有一个条件表达式不成立,逻辑与表达式的结果为假(即不成立)。例如,数学式子0<x<100对应的逻辑表达式是:(x>0)&&(x<100)由于>、<运算符的优先级比&&运算符高,因此该逻辑表达式也可以写成这样:x>0&&x<100又如,判断字符变量ch的值是不是小写字母的逻辑表达式是:ch>='a'&&ch<='z'任务准备逻辑或运算连接两个条件表达式,表达“或者”的含义。只要有一个条件表达式成立,逻辑或表达式的结果为真(即成立);当两个条件表达式都不成立时,逻辑或表达式的结果为假(即不成立)。例如,表达x<0或者y>100的逻辑表达式是: x<0||y>100又如,判断字符变量ch的值是不是字母(包含大写字母和小写字母)的逻辑表达式是: (ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')上述式子表达的是“ch是小写字母或者ch是大写字母”,因此||运算符两侧的小括号不能省略。再如判断某一年year是否是闰年,必须满足下列两个条件之一:①年份能被4整除,但不能被100整除。②年份能被400整除。由于==、!=运算符的优先级比&&、||运算符高,因此证明year是闰年的逻辑表达式可以写成: (year%4==0&&year%100!=0)||year%400==0任务准备逻辑非运算是单目运算符,只需要一个操作数。所有单目运算符的优先级都比其他运算符的优先级高,因此,运算符!的优先级最高,其次是&&,再次是||。例如,假设整型变量x=5,则!x得到0;假设整型变量y=0,则!y得到1。即对非零值进行逻辑非运算会得到0,对0进行逻辑非运算会得到1。逻辑非表达式常用在if语句中作条件,如if(!x)表达的是“如果x等于0”,与if(x==0)是同样的意思;而if(x)表达的是“如果x不等于0”,与if(x!=0)是同样的意思。任务准备4.赋值运算符赋值运算是指将一个数据赋给一个变量,赋值运算符用“=”表示。赋值运算的操作是有方向性的,它将等号右侧表达式的值赋给左侧的变量,等号左侧不允许是表达式。由赋值运算符和操作数组成的表达式称为赋值表达式,其一般形式为:变量名=表达式;例如,x=25是将常量25赋值给变量x;y=y+1是将变量y的值加1后,再赋值给变量y;而x+y=z则是错误的赋值表达式,因为等号左侧不能是x+y这样的表达式。由于赋值运算符比算术、关系、逻辑等运算符的优先级都要低,所以赋值表达式会先执行等号右侧的运算,再将运算结果赋值给等号左侧的变量。因此,x=y=z=a+25也是正确的赋值表达式的写法。但在C语言中,“=”代表赋值,“==”代表比较是否相等,使用时要注意区分。任务准备C语言中还有一种特殊形式的赋值运算符,称为复合赋值运算符。常见的复合赋值运算符有+=、-=、*=、/=和%=,它们表示将左侧变量的值与右侧表达式的值进行相应的运算后,再赋值给左侧的变量。例如,x+=5表示x=x+5;y/=a+3表示y=y/(a+3)。此外,增1运算符++和减1运算符--也暗含赋值操作。例如,x++和++x等价于赋值表达式x=x+1,x--和--x等价于赋值表达式x=x-1。但++x表示先将x加1,再进行其它操作,如y=++x表示先执行x=x+1,再执行y=x。而x++表示先执行其它操作,再将x加1,如y=x++表示先执行y=x,再执行x=x+1。减1运算也是同样的流程。假设有int型变量x的值为3,对它分别执行增1运算和减1运算后赋值给int型变量y,x与y之间的关系如表2-6所示。关于增1和减1运算符,有些教材上会出现一些令人费解的写法,如y=-x++、y=a+++b等。建议初学者不要写类似的代码,可以考虑将y=-x++写成:y=-x;x++; /*或者x=x+1*/可以将y=a+++b写成:y=a+b;a++;任务准备语句等价的语句执行语句后的y值执行语句后的x值y=x++;y=x;x=x+1;34y=++x;x=x+1;y=x;44y=x--;y=x;x=x-1;32y=--x;x=x-1;y=x;22表2-6增1和减1运算任务准备5.位运算符位运算是一种对二进制数进行操作的运算方法。C语言提供了丰富的位运算符号,可用于对二进制数进行各种运算。位运算只能用于整型变量和字符型变量,不能用于浮点型变量。C语言提供了六个位运算符号,分别是按位取反~、按位与&、按位或|、按位异或^、左移位<<、右移位>>。按位取反运算符“~”是单目运算符,其功能是对操作数的每个二进制位取反,即1变为0,0变为1。按位与运算符“&”是双目运算符,其功能是参与运算的两数各对应的二进制位相与。对应的两个二进制位只要有一个为0时,结果位就会为0;只有对应的两个二进制位都为1时,结果位才为1。参与运算的两个数均以补码出现。按位或运算符“|”是双目运算符,其功能是参与运算的两数各对应的二进制位相或。只要对应的两个二进制位有一个为1时,结果位就为1,其它情况结果位为0。当参与运算的是负数时,参与两个数均以补码出现。任务准备按位异或运算符“^”是双目运算符,其功能是将参与运算的两数各对应的二进制位相异或。只要对应的两个二进制位不同,结果位就为1,相同则结果位为0。当参与运算的是负数时,参与两个数均以补码出现。按位左移运算符“<<”是双目运算符,其功能将一个运算对象的各二进制位全部左移若干位,左边的二进制位丢弃,右边补0。每左移一位,相当于该数乘以2。例如,x<<n表示把x的每一位向左平移n位,右边空位补0。按位右移运算符“>>”是双目运算符,其功能将一个运算对象的各二进制位全部右移若干位,右边的二进制位丢弃,正数左边空位补0,负数左边空位补1。每右移一位,相当于该数除以2。例如,x>>n表示把x的每一位向右平移n位,正数左边补0,负数左边补1。任务准备【实例2】给定两个char类型的数据,对它们进行六种位运算并输出结果。intmain(){ unsignedchara=60; /*二进制:00111100*/ unsignedcharb=9; /*二进制:00001001*/ unsignedcharc=~a; /*二进制:11000011*/ unsignedchard=a<<1; /*二进制:01111000*/ unsignedchare=a>>1; /*二进制:00011110*/ unsignedcharf=a&b; /*二进制:00001000*/ unsignedcharg=a|b; /*二进制:00111101*/ unsignedcharh=a^b; /*二进制:00110101*/ printf("60按位取反:%d\n",c); printf("60左移1位:%d\n",d); printf("60右移1位:%d\n",e);图2-5各种位运算的结果 printf("60与9按位与:%d\n",f); printf("60与9按位或:%d\n",g); printf("60与9按位异或:%d\n",h); return1;}任务准备6.条件运算符条件运算符是C语言中唯一的一个三目运算符,它用?和:将三个操作数分开。条件运算符的语法格式为:
表达式1?表达式2:表达式3表达式1为关系表达式,结果为真或假。如果表达式1为真,则返回表达式2的值,否则返回表达式3的值。在条件运算符中,表达式2和表达式3必须是同种数据类型,否则编译器将会自动进行类型转换。条件运算符通常用在赋值语句中,可以根据条件进行不同的赋值操作。条件运算符经常作为if语句的简捷形式来使用。例如,求两个整数中的最大值,可以使用以下代码:intx=32;inty=17;intz=(x>y)?x:y;如果x大于y,条件表达式“(x>y)?x:y”返回x的值,否则返回y的值。不管x与y的是怎样的大小关系,该条件表达式都返回它们中的最大值。任务准备7.逗号运算符逗号运算符是指逗号“,”,它将多个表达式连接起来构成逗号表达式,它的作用是实现对各个表达式的顺序求值。逗号表达式的一般形式为:
表达式1,表达式2,…,表达式n逗号表达式先从左到右依次计算每个表达式的值,并把最后一个表达式的值作为整个逗号表达式的值。例如逗号表达式“x=2,y=3,z=x+y”,先计算x=2的值,再计算y=3的值,最后计算z=x+y的值,结果为5,则整个逗号表达式的值为5。再如表达式“y=(x=2,3*x)”中,括号内的“x=2,3*x”就是一个逗号表达式,它先计算x=2的值,再计算3*x的值,得结果6,最后将6赋值给变量y。逗号表达式还用于for语句,用于同时对多个循环变量赋初值和修改多个循环变量。例如“for(i=0,j=10;i<j;i++,j--){}”中的“i=0,j=10”和“i++,j--”就是逗号表达式。但定义多个同类型变量的语句“intx,y,z”就不是逗号表达式。任务准备8.指针运算符指针就是地址,在C语言中有两个关于指针的运算符:取地址运算符&和指针运算符*。&是取地址运算符,&x即是变量x在内存中的实际地址。*是指针运算符,它返回其操作数(即一个指针)所指向的对象的值,*tp即是地址变量tp所指向的存储单元中的数值。任务准备9.求字节数运算符sizeof是C语言的一种单目运算符,它返回操作数所占内存的字节数。操作数可以是一个常量、变量、类型名、数组名等,操作数的存储大小由操作数的类型决定。例如,如果x是int型变量,则sizeof(x)和sizeof(int)都返回4;sizeof(3.14)返回double类型数据所占的字节数8;如果有数组inta[10],则sizeof(a)返回40,因为数组a占据10个int型数据的空间。sizeof运算符多用在申请内存空间时,计算存储某类型数据所需要的字节数。任务准备10.强制类型转换运算符类型转换是指将一种数据类型的值转换为另一种数据类型的过程。在C语言中,不同类型的数据在一起运算时,要先将这些数据转换成相同的类型,再进行运算。通常类型转换发生在字符型、整型和浮点型之间,分自动类型转换和强制类型转换。将不同类型的数据一起运算时,编译系统会自动进行类型转换,会把占用内存空间少的类型向占用空间多的类型转换,以保证运算结果的精度。当不同类型的数据在一起运算时,自动转换的规则为:①float型数据自动转换成double型;②char与short型数据自动转换成int型;③int型数据自动转换成double型;④int型数据自动转换成unsigned型;⑤int型数据自动转换成long型。任务准备强制类型转换是将某种类型的数据强制转换成指定的数据类型,强制类型转换表达式的一般形式为:
(类型名)(表达式)强制类型转换运算符形如“(类型名)”,其后跟一个表达式,作用是将该表达式的结果转换成指定的数据类型。当表达式是一个变量或常量时,表达式不需要加小括号。将整型数据强制转换为浮点型,数据的大小不变。如“(double)5”将得到double型数据5.000000,原先占4个字节的整数5变成了占8个字节的双精度浮点型数5.000000。因此,当想让两个整数相除后得到小数结果时,可以考虑将其中一个整数强制转换成浮点型,如“(double)5/3”或“5/(double)3”都能得出结果为1.666667。将浮点型数据强制转换为整型,会损失数据的精度。如“(int)3.14”将得到int型数据3,原先占8个字节的双精度浮点型数3.14变成了占4个字节的整型数3。C语言还提供了几个类型转换的库函数,如函数atof()的功能是把字符串转换成浮点数,函数atoi()的功能是把字符串转换成整型数,函数atol()的功能是把字符串转换成长整型数,函数gcvt()的功能是把浮点数转换成字符串,函数strtod()的功能是把字符串转换为double型值,函数strtol()的功能是把字符串转换为长整型数。任务准备11.分量运算符分量运算符包括“.”和“->”,它们用于访问结构体变量中的成员。引用结构体变量的成员用“.”运算符,引用结构体指针的成员用“->”运算符。假如一个指针变量p指向结构体变量,则“结构体变量.成员名”、“(*p).成员名”、“p->成员名”这三种访问形式是等价的。关于结构体类型将在后续章节讲解。任务准备12.下标运算符下标运算符由一对中括号[]组成,它有两个操作数,一个是数组名,另一个是下标。它与数组名和下标一起使用,作用是获取数组的某个元素。下标运算符的语法格式如下:数组名[下标]下标是数组元素的编号,在C语言中下标是从0开始计数的。例如,用“inta[10]”定义一个能存储10个整数的数组,它的10个元素的下标是0~9,这10个元素分别是a[0]、a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]。可以通过“a[i]”形式读取或修改下标为i的元素的值。任务准备13.运算符优先级和结合性只有掌握了运算符的优先级和结合性,才能正确地使用运算符。当一个表达式中出现不同类型的运算符时,先对优先级高的运算符进行运算,再对优先级低的运算符进行运算。当几个运算符的优先级相同时,则根据运算符的结合性确定运算顺序。运算符的结合性规定了运算时的结合方向:左结合和右结合。左结合规定从左向右计算,右结合规定从右向左计算。任务准备表2-7运算符的优先级和结合性优先级运算符含义运算类型结合方向1()[]->.圆括号数组下标指向结构体成员引用结构体成员初等运算符自左向右2!~-++--*&(类型名)sizeof逻辑非按位取反求负自增自减取指针内容取地址强制类型转换长度运算单目运算符从右向左优先级运算符含义运算类型结合方向3*/%相乘相除取余算术运算符自左向右4+-相加相减5<<
>>
左移右移位运算符6>
<
>=<=大于小于大于等于小于等于关系运算符7==!=等于不等于8&按位与位运算符9^按位异或10|按位或11&&逻辑与逻辑运算符12||逻辑或13?:条件运算三目运算符自右向左14=+=-=*=/=%=&=^=|=>>=<<=赋值运算复合赋值运算赋值运算符15,逗号运算逗号运算符从左到右任务准备任务实施Part
1Part
2Part
3任务描述任务实施【任务1】用数组存储某学生的语文、数学、英语、物理、化学课程的成绩(整数),统计这五门课程的平均分,并判断平均分是否及格。1.任务分析本任务考查数组的定义和初始化,以及下标运算符、算术运算符、强制转换运算符、条件运算符的使用。任务要求五门课程的成绩必须是整数,所以可以用整型数组存储。这五门课程的平均分可能是小数,所以可以用浮点型变量存储,单精度和双精度均可。求五门课的总成绩,要用下标运算符访问每一个数组元素,用算术运算符将五个成绩相加。由于两个整数相除只能得到整数结果,所以需要先将总成绩强制转换成小数,再除以5,才能得到保留小数部分的平均分。最后在条件运算表达式中比较平均分与60的大小,判断平均分是否及格。任务实施2.任务实现本任务的实现代码如下,请将代码中空白处补充完整。#include<stdio.h>intmain(){ /*语文数学英语物理化学*/ intcj[5]={75,48,92,78,80}; /*定义数组并初始化*/ intzf; doublepjf; zf=
; /*求总分*/ pjf=
; /*求平均分*/ printf("平均分:%.2lf\n",pjf); printf("%s\n",
?"及格":"不及格");/*条件表达式*/ return0;}编译运行的结果如图2-6:图2-6求平均分任务实施3.任务总结第二个输出语句中的条件表达式的结果是"及格"或"不及格",是字符串常量,因此用printf()函数输出该结果时用“%s”格式。任务准备任务实施任务描述任务3输入和输出任务描述本任务要求输入学生的学号、姓名、性别、年龄、身高,用5个变量存储,然后输出学生信息。要完成本任务,必须熟练掌握输入函数scanf()和输出函数printf()的用法。因此,本任务将讲解C语言常见的输入输出函数的用法,让学生具备输入和输出常见数据的能力。本任务主要涉及字符串型、字符型、整型、浮点型数据的输入、存储和输出。任务准备任务实施Part
1Part
2Part
3任务描述任务准备1.getchar()和putchar()函数getchar()函数用于从键盘缓冲区读取一个字符并返回该字符,它没有参数,一般将返回的字符存入字符变量或输出。输入内容以回车键作为结束标志。putchar()函数用于将参数中的字符数据输出到屏幕。它们在头文件stdio.h中定义,常见用法如下:charch=getchar();putchar(ch);任务准备【实例1】输入两个字符并存储,再输出这两个字符。#include<stdio.h>intmain(){ charch1,ch2; printf("请输入两个字符:");/*原样输出字符串内容*/ ch1=getchar(); /*读取输入的一个字符*/ ch2=getchar(); printf("它们是:"); putchar(ch1); /*输出一个字符*/ printf("%c",ch2); /*putchar(ch2);*/ return1;}编译运行结果如图2-7所示:图2-7字符的输入和输出任务准备实例代码中,putchar(ch)与printf("%c",ch)的功能相同,都能输出一个字符。用户的输入以回车键表示结束,getchar()会依次读取输入内容中的一个字符。当需要读取两个输入字符时,可以连续输入两个字符再回车,如输入“AD”后回车,字符A和D就会分别被两个getchar()函数读取到。如果输入“A”后回车,再输入“D”后回车,则不会得到想要的结果,因为第一个getchar()函数会读取到字符A,第二个getchar()函数会把第一个回车符当作字符读入,而不是字符D。因此,在连续输入多个数据时,要避免字符数据读入错误。任务准备2.printf()函数printf()函数用于在标准输出设备(屏幕)输出数据,其一般调用格式为:printf("格式控制字符串");printf("格式控制字符串",输出值参数表);输出值参数表是要输出的数据,这些数据可以是常量、变量或表达式,它们以逗号隔开。格式控制字符串也称格式字符串,它表示想要输出的格式。格式字符串可以包括两部分:普通字符和格式转换说明符。格式字符串中的普通字符会原样输出,而格式转换说明符则将对应的输出值参数按指定的格式输出,其以%开头,后面跟具有特定意义的字符。输出值参数必须与格式转换说明符在类型、个数和位置上一一对应。格式转换说明符能控制输出数据的类型、对齐方式、长度、小数位数等,如%d对应输出int型数据,%5d对应输出占5个字符位置并靠右对齐的int型数据,%-5d对应输出占5个字符位置并靠左对齐的int型数据,%f对应输出float型和double型数据,%6.2f对应输出占8个字符位置并且小数点后保留2位的浮点型数据。任务准备printf()函数的格式转换说明符及其含义如表2-8所示。格式转换说明符含义%d或%i输出带符号的十进制整数,正数的符号省略。%md输出带符号的十进制整数,右对齐,占m位,不足m位补空格,超过m位则原样输出。%-md输出带符号的十进制整数,左对齐,占m位,不足m位补空格,超过m位则原样输出。%0md输出带符号的十进制整数,右对齐,占m位,不足m位补0,超过m位则原样输出。%u以无符号的十进制整数形式输出%o以无符号的八进制整数形式输出,不输出前导符0。%x以无符号的十六进制整数形式(小写)输出,不输出前导符0x。%X以无符号的十六进制整数形式(大写)输出,不输出前导符0X。%f以十进制小数形式输出浮点型数据,包括单精度和双精度浮点型。%m.nf以十进制小数形式输出浮点型数据,占m位,小数点后保留n位。%e或%E以指数形式输出浮点型数据,指数部分为e或E%c输出一个字符,包含转义字符。%s输出字符串。%p输出变量的地址。%%输出百分号%。表2-8printf()函数的格式转换说明符任务准备【实例2】用printf()函数输出字符、整数、浮点数、字符串和变量地址。intmain(){ charch='A'; intx=15; doubley=31.459; charstr[100]="abcdefg"; printf("ch=%c\n",ch); printf("x=%d,x=%-5d,x=%05d\n",x,x,x); printf("x=%o,x=%x,x=%X\n",x,x,x); printf("y=%f,y=%8.2f,y=%e\n",y,y,y); printf("str=%s\n",str); printf("x的地址:%p\n",&x); return0;}其中%p对应地址数据,需要用&符号取变量x的地址。图2-8printf()输出常见类型数据任务准备3.scanf()函数scanf()函数用于从标准输入设备(键盘)输入数据,存储指定的地址单元中。其一般调用格式为: scanf("格式控制字符串",参数地址表);与printf()函数类似,scanf()函数的格式字符串也可以分为普通字符和格式转换说明符,普通字符必须原样输入,格式转换说明符则与参数地址在数据类型、个数和位置上一一对应。格式转换说明符要求按指定的格式输入数据,其以%开头,后面跟具有特定意义的字符。例如,%d对应int型数据的输入,%f对应float型数据的输入,%lf对应double型数据的输入,%c对应char型数据的输入,%s对应字符串的输入。任务准备scanf()函数的格式转换说明符及其含义如表2-9所示:表2-9scanf()函数的格式转换说明符格式转换说明符含义%d或%i输入十进制整数。%o输入八进制整数。%x输入十六进制整数。%c输入一个字符,空格、回车、制表符(Tab)也作为有效字符输入。%s输入字符串,遇到空格、回车、制表符时结束。%f输入单精度浮点数。%lf输入双精度浮点数。%e以指数形式输入浮点型数据。任务准备使用scanf()函数进行数据输入时,需要注意以下情况。①输入整数和浮点数intx;scanf("%d",&x);输入一个整数时,正常应该输入一个整数后回车,如输入“15”后回车,变量x就会存储输入的15。当非法输入“15a34”、“15.34”时,系统能自动截取15作为输入数据,而输入“a1534”、“.1534”则无法得到正确的输入数据。floaty;scanf("%f",&y);输入“3.14”、“3.14a56”、“3.14.56”都能得到3.14作为输入的浮点型数据,而“a3.14”则无法得到正确的输入数据。doublez;scanf("%lf",&z);输入双精度浮点数时,必须用“%lf”格式转换说明符才能得到正确的输入。任务准备intx;floaty;scanf("%d%f",&x,&y);当几个格式转换说明符相邻出现,如“%d%f”,要求连续输入整数或浮点数。这时,每个数之间以空格、回车或制表符隔开,这样才能获得正确的输入值。scanf("%d,%f",&x,&y);当几个格式转换说明符用逗号隔开,如“%d,%f”,输入的数据也要用逗号隔开。scanf("x=%d,y=%f",&x,&y);格式字符串中的普通字符原样输入,上述语句正确的输入是“x=15,y=3.14”。任务准备②输入字符charch;scanf("%c",&ch);输入一个字符后回车,输入的字符就会被存储在字符变量ch中。intx;floaty;charch;scanf("%d%c%f",&x,&ch,&y);当用“%d%c%f”来连续输入整数、字符、浮点数时,只能输入“15A3.14”形式的数据,系统会自动识别15是整数,A是字符,3.14是浮点数。它们之间不能出现空格、回车、制表符,因为15之后的非数字字符都会被识别成输入字符。例如,当输入“15A3.14”,15后的空格会存入变量ch中,之后的浮点型变量y将无法获取到正确的输入。任务准备intx;floaty;charch;printf("请输入年龄:");scanf("%d",&x);/*用函数fflush(stdin)清除缓冲区里的回车字符*//*或者用函数getchar()接收输入年龄后的回车字符*/printf("请输入性别:");scanf("%c",&ch);printf("请输入身高:");scanf("%f",&y);当要求输入一个整数、一个字符和一个浮点数并以回车键分隔时,第一个回车键势必会被识别成输入字符,造成无法获取到正确的输入数据。因此,可以调用fflush(stdin)清除缓冲区里的回车字符,或者调用getchar()接收输入年龄后的回车字符,这样才能保证接下来的能正确输入字符数据。键盘缓冲区可以认为是内存里的一块区域,从键盘输入的字符(包括回车)都在缓冲区里排队,等待scanf()函数按顺序读取。scanf()函数用%d只能读取回车键之前的整数,回车字符依然在缓冲区中。当scanf()函数再次用%c从缓冲区读取一个字符时,它将读取到队伍最前面的回车字符。因此,用fflush()函数清除缓冲区中的回车符,或用getchar()函数取出缓冲区中的回车符后,才能保证接下来scanf()函数读取的字符就是用户输入的字符。任务准备③输入字符串charstr[100];scanf("%s",str);一般用字符数组来存储输入的字符串,并且字符数组的空间必须足够大,以保证输入的字符串不超过字符数组的存储空间。由于字符数组名str本身就是一个地址常量,因此,在scanf()函数中作参数时不需要取地址符&,而是直接用str。用scanf()函数读取用户输入的字符串时,默认只能读取空格、制表符、回车之前的部分,并且会在末尾添加'\0'作为结束符。如果希望将回车之前的字符串都读入,包含空格和制表符,则可以调用函数gets()实现。任务准备4.gets()和puts()函数gets()函数用于从标准输入设备(键盘)获取一个字符串,存储到指定的空间中。gets()函数会接收回车键之前的所有字符,包括空格和制表符。它会丢弃回车符(即缓冲区中不会残留回车符),然后在字符串末尾添加'\0'作为结束标志。其一般调用格式为:gets(str);其中,str是一个字符数组名(地址常量)或字符指针变量(地址变量)。当str是一个字符数组时,gets(str)的作用是将用户输入的、回车键之前的字符串存入数组str中,并在字符串末尾添加'\0'作为结束标志。gets()函数和scanf()函数都不能检测越界,因此,用户输入的字符串长度最好不要超过数组能存储的元素个数。gets()函数会丢弃回车符,使缓冲区中不会残留回车符,而用scanf()函数获取输入的字符串后,会将回车符留在缓冲区中。puts()函数用于向标准输出设备(屏幕)输出字符串并换行。其一般调用格式为:puts(str);其中,str是一个字符数组名或字符指针变量。任务准备任务实施Part
1Part
2Part
3任务描述任务实施【任务1】输入学生的学号、姓名、性别(M或F)、年龄、身高,用5个变量存储,然后输出学生信息。1.任务分析本任务考查字符串、字符、整数、浮点数的输入和输出。学生的学号是数字组成的字符串,中间没有空格或制表符,可用scanf()函数或gets()函数实现输入。同理,姓名是由字母组成的字符串,也可以用scanf()函数或gets()函数实现输入。性别是字符型数据,值是'M'(男)或'F'(女),在输入前要消除上一次输入的回车符的影响。年龄和身高分别是整型和单精度浮点型数据,对应scanf()函数的%d和%f格式输入。任务实施2.任务实现本任务实现代码如下,请将代码中空白处补充完整。intmain(){ charxh[20];/*学号不超过20个字符*/ charxm[50];/*姓名不超过50个字符*/ charxb; /*性别*/ intnl; /*年龄*/ floatsg; /*身高*/ printf("请输入学号:"); scanf("",); printf("请输入姓名:"); scanf("",); getchar(); /*或fflush(stdin);*/ printf("请输入性别:");图2-9输入学生信息 scanf("",);/*或xb=getchar();*/ printf("请输入年龄:"); scanf("",); printf("请输入身高:"); scanf("",); printf("学号:%s,姓名:%s,性别:%c,年龄:%d,身高:%.2f\n",xh,xm,xb,nl,sg); return0;}编译运行的结果如图2-9所示:任务实施3.任务总结测试发现,scanf()函数获取输入数据后,残留在缓冲区的回车符会作为接下来的gets()函数的输入数据,导致gets()函数无法得到正确的字符串输入,但不会影响接下来的scanf()函数获取输入的字符串。而gets()函数会丢弃回车符,使缓冲区中不会残留回车符,因此它不会影响接下来的字符输入。输入学生信息也可以用如下代码实现:printf("请输入学号:");scanf("%s",xh);getchar(); /*清除缓冲区残留的回车符*/printf("请输入姓名:");gets(xm);/*gets()不会残留回车符,不需调用getchar()或fflush(stdin);*/printf("请输入性别:");xb=getchar();printf("请输入年龄:");scanf("%d",&nl);printf("请输入身高:");scanf("%f",&sg);数据的输入千变万化,初学者在掌握常见类型数据的输入输出的同时,还需要留意一些特殊情况的处理。任务准备任务实施任务描述任务4用结构体变量存储学生信息任务描述本任务要求输入一个学生的学号、姓名、性别、年龄和身高,并用一个变量存储,然后输出学生信息。要完成本任务,必须掌握结构体类型的创建、结构体变量的初始化、结构体成员的访问等。因此,本任务将讲解结构体类型的创建和结构体变量的使用,让学生具备使用构造类型处理复杂数据的能力。本任务主要涉及结构体类型的创建、结构体变量的使用、结构体数组的使用。任务准备任务实施Part
1Part
2Part
3任务描述任务准备在之前的任务中,存储一个学生的信息用到了5个变量,它们分别存储学号、姓名、性别、年龄和身高。但在实际应用中,这种做法不可取,因为如果存储一个学生的信息就要用到5个变量,那么四十个学生就要用到200个变量,显然不切实际。为了存储一个班四十个学生的信息,有人想到用5个数组来分别存储学号、姓名、性别、年龄和身高。可以用二维字符数组存储多个字符串,如定义二维字符数组xh存储40个长度20以内的学号,定义二维字符数组xm存储40个长度50以内的姓名。5个数组的示例代码如下,限于篇幅,每个数组只给出4个初始值。charxh[40][20]={"10001","10002","10003","10004"};charxm[40][50]={"zhangsan","lisi","wangwu","chenliu"};charxb[40]={'M','F','F','M'};intnl[40]={19,17,18,21};floatsg[40]={1.75f,1.60f,1.65f,1.80f};但这种做法有三个弊端:一是学生信息存储在不同的内存区域,获取数据的效率不高;二是每个学生的数据靠数组下标维系,容易因为小失误而导致信息错位;三是结构零散,不便于数据的管理。因此,用5个数组也不是最佳做法。任务准备比较好的解决办法是,将存储学生信息的5个变量组合成一个新的类型——结构体类型,用该结构体类型定义1个变量就能存储1个学生的所有信息,用该结构体类型定义拥有40个元素的数组,就能存储40个学生的信息。1.结构体类型结构体类型是一种自定义类型,它是将多个相关数据组合在一起的构造数据类型。结构体类型由若干个成员组成,每个成员的类型可以是基础类型,也可以是构造类型。在使用结构体类型之前必须先声明它,声明的一般形式为:struct结构体名{
数据类型数据名1;
数据类型数据名2; ……
数据类型数据名n; };任务准备结构体类型的声明以关键字struct开头,后面跟一个自定义的名字,它们必须一起使用,创建的结构体类型是“struct结构体名”。一对大括号内是结构体类型的成员,它们可以是各种数据类型,大括号后必须以分号“;”结束。一般习惯将声明结构体类型的代码写在程序的顶部,include语句之后,函数之前。如果将声明结构体类型的代码写在函数中,则该结构体类型只能在该函数内使用。用于存储学生的学号、姓名、性别、年龄和身高的结构体类型的声明如下,结构体类型是structstudent,用它定义一个变量就可以存储一个学生的所有信息。structstudent{ charxh[20]; /*学号*/ charxm[50]; /*姓名*/ charxb; /*性别*/ intnl; /*年龄*/ floatsg; /*身高*/};任务准备怎么理解结构体类型呢?以广东人熟悉的煲汤来打比方。当广东人想做黄芪当归炖鸡汤,需要去菜市场的不同摊位购买当归、黄芪、桂圆、北沙参、党参、姜片、葱段、八角、桂皮等九种汤料,费时费力,非常不方便。后来有厂家生产了一种“黄芪当归鸡汤料包”的产品,该产品将炖鸡汤所需的九种汤料“打包”成一个汤料包,每当有人想做一份黄芪当归炖鸡汤时,购买一袋黄芪当归鸡汤料包即可。在不同摊位购买九种汤料,就类似定义九个变量存储数据,而“黄芪当归鸡汤料包”这类产品就类似将九个变量组合形成的结构体类型,购买一个汤料包就类似定义了一个结构体变量,它里面就有了九个数据(汤料)。任务准备由于结构体类型必须以struct开头且名字较长,为了方便编程,可以用关键字typedef给结构体类型取一个别名。在声明结构体类型structstudent时给它取别名STU,形式如下:typedefstructstudent{ charxh[20]; charxm[50]; charxb; intnl; floatsg;}STU;在声明结构体类型structstudent之后给它取别名STU,形式如下:typedefstructstudentSTU;在这之后,就可以用STU代替structstudent,使程序更简洁,增强了程序的可读性。任务准备2.结构体变量在C语言中,有三种定义结构体变量的方法。(1)先声明结构体类型,再定义结构体变量。例如在声明了结构体类型structstudent后,再用它定义变量:structstudents1;在给structstudent取别名STU后,还可以用STU定义变量:STUs2;(2)声明结构体类型的同时定义结构体变量。例如在声明结构体类型structstudent时定义变量s1和s2:structstudent{ charxh[20]; charxm[50]; charxb; intnl; floatsg;}s1,s2;任务准备(3)不出现结构体名,直接定义
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度农机产业投资基金投资合同范本
- 二零二五年度土地租赁合同范本(含环保条款)
- 2025年度职业电竞战队教练聘请合同书4篇
- 2025年度生鲜配送服务合同与消费者权益保护协议4篇
- 二零二五年高清监控设备采购合同范本3篇
- 2025年度临时租用汽车合同标准协议-企业用车3篇
- 2025年度智能设备安装服务合同(分享42安装工版)
- 2025年度知识产权法务顾问保密合同
- 课题申报参考:美国后“9·11”诗歌的政治参与意识与“公共性”范式研究
- 二零二五版木质防火门安装与维护服务合同3篇
- 浙江天台历史文化名城保护规划说明书
- 逻辑思维训练500题
- 2023年山东省威海市中考物理真题(附答案详解)
- 第八讲 发展全过程人民民主PPT习概论2023优化版教学课件
- 实体瘤疗效评价标准RECIST-1.1版中文
- 王崧舟:学习任务群与课堂教学变革 2022版新课程标准解读解析资料 57
- 企业新春茶话会PPT模板
- GB/T 19185-2008交流线路带电作业安全距离计算方法
- DIC诊治新进展课件
- 公路工程施工现场安全检查手册
- 1汽轮机跳闸事故演练
评论
0/150
提交评论