C语言程序设计顺序、选择、循环结构周闻钧朱宏明本讲内容赋值语句和顺序结构字符数据输入输出函数格式输入输出函数关系运算符与关系表达式逻辑运算符与逻辑表达式选择语句与选择结构各种循环语句循环结构C程序的结构组织C程序包括如下结构源文件预处理宏全局变量声明、定义函数函数首部函数体局部变量定义执行语句C语句的类型控制语句完成一定的控制功能,共9种If(x>y)iMax=x;elseiMax=y;函数调用语句由一次函数调用加一个分号构成printf("Hello,World");表达式语句由一个表达式构成语句i=9;C语句的类型(续)空语句;什么也不做,有时作为循环语句中的循环体复合语句用{}把一些语句括起来成为复合语句{x=125;t=x/100;printf("%d",t);}程序的三种结构选择结构P代表一个条件,当p条件成立时执行a,否则执行b.
两条路径汇合在一起然后出口.
apb真假程序的三种结构(续)循环结构当型循环结构:当p条件成立时,反复执行a操作.
直到p为假时才停止循环.
直到型循环结构:先执行a操作,再判断p是否为假,若p为假,再执行a,如此反复,直到p为真为止.
程序的三种结构(续)ap真假ap真假顺序程序设计从头到尾,一步一步的按顺序执行顺序程序设计符合我们的日常习惯,我们是天生的顺序程序设计师婴幼儿——少年——中年——老年起床——早饭——中饭——晚饭=和===和==的错误是所有的c程序员都犯过的错误=:赋值运算符,可以包括在其他表达式中if((a=b)>0)t=a;==:相等运算符,用来判断两个变量是否相等if(0==a)t=a;对"=="建议把常量写在左边,变量写在右边0==a如果误写成0=a,编译器会自动报错数据输入和输出输入输出语句和输入输出函数C语言中不提供输入输出语句printf和scanf是函数,它们不是C语言的关键字函数是以库的形式存放在计算机系统中的,不是C语言的组成部分输入输出函数是一系列函数,他们的输出对象包括终端,文件,设备等等主要包含在stdio.
h头文件中字符数据的输入输出putchar()函数功能:向终端输出一个字符,接受一个字符类型作参数在使用标准I/O库函数时,要使用预编译命令#include将stdio.
h文件包括到用户源文件中#include//对于#include"stdio.
h",编译器从用户的工作路径//开始搜索stdio.
h,对于#include,编译器//从标准库路径开始搜索stdio.
hvoidmain(void){chara,b,c;//定义3个字符类型的变量a='B';b='O';c='Y';putchar(a);//利用putchar()函数将字符输出putchar(b);putchar(c);}字符数据的输入输出(续)putchar()函数除了可见字符外,putchar还可以输出一些转义字符putchar('\101');//输出字符'A'putchar(输出单引号字符'putchar('\015');//输出回车,没有换行putchar('\t');//输出tab字符数据的输入输出(续)getchar()函数功能:从终端输入一个字符;getchar()函数没有参数在使用标准I/O库函数时,要使用预编译命令#include将stdio.
h文件包括到用户源文件中字符数据的输入输出(续)#includevoidmain(void){charc;c=getchar();putchar(c);}在运行时,如果从键盘输入字符a;a(输入a后,按回车键,字符才送到内存)a(输出变量c的值a)putchar(getchar())格式输出格式输出函数printf()输出若干个不同类型的数据printf函数的一般格式printf(格式控制,输出列表)或者printf(参数1,参数2,…,参数n),意义为把参数2到n按照参数1指定的形式输出格式控制格式控制是用双引号括起来的字符串,也称转换控制字符串,它包括格式说明:由%和格式字符组成,如%d,%f普通字符:即需要原样输出的字符输出列表要输出的数据,也可为表达式格式输出(续)格式字符——d格式符用来输出十进制整数%d,按整形数据的实际长度输出%md,m为指定的输出字段的宽度如果数据的位数小于m,则在左端补以空格若大于m,则按实际位数输出%ld,输出长整型数据如果用%d输出,就会发生错误对长整型数据也可以指定字符的宽度,如%8ld格式输出(续)格式字符——o格式符以8进制数形式输出整数由于是将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即将符号位也作为八进制数的一部分输出对长整数可以用%lo的格式输出,同样也可以指定字符的宽度格式字符——x格式符以16进制数的形式输出整数同样不会出现负的十六进制数可以用%lx输出长整型数,也可以指定输出字段的宽度格式输出(续)格式字符——u格式符用来输出unsigned型数据,即无符号数,以十进制形式输出一个有符号整数(int型)也可以用%u格式输出;反之,一个unsigned型数据也可以用%d格式输出unsigned型数据也可以用%o或%x格式输出格式字符——c格式符用来输出一个字符一个整数,只要它的值在0~255范围内,也可以用字符形式输出,在输出前,将该整数转换成相应的ASCII字符;反之,一个字符数据也可以用整数形式输出格式输出(续)格式字符——s格式符%s:输出一个字符串%ms:输出的字符串占m列,如果字符串本身长度大于m,则突破m的限制,将字符串全部输出;若长度小于m,则左补空格%-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格%m.
ns:输出占m列,但只取字符串中左端n个字符,这n个字符输出在m列的右侧,左补空格%-m.
ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格;如果n>m,则m自动取n值,即保证n个字符正常输出格式输出(续)格式字符——f格式符用来输出实数,以小数形式输出%f:不指定字符宽度,由系统自动指定,使整数部分全部如数输出,并输出6位小数%m.
nf:指定输出的数据共占m列,其中有n位小数;如果数值长度小于m,则左端补空格%-m.
nf:m,n含义同上,只是使输出的数值相左端靠,右端补空格千万不要以为凡是打印出来的数字都是准确的,前7或16位为有效数字格式输出(续)格式字符——e格式符以指数形式输出实数%e:不指定输出数据所占的宽度和数字部分小数位数,由系统自动指定给出6位小数,指数部分占5位,其中e占一位,指数符号占一位,指数占3位,数值按标准化指数形式输出%m.
ne和%-m.
ne:m,n和-字符含义与前相同格式字符——g格式符用来输出实数它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零格式输出(续)格式字符总结选用%f或%e格式输出宽度较短的一种格式,不输出无意义的0g以标准指数形式输出单、双精度数,数字部分小数位数为6位e以小数形式输出单、双精度数,隐含输出6位小数f输出字符串s以字符形式输出,只输出一个字符c以无符号10进制形式输出整数u以16进制无符号形式输出整数(不输出前导符0x)x以8进制无符号形式输出整数(不输出前导符0)o以带符号的十进制形式输出整数(正数不输出符号)d说明格式字符格式输出(续)格式字符总结输出的数字或字符在域内向左靠-对实数,表示输出n位小数;对字符串,表示截取的字符个数.
n(代表一个正整数)数据最小宽度m(代表一个正整数)用于长整型整数,可加在格式符d、o、x、u前面字母l说明字符格式输出(续)printf()要求有些系统要求格式字符要用小写字母,如%d不能写成%D可以在printf函数中格式控制字符串中包含的转义字符,如\n,\t,\b,\r,\f,\377一个格式说明以%开头,以上述9格式字符之一为结束,中间可以插入附加格式字符如果想输入字符%,则应该在格式控制字符串中用连续两个%%表示不同的系统在实现格式输出时,输出的结果可能会有一些小差别格式输入格式输入函数scanf()一般形式scanf(格式控制,地址列表)控制格式的含义和printf函数相同地址列表是由若干个地址组成的列表,可以是变量的地址,或字符串的首地址(即字符数组首地址)格式输入(续)格式字符与f作用相同,e和f可以互相替换e用来输入实数,可以用小数形式或指数形式输入f用来输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束.
字符串以串结束标志\0作为其最后一个字符.
s用来输入单个字符c用来输入十六进制整数x用来输入八进制整数o用来输入十进制整数d说明格式字符格式输入(续)附加格式字符表示本输入项在读入后不赋给相应的变量*指定输入数据所占的宽度(列数)域宽(为一正整数)用于输入短整型数据(可用%hd,%ho,%hx)h用于输入长整型数据(可用%ld、%lo、%lx),以及double型数据(用%lf或%le)字母l说明字符格式输入(续)scanf()说明标准C在scanf中不使用%u说明符,对unsigned型的数据,以%d或%o、%x格式输入可以指定输入数据所占列数,系统自动按它截取所需数据%后的*附加说明符,用来表示跳过它相应的数据输入数据时不能规定精度格式输入(续)scanf()在执行中应注意的问题scanf函数中格式控制后面应当是变量地址,而不是变量名如果在格式控制字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符在用%c格式输入字符时,空个字符和转义字符都作为有效字符输入在输入数据时,遇到以下情况时该数据认为结束遇空格、回车或Tab键遇宽度结束遇非法输入关系运算符和关系表达式关系运算是逻辑运算中比较简单的一种,所谓的关系运算实际上是比较运算将两个值进行比较,判断比较的结果是否符合给定的条件A>3是一个关系表达式,大于号是一个关系运算符关系运算符及其优先次序不等于!
=优先级相同(低)等于==大于等于>=大于>小于等于a+b等价于c>(a+b)a>b=c等价于(a>b)=ca==bc等价于a=(b>c)高低赋值运算符算术运算符关系运算符关系表达式用关系运算符将两个表达式(可以是算数表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称关系表达式例:(a=3)>('a'b)&&(x>y)!
是一元运算符,只要求有一个运算量,如!
(a>b)逻辑非(相当于其他语言中的NOT)!
逻辑或(相当于其他语言中的OR)||逻辑与(相当于其他语言中的AND)&&逻辑运算真值表假假真真假假真假假真真假真假真假假真真真假假真真a||ba&&b!
b!
aba逻辑运算符的优先次序即!
为三者中最高的逻辑运算符中的&&和||低于关系运算符,!
高于算术运算符例:(a>b)&&(x>y)等价于a>b&&x>y(a==b)||(x==y)等价于a==b||x==y(!
a)||(a>b)等价于!
a||a>b高低赋值运算符算术运算符关系运算符&&和||!
(非)逻辑表达式C语言编译系统在给出逻辑运算结果时,以数值1代表真,以0代表假但在判断一个量是否为真时,以0代表假,以非0代表真,即将一个非零的数值认为真14&&0||2a=4,b=5a=4,b=5a=4,b=5a=415>3&&2||8y)printf("%d",x);表达式语句假(0)真(非0)if语句(续)if(表达式)语句1else语句2例:if(x>y)max=x;elsemax=y;表达式语句2假真语句1if语句(续)if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3:elseif(表达式m)语句melse语句m+1例:if(number>500)cost=0.
15;elseif(number>300)cost=0.
10;elseif(number>100)cost=0.
075;elseif(number>50)cost=0.
05;elsecost=0;if语句(续)表达式1语句2假真语句1语句3语句4语句5表达式2表达式3表达式4真真真假假假if语句(续)三种形式的if语句中的表达式,一般为逻辑表达式或关系表达式系统对表达式的值进行判断,若为0,按假处理;若为非0,按真处理,执行指定的语句例:if(3)printf("OK");if('a')printf("ok");if语句(续)第二第三种形式的if语句中,在每一个else前面有一分号,整个语句结束处有一分号分号是C语言中不可缺少的部分,是if语句的内嵌语句所要求的,若无,会出现语法错误.
在if和else的后面可以只包含一个内嵌的操作语句,也可以有多个操作语句,此时用花括号{}将几个语句括起来成为一个符合语句,在{}外面不需要再加分号if语句的嵌套在if语句中又包含一个或多个if语句,称为if语句的嵌套if和else的配对关系:从最内层开始,else总是与它上面最近的未曾配对的if配对用()可改变优先级,从而改变配对次序if()if(语句1;else内嵌if语句2;elseif(语句3;else内嵌if语句4;if()if(语句1;elseif(语句2;else语句3;if()if(语句1;elseif(语句2;else语句3;条件运算符若if语句中,在表达式为真或假时,都只执行一个赋值语句给同一个变量赋值时,可以采用简单的条件运算符来处理.
if(a>b)max=a;elsemax=b;max=(a>b)a:b;条件表达式条件表达式要求有三个操作对象,称三元运算符,它是C语言中唯一的一个三元运算符一般形式:表达式1表达式2:表达式3执行过程:表达式1假真条件表达式取表达式2的值条件表达式取表达式3的值条件表达式(续)条件运算符的执行顺序:先求解表达式1,若非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值;若表达式的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值条件运算符优先于赋值运算符,但比关系运算符和算术运算符都低条件运算符的结合方向是自右至左条件表达式不能取代一般的if语句,只有在if语句中内嵌的语句为赋值语句时才能代替if语句条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同switch语句switch语句是多分支选择语句一般形式:switch(表达式){case常量表达式1:语句1case常量表达式2:语句2:case常量表达式n:语句ndefault:语句n+1}switch语句(续)switch后括号内的表达式可以是在整数型表达式或字符型表达式,也可以是枚举型数据(对其它类型,原来的C标准是不允许的,现在的ANSI标准允许上述表达式和case常量表达式为任何类型)当表达式的值与某一个case后面的常量表达式的值相等时,就执行case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句switch语句(续)各个case的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象各个case的出现次序不影响执行结果执行完一个case后面的语句后,流程控制转移到下一个case继续执行case常量表达式只是起到语句标号作用,并不是在该处进行条件判断;在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断可以用break语句在执行一个case分支后,使流程跳出switch结构多个case可以公用一组执行语句switch语句(续)switch(i){case1:printf("%d",i);case2:printf("%d",j);case3:printf("%d",k);break;case4:printf("%d",l);default:printf("%d",m);}switch(i){case1:case2:case3:printf("%d",i);break;case4:printf("%d",i);break;default:printf("%d",i);}循环控制在许多问题中都要用到循环控制,例如求若干数数之和循环可用一下方式实现:if语句和goto语句组合while语句do-while语句for语句goto语句及用goto构成的循环goto语句为无条件转向语句,它的一般形式为:goto语句标号;语句标号的命名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须是字母或下划线,不能用整数来作标号goto语句结构化程序设计方法主张限制使用goto语句滥用goto语句将使程序流程变得无规律,可读性差一般来说,可以有两种用途:和if构成循环体从循环体中跳到循环体外但第一种用途可以用while来做,第二种用途可以用break和continue来跳出本层循环和结束本次循环while语句用来实现当型循环结构,其一般形式如下:while(表达式)语句当表达式为非0值时执行while语句中的内嵌语句其特点是:先判断表达式,然后执行语句表达式语句0非0while语句(续)循环体如果包含一个以上的语句,应该用花括号{}括起来,以复合语句形式出现;如果不加花括号,则循环的范围只到while后面的第一个分号处在循环体中应有使循环趋向于结束的语句,否则循环将陷入死循环do-while语句C语言中没有until语句do-while用来实现直到型循环结构,一般形式如下:do语句while(表达式)特点:先执行语句,然后判断表达式先执行一次指定的内嵌语句,然后判别表达式,当表达式的值为非零(真)时,返回重新执行该语句,如此反复,直到表达式的值等于0为止,此时循环结束do-while语句(续)表达式语句0非0表达式语句0非0for语句C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而给出循环结束条件的情况,它可以完全代替while语句for语句的一般形式:for(表达式1;表达式2;表达式3)语句for语句(续)for的执行过程1、先求解表达式12、求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行第3步.
若为假(0),则结束循环,转到第5步3、若表达式为真,在执行指定的语句后,求解表达式34、转回步骤2继续执行5、执行for语句的下一个语句for语句(续)求解表达式1表达式2语句求解表达式3for的下一条语句真假for语句(续)for语句一般形式中的表达式1可以省略,此时应在for语句之前给循环变量赋初值如果表达式2省略,即不判断循环条件,循环无终止地进行下去表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束可以省略表达式1和表达式3,只有表达式2,即只给循环条件——等价于while三个条件都可以省略——无限循环for语句(续)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其它表达式,表达式3也类似表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔;在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为其中最右边的表达式的值表达式2一般是关系表达式和逻辑表达式,但也可以是数值表达式和字符表达式,只要其值为非零,就执行循环体循环的嵌套一个循环体内部又包含另外一个完整的循环结构,称为循环体的嵌套内嵌的循环中还可以嵌套循环,这就是多层循环;循环的嵌套的概念对各种语言都是一样的三种循环可以互相嵌套几种循环的比较四种循环都可以用来处理同一问题,一般情况下他们可以互相替换.
但是一般不提倡使用goto循环while和do-while循环,只在while后面指定循环条件,在循环体中包含应反复执行的操作语句,包括使循环趋于结束的语句(如i++等)for循环的功能最强,凡是while循环能完成的,用for循环都能完成几种循环的比较(续)用while和do-while循环时,循环变量初始化的操作应该在while和do-while语句之前完成;而for语句可以在表达式1中实现循环变量的初始化while和for循环是先判断表达式,后执行语句;而do-while循环是先执行语句,后判断表达式对while,do-while和for循环,可以用break语句跳出循环,用continue语句结束本次循环break语句和continue语句break用于使流程跳出循环结构,即提前结束循环,接着执行循环下面的语句对嵌套循环,break只能跳出当前的循环break不能用于循环语句和switch语句之外的任何其他语句中continue用于结束本次循环,接着进行下一次是否执行循环的判定continue和break的区别是continue只结束本次循环,而不是终止整个循环的执行;而break则是结束循环,不再进行条件判断作业阅读第四、五、六章
百纵科技:美国高防服务器,洛杉矶C3机房 独家接入zenlayer清洗 带金盾硬防,CPU全系列E52670、E52680v3 DDR4内存 三星固态盘阵列!带宽接入了cn2/bgp线路,速度快,无需备案,非常适合国内外用户群体的外贸、搭建网站等用途。官方网站:https://www.baizon.cnC3机房,双程CN2线路,默认200G高防,3+1(高防IP),不限流量,季付送带宽美国洛杉矶C...
近日华纳云发布了最新的618返场优惠活动,主要针对旗下的免备案香港云服务器、香港独立服务器、香港高防御服务器等产品,月付6折优惠起,高防御服务器可提供20G DDOS防御,采用E5处理器V4CPU性能,10Mbps独享CN2 GIA高速优质带宽,有需要免备案香港服务器、香港云服务器、香港独立服务器、香港高防御服务器、香港物理服务器的朋友可以尝试一下。华纳云好不好?华纳云怎么样?华纳云服务器怎么样?...
EdgeNat 商家在之前也有分享过几次活动,主要提供香港和韩国的VPS主机,分别在沙田和首尔LG机房,服务器均为自营硬件,电信CN2线路,移动联通BGP直连,其中VPS主机基于KVM架构,宿主机采用四路E5处理器、raid10+BBU固态硬盘!最高可以提供500Gbps DDoS防御。这次开年活动中有提供七折优惠的韩国独立服务器,原生IP地址CN2线路。第一、优惠券活动EdgeNat优惠码(限月...
转义字符为你推荐
山东省高校教师培训管理系统重要产品信息指南支持ipad支持ipad流量支付宝photoshop技术ps几大关键技术?勒索病毒win7补丁怎么删除 防勒索病毒 打的补丁win10关闭445端口win10家庭版怎么禁用445端口127.0.0.1传奇服务器非法网关连接: 127.0.0.1联通版iphone4s苹果4s是联通版,或移动版,或全网通如何知道?
域名城 海外域名注册 中文域名交易中心 x3220 duniu 新加坡主机 windows主机 国外php主机 名片模板psd 双11抢红包攻略 godaddy 好玩的桌面 服务器架设 彩虹ip 牛人与腾讯客服对话 免费全能空间 亚洲小于500m 中国智能物流骨干网 工作站服务器 169邮箱 更多