版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言汇编C语言概述软件=程序+各种文档程序:一系列有序的指令集合。程序=算法+数据结构+语种+算法:解决问题的思路。算法具有五大特性:有效性(可行性)、确定性、有穷性、零个或多个输入、一个或多个输出。1、程序的灵魂算法如同写命题作文前,要“先审题、再构思、最后成文”一样,编制一个应用程序,也应该“先弄清楚问题所在,再想好解决问题的办法(即操作方法、步骤),最后用某一计算机语言编写代码”。写作文的难点是“构思”,编程序的难点在于“想到解决问题的办法”,而“解决问题的办法”就是“算法”的通俗说法。广义而言,算法就是解决问题或处理事情的方法和步骤。狭义而言,算法专指用计算机解决某一问题的方法和操作
2、步骤。可见,“算法”是程序的核心。著名计算机科学家沃思(Nikiklaus Wirth)就提出过一个公式:程序=算法+数据结构。所谓“数据结构”通俗地说就是“数据间的组织关系”, “数据结构”的重要性,到“数组”那一章会体会得多一点。计算机算法可以分为两大类:一类是数值计算算法,主要是解决一般数学解析方法难以处理的一些数学问题,如求解超越方程的根、求定积分、解微分方程等;另一类是非数值计算算法,如对非数值信息的排序、查找等。2、算法的三种基本结构1966年,Bohra和Jacopini提出了用以下三种基本结构作为表示一个良好算法的基本单元。(1)顺序结构。(2)选择结构(又称分支结构)。选择结
3、构有三种形式:单分支、双分支和多分支。(3)循环结构(又称重复结构)。循环结构有两种常见形式:当型循环,“先判断、后执行”;直到型循环,“先执行、后判断”。理论上已经证明,无论多么复杂的问题,其算法都可表示为这三种基本结构的组合。依照结构化的算法编写的程序或程序单元(如过程),其结构清晰、易于理解、易于验证其正确性,也易于查错和排错。这就是所谓的“结构化程序设计方法”。3、描述算法的方法(1)自然语言(2)伪代码(3)流程图或N-S图算法是程序的核心,在初学者对C还不熟悉的前提下,如何给予算法提示呢?即使日后对C非常熟悉了,遇到较难的算法,也需要事先描述出算法后,再编写代码。描述算法的常用方法
4、有:自然语言、传统流程图、N-S结构化流程图、伪代码等。其中,最常用又简洁明了的是传统流程图和N-S结构化流程图。(1)传统流程图起止框处理框判断框连接点输入输出框流程线过程框用以上图形符号描述的三种基本结构:ABeTrueFalseAeTrueFalseAB(a)顺序结构 (b)双分支结构 (c)单分支结构由流程图可以发现,三种标准基本结构的共同特点是:1.只有单一的入口和单一的出口; 结构中的每个部分都有执行到的可能; 结构内不存在永不终止的死循环。由流程图还可以发现,图形清晰明了,容易理解,适合初学者使用;但图中箭头多,算法复杂时,图形占的篇幅也大(2)N-S结构化流程图1973年美国学
5、者Nassi和Shneiderman提出了一种新的流程图方式。这种形式将全部算法写在一个矩形框内,大框内包含从属的小框。下图给出了三种基本结构的N-S图。完全去掉了传统流程图中的箭头。顺序结构 双分支选择结构 当型循环结构 直到型循环结构三种基本结构的N-S图一、C语言的特点(面向过程)二、程序设计思想“自上而下、逐步细化”的模块化 ,C语言适合结构化程序设计的语种,有三种结构:顺序、选择、循环(选择即分支、循环即重复)三、C语言字符集1. 52个英文字母(严格区分大小写)2. 符号: ; , = 赋值号 +和-等 空格 ! & % *和/ | 3. 标识符(1)关键字(2)标准标识符
6、(系统函数名):比如printf(3)用户自定义标识符:只能含有字母、下划线、数字字符,且第一个字符必须是字母或下划线。不能与关键字同名!【建议】自己定义标识符时,尽量注意:“望文生义”、“简洁明了”、“符合习惯”。4. 语句(总是以分号结束,复合语句除外)(1)说明语句或定义语句(2)空语句(只有一个;)(3)表达式语句(最重要的是赋值语句)(4)函数调用语句(比如printf语句)(5)控制语句(6)用将若干语句括起来,就构成一个复合语句四、C源程序的构成1个C语言源程序(.c)=1个主函数 +若干子函数main( )定义说明部分执行语句部分数据类型、运算符和表达式一、数据类型对于基本数据
7、类型量,按其取值是否可改变又分为常量和变量两种。在程序执行过程中,其值不发生改变的量称为常量,取值可变的量称为变量。二、常量(书面常量、符号常量)1、整型常量例如:5、32767、-12(普通整数,占2B)0L、60000(长整数,占4B)017、065(八进制整数)0X1f、0x2a(十六进制整数)【解释】(1)书面常量的类型取决于书写格式,9和9L,前者是普通整数,占2B;后者是长整数,占4B。其中“L”或“l”是长整数的后缀。(2)“0”是八进制整数的前缀、“0x”是十六进制整数的前缀。(3)普通整数的范围是-32768+32767,因此,当书写出60000时,系统默认为长整数。(4)长
8、整数的范围是正负21亿多。2、实数(浮点数)(1)单精度实数(占4B)3.14、.28(相当于0.28)、26.(26.0)、6.5f或6.5F(f是单精度实数的后缀,系统对所有书面实常量都默认为双精度)(2)双精度实数(占8B)有效数字的个数也远远多于单精度实数。(3)指数格式(e或E)xEy(y必须是整数),x×10y3、字符型常量(占1B)'A'、'7'、'n'、''、'0'、'101'、'x41'单引号括住的单个字符(还有一种书写格式单引号括住的以反斜杠“”开头的转
9、义字符)'n' 回车换行,'0' 空字符,其ASCII码值是0【变量的定义格式】char c;4、字符串常量(在C中,字符串只有常量形式、没有变量形式)"Hello"、"A"、""(空串)双引号括住的0个或多个字符。总是以'0'作为结束标志。'0'是ASCII表中的第一个字符,其ASCII值是0。是空字符。(与空格符区别,其ASCII值是32,' ')'n'是回车换行的功能"Hello"占6B;串长为5"A&q
10、uot;占2B;串长为1""(空串)占1B;串长为05、符号常量必须先声明,后使用。【声明格式】#define 标识符 常量串例如:#define PI 3.14159此命令通常书写在程序的最前面。【解释】(1)由于C语言严格区分大小写,且关键字等多为小写,故符号常量名常常 大写,以便不易犯这样一个错:程序运行过程中,修改其值。(2)使用符号常量的好处:当普通常量书写太麻烦时,可以用较简单的符号常量名代替;当程序中用某常量多次时,若将此常量声明成符号常量时,当此值需修改时,只要改一处即可。三、变量C语言规定“变量一定要先定义、后使用,且定义必须集中在前部。”【定义格式】类型
11、名 变量名1, 变量名2,;【类型名】int普通整型long或long int长整型float单精度double双精度char字符型【举例】char z;int x,y;float a;四、算术运算符+、-、*、/、%是整除求余符号,其运算对象必须是整数。7%5 余数是2通常用来表达:x能否被y整除。【注意】/:当“/”左右两侧的操作都为整数时,其运算结果也为整数,且C语言对实数自动取整时,直接将小数部分去掉。98/100 在C中结果是0五、关系运算符(比较运算符)>、>=、<、<=、!=、=1、逻辑学中有两个逻辑值: 逻辑真简称真;逻辑假简称假C语言用0表示假;用1表
12、示真。但是,当用户书写出非0值做逻辑值用时,系统认为是真。2、在数学中,1<x<10是成立的,但在C中不要写成连不等式!而应写成:1<x&&x<10若在C中也写成1<x<10,则可能出现错误。例如,当x取值为15时,在数学中该式是不成立的,该式的结果为假。但是,在C中其结果却是1(为真)。1<15是成立的,结果为1,接着继续拿结果1<10,还是成立的。六、逻辑运算符!逻辑否定、取非、not&&-逻辑与(逻辑乘)、and|-逻辑或(逻辑加)、or逻辑变量x逻辑变量y!xx&&yx|y非0真非00110
13、假0100非000010非01011、当进行与运算时,若左边操作数为0时,系统对右操作数不作处理;2、当进行或运算时,若左边操作数为非0时,系统对右操作数不作处理。七、赋值运算符 = (用于构成赋值语句,赋值语句格式)赋值表达式;【赋值表达式的说明】1、格式:变量名=表达式【功能】将右边的值转换成与左边类型相同的值后,再赋值给左边。例如:int x, y;x=3.9; /*先变成3再赋值*/y= -2L; /*先变成-2再赋值*/2、赋值号的左边只能是一个变量,右边可以是常量、有值的变量、能计算出值的表达式。3、一个常量或一个变量也是一个最简单的表达式。4、在变量定义之后可以使用连赋值的方式给
14、多个变量赋予相同的值;但是在定义变量的时候绝不允许出现连赋值的方式!例如:int x,y,z;x=y=z=9; 再如:int x=9, y=9, z=9; /*初始化*/而:int x=y=z=9; ×八、逗号运算符 ,【逗号表达式】表达式1,表达式2,表达式3,表达式n【说明】1、依次计算表达式1、表达式2、表达式n的值。2、整个逗号表达式的结果是“表达式n”的值。九、条件运算符(唯一的三目运算符) ? :【条件表达式】表达式1?表达式2:表达式3【说明】1、先计算表达式1的值,当其值为非0时(条件成立),将表达式2的结果作为整个条件表达式的结果用;当其值为0时(条件不成立),将表
15、达式3的结果作为整个条件表达式的结果用。int x;x=7<5?7:5;2、该运算符为右结合性(自右向左)。十、自增、自减运算符 + -单目运算符1、两种格式:格式一:变量+ 格式二:+变量2、两种格式的联系:当二者独立成句时,功能完全一样。例如:int x,y;x=y=9;x+; /*等价于 x=x+1; */+y; /*等价于 y=y+1; */3、两种格式的区别:当二者不独立成句时(不加分号,只是以自增表达式的格式出现时),“变量+”先取变量的原值用,再将该变量的值增1;“+变量”先让变量的值增1,再使用其增1 后的值。例如:int a,b,c; int d;a=b=9;c=a+;
16、 /*c的值为9,a变成10*/d=+b; /*先b变成10,d的值为10*/十一、类型转换1自动转换规则(1)当两个运算对象的类型相同时,运算结果的类型也为该类型。例如:1/2的结果是0、1.0/2.0结果0.5(2)当两个运算对象的类型不同时,系统按“就高不就低”的原则统一数据类型,然后运算,运算结果为统一后的类型。例如:1/2.0、1.0/2【类型转换规则:“就高不就低”】【补充说明】char型数据都有对应的ASCII码值,C语言允许在合适的时候,将一个字符与其ASCII相通使用。例如:int x= 'A'char y=65;又如:int x=8;x=x+'A
17、39;(3)在“赋值表达式:变量=表达式”中,其功能是“先计算右边表达式的值,然后将其值(转换为与左边变量类型相同的数据)赋值给左边的变量。” (“右边服从左边”)例如:float x=3.95;x中的值是3.95又如:int x=3.95;x中的值是3再如:float x=3;x中的值是3.02、强制类型转换【格式】(类型名)(转换对象)【说明】(1)“类型名”外的()不可以省!(2)“转换对象”可以是一个常量、一个变量、一个表达式;当为“一个常量、一个变量”时,其外的()可以省。而为“一个表达式”其外的()不可以省!例如:(int)7.0%5 或(int)(7.0)%5 又如:(int)(
18、3.5*2.0)%5 不可以省十二、自反赋值运算符 +=、-=、*=、/=、%=等等【自反赋值表达式的格式】变量名?=表达式【解释】“?”代表任意的一个合法的双目运算符。【功能】变量名=变量名?(表达式)即“变量名?=表达式”与“变量名=变量名?(表达式)”完全等价例如:int x,y; x=y=9;x*=5+7;/*等价于x=x*(5+7); */y+=x*2;/*等价于y=y+x*2; */【注意】C语言的变量在定义后,若没有被赋予确定的值,则该变量中的值“不确定”或称“该变量没有值”。TC系统会报警告!十三、输出函数printf构成的输出语句简介【格式】printf("输出格式
19、控制符",输出对象表);【说明】int型数据的格式符-%d(%o、%x)long-%ld (%后面是小写字母l和d)float-%fdouble-%lfchar-%c字符串-%s例如:printf("%d,%fn", 18, 3.14);屏幕上显示:18,3.14【注意】在printf函数的第一大参数中(格式控制字符串)凡是以%开头的格式控制符不直接出现,而是显示其对应输出对象的值;而其中的其他内容原样出现。printf("s=%fn",3.14*1*1);显示:s=3.14printf("%sn%sn","Hi&
20、quot;," Bye!");显示:HiBye!而printf("Hin Bye!n");显示结果同上。当输出对象为字符串时,可以省略第一大参数。十四、scanf函数构成的输入语句简介:1、功能:从键盘给变量赋值。2、与赋值语句给变量赋值的区别: 随机性3、格式:scanf("输入格式控制串",输入变量地址表列);例如:int x,y;scanf("%d%d",&x,&y);【解释】:“&”是取地址符,单目运算符。使用格式:&变量名【建议】:对于数值型数据,在scanf的第一大参数中
21、尽量只写出%控制符,其他字符不要写,实际输入数据时,数据之间的分隔符为“空格”或“回车”。结束整个输入时,以回车键结束输入过程。【说明】:(1)当输入对象为数值型数据时,若第一大参数中除相应的%开头的格式控制符外,还有其他字符,则在输入时其他字符必须原样输入!int x,y;scanf("x=%d,y=%d",&x,&y);输入时只能按如下格式输入:x=5,y=8<回车>最好写成这样,才能实现提示作用:int x,y;printf("请输入x和y的值n");scanf("%d%d",&x,&
22、y);(2)当输入的对象都是字符型数据,而且第一大参数中只含有%开头的格式控制符时,输入的字符间不能含有任何分隔符,否则分隔符会被当作有效字符读入(多余的浪费)char x,y;scanf("%c%c",&x,&y);想让x存放字母A,y存放字母a,应这样输入:Aa<回车>例如:int x,y,z;x=y=0;z=x+&&y+;printf(“%d,%d,%dn”,x,y,z);结果是:1,0,0再如:int x,y,z;x=y=7;z=x+|y+;printf(“%d,%d,%dn”,x,y,z);结果是:8,7,1选择结构一、
23、单分支选择语句1. 格式:if(表达式) 语句2. 功能: 当表达式的值为非0(真、条件成立)时,执行“语句”。否则执行if之后的下一句。3. 说明(1)表达式可以是任意类型的表达式(结果是数值型),但通常是关系或逻辑表达式。也可以是数值型的常量或变量(它们是最简单的表达式)。(2)“语句”可以是以分号结束的单个语句,也可以是一个复合语句。不可以是多个语句。4. 举例例1、任意读入两个整数,然后输出其中的较大者。main()int x,y;scanf("%d%d",&x,&y);if(x>y)printf("%dn",x);if(y
24、>=x)printf("%dn",y);二、双分支if语句【格式】: if(表达式)语句1else语句2【功能】【说明】1.“语句1”和“语句2”可以分别是以分号结束的单个语句,也可以分别是一个复合语句。都不可以是多个语句。2. else子句不可以独立存在。改写上例:任意读入2个整数,输出较大数。main()int x,y;scanf("%d%d",&x,&y);if(x>y)printf("%dn",x);else /*暗含两种情况:<和=*/printf("%dn",y);例如
25、:任意读入2个整数,按从小到大的顺序输出这2个数。【法1】main()int x,y;scanf("%d%d",&x,&y);if(x<y)printf("%d,%dn",x,y);elseprintf("%d,%dn",y,x);【法2:借助第三数,完成两数的交换】让x中放较小数,y中放较大数。main()int x,y;int t; /*中间变量*/scanf("%d%d",&x,&y);if(x>y)t=x; x=y; y=t;printf("%d,%dn
26、",x,y);【基本算法一:两数交换,借助第三数】t=x; x=y; y=t;【思考:本题改成“任意读入3数,从小到大输出”】三、多分支if语句【格式】if(表达式1)语句1else if(表达式2)语句2else if(表达式3)语句3else语句n+1【功能】【注意】else和if之间有空格。最后的else子句可以省。【举例】例1、批发铅笔,批发量x,100x300,打7折;300x500,打5折;500x1000,打4.5折;x=1000,打4折。其余不打折。求顾客应付款。(1元/支)【法1:多分支选择语句】main()int x;float cost;scanf("
27、%d",&x);if(x>=1000)cost=1*x*0.4;else if(x>=500)cost=1*x*0.45;else if(x>=300)cost=1*x*0.5;else if(x>=100)cost=1*x*0.7;elsecost=1*x;printf("cost=%fn",cost);%m.nf(m、n是正整数,通常m>n,m表示整个实数所占显示宽度,包含小数点,实数宽度不够时,左补空格;n表示小数点右边的位数。)例如:printf("%6.2fn",3.14159);UU3.14(U
28、代表空格)又如:printf("%3.4fn",3.14159);3.1416【注意】%m.nf的格式可以省写成“%.nf”,即可将m省略。%-m.nf(若数宽度不够,则右补空格)%.nf(m可以省,满足小数点后保留n位,该实数实际需要占多少位,就占多少位。)关于整数:%md: 输出的整数若位数不足m位,左补空格。%-md: 输出的整数若位数不足m位,右补空格。例:任意读入一个年份,判断其是否为闰年。(能被400整除,或能被4整除且不能被100整除的,就是闰年)四、if语句的嵌套(if语句中含有另一个if语句)例1:铅笔打折的改写。main()int x;float cos
29、t;scanf("%d",&x);if(x<100)cost=1*x;elseif(x<300)cost=1*x*0.7;elseif(x<500)cost=x*1*0.5;elseif(x<1000)cost=1*x*0.45;elsecost=1*x*0.4;printf("cost=%.2fn",cost);【注意】(1)外选择语句必须完整地包含内选择语句,请缩进书写。(2)else总是和前面最近的一个没有配对且有资格配对的if配对。例2、任意读入一个字符,判断其是否为数字字符,若是,进一步判断其是否为5,是就输出该
30、字符及其ASCII码值;若不是数字字符,就输出“Is not digit!”。【法一:利用ASCII值判断】#include<stdio.h>main()char c;c=getchar();if(c>='0'&&c<='9')if(c='5')printf("%c,%dn",c,c);elseputs("Is not digit!n");【用取消内if的配对资格!】【法二:利用系统函数isdigit判断数字字符】用系统函数(库函数):isdigit(字符型数据)含义
31、是判断“字符型数据”是否为数字字符。(是,则函数返回值为非0;否则为0),使用时一定要加头文件“ctype.h”。#include <stdio.h>#include <ctype.h>main()char x;scanf("%c",&x);if(isdigit(x)!=0) /*逻辑等价于isdigit(x)*/if(x='5')printf("%c:%dn",x,x);elseprintf("Is not digit!n");【将光标移到系统函数名下方,然后按Ctrl+F1,弹出对应
32、头文件名。按Esc键回到蓝色编辑环境。】【结论】(1)用扩住某单分支if语句,可以取消其与else的配对资格!(2)两组逻辑等价式:变量a格式a取值逻辑等价式a0或非0a!=0!a0或非0a=0【解释:】数值数据aa!=00(假)假非0(真)真所谓“逻辑等价”就是,当某式子的结果被当做逻辑值用时,其逻辑等价式的真值与该式子完全一致。五、多分支switch语句【格式】: switch(表达式)case 常量1:语句块1;break;case 常量2:语句块2;break;case 常量3:语句块2;break;default: 语句n+1;【说明】(1)switch后的表达式通常是整型或字符型表
33、达式(常量、变量);(2)case后的常量必须是整型或字符型。(3)“break;”语句只能出现在switch或循环语句中。作用是跳出所在语句结构。(4)“语句块1;语句块n+1;”可以是若干个语句,不必构成一个复合语句。(5)default分支可以省略。【功能】例1:改写铅笔。#include<stdio.h>main()int x;float cost;scanf("%d",&x);switch(x/100)case 0: cost=1*x; break;case 1:case 2: cost=1*x*0.7;break;case 3:case 4:
34、 cost=1*x*0.5;break;case 5: case 6: case 7: case 8:case 9: cost=1*x*0.45; break;default:cost=1*x*0.4; printf("%.2fn",cost);【而以下也正确】#include<stdio.h>main()int x;float cost;scanf("%d",&x);switch(x/100)case 1:case 2: cost=1*x*0.7;break;default:cost=1*x*0.4;break;case 3:cas
35、e 4: cost=1*x*0.5;break;case 5:case 6:case 7:case 8:case 9: cost=1*x*0.45; break;case 0: cost=1*x; printf("%.2fn",cost);【注意】(1)各分支位置可以不分先后(不好!应试的)。但依然只有最后一个分支可以不加break;语句!。(2)两个(或以上)相邻分支的操作一样,可将对应语句写在最后一个分支上。(3)如果前面的分支缺了break语句,则无条件地接着做下一个分支的语句,直到遇到break;或switch的为止。例2给家长编一个小程序:输入成绩等级A,输出“9
36、0<=fs<=100”; 输入成绩等级B,输出“80<=fs<90”; 输入成绩等级C,输出“70<=fs<80”; 输入成绩等级D,输出“60<=fs<70”; 输入成绩等级E,输出“fs<60”。#include<stdio.h>main()char dj;dj=getchar();switch(dj)case 'A':case 'a': printf("90<=fs<=100n");break;case 'B':case 'b'
37、: printf("80<=fs<90n");break;case 'C':case 'c': printf("70<=fs<80n");break;case 'D':case 'd': printf("60<=fs<70n");break;case 'E':case 'e': printf("fs<60n");break;default: printf("Input
38、error!n"); 【或】#include<stdio.h>#include<ctype.h>main()char dj;dj=getchar();dj=toupper(dj);switch(dj)case 'A': printf("90<=fs<=100n");break;case 'B': printf("80<=fs<90n");break;case 'C': printf("70<=fs<80n");brea
39、k;case 'D': printf("60<=fs<70n");break;case 'E': printf("fs<60n");break;default: printf("Input error!n"); 【补充:4个数学函数,要加#include <math.h>】1、pow(x,y)功能:计算xy2、abs(数值型表达式)求“数值型表达式”的绝对值,即|数值型表达式|。注意:必须是整型数据。3、fabs(实数表达式)求绝对值4、sqrt(正数)求“正数”的平方根。
40、循环结构一、循环的分类1、计数型循环:事先知道循环的次数。非计数型循环:事先不知道循环的次数。2、当型循环:“先判断,后执行”,循环体有可能执行0遍。直到型循环:“先执行,后判断”,循环体至少执行一遍。二、while语句:擅长描述当型循环1、格式: while(表达式) 语句2、功能: 3、说明:(1)“表达式”通常是关系或逻辑表达式,也可以是任意表达式(结果是数值型即可)。(2)“语句”又称“循环体(语句)”,必须是一个以分号结束的语句,或一个复合语句。(3)“循环体”中必须有一个操作,使得“表达式”最终为0(条件不成立)否则,会出现“无限循环”即“死循环”,若出现“死循环”,按“Ctrl+
41、Break”键4、基本算法二:累加例如:求1+2+3+100的和。main()int s, i; s=0; i=1; while(i<=100) s=s+i; i=i+1; printf(“1+2+100=%dn”, s);【分析:出循环时,i为101,其最后一个合法取值(终值)为100;本题中s被称为累加器,它以“s=s+”的形式出现在循环中,该式被称为累加式,累加器在进入循环前必须获得合法初值,通常为0。i是一个特殊的累加器,每次递增1,又称为计数器。i身兼二职:控制循环的次数,同时兼做累加式的通项。】三、dowhile语句(直到型)1、格式: do 语句 while(表达式);2、
42、功能:3、说明:(1)最后有一个分号(2)“语句”依然是一个语句(当含多个语句分量时,必须括成复合语句)(3)“表达式”成立时(非0)接着做“循环体语句”。4、改写上例(累加):main()int s, i; s=0; i=1; dos=s+i; i=i+1; while(i<=100); printf(“1+2+100=%dn”, s);【当型循环和直到型循环,在循环体被执行1次及1次以上时,通常可以互相替换】例2、输出1+1/2+1/3+1/100的和。main()float s; int i; s=0.0; i=1; while(i<=100) s=s+1.0/i; i+;
43、printf("%fn",s);例3、输出1-1/2+1/3-1/4-1/100的和。main()float s; int i; int t =1; s=0.0; i=1; while(i<=100) s=s+1.0/i*t; t=t*(-1); /*t= -t;*/ i+; printf(“%fn”,s);四、for循环语句(擅长于计数型循环)1、格式:for(表达式1;表达式2;表达式3) 语句2、功能:3、说明:(1)“语句”即循环体(语句),只能是一个语句(单个以分号结束的语句或一个复合语句)(2)for后的()中由两个;隔开3个表达式,其中“表达式1”通常是
44、对“循环控制变量”赋初值,“表达式2”通常是关系或逻辑表达式,“表达式3”通常是对“循环控制变量”做增值变化。(3)3个表达式都可以省略(也可以省略其中的任意多个),但2个分号不允许省略。4、改写“求1+2+100的和”main()int s,i; for(s=0,i=1;i<=100;i+) s=s+i; printf(“%dn”,s);【改写:表达式省略】main()int s,i; s=0; i=1; for(;) s=s+i; i+;if(i>100) break; printf(“%dn”,s);【结论】计数型循环的循环次数: 循环控制变量的终值即最后一个合法取值,初值是
45、其第一个合法取值。步长是循环控制变量每一次递增的值。五、几个重要算法:1、穷举法对所有的可能性进行判断,凡是符合条件的做相应处理(输出、保存等)。例1:输出所有的“水仙花”数,即这样的三位正整数:其每一数位上的数字的立方和等于该数本身。比如,153=13+53+33。【法一:一重循环,难点:求出每位数字】main()int x, b,s,g; /*b-存放百位数字*/ for(x=100;x<=999;x+) b=x/100; s=x/10%10; g=x%10; /*任何正整数%10的*/*余数即为其个位数字*/if(g*g*g+s*s*s+b*b*b=x) printf(“%dn”,
46、x);【法二:三重循环。拼数字】main()int b,s,g; for(b=1;b<=9;b+) /*时针*/ for(s=0;s<=9;s+)/*分针*/ for(g=0;g<=9;g+) if(g*g*g+s*s*s+b*b*b= b*100+s*10+g) printf(“%dn”, b*100+s*10+g);【结论,核心语句if被执行了900次】 补充:循环的嵌套(1)当某一循环语句完整地套住另一循环语句时,称为循环的嵌套。(2)当嵌套时,内循环变化得快,外循环变化得慢。(3)当外循环独立执行时,重复次数为x,内循环独立执行时,重复次数为y,则嵌套时其核心语句被执
47、行x×y次。例2、用100元购买麦当劳(5元/份)和肯德基(7元/份),恰巧用完,问共有几种买法?main()int m,k; for(m=0;m<=20;m+) for(k=0;k<=14;k+)if(5*m+7*k=100) printf(“M:%d,K:%dn”,m,k);2、正整数的各数位上数字的获取例1:任意读入一个正整数,依次输出其低位到高位上的每一位数字。main()long x; do printf(“Input x>0:n”);scanf(“%ld”,&x); while(x<=0); while(x!=0) printf(“%d “
48、, x%10); x=x/10; 例2:任意读入一个整数,依次输出其低位到高位上的每一位数字及其符号位,但若是0不输出符号位。main()long x; long y; char fh; scanf(“%ld”,&x); y=x; /*保留x原值*/ if(x<0) fh= '- ' x= -x; else fh= '+ ' do printf(“%d “, x%10); x=x/10; while(x!=0); if(y!=0) printf(“%cn”, fh);3、迭代法例1. 猴子吃桃问题。某猴子某天摘了若干只桃子,吃了一半,不过瘾,又多吃
49、一只;第二天又吃了一半,不过瘾,再多吃一只到第十天,发现只剩1只桃子了。问第一天共摘了多少只桃子。main()int peach,day; peach=1; for(day=9; day>=1; day-) peach=(peach+1)*2; printf(“1:%dn”,peach); 【归纳:类似于本题peach变量的特点:其值不停地被新值替代(自身的原值变化而来),直到满足所求终止。】main()int peach,day; peach=1; for(day=9; day>=1; day-) peach=(peach+1)*2; printf(“%d:%dn”,day,pe
50、ach); 4、辗转相除法求两正整数的最大公约数main()int x,y,r; do scanf(“%d%d”, &x,&y); while(x<=0|y<=0); r=x%y; while(r!=0) x=y; y=r; r=x%y; printf(“%dn”,y);【改写:用dowhile】main()int x,y,r; scanf(“%d%d”, &x,&y); do r=x%y;x=y; y=r; while(r!=0); /*出循环y为0*/ printf(“%dn”,x);5、判断素数(质数)数学定义:“凡是只能被1和自身整除的大于1
51、的整数,就称为质数,即素数。”即“不能被2自身-1整除的大于1的整数,就称为质数。”例1.任意读入一个大于1的整数,判断其是否为素数。【法一: 紧扣数学定义】main()int x,k; do printf(“Input x>1:n”); scanf(“%d”,&x); while(x<=1); for(k=2;k<=x-1;k+) if(x%k=0) break; if(x=k) printf(“%d is sushun”,x); else printf(“%d is not sushun”,x);【解释:“break;”语句只能存在于switch与三大循环语句中,
52、用于提前跳出所在语句。】【改写此例。用一个小技巧:借助一个“逻辑型”变量,实质是一个整型变量,让其为1时,表示“是素数”,为0时,表示“不是素数”】main()int x,k; int flag=1;/*总是先认为x是素数*/ do printf(“Input x>1:n”); scanf(“%d”,&x); while(x<=1); for(k=2;k<=x-1;k+) if(x%k=0) flag=0;break; if(flag=1)/*或flag!=0或flag*/ printf(“%d is sushun”,x); else printf(“%d is no
53、t sushun”,x);【用while改写】main()int x,k; do printf(“Input x>1:n”); scanf(“%d”,&x); while(x<=1); k=2; while(x%k!=0)k+; if(k=x) printf(“%d is sushun”,x); else printf(“%d is not sushun”,x);【变形一:用sqrt函数,求平方根】#include <math.h>main()int x,k; int flag=1;/*最好用flag*/ do printf(“Input x>1:n”);
54、 scanf(“%d”,&x); while(x<=1); for(k=2;k<=sqrt(x);k+) if(x%k=0) flag=0;break; if(flag=1)printf(“%d is sushun”,x); else printf(“%d is not sushun”,x);变形2:2x/2补充:break;语句与continue;语句(1)break;只可以出现在循环语句及switch语句中,用于提前跳出所在语句。在循环语句中出现的break语句通常处在if的控制之下。(2)continue;语句只能出现在循环语句中,通常在if的控制之下,一旦被执行,本
55、次循环其后的几个操作语句不被执行,而是继续从下一轮循环开始。例1. 输出1100间的所有3的倍数。main()int x; for(x=1;x<=100;x+) if(x%3!=0) continue; printf("%dn",x); 6. 累乘(基本算法)例1. 求10!。【分析:1×2×3××10】main() int k; long jc; jc=1; for(k=1;k<=10;k+)jc=jc*k; printf("%ldn",jc); 累乘器jc在进入循环前必须获得合适初值;通常为1。累乘
56、式“jc=jc*”必须出现在循环中。注意,本题不要让jc溢出。算法分为“非数值型”算法和“数值型”算法两大类。“数值型”算法通常解决的有一定计算难度的数学问题(级数计算、高次方程求根),通常所求值为近似值。7级数计算(展开式的求解)例1、求1+1/2!+1/3!+1/n!+,直到某项的值小于10-6为止。【法一:直接法。直接利用项次描述通项。】main()float s; int k; float jc; float t; int i; s=0.0; k=1; /*k用来描述项次*/ t=1; /*先让t存放第一项的值*/ while(t>=1e-6) s=s+t; k+; /*准备求下一项*/ jc=1; /*求k!*/ for(i=1;i<=k;i+) jc=jc*i; t=1/jc; printf(“%fn”,s);递推法(间接法)求通项:利用前项求后项。【法二:间接法求通项】分析:fn=fn-1/n#include <stdio.h>main()float s,t; /*t表示通项*/ int i;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 17001.8-2024防伪油墨第8部分:防涂改防伪油墨
- GB/T 28589-2024地理信息定位服务
- 交通工程监理合同管理资料范本2
- 眼科检查设备项目运营指导方案
- 助听器验配服务行业相关项目经营管理报告
- 哇音踏板产品供应链分析
- 室内电烤架产品供应链分析
- 倾卸式斗车产业链招商引资的调研报告
- 人工智能技术领域的研究行业营销策略方案
- 瑜伽上衣项目运营指导方案
- 家庭居室装饰装修工程保修单
- 小学生汉语拼音田字格练习
- DBJ∕T 15-138-2018 建筑电气防火检测技术规程
- 北师大版数学七年级上册期中测试题【含答案】(共4套)
- 2022年WABCO防抱死系统
- 离婚登记申请受理回执单(民法典版)
- 《过敏性休克》PPT课件(PPT 32页)
- 金属风管支架重量计算表
- 《幼儿园中班第一学期家长会》 PPT课件
- 企业员工职业生涯规划表模板
- 电子档案管理系统需求
评论
0/150
提交评论