版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、c语言程序设计,主编:高立兵,1,职业教育“十二五”规划教材,目 录,项目1 c语言概述,1,项目2 数据类型、运算符与表达式,2,项目3 顺序结构程序设计,3,项目4 选择结构程序设计,4,项目5 循环结构程序设计,5,项目6 数组,5,项目导读 项目目标 项目任务,本项目主要对c语言的一些基础知识及其字符集和词汇进行介绍,使读者在学习c语言之前对其有个全面的认识,项目导读,安装、配置tc2.0和vc+6.0,成功启动tc2.0和vc+6.0。 能编写一个简单的c程序的源文件,并编译该源文件,链接目标文件得到可执行文件,项目目标,任务1.1 c语言的发展与特点,c语言是1972年由美国的de
2、nnis ritchie设计发明的,并首次在配备了unix操作系统的dec pdp-11计算机上实现。它由早期的编程语言bcpl(basic combined programming language)发展演变而来,c语言的特点 1、c语言是中级语言 2、c语言是结构化语言 3、c语言功能齐全 4、c语言适用范围广,任务1.2 认识c语言,本任务通过几个简单的c程序,介绍c语言的基本组成和格式,案例1.1 main( ) printf(“this is a c program.n”); 本程序的功能是输入下列一行信息: this is a c program,任务1.2 认识c语言,程序说明:
3、 main函数是“主函数”,每一个c程序必须有一个main函数。 函数体由大括弧 括起来。本例中,主函数内只有一个输出语句,printf(“this is a c program.n”);是c语言的输出函数(具体详见项目3)。双引号内的字符串将照原样输出。 “n”是换行符,即在输出“this is a c program.”后换行。 分号是c语句的基本构成,每一个c语句后都应再加上分号,分号是语句的结束标志,任务1.2 认识c语言,本任务通过几个简单的c程序,介绍c语言的基本组成和格式,案例1.2 main() /*求两数之和*/ int a,b,sum; /*本行开始的以下4条为c语句*/
4、a=123;b=456; sum=a+b; printf(“sum is %dn”,sum); 本程序的功能是求两数之和,任务1.2 认识c语言,程序说明: /*/是注释语句,此信息对编译和运行不起作用。 (2) 程序第二行的含义是定义a、b和sum为整体变量。 (3)“sum=a+b;”的含义是把变量a和b的和赋给变量sum。 (4)该程序的输出结果是:sum is 579,任务1.2 认识c语言,案例1.3 main( ) /*求一个数的绝对值*/ int x,y; scanf(“%d”, 本程序的功能是求z的绝对值,任务1.2 认识c语言,程序说明: (1)本程序包括两个函数:主函数ma
5、in和被调用函数abs。 (2)函数abs的作用是将z的绝对值返回给主调函数main(返回值是通过函数名abs带回到main函数的调用处的)。 (3)程序中的scanf函数的作用是从键盘上输入x的值。 无符号基本整型 unsigned int; 有符号短整型 signed short int; 无符号短整型 unsigned short int; 有符号长整型 signed long int; 无符号长整型 unsigned long int; 有符号双长整型 signed long long int; 无符号双长整型 unsigned long long int; 以上方括号表示其中的内容是
6、可选的,既可以有,也可以没有。如果既未指定为signed也未指定为unsigned的,默认为“有符号类型”。如signed int a和int a等价,任务2.2 数据类型,2.2.2 字符型数据 1. 字符与字符代码 字符与字符代码并不是任意写一个字符,程序都能识别的。例如圆周率在程序中是不能识别的,只能使用系统的字符集中的字符,目前大多数系统采用ascii字符集。各种字符集(包括ascii字符集)的基本集都包括了127个字符。其中包括: 字母:大写英文字母az,小写英文字母az。 数字:09。 专门符号:29个: !”# ? 定义c为字符型变量并使初值为字符?。?的ascii代码是63,系
7、统把整数63赋给变量c。c是字符变量,实质上是一个字节的整形变量,由于它常用来存放字符。所以称为字符变量。可以把0127之间的整数赋给一个字符变量。 在输出字符变量的值时,可以选择以十进制整数形式输出,或以字符形式输出。如: printf(“%d %cn”, c , c ); 输出结果是: 63 ? 用“%d”格式输出十进制整数63,用%c格式用字符形式输出字符,任务2.2 数据类型,2.2.3 浮点型数据 浮点型数据是用来表示具有小数点的实数的 。 浮点数类型包括float(单精度浮点型)、double(双精度浮点型)、long double(长双精度浮点型)。 (1)float型(单精度浮
8、点型)。编译系统为每一个float型变量分配4个字节,数值以规范化的二进制数值形式存放在存储单元中。在存储时,系统将实型数据分成小数部分和指数部分两个部分,分别存放。小数部分的小数点前面的数为0.如3.14159在内存中的存放形式可以用图2.9表示,图2.9,任务2.2 数据类型,double型(双精度浮点型)。为了扩大能表示的数值范围,用8个字节存储一个double型数据,可以得到15位有效数字,数值范围为1.710-308 1.710308 。在c语言中进行浮点数的算术运算时,将float型数据都自动转换为double型,然后进行运算。 long double型(长双精度)型,不同的编译系
9、统对long double型的处理方法不同,turbo c对long double型分配16个字节。而visual c+6.0则对long double型和double型一样处理,分配8个字节。请读者在使用不同的编译系统时注意其差别。表2.4列出实型数据的有关情况,表2.4,任务2.3 运算符和表达式,2.3.1基本的算术运算符,表2.5 最常用的算术运算符,任务2.3 运算符和表达式,2.3.2 自增、自减运算符 作用是使变量的值加1或减1,例如: +i ,-i ( 在使用i之前,先使i的值加(减)1) i+, i-( 在使用i之后,使i的值加(减)1) 粗略地看,+i和i+的作用相当于i=
10、i+1。但+i和i+的不同之处在于+i是先执行i=i+1后,再使用i的值;而i+是先使用i的值后,再执行i=i+1。如果i的原值等于3,请分析下面的赋值语句: j=+i;(i的值先变成4,再赋给j, j的值为4) j=i+;(先将i的值3赋给j, j的值为3,然后i变为4) 又例如: i=3; printf(“%d”,i+); 输出4。若改为 printf(“%dn”,i+); 则输出3,任务2.3 运算符和表达式,2.3.3 算术表达式和运算符的优先级与结合性 用算术运算符和括号将运算对象(也称操作数)连接起来的、符合c语法规则的式子,称为c算术表达式。运算对象包括常量、变量、函数等。例如,
11、下面是一个合法的c算术表达式: a*bc1.5+a c语言除了规定了运算符的优先级外,还规定了运算符的结合性。在表达式求值时,先按运算符的优先级别顺序执行,例如先乘除后加减。如表达式ab*c , b的左侧为减号,右侧为乘号,而乘号优先级高于减号,因此,相当于a(b*c)。 如果在一个运算对象两侧的运算符的优先级别相同,如ab+c,则按规定的“结合方向”处理。c语言规定了各种运算符的结合方向(结合性),算术运算符的结合方向都是“自左至右”,及先左后右,因此b先与减号结合,执行ab的运算,然后再执行加c的运算。“自左至右的结合方向”又称“左结合性”,即运算对象先于左面的运算符结合。以后可以看到有些
12、运算符的结合方向为“自右至左”,即右结合性(例如,赋值运算符,若有a=b=c,按从右到左顺序,先把变量c的值赋给变量b,然后把变量b的值赋给变量a,任务2.3 运算符和表达式,2.3.4 不同类型数据间的混合运算 在程序中经常会遇到不同类型的数据进行运算,如5*3.5。如果一个运算符的两侧的数据类型不同,则先自动进行类型转换,使二者具有同一种类型,然后进行运算。因此整型、实型、字符型数据间可以进行混合运算。规律为: (1) +、*、运算的两个数中有一个数为float或double型,结果是double型,因为系统将所有float型数据都先转换为double型,然后进行运算。 (2) 如果int
13、型与float或double型数据进行运算,先把int型和float型数据转换为double型,然后再进行运算,结果是double型。 (3) 字符(char)型数据与整型数据进行运算,就是把字符的ascii代码与整型数据进行运算。如:12+a,由于字符a的ascii代码是65,相当于12+65,等于77。字符数据可以直接与整型数据进行运算。如果字符型数据与实型数据进行运算,则将字符的ascii代码转换为double型数据,然后进行运算,任务2.3 运算符和表达式,示例2.1 编程:给定一个大写字母,要求用小写字母输出。 编写程序: #includestdio.h int main ( ) c
14、har c1 ,c2; c1=a 将字符a的ascii代码放到c1变量中 c2=c1+32; 得到字符a的ascii代码,放在c2变量中 printf(“%cn”,c2); 输出c2的值,是一个字符 printf(“%dn”,c2); 输出c2的值,是字符a的ascii代码 reurn 0 运行结果: a 97,任务2.3 运算符和表达式,2.3.6 c运算符 除了算术运算符外,c还提供其他运算符,共有以下几类: 关系运算符 (= ! =) 逻辑运算符 (! 定义各变量,均为double型 a=2.67; 对边长a赋值 b=4.43; 对边长b赋值 c=5.21; 对边长c赋值 s=(a+b+
15、c)/2; 计算s area=sqrt(s*()*()*(); 计算area printf(“a=%ftb=%ft%fn”,a ,b ,c ); 输出三边a ,b ,c 的值 printf(“area=%fn”,area); 输出面积area的值 return 0 ; 运行结果: a=2.670000 b=4.430000 5.210000 area=8.903431,任务2.4 赋值语句,2.4.1 赋值运算符 赋值符号=就是赋值运算符,它的作用是将一个数据赋给一个变量。如a=3的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。也可以将一个表达式的值赋给一个变量。 2.4.2 复
16、合的赋值运算符 在赋值符=之前加上其它运算符,可以构成复合的运算符。如果在“=”前加一个“+”运算符就成了复合运算符“+=”。例如可以有以下的复合赋值运算: a+=3 等价于 a=a+3 x*=y+8 等价于 x=x*(y+8) x%=3 等价于 x=x%3 以“a+=3”为例来说明,它相当于使a进行一次自加3的操作。即:先使a加3,再赋给a。同样,“x*=y+8”的作用是使x乘以(y+8),再赋给x,任务2.4 赋值语句,2.4.3 赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。它的一般形式为 变量 赋值运算符 表达式 赋值表达式的作用是将一个表达式的值赋给
17、一个变量,因此赋值表达式具有计算和赋值的双重功能。如a=3*5是一个赋值表达式。对赋值表达式求解的过程是:先求赋值运算符右侧的“表达式”的值,然后赋给赋值运算符左侧的变量。既然是一个表达式,就应该有一个值。赋值表达式a=3*5的值为15,对表达式求解后,变量a的值和表达式的值都是15。 2.4.4 赋值过程中的类型转换 如果赋值运算符两侧的类型一致,则直接进行赋值。如: i=234; 设已定义i为整型变量 此时直接将整数234存入变量i的存储单元中。 如果赋值运算符两侧的类型不一致,但都是算术类型时,在赋值时要进行类型转换。类型转换是由系统自动进行的,任务2.4 赋值语句,2.4.5 赋值表达
18、式和赋值语句 在c程序中,赋值语句是用的最多的语句。在任务1的c语句分类中,并没有看到赋值语句,实际上,c语言的赋值语句属于表达式语句,由一个赋值表达式加一个分号组成。 注意:要区分赋值表达式和赋值语句。 赋值表达式的末尾没有分号,而赋值语句的末尾必须有分号。在一个表达式中可以包含一个或多个赋值表达式,但绝不能包含赋值语句。 2.4.6 变量赋初值 可以用赋值语句对变量赋值,也可以在定义变量时对变量赋以初值。这样可以使程序简练。如: int a=3; 定义a为整型变量,初值为3 float f=2.56; 定义f为浮点型变量初值为2.56 char c=a 定义c为字符变量,初值为a,项目3
19、顺序结构程序设计,1,项目导读 项目目标 项目任务,在项目2中介绍了c程序中用到的一些基本要素,如常量、变量、运算符、表达式等。本项目将介绍编写简单的c程序所必需的一些内容,项目导读,使用scanf函数从键盘为变量输入值。 使用printf函数输出数据。 能编写简单的c程序的源文件,并运行程序,思考,项目目标,任务3.1 顺序程序设计举例,示例3.1 用温度计测量出用华氏法表示的温度(如69f),今要求把它转换为以摄氏法表示的温度(如20)。 解题思路:这个问题的算法很简单,关键在于找到二者之间的转换公式。根据物理学知识,知道以下转换公式: c=59(f-32) 其中f代表华氏温度,c代表摄氏
20、温度。据此可以用n-s图表示算法,见图3.1,图3.1,算法由3个步骤组成,这是一个简单的顺序结构。 编写程序:有了n-s图,很容易用c语言表示,写出求此问题的c程序,任务3.1 顺序程序设计举例,includestdioh int main() float f,c; 定义f和c为单精度浮点型变量 f=63.0; 定义f的值 c=(59)*(f-32); 利用公式计算c的值 printf(“f=%nc=%n”,f,c);输出c的值 return 0; 运行结果: f=63.000000 c=16.777778,任务3.1 顺序程序设计举例,示例3.2 计算存款利息。有1000元,想存一年。有三
21、种方法可选:活期,年利率为r1;一年期定期,年利率为r2;存两次半年定期,年利率为r3。请分别计算出一年后按三种方法所得到的本息和。 解题思路:关键是确定计算本息和的公式。从数学知识可知,若存款额为p0,则: 活期存款一年后本息和为p1=p0(1+r1)。 一年期定期存款,一年后本息和为p2=p0(1+r2)。 两次半年定期存款,一年后本息和为p3=p0(1+r3/2)(1+r3/2)。 画出n-s流程图,见图3.2,图3.2,任务3.1 顺序程序设计举例,includestdio.h int main () float p0=1000,r1=0.0036,r2=0.0225,r3=0.019
22、8,p1,p2,p3; 定义变量 p1=p0*(1+r1); 计算活期本息和 p2=p0*(1+r2); 计算一年定期本息和 p3=p0*(1+r32)*(1+r32);计算存两次半年定期的本息和 printf(“p1=%fnp2=%fnp3=%fn”,p1,p2,p3);输出结果 return 0; 运行结果: p1=1002.599976 p2=1022.500000 p3=1018.898010,任务3.2 c语句概述,c程序的执行部分是由语句组成的。程序的功能也是由执行语句实现的,c程序主要包含表达式语句、函数调用语句、控制语句、复合语句和空语句,其中控制语句包含多种情况,本任务将分别
23、进行介绍。 c程序结构可以用图3.3表示。即一个c程序可以由若干个源程序文件(编译时以文件模块为单位)组成,一个源文件可以由若干个函数和预处理指令以及全局变量声明部分组成(关于“全局变量”见项目7)。一个函数由数据声明部分和执行语句组成,图3.3,任务3.2 c语句概述,c语句分为以下5类 : (1) 控制语句。控制语句用于完成一定的控制功能。c语句只有9种控制语句,它们的形式是: if( )else (条件语句) for ( ) (循环语句) while( ) (循环语句) dowhile( ) (循环语句) continue (结束本次循环语句) break (中断执行switch或循环语
24、句) switch (多分支选择语句) return (从函数返回语句) goto (转向语句,在结构化程序中基本不用goto语句) 上面9种语句表示形式中的( )表示括号中是一个“判别条件”,“”表示内嵌的语句。例如上面的“if( )else”的具体语句可以写成: if(xy) z=x ; else z=y,任务3.2 c语句概述,2) 函数调用语句。函数调用语句由一个函数调用加一个分号构成,例如: printf(“this is a c statement .”); 其中printf(“this is a c statement .”)是一个函数调用,加一个分号成为一个语句。 表达式语句。
25、表达式语句由一个表达式加一个分号构成,最典型的是,有赋值表达式构成一个赋值语句。例如: a=3 是一个赋值表达式,而 a=3; 是一个赋值语句。 空语句。下面是一个空语句: ; 此语句只有一个分号,它什么也不做。那么它有什么用呢?可以用来作为流程的转向点(流程从程序其他地方转到此语句处),也可以用来作为循环语句中的循环体(循环体是空语句,表示循环体什么也不做,任务3.2 c语句概述,复合语句。可以用 把一些语句和声明括起来成为复合语句(又称语句块)。例如下面是一个复合语句: float pi=2.14159,r=2.5,area; 定义变量 area=pi * r * r ; printf(“
26、area=%f”,area); 可以在复合语句中包含声明部分(如上面的第2行),c99允许将声明部分放在复合语句中的任何位置,但习惯上把它放在语句块开头位置。复合语句常用在if语句或循环中,此时程序需要连续执行一组数据。 注意:复合语句中最后一个语句中最后的分号不能忽略不写。 c语言允许一行写几个语句,也允许一个语句拆开写在几行上,书写格式无固定要求,任务3.3 数据的输入/输出,3.3.1 输入输出举例 案例3.3 求ax2+bx+c=0方程的根。a ,b ,c由键盘输入,设b24ac0。 解题思路:首先要知道求方程式的根的方法。由数学知识已知:如果b24ac0,则一元二次方程有两个实根:
27、, 可以将上面的分式分为两项: , 则x1 =p+q, x2=pq 有了这些式子,只要知道a ,b ,c的值,就能顺利的求出方程的两个根,任务3.3 数据的输入/输出,include #include 程序重要调用求平方根函数sqrt int main () double a ,b ,c ,disc ,x1,x2,p ,q; disc用来存放判别式(b*b4ac)的值 scanf(“%1f%1f%1f”, 运行结果: 1 3 2 x1=-1.00 x2=-2.00,任务3.3 数据的输入/输出,3.3.2 有关数据输入输出的概念 从前面的程序可以看到:几乎每一个c程序都包含输入输出。因为要进行
28、运算,就必须给出数据,而运算的结果当然需要输出,以便人们应用。没有输出的程序是没有意义的。输入输出是程序中最基本的操作之一。 在讨论程序的输入输出时首先要注意以下几点。 所谓输入输出是以计算机主机为主体而言的。 c语言本身不提供输入输出语句,输入和输出操作是由c标准函数库中的函数来实现的。 在使用系统库函数时,要在程序文件的开头用预处理指令#include把有关头文件放在本程序中 如:#include 注意:应养成这样的习惯:只要在本程序文件中使用标准输入输出库函数时,一律加上#include指令,任务3.3 数据的输入/输出,3.3.3 用printf函数输出数据 在c程序中用来实现输出和输
29、入的,主要是printf函数和scanf函数。这两个函数是格式输入输出函数。用到两个函数时,程序设计人员必须制定输入输出数据的格式,即根据数据的不同类型指定不同的格式。 1、printf函数的一般格式 printf函数的一般格式为 printf(格式控制,输出表列) 例如: printf(“%d,%cn”,i ,c) 2、格式字符 (1) d格式字符。用来输出一个有符号的十进制整数。 可以在格式声明中指定输出数据的域宽(所占的列数),如用“%5d”,指定输出数据占5列,输出的数据显示在此5列区域的右侧。如: printf(“%5dn%5dn”,12,345); 输出结果为 12 (12前面有3
30、个空格) 345 (345前面有1个空格,任务3.3 数据的输入/输出,2)c格式符。用来输出一个字符。例如; char ch=a; printf(“%c”,ch); 运行时输出 a 一个整数,如果在0127范围中,也可以用“%c”使之按字符形式输出,在输出前,系统会将该整数作为ascii码转换成相应的字符;如: short a=121; printf(“%c”,a); 输出字符y。 (3)s格式符。用来输出一个字符串。如: printf(“%s”,“china”); 执行此函数时在显示屏上输出字符串“china”(不包括双引号,任务3.3 数据的输入/输出,4) f格式符。用来输出实数(包括
31、单、双精度、长双精度)。以小数形式输出,有几种用法: 基本型,用%f。 不指定输出数据的长度,由系统根据数据的实际情况决定数据所占的列数。系统处理的方法一般是:实数中的整数部分全部输出,小数部分输出6位。 示例 3.4 用%f输出实数,只能得到6位小数。 #include int main( ) double a=1.0; printf(“%fn”, a3); return 0; 运行结果: 0.333333 虽然a是双精度型,a3的结果也是双精度型,但是用%f格式声明只能输出6位小数,任务3.3 数据的输入/输出,指定数据宽度和小数位数,用%m.nf。 如果想在示例3.4输出双精度变量a的1
32、5位小数,可以采用案例3.3所用的方法,用“%20.15fn”, a/3) 运行结果: 0.333333333333333 注意:在用%f输出时要注意数据本身能提供的有效数字,如float型数据的存储单元只能保证6位有效数字。double型数据能保证15位有效数字。不要以为计算机输出的所有数字都是绝对精确有效的。 输出的数据向左对齐,用%m.nf。 在m.n的前面加一个负号,其作用与%m.nf形式作用基本相同,但当数据长度不超过m时,数据向左靠,右端补空格。如: printf(“%24.15f,%24.15fn”,a ,a); 运行结果: 3332.333333333333500 3332.3
33、33333333333500 第1次输出a时输出结果向左端靠,右端空5列。第2次输出a使输出结果向右端靠,左端空5列,任务3.3 数据的输入/输出,5) e格式符。用格式声明%e指定以指数形式输出实数。 例如: printf(“%e”,122.456); 输出如下: 1.234560 e+002 所输出的实数共占13列宽度(注:不同系统的规定略有不同)。 也可以用“%m.ne”形式的格式声明,如: printf(“%12.2e”,122.456); 输出为 1.23e+002 (数的前面有4个空格) 格式符e也可以写成大写e形式,因此输出的数据中的指数不是以小写字母e表示而以大写字母e表示,如
34、1.23460e+002,任务3.3 数据的输入/输出,表3.1 printf函数中用到的格式字符,任务3.3 数据的输入/输出,3.3.4 scanf函数输入数据 1 . scanf函数的一般形式 scanf(格式控制,地址表列) “格式控制”的含义同printf函数。“地址表列”是由若干个地址组成的的表列,可以是变量的地址,或字符串的首地址。 2 . scanf函数中的格式声明 与printf函数中的格式声明相似,以%开始,以一个格式字符结束,中间可以插入附加的字符,表3-4 scanf函数中用到的格式附加字符,任务3.3 数据的输入/输出,表3-3 scanf函数中所用到的格式字符,任务
35、3.3 数据的输入/输出,3.3.5 字符数据的输入输出 除了可以用printf函数和scanf函数输出和输入字符外,c函数库还提供了一些专门用于输入和输出字符的函数。 用putchar函数输出一个字符 putchar函数的一般形式为 putchar(c) 示例 3.6 先后输出boy三个字符。 解题思路:定义3个变量,分别赋以初值b,o,y, 然后用putchar函数输出这3个字符变量的值,任务3.3 数据的输入/输出,include int main( ) char a=b,b=o,c=y; 定义3个字符变量并初始化 putchar(a); 向显示器输出字符b putchar(b); 向显
36、示器输出字符o putchar(c); 向显示器输出字符y putchar(n); 向显示器输出一个换行符 return 0; 运行结果: boy 连续输出b,o,y3个字符,然后换行,任务3.3 数据的输入/输出,用getchar函数输入一个字符 为了向计算机输入一个字符,可以调用系统函数库中的getchar函数(字符输入函数)。getchar函数的一般形式为 getchar( ) 示例3.7 从键盘输入boy3个字符,然后把它们输出到屏幕。 解题思路:用3个getchar函数先后从键盘向计算机输入boy3个字符,然后用putchar函数输出,任务3.3 数据的输入/输出,include i
37、nt main( ) char a, b, c; 定义字符变量a, b, c a=getchar( ); 从键盘输入一个字符,送给字符变量a b=getchar( ); 从键盘输入一个字符,送给字符变量b c=getchar( ); 从键盘输入一个字符,送给字符变量c putchar(a); 将变量a的值输出 putchar(b); 将变量b的值输出 putchar(c); 将变量c的值输出 putchar(n); 换行 return 0; 运行结果: boy boy,任务3.4 顺序结构的程序设计,示例 3.9 输入三角形的三边长,求三角形面积。 为简单起见,设输入的三边长a,b,c能构成三
38、角形。从数学知识已知三角形的面积的公式为,其中s=(a+b+c)2 据此编写程序如下; #include main() float a,b,c,s,area; scanf(“%f,%f,%f”,,任务3.4 顺序结构的程序设计,示例 3.10 从键盘输入一个大写字母,要求改用小写字母输出。 #include main() char c1,c2; c1=getchar(); printf(“%c,%dn”,c1,c1); c2=c1+32; printf(“%c,%dn”,c2,c2); 运行情况如下; a a,65 a ,97,项目4 选择结构程序设计,1,项目导读 项目目标 项目任务,选择结
39、构是三种基本结构之一,在大多数程序中都会包含选择结构。本项目将介绍如何用c语言编写含选择结构的程序,项目导读,了解if和if-else语句的用法以及了解多重条件下if语句的嵌套使用。 掌握switch开关语句的用法。 熟悉条件运算符的使用,思考,项目目标,任务4.1 if语句,4.1.1 选择结构简介 选择结构体现了程序的判断能力。在程序执行过程中能依据运行时某些变量的值确定某些操作是否执行,或者确定若干个操作中选择哪个操作执行,这种程序结构称为选择结构,又称为分支结构。 c语言提供了两种分支语句:if条件语句和switch多分支选择语句用于实现选择程序的设计,其中,if语句又分三种结构。在程
40、序设计过程中,根据各语句的结构特点,灵活应用,任务4.1 if语句,4.1.2 简单的if语句 if结构是一种常用的分支结构,用它可以构成复杂的判断选择。 if语句是最简单的一种单分支结构,其一般形式为: if(表达式) 语句a,其中,表达式一般为条件表达式或逻辑表达式,if结构的功能是:先判断表达式的逻辑值,若该逻辑值为“真”,则执行语句a,否则,什么也不执行。 if结构的流程图如图4.1所示,图4.1,任务4.1 if语句,示例4.1设x与y有如下函数关系,试根据输入的x值,求出y的值。 解题思路:依题意知:当x0时,y=x-7;当x=0时,y=2;当x0时,y=3*x*x;其程序流程图如
41、图4.2所示,图4.2 程序流程图,任务4.1 if语句,程序代码如下: #includestdio.h void main() float x,y; printf(请输入x的值:); scanf(%f, if(x0) y=3*x*x; /*x为负数时*/ printf(y的值是:%2fn,y);,任务4.1 if语句,4.1.3 if-else语句 双分支结构是按照某个条件判断出执行两个语句(可以是复合语句)中的哪个语句。双分支结构如图4.3所示,在c语言中,使用ifelse语句可以实现双分支结构。其格式为: if(表达式) 语句1; else 语句2; 功能:计算表达式的值,如果为真(非0
42、),则执行“语句1”;否则执行“语句2,图4.3 双分支结构,任务4.1 if语句,示例4.3 设计一个猜数游戏,由计算机产生一个随机数magic,从键盘输入一个数guess,若输入的数guess的大小等于随机数magic,则输出“恭喜你,猜对了!”。否则,输出“很遗憾,猜错了!”。 #includestdio.h #includestdlib.h main( ) int guess,magic; magic=rand( ); /*获取一个随机数字*/ printf(请输入你猜的数字:); scanf(d, i+; while(i=100); printf(“%d”,sum);,先先画出流程图
43、,见图5.3,图5.3,任务5.2 for循环语句,for语句是c语言中使用最为灵活的语句,不论循环次数是已知,还是未知,都可以使用for语句。for语句的格式如下: for(表达式1;表达式2;表达式3) 语句 for语句的执行过程为: step1 先计算表达式1的值 step2 再计算表达式2(条件)的值,若表达式2的值为非(“真”,条件成立),则执行for语句的循环体语句,然后再执行第3步;若表达式2的值为0(“假”,条件不成立),则结果for循环,直接执行第5步。 step3 计算表达式3的值 step4 转到第2步。 step5 结束for语句(循环),执行for语句后面的语句,图5
44、.5 for语句的流程图,任务5.2 for循环语句,示例5.7 求1+2+100的和,include void main() int i,sum; sum=0; for(i=1;i=100;i+) sum=sum+i; /*累加1100每个数*/ printf(“1+2+100的值为:%dn”,sum);,任务5.2 for循环语句,5.2.2 几种循环语句的比较 四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。 while和do-while循环,只在while后面指定循环条件,在循环体中应包含使循环趋于结束的语句(如i+,或i=i+1等)。 for循环可以在表达式3中包含使循环
45、趋于结束的操作,甚至可以将循环体中的操作全部都放到表达式3中。因此,for语句的功能更强,凡用while循环能完成的,用for循环都能实现。 用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。 while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环。用goto语句和if语句构成的循环,不能用break语句和continue语句进行控制,任务5.2 for循环语句,5.2.3 循环语句的嵌套 循环结构的嵌套有很多种,一般循环体中的循环
46、称为“内循环”,包含内循环为“外循环”,当然,这只是指二重循环。另外还有多层嵌套的情况,这属于多重循环。 循环结构的嵌套示例。 #include void main() int x,y; for(x=1;x=2;x+) for(y=1;y=4;y+) printf(“x=%d,y=%dn”,x,y);/*输出每次循环的x,y的值*,任务5.2 for循环语句,示例5.13 编程输出如下由“*”组成的三角形。 * * * * * * * * * * * * * * * * * * * * * * * * * 分析:执行循环语句: for(i=1;i=10;i+) printf(“ * ”); 将
47、输出一行10个“ * ”字符,而本例的三角形是由5行“*”字符组成的。就是说,只要重复执行5次类似的for循环语句即可实现本例所要求的输出。这就构成了循环的嵌套。 观察上述三角形构成的特点,不难发现,第i行“ * ”字符的个数为2 *i-1,程序代码如下: #include void main() int i,j; for(i=1;j=5;i+) /*外循环的次数为需打印的行数*/ for(j=1;j=2*i-1;j+) /*内循环的次数由需要打印“*”的个数决定*/ printf(“*”); printf(“n”);,任务5.3 无条件转向语句,5.3.1 无条件转向语句 无条件转向语句是指
48、当程序执行到该语句时,程序立即转移到程序的其他地方执行,至于转移到什么地方,要看使用何种无条件转向语句。c语言提供三个无条件转向语句:break语句,continue语句和goto语句。 1. break语句 格式:break; 作用:强迫终止程序的执行,即提前退出程序的执行。 用法:只能用在switch语句和循环体中使用。当break语句在循环体中的switch语句体内时,其作用是跳出该switch语句体。当break语句在循环体中时,其作用是跳出本层的循环体,任务5.3 无条件转向语句,2.continue语句 格式: continue; 作用:结束本次循环,不再执行continue语句之
49、后的循环体语句,直接使程序回到循环条件,判断是否提前进入下一次循环。 说明: (1)continue语句只用在for、while、dowhile等循环体中,通常与if条件语句一起使用,用来加速循环。 (2)循环体中单独使用continue语句无意义,示例5.16 编写程序,打印100200间不能被3整除的数。 #include void main() printf(“100200之间不能被3整除的数有:n”) int n; for(n=100;n=200;n+) if(n%3= =0) /*判断是否能被3整除*/ continue; printf(“%dt”,n); /*不能整除的全部打印出来
50、*/printf(“n”); printf(“n”);,任务5.3 无条件转向语句,3.goto语句 goto语句是无条件转移语句。它的一般形式为: goto 语句标号: 其中,goto为保留字。语句标号用标识符表示,用来标识一条语句,它出现在语句的前面,用冒号与语句隔开。如: 语句标号:语句 因为使用goto语句会破坏结构化程序的逻辑结构,所以结构化程序设计语言不提倡使用goto语句。但在程序设计的某些场合,goto语句也会使程序设计得以简化,所以一般结构化程序设计语言中又都保留了无条件转移语句goto,只是限制其使用而已,项目6 数组,1,项目导读 项目目标 项目任务,本项目将讨论c语言提
51、供的一种最简单的构造类型-数组。在程序设计中数组是一种十分有用的数据结构,许多问题不用数组机会很难解决。本项目将介绍一维和二维数组的定义、数组元素的引用以及数组应用的一些基本算法,项目导读,学会使用一维数组存放数据并处理所存放的数据。 学会调用参数是数组的函数。 学会通过排序来处理数据。 能初始化二维数组,使用二维数组处理数据,思考,项目目标,任务6.1 一维数组,1.一维数组的定义 当数组中每个元素只带有一个下标时,称这样的数组为一维数组。在c语言中,定义一维数组的语句一般形式如下,例如: int a8; 在这里,int是类型名,a8就是一维数组说明符,任务6.1 一维数组,2.一维数组元素
52、的引用 由于是一维数组,因此引用数组元素时只带一个下标。引用形式如下: 数组名下标表达式 例如,若有以下定义语句: double x8 则x0、xj、xi+k都是对x数组中的元素的合法引用形式,其中0、j和i+j称为下标表达式。 3.一维数组的初始化 当系统为所定义的数组在内存中开辟一串连续的存储单元时,这些存储单元中并没有确定的值。可以采用以下形式,在定义语句中为所定义数组的各元素赋初值: int a8=0,1,2,3,4,5,6,7,任务6.1 一维数组,4.通过赋初值定义数组的大小 c语言规定可以通过赋初值来定义数组的大小,这时数组说明符的一对方括号中可以不指定数组的大小。例如: int
53、 a =0,0,0,0,0,0,0,0,; 以上语句的一对花括号中出现了8个0,它隐含的定义了a数组含有8个元素,此定义语句等价于以下语句: int a8=0; 5.一维数组的定义和数组元素引用举例 示例6.1 编写程序,定义一个含有30个元素的int类型数组。依次给数组元素赋奇数135,然后按每行10个数顺序输出,最后再按每行10个数逆序输出,任务6.1 一维数组,include define m 30 main( ) int sm,i,k=1; for(i=0;i0;i-) /*下标值从大到小*/ printf(“%3d%c”,si(i%10=0)?n: ); /*利用条件表达式来决定输出
54、换行符还是输出空格*/ printf(“n”);,任务6.1 一维数组,6.1.2 一维数组和指针 c语言中,在函数体中或在函数外部定义的数组名可以认为是一个存放地址值的指针变量名,其中的地址值是数组第一个元素的地址,也就是数组所占一串连续存储单元的起始地址,定义数组时的类型即是此指针变量的基本类型。重要的是:这个指针变量中的地址值不可改变,也就是说,不可以给数组名重新赋值!因此,也可以认为数组名是一个地址常量。 数组元素的引用方式 1、通过数组的首地址引用数组元素 2、通过指针引用一维数组元素 3、用带下标的指针变量引用一位数组元素,任务6.1 一维数组,6.1.3 函数之间对一维数组和数组
55、元素的引用 1.数组元素作实参 当调用函数时,数组元素可以作为实参传送给形参,每个数组元素实际上代表内存中的一个存储单元,故和普通变量一样,对应的形参必须是类型相同的变量。数组元素的值可以传送给该变量,在函数中只能对该变量进行操作,而不能直接引用对应的数组元素,更不可能在函数中改变对应数组元素中的值。 2.数组名作实参 数组名也可以作为实参传送,但数组名本身是一个地址值,因此,对应的形参就应当是一个指针变量,此指针变量的类型必须与数组的类型一致。在函数中,可以通过此指针变量来引用调用函数中对应的数组元素,从而达到对调用函数中对应的数组元素进行操作而改变其中的值。 3.数组元素地址作为实参 当用
56、数组元素地址作为实参时,因为是地址值,所以对应的形参也应当是基类型相同的指针变量,任务6.2 二维数组,6.2.1 二维数组的定义和二维数组元素的引用 1.二维数组的定义 当数组中每个元素带有两个下标时,称这样的数组为二维数组。在逻辑上可以把二维数组看成是一个具有行和列的表格或一个矩阵。 在c语言中,二维数组的定义语句形式如下,任务6.2 二维数组,2.二维数组元素的引用 引用二维数组元素时必须带有两个下标。引用形式如下: 数组名 下标表达式1 下标表达式2 例如,若有以下定义语句: double w42; 则w01、wij、wi+kj+k都是合法的数组元素引用形式,只是每个下标表达式的值必须
57、是整数,且不得超越数组定义中的上、下界。 3.二维数组的初始化 (1)所赋初值个数与数组元素的个数相同 (2)每行所赋初值个数与数组元素的个数不同 (3)所赋初值行数少于数组行数 (4)赋初值时省略行花括号对,任务6.2 二维数组,4.通过赋初值定义二维数组的大小 对于二维数组,只可以省略第一个方括号中的常量表达式,而不能省略第二个方括号中的常量表达式。例如: int a 3=1,2,3,4,5,6,8; 以上语句中,a数组的第一维的方括号中的常量表达式上省略,在所赋初值中,含有4个行花括号对,则第一维的大小由所赋初值的行数来决定。因此,它等同于: int a43=1,2,3,4,5,6,8;
58、 5.二维数组的定义和数组元素引用举例 示例6.10 通过键盘给23的二维数组输入数据,第一行赋1、2、3,第二行赋10、20、30,然后按行输出此二维数组,任务6.2 二维数组,本题示例了引用二维数组元素、对二维数组进行输入和输出的基本方法。程序中用i作为行下标,j作为列下标。程序如下: #include main( ) int a23,i,j ; printf (“enter data by line :n”); for(i=0;i2;i+) for( j = 0;j 3;j+ )scanf( “%d”,,当运行以上程序时输入:1 2 3 10 20 30 ( 代表enter键) 输出结果
59、如下: output a2 dimension array: 1 2 3 10 20 30,任务6.2 二维数组,6.2.2 二维数组和指针 先给出以下定义: int *p, a34; 1. 二维数组a由若干个一维数组组成 在c语言中定义的二维数组实际上是一个特殊的一维数组,这个一维数组的每个元素又是一个一维数组。如以上定义的a数组,则可视a数组由a0、a1、a2三个元素组成,而a0、a1、a2中每个元素又是由四个整型元素组成的一维数组。可用a00、a01等来引用a0中的每个元素,其它依次类推。 2. 二维数组名也是一个地址值常量 二维数组名同样也是一个存放地址常量的指针,其值为二维数组中的第
60、一个元素的地址。以上a数组,数组名a的值与a0的值相同,任务6.2 二维数组,6.2.3 二维数组程序举例 示例6.11 将一个二维数组行和列元素互换,存到另一个二维数组中。例如,main() inta23=1,2,3,4,5,6; intb32,i,j; printf(“arraya:n”); for(i=0;i=1;i+) for(j=0;j=2;j+) printf(“%5d”,aij); bji=aij;,printf(“n”); printf(“arrayb:n”); for(i=0;i=2;i+) for(j=0;j=1;j+) printf(“%5d”,bij); printf(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届新疆昌吉回族自治州九中物理高三第一学期期中考试试题含解析
- 2025届安徽凤阳县城西中学物理高一上期末联考试题含解析
- 2025届中考物理热身梯形含解析物理高一上期中质量检测模拟试题含解析
- 2025届江苏省徐州市高一物理第一学期期末综合测试模拟试题含解析
- 2025届湖南长沙市第一中学物理高三第一学期期中经典模拟试题含解析
- 2025届湖南省长沙市稻田中学物理高二第一学期期中考试试题含解析
- 2025届内蒙古赤峰第四中学高二物理第一学期期中达标检测模拟试题含解析
- 安徽省全国示范高中名校2025届高二物理第一学期期末检测试题含解析
- 2025届上海市浦东新区四校物理高三上期末质量检测模拟试题含解析
- 2025届江苏省扬州市广陵区扬州中学物理高三上期中统考模拟试题含解析
- 2023年Beck自杀意念评估量表
- GB/T 2573-2008玻璃纤维增强塑料老化性能试验方法
- GB/T 25217.7-2019冲击地压测定、监测与防治方法第7部分:采动应力监测方法
- 《幼儿卫生学》配套教学课件
- 刑法课件(第三版)课件 第七章:罪数
- 《大体积混凝土》课件
- 认识谵妄课件
- 三年级上册数学课件-《练习五》北师大版 (共16张PPT)
- 五年级《欧洲民间故事》知识考试题库(含答案)
- 中国电力工业发展史课件
- 五年级上册数学课件-第5单元 6.解方程(1)∣人教新课标 (共14张PPT)
评论
0/150
提交评论