C语言程序设计教程电子教案_第1页
C语言程序设计教程电子教案_第2页
C语言程序设计教程电子教案_第3页
C语言程序设计教程电子教案_第4页
C语言程序设计教程电子教案_第5页
已阅读5页,还剩313页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计教程电子教案目录

第1章C语言概述第2章数据类型、运算符和表达式第3章C程序中的输入、输出第4章C程序的控制结构第5章数

组第6章函数第7章编译预处理命令第8章指

针第9章结

体第10章文

件第1章C语言概述学习目标

对C语言有一个概括的了解,能够编写包含键盘输入、计算和显示输出等操作的简单C程序。主要内容C语言的产生与特点

简单C程序的组成C语言应用程序开发的基本步骤1.1C语言的产生及特点

C语言是为了编写系统程序而在1968年开始研发的计算机高级语言C语言表达能力强,使用灵活,程序结构清晰,紧凑,可移植性好C语言是进一步学习面向对象的程序设计语言C++和VC的基础

【例1-1】从键盘输入三个整数,输出它们的和

main()/*计算三个整数的和*/{intx,y,z,sum;scanf("%d,%d,%d",&x,&y,&z);sum=x+y+z;printf("sum=%d\n",sum);}

语句

函数体

主函数名最简单的C程序的组成对程序的注释1.2C语言程序的结构及书写格式

main(){intx,y,z,sum;scanf("%d,%d,%d",&x,&y,&z);sum=x+y+z;printf("sum=%d\n",sum)}定义变量x,y,z和sum从键盘输入三个整数赋给变量x,y和z显示变量sum的值计算x+y+z,并将结果赋给变量sum程序说明一般C程序的组成【例1-2】采用模块结构,改写例1-1的程序。add(intx,inty,intz){return(x+y+z);}

main(){intx,y,z;printf("PleaseInputThreeIntegers:\n");scanf("%d,%d,%d",&x,&y,&z);printf("sum=%d\n",add(x,y,z));}函数add()主函数main()调用函数add()

……函数1主函数main()函数2函数k注意:每个C程序必定有一个、而且只能有一个主函数main()。

主函数可以调用其它子函数,而子函数不可以调用主函数,子函数彼此之间也可以相互调用。C程序的组成

,当一个语句分几行书写时,在换行前应加上“\”符,然后从下一行的开头继续。2.习惯上,书写C程序时均使用小写英文字母。3.C程序一般都采用缩进格式的书写方法,不同结构层次的语句,从不同的起始位置开始,同一结构层次中的语句,缩进同样个数的字符位置。4.应当在程序中适当地添加一些注释行。1.3C程序的编辑、调试和运行编辑源程序

生成目标程序

经编译

经连接库修改源程序函数

生成exe文件

运行运行时出错编译出错第1章结束

第2章

数据类型、运算符和表达式

学习目标1.掌握基本数据类型的概念和常量表示方法,掌握变量的定义方法,能够根据实际情况选用适当的数据类型2.熟练掌握数值表达式的构造方法,能够利用表达式完成数值计算主要内容C数据类型概述常量和变量算术运算表达式赋值表达式自增、自减表达式2.1概述C语言支持的数据类型基本数据类型整型单精度型主要数据类型构造数据类型指针类型实型字符型数组类型结构体类型双精度型基本数据类型说明符整型:intlong字符型:char实型:floatdoublelongdouble2.2常量常量∶在程序运行过程中,其值不能被改变的量。

一.不同数制整型常量的表示例如:12:十进制数12012:八进制数12(等于十进制数10,用前导符0表示八进制数常量)0x12:十六进制数12(等于十进制数18,用前导符0X或0x表示十六进制数常量)用‘’括起来的可显示字符,如∶‘A’、‘$’、‘3’等(转义字符除外)2.用八进制数表示其ASC代码的字符,如‘\101’表示西文字符A、‘\63’表示数字字符3。3.用十六进制数表示其ASC代码的字符,如:‘\x41’表示西文字符A、‘\x2A’表示字符*。4.用‘\’’表示字符’,‘\”’表示字符”,‘\\’表示字符\。5.用双引号括起来的字符序列表示字符串常量,其中最后一个字符是字符串结束符‘\0’,不显式地表示出来。如:“English”。【例2-1】常量的例子main(){floatr;printf("PleaseInputRadius:\n");scanf("%f",&r);printf("TheCircumferenceofCirle:%f\n",2*3.1415926*r);}定义浮点型变量r人机对话,通知用户输入半径的值从键盘输入半径的值,并将值赋给变量r显示结果常量2常量三.符号常量

可以用#define命令定义符号常量,在程序的执行过程中不允许改变符号常量的值。【例2-2】说明符号常量的例子#definePRICE30main(){intnum,total;

num=10;total=num*PRICE;printf("total=%d",total);}通过#include定义符号常量PRICE为30定义二个整型变量num和total使变量num的值为10执行运算10×30并把运算的结果赋予变量total显示结果2.3变量的定义和初始化变量:在程序运行时,其值可变的量被称为变量,分为整型变量、实型变量和字符型变量一.C语言中的标识符C语言把用户给常量、变量、函数、标号和其它对象所起的名字统称为标识符。用户定义的标识符须遵循如下规则:标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,标识符的长度不超过32个字符。同时,C语言的关键字和库函数名不能作为标识符。例如,下面的字符序列均为合法的C语言标识符:a,b,word,_file,file2,F_name,f_name注意:C编译程序字母区分大小写,所以上述F_name和f_name是二个不同的标识符。下面的字符序列为不合法的C语言标识符:2L──违反了标识符第一个字符必须为字母或下划线的规定。a**──违反了标识符只能由字母、数字和下划线三种字符组成的规定。int──违反了C语言的关键字和库函数名不能作为标识符的规定。

二.变量分类有符号整型说明符无符号整型说明符整型intsigned signedintunsignedunsigned int长整型longlong intsigned longsigned longintunsigned longunsigned longint

有符号整型无符号整型占字节数整型int-32768~32767unsigned0~655352字节长整型long-231~(231-1)

unsigned long0~4,294,967,2954字节整型变量的值域Longdouble取值(绝对值)范围占字节数10-4931~104932

单精度型双精度型10-37~10384float

double10-307~10308

浮点型说明符816说明符取值范围(字符的ASC码值)占字节数char0~2551在设计程序时,应当根据数据本身的特点和变化范围正确选择变量类型。

变量的定义格式:

类型说明符变量名表

int、unsigned、long、float、double、char等变量名只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。例如,语句:inta1,a2,age;

floatx,y,z;

charch;分别定义了整型变量a1,a2,age,浮点型变量x,y,z和字符型变量ch。变量的初始化:

在定义变量的同时对变量预先设置初值。例如,执行语句:

intnum=20;floatpi=3.14;charc1,c2='M';变量num、pi、c2的初值分别为20、3.14和字符M。四.各类数值型数据间的混合运算高doublefloat

longunsigned

低intchar当各种不同类型的数据混合运算时,其运算结果的类型由上图所示的类型转换原则确定。【例2-3】设程序中定义变量:inti;floatf;doubled;

执行运算:i+(f*d)-(f+i)(这里的*表示乘法)下图给出了在运算过程中所发生的数据类型的转换i+(f*d)-(f+i)

doubledoubledouble

doubledouble

double

doubledouble

double2.4算术运算符和算术运算表达式一.算术运算符算术运算符包括:

+(加)-(减)*(乘)/(除)%(求余)

操作符%只作用于整数x%y的值就是x除以y的余数。操作符/的两种含义:整数除法(整除)

当被除数和除数都是整型数据时,“\”运算的结果为整型。

例如:5/2的值为2(而不是2.5)实数除法

当被除数和除数中至少有一个是实数型数据时,“\”运算的结果为实数型。

用算术运算符和括号将运算对象连接起来、并符合C语言语法规则的式子,称为算术运算表达式或算术表达式。例如:设r、x、y是已经定义的数值型变量,则:3.14*r*r、x+2*y-3/z、(x-y)*(x-y/2)均是合法的算术运算表达式,单独的r、x、y也是合法的算术运算表达式。实际上,单独的常量或变量是最简单的算术运算表达式。注意:算术运算表达式中的分数线须用/表示

例如:2+3×i

k×j

表示为C语言表达式就是:

(2+3*i)/(k*j)或(2+3*i)/k/jC程序中,称表达式的运算结果为表达式的值。C语言规定,在表达式求值时,须按运算符优先级的高低次序执行。对算术运算而言,必须遵循先括号内后括号外,先乘、除及求余运算,后加减的运算优先级规则。C语言规定了运算符二种不同的结合方向:左结合:当参于运算的数据两侧的运算符优先级相同时,运算顺序为自左至右。C语言规定算术运算符遵循左结合的规则。例如,计算算术运算表达式a+b-c时,运算符“+”和“–”具有相同的优先级,所以先执行

a+b,其结果再和c相减。右结合:当参于运算的数据两侧的运算符优先级相同时,运算顺序为自右向左。

C语言提供的运算符中有少量运算符遵循右结合的规则。教材的附录部分列出了C语言中所有运算符以及它们的优先级和结合性。2.5赋值运算符与赋值运算表达式赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。例如:执行程序段inta;a=3;a=a-5;当执行语句“a=3;”就完成一次赋值运算,把赋值运算符右边的值3赋给赋值运算符左边的变量a,赋值后,a的值为3。再执行语句“a=a-5;”,赋值运算符右边的表达式a-5的运算结果为-2,将-2赋给a。最后,变量a的值变为-2。复合的赋值运算符复合的赋值运算符的格式:算术运算符=所以,+=、-=、*=、/=、%=都是复合的赋值运算符。将一个变量通过赋值运算符或复合的赋值运算符与一个表达式连接而成的式子称为赋值运算表达式。赋值运算表达式的格式为:变量名=表达式或变量名复合的赋值运算符表达式例如:x=1.414,m1='E',s=3.14159*r*r或a+=5,x/=a+1上述各例都是合法的赋值运算表达式。赋值运算表达式的作用是把赋值运算符右边表达式的值赋给赋值运算符左边的变量。当算术运算符和赋值运算符同时出现在一个表达式中时,算术运算符的优先级高于赋值运算符。C语言允许赋值运算表达式中的表达式部分还是一个赋值表达式,这样就构成了多重赋值。多重赋值表达式中,赋值运算符遵循右结合的法则,即:自右向左的运算顺序。例如:多重赋值语句a=b=c=x+8;在执行时等价于依次执行三个语句:c=x+8;b=c;a=b;将一个变量通过复合的赋值运算符与一个表达式连接而成的式子同样称为赋值运算表达式。例如:a+=5,x/=a+1

下面的例子说明了复合的赋值运算符的运算规则。表达式a+=5等价于a=a+5表达式a*=4-b等价于a=a*(4-b)表达式a%=b-1等价于a=a%(b-1)注意:

复合的赋值运算符右边的表达式是作为一个整体参与其左边算术运算符所规定的运算的。【例2-4】赋值运算表达式举例1)y=3*(x-1);/*将3*(x-1)的结果赋值给变量y。*/2)a=(b=4)+(c=6);/*这里的赋值运算表达式(b=4)、(c=6)参于算术运算,C言规定,将赋值运算符右边表达式的值作为赋值运算表达式的值。所以,赋值运算表达式(b=4)的值为4,(c=6)的值为6,最后将它们的和赋值给变量a,由于算术运算符的优先级高于赋值运算符,所以表达式中的括号是必须的。*/3)a+=a*=a+2;/*这里的语句等价于:a=a*(a+2);a=a+a;*/字符型数据的值在内存表现为它们的ASC代码值(0--255之间的一个整数)2.字符常量以其ASC代码值参与整数运算。

如:‘A’+2的值为67字符A的ASC码值为65【例2-5】字符型变量参与算术运算main(){inta;chari;a='B'-1;i=a+10;printf("a:%d,a:%c\n",a,a);printf("i:%d,i:%c\n",i,i);}以字符格式输出变量a的值结果为字符A以整型格式输出变量a的值结果为67【例2-6】大小写字母的转换

main(){charc1='a',c2='B';c1=c1-32;c2=c2+32;printf("c1:%c,c2%c",c1,c2);}大小写英文字母的ASC码值相差322.6自增、自减运算符++、--功能:(设i为整型变量)++i:在使用i之前,先执行i+=1,使i的值加1。--i:在使用i之前,先执行i-=1,使i的值减1。i++:在使用i之后,执行i+=1,使i的值加1。i--:在使用i之后,执行i-=1,使i的值减1。上述“使用”指的是i加1或减1前后的其他操作,如赋值、运算、显示等。若不存在其它操作,则i++与++i一样,执行i+=1,使i的值加1;i--与--i一样,执行i-=1,使i的值减1。【例2-7】自加、自减运算符的应用。main(){inti=10,j;floatpi=3.14,pa;j=i++;pa=++pi;printf("j=%d,pa=%f\n",j,pa);printf("i=%d,pi=%f\n",i++,--pi);}先将i的值赋给变量j再执行i+=1;先执行pi+=1;再将pi的值赋给变量pa先将i的值输出再执行i+=1;先执行pi-=1;再将pi的值输出2.7位运算符

位运算以字节(byte)中的每一个二进位(bit)为运算对象,最终的运算结果是整型数据。位运算分为按位逻辑运算和移位运算。

按位逻辑运算符包括:按位逻辑与运算符:“&”按位逻辑或运算符:“|”按位逻辑非运算符:“~”按位逻辑异或运算符:“^”运算法则设用x、y表示字节中的二进位,取值为0或1。按位逻辑运算符的运算法则为:

按位逻辑与运算:x&y的结果为1,当且仅当x、y均为1,否则x&y的结果为0。按位逻辑或运算:x|y的结果为0,当且仅当x、y均为0,否则x|y的结果为1。按位逻辑异或运算:x^y的结果为1,当且仅当x、y的值不相同,否则x^y的结果为0。按位逻辑非运算:当x=1时,~x=0,而当x=0时,~x=1。

位运算表达式的格式:整型变量名运算符(&、|、^)整型变量名或~整型变量名【例2-8】位运算符的应用设有:inta=55,b=36;计算:a&b、a|b、a^b及~a的结果。假定每个整型变量占二个字节(16bit),则在内存中的二进制数a、b为:a:0000000000110111b:0000000000100100按上述按位运算的法则,列出下述算式:

a&b:a|b:00000000001101110000000000110111&0000000000100100|000000000010010000000000001001000000000000110111

a^b:00000000001101110000000000100100a:0000000000110111^0000000000100100~a:11111111110010000000000000010011结果:a&b=24,a|b=37a^b=13,~a=ffc8(用十六进制表示)

C语言提供的移位运算实现将整数数据按二进位右移或左移的功能。向右移位运算符:“>>”,向左移位运算符:“<<”。移位运算表达式的格式:整型变量名移位运算符整型常量其中,整型常量指出右移或左移的位数。【例2-9】移位运算符的应用设定义inta=55,b=36;计算(a+b)>>2、(a-b)<<3的结果。a+b和a-b的结果91和19在内存中的二进制数分别为:

a+b:0000000001011011和a-b:0000000000010011a+b:0000000001011011(a+b)>>2:00000000010110左边补0

结果:0000000000010110a-b:0000000000010011(a-b)<<3:0000000010011右边补0结果:00000000100110002.8其他运算符和表达式

C语言提供的强制类型转换运算符可以将一个表达式转换成指定的数据类型。格式:(类型说明符)(表达式)例如:(double)(x+y)/*将表达式x+y的结果转换成双精度型*/(int)a/*将变量a的值转换成int类型*/【例2-10】强制类型转换运算符的使用main(){floatx=3.6,y=6.6;printf("x+y=%f\n",x+y);printf("x+y=%f\n",(int)x+(int)y);}将x的值强制转换成整型值3将y的值强制转换成整型值6

C语言通过逗号运算符“,”将两个以上的表达式连接起来,组成逗号表达式。逗号表达式的一般格式:表达式1,表达式2,……,表达式k逗号表达式的运算:

依次求表达式1、表达式2、……、表达式k的值,并以最后一个表达式k的值作为整个逗号表达式的值。

例如,语句:x=(a=3,6*3);等价于:a=3;x=6*3;x=6*3;将表达式6*3的结果作为整个逗号表达式的值第2章结束

第3章

C程序中的输入、输出

学习目标

对C语言的输入、输出有一个初步的了解,学会使用scanf()、printf()函数实现整型、浮点型和字符型数据的输入、输出。主要内容·C语言的输入、输出·printf()函数·scanf()函数·getchar()函数和putchar()函数3.1概述C语言中没有输入、输出语句,通过调用库函数中的输入、输出函数printf()、scanf()、getchar()和putchar()实现输入、输出。在使用输入、输出函数时,应当在源程序的开始处使用#include<stdio.h>命令将输入、输出函数的头文件包含进来,以便在编译时实现连接。一.格式输出函数printf()函数功能∶从指定的输出设备输出数据,默认的输出设备为显示器。使用格式∶

printf(格式控制,输出表列)由格式控制符%和格式字符实现表达式3.2格式输入、输出函数scanf()和printf()

格式控制的内容这部分是用双引号括起来的字符串,其中包含两种信息:格式说明:由%和格式字符组成。如%d、%f、

%f等,它们的作用是将待输出的数据按指定的格式输出。普通字符:即需要按原样输出的字符。例如,语句:

printf("TotalNumberis%d,Priceis%f\n",total,price);中的TotalNumberis

、Priceis●输出表列部分:这部分是需要输出的数据值,通常是表达式,如上例中的total、price。

常用的printf()格式字符

格式字符说明c(*)以字符形式输出,只输出一个字符d(*)以带符号的十进制形式输出整数(正数不输出符号)e或,E以指数形式输出实数,数字部分小数位数为6位f(*)以小数形式输出单、双精度数,隐含输出6位小数l用于长整型数据,可加在格式符d,o,x,u前面

当于∶2.5×10-3如∶%ld,%lo,%lx等接上页格式字符说明o以八进制无符号形式输出整数(不输出前导符0)s(*)输出字符串u以无符号十进制形式输出整数x或X以十六进制无符号形式输出整数(不输出前导符0x),用x则输出十六进制数的a~f以小数形式,用X时,则用大写字母输出【例3-1】输出格式控制符的应用main(){intx=35;floaty=123.456;charch='A';printf("x=%d\n",x);printf("y=%f\n",y);printf("y=%10.2f\n",y);printf("y=%-10.2f\n",y);printf("ch=\'%c\'\n",ch);printf("String:\"%s\"\n","Shanghai");}以整数格式输出表达式x的值\n为转义字符,输出时将光标移到下一行的开始处按原样输出字符串String%-m.nf与%m.n相似,只是在其右边以空格补足不足部分。

%m.nf表示以小数形式输出,输出结果共占m位,其中小数部分占n位。如果输出结果不足m个字符,则在其左边以空格补足。

格式转义字符

字符形式功

能\n(*)换行\t(*)横向跳格(即跳到下一个输出区)\v竖向跳格\b退格\r回车\”(*)双引号字符\\(*)反斜杠字符“\”\’(*)单引号字符\ddd1到3位8进制数所代表的字符\xhh1到2位16进制数所代表的字符

【例3-2】转义字符的应用main(){printf("Chinese\tEnglish\n");printf("\"Welcome,friends!\"\n");printf("\101,\x41\n");}转义字符'\t'使字符串"English“输出到第2个输出区

转义字符\”用以输出双引号字符。

\101以八进制形式给出大写字母A的ASC码值65。\x41以十六进制形式给出大写字母A的ASC码值65。

二.格式输入函数scanf()

功能∶从键盘输入数据,并存入相应变量的存储单元。使用格式∶

scanf(格式控制,地址表)与printf()函数的格式控制类似,以%d%f,%c,%s为最常用由取地址运算符“&”取出变量的存储单元的起始地址

格式字符说明

c用以输入单个字符d用以输入有符号的十进制整数f用以输入实数,可以用小数形式或指数形式输入L用以输入长整型数据以及double型数据o用以输入无符号的八进制整数s用以输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志’\0’作为其最后一个字符u用以输入无符号的十进制整数x或X用来输入无符号的十六进制整数(大小写作用相同)*表示本输入项在读入后不赋给相应的变量域宽指定输入数据所占宽度(列数),域宽应为正整数常用的scanf()格式字符表

【例3-3】输入格式控制符的应用main(){inta,b;floatc,d;chare;scanf("%d%d",&a,&b);scanf("%f,%f",&c,&d);scanf("%c",&e);printf("%d+%d=%d\n",a,b,a+b);printf("%f-%f=%f\n",c,d,c-d);printf("%c\n",e);}当二个%d之间没有分隔符时,相应的二个输入数据之间也必须用空格分隔当二个%f之间用逗号分隔时,相应的二个输入数据之间也必须用逗号分隔3.3字符输入、输出函数getchar()和putchar()一.字符输出函数putchar()putchar()函数用以输出字符变量的值。调用putchar()函数的一般格式:

putchar(整型表达式);其中,“整型表达式”的值应当在字符ASC码值的范围内。通常,putchar()的参数是字符型变量、字符常量,也可以是整型变量、整型常量。【例3-4】字符输出函数putchar()的应用

#include<stdio.h>main(){chara='C';inti=97;putchar(a);putchar(b);putchar('t');}将变量或表达式的值以字符格式输出使用putchar()函数,必须用命令“#include”将标准输入输出函数的头文件“stdio.h”包含到用户的源文件中

二.getchar()函数功能:getchar()函数用以从键盘上输入一个字符。调用getchar()函数的一般格式:getchar()【例3-5】字符输入函数getchar()的使用

#include<stdio.h>main(){charch;ch=getchar();putchar(ch);putchar(getchar());}由getchar()函数从键盘输入一个字符,并立即由putchar()函数将其输出使用getchar()函数,必须用命令“#include”将标准输入输出函数的头文件“stdio.h”包含到用户的源文件中

第3章结束

第4章

C程序的控制结构

学习目标熟练掌握if语句,掌握switch语句,会利用这两种语句进行条件分支结构的程序设计。熟练掌握for语句、while语句和do…while语句,会利用这三种语句进行循环结构的程序设计。掌握break语句和continue语句与上述语句配合使用的方法。主要内容程序算法的概念顺序结构分支结构循环结构

4.1程序算法简介计算机科学家沃思提出公式:

数据结构+算法=程序

数据结构──对数据的描述。如前面所介绍的各种数据类型就是最简单的数据结构。

算法──对操作的描述,是为解决一个问题而采取的方法和步骤。通常用流程图表示算法。

计算1+2+3+4+…+100可以二种不同的算法:算法一:先作1+2,再加3,再加4,一直加到100,最后得到结果:5050。算法二:利用等差数列求和公式:n(n+1)21+2+3+……+n=

比较算法一和算法二:

算法二不具有普遍性,许多级数求和问题是不能简单地用公式表示的,如:cos1+cos2+cos3+……+cosn算法一所反复实施的是二个数的加法运算:1、1+2、(1+2)+3、(1+2+3)+4、……、(1+2+3+……+99)+100这种看似枯燥、单一,反复实施的运算利用C语言提供的选择结构和循环结构却是很容易实现的,而且这一算法适用于不同的级数求和问题。由于计算机具有极高的运算速度,这样的程序结构恰好发挥了计算机的特长。结论:对计算机而言,算法一优于算法二。选择一个好的算法是设计出高质量程序的前提。【例4-1】为计算1+2+3+……+n设计一个算法,其中n的值由键盘输入步骤1:从键盘输入n的值步骤2:0sum(使变量sum具有初值0)步骤3:1i(使变量i具有初值1)步骤4:sum+isum(用sum+i的值取代sum原来的值)步骤5:i+1i(使变量i的值增1)步骤6:若i≤n,再返回到步骤4,否则结束。说明:算法中,步骤4到步骤6组成一个循环,最后的计算结果存放在变量sum中。上述算法中的每一个步骤都可以用C语言来描述,并最终成为一个完整的C程序。

二.算法的表示算法用流程图来表示。所谓流程图就是用一些图框表示各种操作,形象直观,易于理解。

常用的流程图符号:或开始、结束框输入、输出框处理框判断框流程线按算法一计算1+2+3+……..+n的流程图,其中n的值由键盘输入。

开始输入n0sum1isum+ifaci+1ii≤n?y输出sumn结束返回三.算法的特性有穷性:一个算法所包含的操作步骤必须是有限的。2.确定性:指算法中的每一个步骤的含义必须是明确的,不能有二义性。3.由零个或多个输入:如果算法中的n是已知的数据,而不是来自外部,可以没有输入。4.有一个或多个输出:通过输出了解算法的结果。5.有效性:算法中的每一个步骤都应当是可以被执行的,并能得到确定的结果。4.2顺序结构

语句1语句2

顺序结构:顺序结构是最简单的程序结构,在执行时,按语句的先后次序依次执行,直至结束。【例4-2】编写程序,要求从键盘输入圆的半径r,计算圆的面积s和周长l

main(){floats,l,r;printf("PleaseInputr");scanf("%f",&r);s=PI*r*r;l=2*PI*r;printf("r=%f,s=%f,l=%f\n",r,s,l);}将r2表示为r*r或用函数表示为∶pow(r,2)定义符号常量【例4-3】从键盘上输入一个三位正整数,然后逆序输出main(){inta,b;scanf("%d",&a);b=a%10;a/=10;printf("%d",b);b=a%10;printf("%d",b);a/=10;printf("%d\n",a);}

取出个位数得到由百位数数字和个位数数字组成的二位数4.3关系运算符和关系运算表达式

关系运算符用于表达式之间的比较:大于比较运算符:>小于比较运算符:<大于等于比较运算符:>=小于等于比较运算符:<=等于比较运算符:==不等于比较运算符:!=关系运算符按运算优先级可分为二组:>、<、>=、<=具有相同的运算优先级,==和!=具有相同的运算优先级。后一组的运算优先级又低于前一组。同优先级的关系运算符遵循左结合──自左至右的结合方向。二.关系运算表达式

二个表达式通过关系运算符连接而成为关系运算表达式。

关系运算表达式的一般形式为:

<表达式1><关系运算符><表达式2>

例如:

c>a+b、a!=2、-5<=b-c都是合法的关系

运算表达式。

关系运算表达式的结果为逻辑值。

1(表示“真”)──当关系运算表达式成立时(True)。逻辑值=0(表示“假”)──当关系运算表达式不成立时(False)。

关系运算符的优先级高算术运算符:+-*/%

关系运算符:><>=<=关系运算符:==!=低

赋值运算符:=+=-=*=/=%=【例4-4】设:a=3,b=4,c=5,判断下列各关系运算表达式的结果。

x=b>a

由于关系运算符优先于赋值运算符,所以原式等价于x=(b>a),由题设可知b>a成立,结果为1,故最后执行赋值运算x=1。(2)a!=b>=c

由于关系运算符!=的运算优先级低于关系运算符>=,所以原式等价于a!=(b>=c),由题设可知b>=c不成立,结果为0,原式可化为a!=0,由题设可知a!=0成立,结果为1。(3)(a>b)>(b<c)由题设可知,a>b不成立,结果为0,b<c成立,结果为1,原式可化为0>1,其结果为0。(4)f=a<b<c由于同优先级的关系运算符遵循自左至右的结合方向,故原式等价于:f=((a<b)<c),由题设可知,a<b的结果为1,(a<b)<c的结果为1,最后执行赋值运算:f=1。4.4逻辑运算符和逻辑运算表达式

逻辑运算符包括∶

!

(逻辑非运算)

&&

(逻辑与运算)

||

(逻辑或运算)

逻辑表达式∶

用逻辑运算符连接而成的表达式。逻辑运算的结果为逻辑值,以1表示“真”(true),以0表示“假”(false)。高

逻辑运算符:!

算术运算符:+、-、*、/、%

关系运算符:>、<、>=、<=

关系运算符:==、!=

逻辑运算符:&&、||低

赋值运算符:=、+=、-=、*=、/=、n%=运算符的优先级:注意:

C++允许算术运算表达式参与逻辑运算,在参与逻辑运算时,一切非零值均作为逻辑值1,而将零值作为逻辑值0。逻辑运算法则:

(设A,B是参与逻辑运算的二个量)逻辑“与”运算法则:(运算符:&&)

A&&B的结果为1,当且仅当A,B的值均为非0,否则,A&&B的结果为0。

例如:1&&0的结果为0-5&&3.14的结果为10&&0的结果为0逻辑“或”运算法则:(运算符:||)A||B的结果为0,当且仅当A、B的值均为0,否则,A||B的结果为1。例如:1||0的结果为1-5||3.14的结果为10||0的结果为0

逻辑“非”运算法则:(运算符:!)!A的结果为0,当且仅当A的值为非0,否则,!A的结果为1。例如:!0的结果为1!3.14的结果为0【例4-5】设inta=3,b=4,c=5;判断下列表达式的值:

说明:由于逻辑与、或运算的优先级低于关系运算符,故将下列各式中的括号去除后对结果没有影响。(1)(a>b)||(c>a)由题设可知,原式等于0||1,结果为1。(2)(!c<a)&&(b>a)||(b<a)由题设可知,原式等于(!5<3)&&(4>3)||(4<3)由于逻辑非运算的优先级高于关系运算符,而!5的值为0,故原式又等于(0<3)&&(4>3)||(4<3)也即是:1&&1||0,按自左向右的结合方向,最后结果为1。【例4-6】设inta=3,b=4,c=5;判断表达式a=(b=!a)&&(c=b)的值。原表达式等价于a=((b=!a)&&(c=b))。C语言规定:

在执行“&&”运算时,如果“&&”运算符左边表达式的值为0,则已经可以确定“&&”运算的结果一定为0,故不再执行“&&”运算符右边表达式规定的运算。类似地,在执行“||”运算时,如果“||”运算符左边表达式的值为1,则已经可以确定“||”运算的结果一定为1,故不再执行“||”运算符右边表达式规定的运算。

由题设可知,!a的值为0,故赋值运算表达式b=!a的值为0,按C语言规定,赋值运算表达式(c=b)将不被执行,c的值还是5,b的值为0,由于逻辑运算表达式(b=!a)&&(c=b)的值为0,故a的值为0,整个赋值运算表达式为0。

逻辑表达式的应用举例1.数学中的1≤x<5,并且x≠3可用逻辑表达式表示为:x>=1&&x<5&&x!=3;2.x是3的倍数或5的倍数,可用逻辑表达式表示为:x%3==0||x%5==0;4.5选择结构在许多场合,需要根据不同的情况执行不同的语句。称这种程序结构为选择结构。C语言提供的条件语句和开关语句可用于实现选择结构程序设计。

一.if语句和if…else…语句

if语句if语句的格式:

if(表达式)

语句

值为0值为非0表达式语句执行时,首先计算表达式的值,若其值不为0(表示真),则执行语句部分,否则,跳过语句部分,执行其后面的语句

【例4-7】从键盘输入实数a,输出a的绝对值main(){floata;printf("Enterafloat\n");scanf("%f",&a);if(a<0)a=-a;printf("a=%f\n",a);}若a<0成立,执行a=-a否则直接执行printf语句【例4-8】从键盘输入一个正整数n,如果n是一个三位数,将其逆序输出,否则,直接结束。

main(){inta,b;scanf("%d",&a);if((a>=100)&&(a<1000))printf("TheEnd\n");}{b=a%10;a/=10;printf("%d",b);b=a%10;printf("%d",b),a/=10;printf("%d\n",a);}复合语句取出个位数字取出由百位数字和十位数字构成的二位数

if……else……语句

if……else……语句的格式:if(表达式)

语句1

else

语句2值为非0值为0表达式语句1语句2执行时,首先计算表达式的值,若其值不为0,则执行语句1,否则,执行语句2。语句1和语句2必定有一个、而且只能有一个被执行。之后,执行其后续语句。

【例4-9】从键盘上输入两个整数a和b,按先大后小的顺序输出。main(){inta,b;printf("Pleaseentertwointegers\n");scanf("%d,%d",&a,&b);if(a>b)printf("MAX=%d,MIN=%d,\n",a,b);elseprintf("MAX=%d,MIN=%d,\n",b,a);}a>b成立,执行这一语句a>b不成立,执行这一语句例4.10输入a,b,c,利用求根公式求一元二次方程ax2+bx+c=0的根。流程图:开始输入a,b,c计算b*b-4*a*c并赋值给变量deltadelta>=0?计算:sqrt(delta)并将结果赋给变量delta输出实根结束计算:sqrt(-delta)并将结果赋给变量delta输出复根开始输入a,b,c计算b*b-4*a*c并赋值给变量delta

delt>=0?YesNo计算:sqrt(delta)并将结果赋给变量delta输出实根计算:sqrt(-delta)并将结果赋给变量delta输出复根结束#include<math.h>main(){floata,b,c;floatx1,x2,delta;printf("PleaseInputa,b,c:");scanf("%f,%f,%f",&a,&b,&c);delta=b*b-4*a*c;if(delta>=0){delta=sqrt(delta);printf("x1=%f,",(-b+delta)/(2*a));printf("x2=%f\n",(-b-delta)/(2*a));}else{delta=sqrt(-delta);printf("x1=%f+%fi\n",-b/(2*a),delta/(2*a));printf("x1=%f-%fi\n",-b/(2*a),delta/(2*a));}}程序:if与else配对,用以找出a、b中的大者【例4-11】编程求整数a、b、c中的最大者,a、b、c由键盘输入。main(){inta,b,c,max;print{("Pleaseenterthreeintegers:\n");scanf("%d,%d,%d",&a,&b,&c);if(a>b)max=a;elsemax=b;if(max<c)max=c;printf("a=%d,b=%d,c=%d,MAX=%d\n",a,b,c,max);}条件运算符C语言提供了条件运算符“?:”。由条件运算符构成的表达式称为条件运算表达式。在某些情况下,条件语句if……else……可以用条件运算表达式来代替。条件运算表达式的格式:表达式1?表达式2:表达式3

执行时,先判断表达式1的值,如果其不为0,则以表达式2的值作为条件运算表达式的值,否则,以表达式3的值作为条件运算表达式的值。例如,赋值语句:y=x>0?10:-10;等价于:条件语句:if(x>0)y=10;elsey=-10;只有在if语句内嵌的语句为赋值语句、且两个分支都给同一个变量赋值时,才能用条件表达式代替if语句

【例4-12】从键盘输入二个整数,输出其中的较大者。main(){inta,b;printf("Pleaseinputtwointegers:\n");scanf("%d,%d",&a,&b);printf("MAX=%d\n",(a>b)?a:b);}使用条件运算符使程序变得简洁C语言允许在条件语句中又包含另一个条件语句,称之为条件语句的嵌套。

在if语句中又嵌套了另一个if语句【例4-13】从键盘上输入一个字符,判断它是英文字母、数字或其它字符。输入的是数字?输入的是字母?显示:是数字显示:是字母显示:是其它字符结束yesnoyesno流程简图:程序:#include<stdio.h>main(){charch;printf("Enteracharacter:");ch=getchar();if(ch>='0'&&ch<='9')printf("Thecharacterisadigit\n");elseif((ch>='A'&&ch<='Z')||((ch>='a'&&c<='z'))printf("Thecharacterisacaptalletter\n");elseprintf("Thecharacterisothercharacter\n");}【例4-14】修改例4-10的程序,要求在求解方程之前,先判断输入的二次项系数a是否为0,若为0,则输出出错信息。输入a,b,c开始a≠0?其余部分请参阅图4-6中的相应部分

显示:Error!结束计算b*b-4*a*c并赋值给变量deltadelta>=0?其余部分请参阅图4-6中的相应部分yesnoyesno流程图:“if”和“else”的正确配对

复合语句和条件语句的嵌套结构为解决一些较为复杂的编程问题提供了必要的条件。但同时也使程序的结构变得复杂,不易读懂。特别是在程序中有多个{}和if…else…的情况。在阅读程序之前,必须能正确地将“{”和“}”配对、将“if”和“else”配对,使程序的结构变得清晰和有条理。“if”和“else”配对应遵循下述规律:自上而下,“else”总是和上面离它最近的“if”配对。而且,每一个“else”只能和一个“if”配对。由于单独的“if”也是条件语句,所以,允许无“else”配对的“if”单独存在。同理,“{”和“}”配对应遵循下述规律:自上而下,“}”总是和上面离它最近的“{”配对。【例4-15】如果变量x的值是-15,变量y的值是-10,则执行下面的程序段后,屏幕上显示的内容是什么?if(x>0)if(x>10)printf("A");elseprintf("B");elseif(y<-8)if(y>-20)printf("C");elseprintf("D");printf("E");

为了看清程序结构,必须先将if和else正确配对。if(x>0)if(x>10)printf("A");elseprintf("B");elseif(y<-8)if(y>-20)printf("C");elseprintf("D");printf("E");if(x>0)if(x>10)printf("A");elseprintf("B");elseif(y<-8)if(y>-20)printf("C");elseprintf("D");printf("E");将if和else正确配对:该程序段采用了缩进格式,这种格式更容易反映出程序结构。显示:Ex>0

?x>10?显示:A显示:By<-8?

y>-20?显示:C显示:Dyesyesnonoyesnonoyes流程图:switch语句的格式:

switch(整型表达式){

case整型常量表达式1:语句序列1〖break;〗

case整型常量表达式2:语句序列2〖break;〗……

case整型常量表达式k:语句序列k〖break;〗

〖default:语句序列k+1〗

}开关语句用于在程序中实现多路选择。Yes语句序列1语句序列2有break?有break?语句序列k-1有break?语句序列k语句序列k+1开关语句之后的语句有break?开关:整型表达式………YesYesYesnonononoSwitch语句的执行流程:说明:

格式中的break语句不是必须的,应根据需要而

定。

格式中的default语句不是必须的,在缺省的情

况下,相当于语句序列k+1是空语句。

格式中的{}是必须的。(1)switch语句与if语句的不同之处在于:switch语句只能对整型(含字符型)表达式的值是否等于给定的值进行判断,而if语句可以用于判断各种表达式。(2)switch语句中,case后面只能是常量。(3)同一个switch语句中,任意两个case后面的常量值不能相同。注意:【例4-16】编写一个四则运算计算器程序,可以实现输入二个数和一个四则运算符,输出运算结果的功能。main(){floatoperandl,operand2,result;charoperator;scanf("%f,%c,%f",&operandl,&operator,&operand2);switch(operator){case'+':result=operandl+operand2;break;case'-':result=operandl一operand2;break;case'*':result=operandl*operand2;break;case'/':result=operandl/operand2;break;default:printf("Illegaloperator,error!\n");}printf("result=%f\n",result);}由operator的值决定执行哪一个case语句执行break语句后就结束switch语句【例4-17】用switch语句实现从键盘输入成绩,转换成相应的等级后输出(90-100为A,80-89为B,70-79为C,60-69为D,59及以下为E)。main(){intscore;printf("PleaseInputAScore:");scanf("%d",&score);printf("\n");switch(score/10){case10:case9:printf("%c\n",'A');break;case8:printf("%c\n",'B');break;case7:printf("%c\n",'C');break;case6:printf("%c\n",'D');break;default:printf("%

温馨提示

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

最新文档

评论

0/150

提交评论