算法口诀总复习_第1页
算法口诀总复习_第2页
算法口诀总复习_第3页
算法口诀总复习_第4页
算法口诀总复习_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

算法口诀分支累算整除性,最大最小双重循,一查两排两遍历,函数调用文件行。一、C语言基础(基本数据类型和表达式)C的数据类型有:简单类型(整型、字符型、实型),复杂类型(数组、结构体),指针类型和空类型。1、常量和变量(1)常量常量是在程序运行过程中其值不能被改变的量,是直接处理的,处理的是它的字面值。常量有不同的类型,例如:12、0、-3是整型常量;4.6,-1.23是实型常量;’a’,’d’,’A’是字符常量。常量也可以用标识符代表,称为符号常量。符号常量的定义格式为:#defile符号常量名字符序列(2)变量变量是其值可以改变的量,一个变量拥有一个名字,变量名用标识符表示,在内存占据一定的存储单元,该存储单元中存放变量的值,存储单元的编号称变量的地址。变量是间接处理的,看到的是变量的名,处理的是变量的值。在C语言中,小写和大写字母被认为是两个不同的字符,例如:sum和SUM代表两个不同的变量名。变量的特点是:取之不尽,以新冲旧。变量先定义后使用,先赋值后处理。3、C语言的数据类型(1)有以下三种表示形式:十进制整数:例如:123、0、-456八进制整数:以0开头的数即认为是八进制数,例如:0123即八进制的123,而028是错误的八进制整数。十六进制整数:以0x或0X开头的数即认为是十六进制数,例如:0x123是十六进制整数123,而0xhh是错误的十六进制整数。基本型:以int表示,在内存中占2个字节。长整型:以long表示:在内存中占4个字节。无符号整型:以unsignedint或unsignedlong表示。(2)实型数据实型常量又称浮点数,有两种表示形式:十进制数形式:由数字和小数点组成(必须有小数点),例如:0.123、.123、123.。指数形式:由数字、E(或e)和整数组成,例如:123e3、123.4E2。注意:E后面必须有整数,E前面必须要有数字,0.2E、0.2E2.3、e-5不合法。实型变量有2种形式:单精度(float)型,内存占4个字节(32位)。双精度(double)型,内存占8个字节(64位)。实型变量的定义:floatx,y;定义x和y为单精度型变量 doublez;定义z为双精度型变量字符型数据字符常量C语言的字符常量是指用单引号括起来的一个字符,例如:'a'、'A'、'$'除上述字符常量之外,C中还允许一种特殊字符常量,即以“\”开头的字符序列,称为“转义字符”,意思是将“\”后面的字符转变成另外的意义。转义字符占一个字节,算一个字符,它们一般起控制作用。例如:\n换行\ddd1~3位八进制数所代表的字符,例如:\101表示字母A\xhh1~2位十六进制数所代表的字符,例如:\x41也表示字母A字符数据在内存中存储一个字节,存放该字符相应的ASCII码。字符变量的定义:charc1,c2;字符变量的赋值:c1='a';c2='b';内存中存放的不是'a'和'b',而是'a'和'b'的ASCII码97和98,输出字符还是整数取决于“格式控制符”,例如:printf("%d%c",c1,c2);运行结果:97b字符串常量字符串常量是一对双引号””括起来的字符序列,例如:"Howdoyoudo.",用一维数组存放。注意:不要混淆字符常量与字符串常量:“a”与‘a’的区别:“a”分配2个字节,存放'a'和字符串结束符‘\0’,而‘a’只分配1个字节。字符串常量不能赋给一个字符变量,例如:charc1;c="a";是错误的。2.运算符与表达式(1)算术运算符和算术算术运算符有:+、-、*、/、%、++、--、-,其中:-、++、--是单目运算符,其余是双目运算符。使用时要注意3点:两个整数相除,结果为整型,如果其中一个为实型,则结果为double型,例如:5/3=1,3/5=0,3.0/5=0.6%运算符只适用于整数(表示两个整数求余数),例如:5%3=2,3%5=3,8%4=0,-7%4=-3,7%(-4)=3;而5.2%3不合法自增自减运算符++、--的作用是使变量的值增1、减1。在程序中经常用作变量计数。++和—出现在变量前或后区别在于:++n和--n在使用n之前,使n的值先加(或减)1。即先变化n后得到新的n值,再作其它运算;n++和n--在使用n之后,再使n的值加(或减)1。即先使用原来的n进行运算,再进行加(或减)1。自增、自减运算符只能用于变量,不能用于常量或表达式,例如:5++和(x+y)++是错误的。自增++、自减--运算符是自右至左结合的。例如:-n++表示-(n++),而不是(-n)++。所谓表达式是用运算符和括号将运算对象连接起来的、符合C语法规则的式子,称为C语言表达式。这里运算对象包括:常量、变量、函数等,广义地说,一个常量、变量和函数也可以作为表达式。当我们将算术表达式转换成C语言数值表达式时,要注意下列规则:每个符号占一格,每个符号都必须一个一个地并排写在同一横线上,不能有上标和下标。如:x3要写成x*x*x,x1+x2必须写成x1+x2,分数可用小数表示。所有运算符都不能省略。如:2xy必须写成2*x*y。所有的括号都是小括号。如:5[x+2(y+z)]必须写成5*(x+2*(y+z))。三角函数的自变量必须用弧度表示。如:sin30必须写成sin(30*3.14/180)。在转换时,要保持原有算术表达式的优先级,必要时要添加括号。如分式:必须写成(a+b)/(c-d)。在C表达式中不能出现非C字符,如:2r应写成2*pi*r。为了使算术表达式能按正确的法则运算,C规定了运算符的优先级和结合性,在表达式求值时,对一个运算对象而言先按运算符的优先级别高低次序执行,如果优先级相同,再按结合方向处理。C语言的优先级有15级,要掌握主要的优先级单目运算符>算术运算符>关系运算符>逻辑运算符>赋值运算符C语言运算符的结合性有左结合性和右结合性,其中单目运算符、条件运算符和赋值运算符是右结合性,其它运算符为左结合性。算术运算时,C语言会进行类型转换,类型转换的方法有3种:自动类型转换:将字节短的自动转换为字节长的,在运算时先将各种类型化成同一类型,然后进行运算。赋值类型转换:如果一个赋值运算符两边的数据类型不同时,把右边的数据类型转换为左边的变量类型后,再赋值。赋值的结果按左边变量的类型取值。强制类型转换可以用一个强制类型转换运算符将一个表达式的值转换成所需要的类型,一般形式:(类型名)(表达式)例如: (double)a将a的值转换成double型 (int)(x+y)将(x+y)的结果转换成int型 (float)(5%3)将(5%3)的结果转换成float型强制类型转换只是将表达式的值转换成所需的类型,而每一个变量的类型没有变化。关系运算符与关系表达式关系运算就是比较运算,将两个值进行比较,判断比较的结果是否符合给定的条件。用关系运算符将两个表达式连接起来的式子称为关系表达式。C语言有6种关系运算符:<、<=、>、>=、==、!=,其中,<、<=、>、>=的优先级高于==、!=,左结合性。关系表达式的值是一个逻辑值,即“真”或“假”,C语言中以1代表“真”,以0代表“假”。x和y不同时为零写作x!=0||y!=0或x||y,year是闰年,即year能被4整除但不能被100整除,或year能被400整除。写作(year%4==0&&year%100!=0)||(year%400==0)或者(!(year%4)&&year%100)||!(year%400)(3)逻辑运算符和逻辑表达式C语言的逻辑运算符有:!、&&、||,其优先级从左到右。其中:!是右结合性,&&和||是左结合性。用逻辑运算符连接起来的式子就是逻辑表达式。逻辑表达式的值只有两个值,即用1表示“真”,用0表示“假”。在参与运算时,在判断一个逻辑量是“真”或“假”时,以0代表“假”,以非0代表“真”。在运算结果中以0代表“假”,以1代表“真”。在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。例如:a&&b&&c只有当a为"真"时才判断b的值,只有当a和b都为“真”时才判断c的值。如果a为“假”,则不必判断b和c,后面两个&&运算没有执行。a||b||c只有当a为“假”时才判断b的值,只有当a和b都为“假”时才判断c的值。如果a为“真”,则不必判断b和c,后面两个||运算没有执行。表达式,例如:ch是小写英文字母:ch>='a'&&ch<='z'ch是大写英文字母:ch>='A'&&ch<='Z'ch是英文字母:ch>='A'&&ch<='Z'||ch>='a'&&ch<='z'ch是数字字母:ch>='0'&&ch<='9'大小写字母的转换:大写字母+32它的小写字母例如‘A’+32’a小写字母-32它的大写字母例如‘a’-32’A数字和数字字符的转换:数字+’0’(48)例如:5+’0’’数字字符-’0’(48)例如:’5’-’0’(4)条件运算符和条件表达式?:是条件运算符,由条件运算符构成条件表达式。它的一般形式:表达式1?表达式2:表达式3条件表达式的求解过程:1)求解“表达式1”2)如果“表达式1”的值为“真”(非0),求解“表达式2”如果“表达式1”的值为“假”(为0),求解“表达式3”条件运算符为右结合性,例如:a>b?a:c>d?c:d;相当于:a>b?a:(c>d?c:d);条件表达式有时可以取代if语句,例如:当if语句中内嵌的语句为赋值语句,并且两个分支都赋给同一个变量时,可以用条件运算符代替。if(a>b)max=a;elsemax=b;可以写成条件表达式max=a>b?a:b;条件表达式中,表达式1的类型可以与表达式2、表达式3的类型不同。例如:ch=x?’a’:’b’或f=x>y?1:1.5要注意条件表达式中的表达式2和表达式3只执行一个,当与x++,x—配合时,只有执行到的x++中x才会变化。(5)赋值运算符和赋值表达式赋值号“=”就是赋值运算符。它的作用是将一个数据或表达式的值赋给一个变量,赋值运算符是右结合性,优先级较低,为倒数第2个。在赋值运算符之前加上其它运算符可以构成复合赋值运算符。例如:+=、-=、*=、/=、%=、>>=、<<=、&=、^=、|=等。a+=3相当于a=a+3,a*=b+3相当于a=a*(b+3)用赋值运算符或复合赋值运算符将变量和表达式连接起来的式子称为赋值表达式。赋值表达式是“无孔不入“的,它可以出现在许多地方。例如:x=y=z=3、x+=y+=z、y=(x+3)*(x-3)、if(x=2)、while(x=4)等。赋值运算符,完成赋值运算;运算符,完成关系运算。if(x=2)与if(x==2)代表不同的含义。基本的输入语句有:1)格式化输入语句:scanf(格式控制字符串,地址表列)所以要有&格式控制字符串:格式控制说明:按指定的格式输入数据,%…与数据类型有关int型:%dfloat型:%fdouble型:%lf字符串%s普通字符:原样输入2)单个字符输入语句:getchar()3)字符串输入语句:gets()基本的输出语句有:1)格式化输出语句:printf(格式控制字符串,输出表列)格式控制字符串:格式控制说明:按指定的格式输入数据,%…与数据类型有关int型:%dfloat型:%fdouble型:%f字符串%s普通字符:原样输入2)单个字符输出语句:putchar()3)字符串输入语句:puts()二、选择结构.1、控制结构:(1)简单判断:if(表达式)语句(2)选择分支:if(表达式)语句1else语句2(3)多条件选择:if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3……else语句n(4)情况语句:switch(表达式){case常量表达式1:语句段1case常量表达式2:语句段2……case常量表达式n:语句段ndefault:语句段n+1}(5)嵌套的if-else语句if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句42、说明:(1)在这5种控制结构中,第1种简单判断使用起来最简单,但也最实用,可以作为首选,虽然在编制程序时语句多用几句,但用起来却很方便。(2)第2种选择分支往往用在两种情况的判断,使用时要注意语句1和语句2后面都有分号。(3)第3种多条件选择是if-else语句的一种嵌套形式,由于它可以直接用于多条件的选择判断,所以单独作为一种形式列出。在使用时,有时比switch语句更简单,要注意最后一个else的后面没有if。(4)第4种情况语句要注意switch后面的表达式是与case后面的常量表达式匹配,而不能与一般的含变量的表达式匹配。语句段后面没有break语句时是入口开关,有break语句时才是真正的多路开关。(5)第5种嵌套的if--else语句使用起来最灵活,其实,以上各种形式的分支结构间相互都可以嵌套,当有多种形式的分支结构嵌套时,特别要注意else总是与它最近的没有匹配的if相匹配。例1:编程,输入x后,根据下式计算并输出y值。 #include<stdio.h>#include<math.h>voidmain(){ doublex,y; scanf("%lf",&x); if(x<-2)y=x*x-sin(x); elseif(x>2) y=sqrt(x*x+x+1); else y=pow(2,x)+x; printf("y=%f\n",y);}文件包含:#include<stdio.h>输入输出、文件#include<math.h>数学#include<string.h>字符串#include<ctype.h>字符常用数学函数:exexp(x)xypow(x,y)|x|fabs(x)abs(x)lnxlog(x)lgxlog10(x)x1/2sqrt(x)例2:写出执行下列语句后的输出结果。intx=5;if(x=3)printf("%d\n",x);elseprintf("%d\n",x+2);答案:3分析:在C语言的运算符中,要注意“=”与“==”的区别。“=”是赋值运算符,构成的是赋值表达式;“==”是关系运算符,表示等于,构成的是关系表达式,结果是逻辑值。本题if语句的条件“x=3”是赋值表达式,结果是3,为逻辑真,执行printf("%d\n",x);,输出结果3。例3:下列程序段的输出结果是:inti=5,j=0;switch(i%2){case1:j+=1;case0;j-=1;}printf(“%d”,j);答案:0分析:本例是不带break的switch语句,是“入口”开关,由于i%2的值为1,先执行j+=1;,因为后面没有break;语句,继续执行j-=1;,j的结果仍然为0。例4:下列程序段的输出结果是inti=0,j=1;switch(j){case1:i+=1;break;case2;i+=2;break;case3;i+=3;break;}printf(“%d”,i);答案:1分析:本例是带break的switch语句,是“多路”开关,在执行完i+=1;后,因为后面有break;语句,跳出switch语句,结果为1。例5:下列程序段的输出结果是:intk=1,s=0;switch(k){case1:s+=10;case2:s+=20;break;default:s+=3;}printf(“k=%ds=%d”,k,s);答案:k=1,s=30分析:本例k=1,先执行s+=10;,因为因为后面没有break;语句,继续执行s+=20;由于后面有break;语句,跳出switch语句,结果s的值为30。例6:假定所有变量均已正确定义,下列程序段运行后b的值是:inta=0,b=10;if(a=0)b--;elseif(a<0)b++;elseb=b+b;A.20 B.11 C.9 D.0答案:A分析:本例是嵌套的if语句,首先执行if(a=0),由于a=0,执行else后面的if(a<0)b++;elseb=b+b;语句,由于a<0不成立,执行b=b+b;,所以b的值是20。例7:假定所有变量均已正确定义,下列程序段运行后x的值是:a=b=c=0;x=35;if(!a)x--;elseif(b);if(c)x=3;elsex=4;A.34 B.4 C.35 D.答案:B分析:本例也是嵌套的if语句,由于a=b=c=0;,!a的值为1,执行x--;,x的值是34,继续执行下一个if语句if(c)x=3;elsex=4;,由于c=0,所以x的值是4。不少学生认为第1次的结果34就是答案,这是错误的,因为下面还有语句,要继续执行,得到x的值是4,变量的值“以新冲旧”。例8.下面的程序片段所表示的数学函数关系是。y=-1;if(x!=0)if(x>0)y=1;elsey=0;A.B. C. D.答案:C分析:有的学生想当然的就认为答案是A,这是错误的。本题先将y赋为-1,执行if(x!=0)if(x>0)y=1;elsey=0;,将x!=0的情况分为大于0和小于0两种情况,当x大于0时,y=1,x小于0时,y=0,所以本题的答案是C。例9:下列各语句中,能够输出整型变量a、b中最大值的是。A、printf(”%d\n”,(a>b)?a,b);B、(a>b)?printf(”%d”,a):printf(”%d”,b);C、printf(”%d”,if(a>b)aelseb);D、printf(”%d\n”,(a>b)?a:b);答案:D分析:本题是条件表达式的应用问题,D是正确的。A的条件表达式格式错误,B与C的错误在于条件表达式内部不能再套语句。例10:编写程序,输入一个小写字母,将字母循环后移5个位置后输出,例如’a’变成’f’,‘w’变成’b’。解:#include<stdio.h>voidmain(){charc;c=getchar();if(c<'v'&&c>='a')c=c+5;elseif(c>='v'&&c<='z') c=c-21; putchar(c);}分析:这是一个循环后移问题。将字母a到u之间的字母后移5个位置,执行c=c+5;,而将v到z之间的字母循环移到字母a的前面,即c=c+5-26,也就是c=c-21。例11:阅读下列程序说明和程序,在每小题提供的若干可选答案中挑选一个正确答案。#include<stdio.h>Voidmain(){inti,j,k;scanf("%d",&i);j=k=0;if((i/10)>0)/*第7行*/j=i;if((i!=0)&&(j!=0))k=i;elsek=-1;/*第12行*/printf("j=%d,k=%d\n",j,k);}(13)程序运行时,输入5,输出 (13) 。A、j=0,k=5 B、j=5,k=5C、j=0,k=-1D、j=5,k=-1(14)程序运行时,输入99,输出 (14) 。A、j=99,k=-1 B、j=0,k=-1C、j=0,k=99D、j=99,k=99(15)将12行改为”k=-1,j=i/10;”程序运行时,输入99,输出 (15) 。A、j=99,k=-1 B、j=9,k=99C、j=99,k=99D、j=9,k=-1(16)将7行改为”if((i/10)>0){”,将12行改为”k=-1;}”程序运行时,输入5,输出 (16) 。A、j=0,k=-1 B、j=0,k=0C、j=5,k=5D、j=5,k=-1三、循环结构1.控制结构(1)当型循环:while(表达式)语句(2)直到型循环:do语句while(表达式);(3)步长型循环:for(表达式1;表达式2;表达式3)语句2.说明:(1)第1种当型循环当“表达式”为非0值时,执行语句,“语句”部分就是循环体,while循环是先判断后执行。如果语句部分包含一个以上的语句,那么应该用复合语句“{}”的形式。在循环体中应有使循环趋于结束的语句。否则会造成死循环。当表达式一开始就不成立时,会造成一次也不做的循环。(2·第2种直到型循环先执行“语句”,后判断“表达式”,即至少执行一次循环体。当“表达式”的值为非0时,返回重新执行“语句”。对于同一个问题,既可以用while语句,也可以用do-while语句处理。while语句可能一次也不执行循环体,但do-while语句至少执行一次循环体。特别要注意while语句后加分号;。3.第3种步长型循环是应用最广泛,也是最重要的一种控制格式。For语句的流程框图如下:判表达式2判表达式2执行语句0(非0)for执行表达式1执行表达式3执行for后面的语句其执行过程是:1)求解表达式1;2)求解表达式2:如果值为真(非0),则执行“语句”部分;如果值为假(0),则结束循环;3)当表达式2为真时,在执行了“语句”部分后,求解表达式3;4)转到第2步继续执行.在步长型循环的一般格式中,表达式1、表达式2、表达式3可以是任意表达式,理解和在程序设计实践中掌握for语句的格式和功能,是学习程序设计的重要一环。必须认真掌握。for语句最常用的形式:for(循环变量赋初值;循环结束条件;循环变量加步长)语句所以把它称为步长型循环。4.break语句:break语句除了可以用来跳出switch结构之外,还可以用来从循环体内跳出循环。语句的一般形式:break;continue语句:其作用是结束本次循环。即跳过循环体中的continue后面的其它语句,接着进行下一次是否执行循环的判断。语句的一般形式:continue;break语句和continue语句的区别是:(1).break语句结束整个最内层循环,不再进行条件判断。(2)continue语句只结束本次循环,直接进行是否执行下一次循环的判断。6.循环结构的执行有3种情况:有限次循环、永真循环和一次也不做的循环。四、循环结构的最基本应用,可以实现程序中的计数和累加、累乘。(1)累加累乘基本知识:不变式功能公式初值X=X+1计数0S=S+X累加∑0S=S*I累乘N!1S=S*X累乘Xn1实现上述功能的程序如下:1)求1+2+3+……+n#include<stdio.h>voidmain(){inti,,n,sum;scanf("%d",&n);sum=0;for(i=1;i<=n;i++)sum=sum+i; printf(“%d\n”,sum); }longcal(intm,intn)//计算m到n的和{ inti;longsum=0; for(i=m;i<=n;i++) sum=sum+i; returnsum;}2)求n!#include<stdio.h>voidmain(){inti,n;doublefact;printf("inputn:\n");scanf("%d",&n);fact=1; /*置阶乘fact的初值为1*/for(i=1;i<=n;i++) /*循环重复n次,计算n!*/fact=fact*i;printf("fact=%.0f\n",fact);}

intfact(intn) //定义计算n!的函数{ inti,f=1;

for(i=1;i<=n;i++)//循环 f=f*i;//累乘returnf;//返回n!的值}3)求xn#include<stdio.h>voidmain(){inti,n;doublex,power;printf("inputx,n:\n");scanf("%lf%d",&x,&n);power=1; for(i=1;i<=n;i++)power=power*x;printf("%0.f\n",power);}doublemypow(doublex,intn){inti;doublepower=1;for(i=1;i<=n;i++)power=power*x;returnpower;}例1.输入x、n后输出下列算式的值。(次数控制)解1:(单循环) #include<stdio.h> voidmain() { floats,t1,t2,t3,x;inti,n; scanf("%f%d",&x,&n);s=0;t1=t2=t3=1;for(i=1;i<=n;i++){t1=t1*x;t2=t2*i;s=s+t3*t1/t2;t3=-t3;}printf("%f\n",s); }解2:(双循环) #include<stdio.h> voidmain() { floats,t1,t2,t3,x;inti,j,k,n; scanf("%f%d",&x,&n);s=0;t3=1;for(i=1;i<=n;i++){t1=1;for(j=1;j<=n;i++)t1=t1*j;t2=1;for(k=1;k<=n;k++)t2=t2*x;s=s+t3*t1/t2;t3=-t3;}printf("%.2f\n",s); }解3(函数调用) #include<stdio.h>intfactorial(intn); doubleexpon(doublex,intn);voidmain() { floats,x;inti,n,t;scanf("%f%d",&x,&n);s=0;t=1;for(i=1;i<=n;i++){s=s+t*mypow(x,i)/fact(i);t=-t;}printf("%.2f\n"}

intfact(intn){ inti,f=1;for(i=1;i<=n;i++) f=f*i;returnfact;} doublemypow(doublex,intn){inti;doublepower=1;for(i=1;i<=n;i++)power=power*x;returnpower;}例2.求菲波那契(Fibonacci)序列:1,1,2,3,5,8,……。请输出前10项。#include<stdio.h>void main(){inti,x1,x2,x; x1=1; /*头两项都是1*/x2=1;printf("%6d%6d",x1,x2);/*先输出头两项*/for(i=1;i<=8;i++){/*循环输出后8项*/x=x1+x2;/*计算新项*/printf("%6d",x);x1=x2;/*更新x1和x2*/x2=x;}}例3.求1-1/3+1/5-…的前n项和#include<stdio.h>voidmain(){inti,n; doubleitem,sum;printf("inputn:"); scanf("%d",&n); flag=1;t=1; sum=0;for(i=1;i<=n;i++){ item=flag*1.0/t;/*计算第i项的值*/ sum=sum+item;/*累加第i项的值*/flag=-flag;/*准备下一次循环*/t=t+2; } printf("sum=%f\n",sum);}例4.下列格里高利公式求π的近似值,要求精确到最后一项的绝对值小于10–5。(精度控制)#include<stdio.h>#include<math.h>/*使用绝对值函数fabs*/voidmain(){intflag,t;doubleitem,pi; /*pi用于存放累加和*/flag=1;t=1; /*变量t表示第i项的分母*/item=1.0; /*item中存放第i项的值*/pi=0;while(fabs(item)>=0.00001){ item=flag*1.0/t; /*计算第i项的值*/pi=pi+item; /*累加第i项的值*/flag=-flag;/*改变符号,为下一次循环做准备*/t=t+2;/*分母递增2,为下一次循环做准备*/}pi=pi*4; /*循环计算结果是pi/4*/printf(“pi=%f\n”,pi);}例5:试题7(28分)编程题嵌套调用定义函数fact(n)计算n的阶乘:n!=1*2*……*n,函数参数n的类型是int,函数的类型是double。//阶乘定义函数cal(x,e)计算下列算式的值,直到最后的一项的值小于e,函数形参x的和e的类型都是double,函数的类型是double。要求调用定义函数fact(n)计算n的阶乘,调用库函数pow(x,n)计算x的n次幂。//累加累乘,精度控制定义函数main(),输入两个浮点数x和e,计算并输出下列算式的值,直到最后一项的值小于精度e,要求调用定义函数cal(x,e)计算下列算式的值。嵌套调用#include<stdio.h>doublefact(intn){ doublef=1;inti; for(i=2;i<=n;i++) f=f*i; returnf;}doublecal(doublex,doublee){ doubleitem=x,s=0,p=x; inti=1; while(item>=e){ s=s+item;i++; item=pow(x,i)/fact(i); } returns;}voidmain(){ doublex,e; scanf("%lf%lf",&x,&e); printf("s=%lf\n",cal(x,e));}例6:双重循环阅读下列程序并回答问题,在每小题提供的若干可选答案中,挑选一个正确答案。【程序】(双重循环,初值位置,for语句格式与功能)程序1#include<stdio.h>main(){intj,k,s1,s2;s1=s2=0;for(j=1;j<=5;j++){s1++;for(k=1;k<=j;k++)s2++;}printf("%d%d",s1,s2);}程序2#include<stdio.h>main(){intj,k,s1,s2;s1=0;for(j=1;j<=5;j++){ s1++; for(k=1,s2=0;k<=j;k++)s2++;}printf("%d%d",s1,s2);}程序3#include<stdio.h>main(){intj,k,s1,s2;s1=0;for(j=1;j<=5;j++){s1++; for(k=1;k<=j;k++,s2=0)s2++;}printf("%d%d",s1,s2);}程序4#include<stdio.h>main(){intj,k,s1,s2;s1=s2=0;for(j=1;j<=5;j++,s1=0){s1++;for(k=1;k<=j;k++) s2++;}printf("%d%d",s1,s2);}(13)程序1运行时,输出 (13) 。A、015 B、50 C、55 D、515 (14)程序2运行时,输出 (14) 。A、015 B、50 C、55 D、515 (15)程序3运行时,输出 (15) 。A、015 B、50 C、55 D、515 (16)程序4运行时,输出 (16) 。A、015 B、50 C、55 D、515 五、整除性(循环与分支的嵌套)基本知识:x%y==01.简单应用例1.从键盘输入100个整数,求其中正数的平均数。main(){inti,count=0,x;floatsum=0;for(i=0;i<100;i++){scanf(“%d”,&x);if(x>0){sum=sum+x;count++;}}sum=1.0*sum/count;printf("%f",sum);}例2.输入一行字符,统计其中英文字母、空格或回车、数字和其他字符的个数。#include<stdio.h>voidmain(){intblank,digit,i,letter,other;charch;blank=digit=letter=other=0; while((c=getchar())!='\n'){if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))letter++;elseif(ch>='0'&&ch<='9')/*如果ch是数字字符*/digit++;elseif(ch==''||ch=='\n')blank++;elseother++;}printf("letter=%d,blank=%d,digit=%d,other=%d\n",letter,blank,digit,other);}2.素数输入一个正整数m,判断它是否为素数。#include<stdio.h>voidmain(){ inti,m; printf("Inputanumber:"); /*输入提示*/ scanf("%d",&m); for(i=2;i<m/2;i++) if(m%i==0)break; if(i>=m/2)printf("%disaprimenumber!\n",m); elseprintf("No!\n"); }求500以内的全部素数,每行输出10个。解1#include<stdio.h>#include<math.h>/*使用求平方根函数,需要包含数学库*/voidmain(){intcount,i,m,n;count=0;*count用于控制输出格式,每行输出10个数*/for(m=2;m<=500;m++){n=sqrt(m);for(i=2;i<n;i++)/*判断m是否为素数*/if(m%i==0)break;if(i>=n){ /*如果m是素数*/printf("%6d",m);/*输出m*/count++;/*累加已经输出的素数个数*/if(count%10==0)printf(“\n”);/*输出数10的倍数,换行*/}}printf("\n");}解2/*使用函数求500以内的全部素数*/#include<stdio.h>#include<math.h>intprime(intx);/*函数声明*/voidmain(){intcount,m;count=0;/*count用于控制输出格式,每行输出10个数*/for(m=2;m<=500;m++){if(prime(m)){/*调用prime(m)判断m是否为素数*/printf("%6d",m);/*输出m*/count++;/*累加已经输出的素数个数*/if(count%10==0)printf(“\n”);/*输出换行*/}}printf("\n");}/*定义判断素数的函数,如果x是素数则返回1(“真”);否则返回0(“假”)*/intprime(intx){inti,n,res; /*变量res作为判断结果*/res=1;/*设res的初值为1*/n=sqrt(x);for(i=2;i<n;i++)if(x%i==0){ /*如果x不是素数*/res=0; /*判断结果为0*/break; /*中止循环*/}returnres;/*把判断结果回送主函数*/}(3)阅读下列程序说明和程序,在每小题提供的若干可选答案中挑选一个正确答案。【程序说明】验证哥德巴赫猜想:任何一个大于6的偶数均可表示为两个素数之和。例如6=3+3,8=3+5,…,18=7+11。将6~100之间的每个偶数都表示成两个素数之和,打印时一行打印5组。要求定义和调用函数prime(m)判断m是否为素数。当m为素数时返回1,否则返回0,素数就是只能被1和自身整除的正整数,1不是素数,2是素数。(整除性,函数调用)运行示例:6=3+3 8=3+5 10=3+7 12=5+7 14=3+1116=3+13 18=5+13 20=3+17【程序】#include<stdio.h>#include<math.h>intprime(intm){inti,n;if(m==1)return0;n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0)return0;(5);}main(){intcount,i,number;count=0;for(number=6;number<=20;number=number+2){for(i=3;i<=number/2;i=i+2) if((6)){printf("%d=%d+%d",number,i,number-i);count++; if((7))printf(“\n”); (8);}}}(5)A、; B、return1;C、return0; D、elsereturn1;(6)A、prime(i)!=0||prime(number-i!=0) B、prime(i)!=0&&prime(number-i!=0)C、prime(i)==0||prime(number-i==0) D、prime(i)==0&&prime(number-i==0)(7)A、count%5==0 B、count%5!=0 C、(count+1)%5==0 D、(count+1)%5!=0(8)A、break; B、elsebreak;C、continue; D、;3.数位截取基本知识:while(x){d=x%10;处理x=x/10;}(1)输入一个正整数,将其逆序输出。例如,输入12345,输出54321scanf(“%d”,&x);while(x>0){printf(“%d”,x%10);x=x/10;}(2)从键盘读入一个整数,统计该数的位数。例如,输入1234,输出4;输入0,输出1。#include<stdio.h>voidmain(){intcount,number;/*count记录number的位数*/count=0;printf("Inputanumber:"); /*输入提示*/scanf("%d",&number);if(number<0)number=-number;do{ /*判断循环条件*/number=number/10; /*整除后减少一位个位数,组成一个新数*/ count++; /*位数加1*/}while(number!=0); /*判断循环条件*/printf("Itcontains%ddigits.\n",count);}(3)输入一个长整型数,求各位数字的平方和#include<stdio.h>voidmain(){intdigit;longin,s;scanf(“%ld”,in);_________________&&if(in<0)in=-in;__________________&&s=0;while(in>0){___________&&digit=in%10;s=s+digit*digit;_____________&&in=in/10;}printf(“sum=%ld\n”,s);}(4)若一个3位整数的各位数字的立方之和等于这个整数,称之为“水仙花数”。例如:153是水仙花数,因为153=13+53+33求所有的水仙花数。解1:#include<stdio.h>voidmain(){intdigit,x,s;printf(″水仙花数是:\n″);for(i=100;i<=999;i++){x=i;s=0;while(x){digit=x%10;s+=digit*digit*digit;x=x/10;}if(s==i)printf(“%d\n”,i);}}解2:#include<stdio.h>voidmain(){inti,j,k;printf(″水仙花数是:\n″);for(i=1;i<=9;i++) /*百位数*/for(j=0;j<=9;j++) /*十位数*/ for(k=0;k<=9;k++) /*个位数*/if(i*i*i+j*j*j+k*k*k==100*i+10*j+k)printf(“%d\n”,i*100+j*10+k);}解3:#include<stdio.h>voidmain(){inta,b,c,i;printf(″水仙花数是:\n″);for(i=100;i<=999;i++){a=i%10;b=i/10%10;c=i/100;if(i==a*a*a+b*b*b+c*c*c)printf(“%d\n”,i);}}4.分解因子(1)(完数)程序设计题:考生目录下有Design.c程序,请完成以下功能:在6至1000内找出所有的“完数”,说明:某数等于其诸因子之和则该数为完数,如6=1+2+3,28=1+2+4+7+14则6、28就是完数。#include<stdio.h>#include<stdlib.h>voidmain(){ intn,i,s;for(n=6;n<=1000;n++) {s=0; for(i=1;i<n;i++) if(n%i==0)s+=i; if(n==s)printf("%6d",n);}}(3)输入一个正整数,输出它的所有质数因子。例如:n=13860,则输出2、2、3、3、5、7、11解:#include"stdio.h"voidmain(){intm,i=2;printf("请输入一个整数:");scanf("%d",&m);while(m!=1)if(m%i==0){printf("%d",i);m/=i;}elsei++;printf("\n");}分析:利用整除性分解质数因子时,允许有相同的因子,例如:8=2*2*2,因此在while(m!=1)循环体内,找到因子,并用m/=i;除掉因子后,i并不加1,允许重负判断,只有不是因子时,才i++。5.最大公约数,最小公倍数该程序功能:输入m、n(要求输入数均大于0),输出它们的最小公倍数

#include<stdio.h>

voidmain()

{intm,n,k;while(scanf("%d%d",&m,&n),m<0||n<0);for(k=m;k%n!=0;)k=k+m;printf("%d\n",k);}最大最小(循环与分支的嵌套)(1)简单变量#include<stdio.h>voidmain(){ inti,n;floatmax,min,x;scanf(“%d”,&n);scanf(“%f”,&x); max=min=x; for(i=1;i<n;i++){scanf(“%f”,&x);if(max<x)max=x; if(x<min)min=x; }printf("%f%f",max,min);}(2)一维数组#include<stdio.h>voidmain(){ inti;floatmax,min,a[10];for(i=0;i<10;i++)scanf(“%f”,&a[i]); max=min=0; for(i=1;i<10;i++){if(a[i]>a[max])max=i; if(a[i]<a[min])min=i; }printf("%f%f",a[max],a[min]);}二维数组单元法#include<stdio.h>voidmain(){ inti,j;floatmax,min,a[3][4];for(i=0;i<3;i++)for(j=0;j<4;j++)scanf(“%f”,&a[i][j]); max=min=a[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++){if(a[i][j]>max)max=a[i][j]; if(a[i][j]<min)min=a[i][j]; }printf("%f%f",max,min);}下标法输入一个2*3的二维数组,找出最大值以及它的行下标和列下标,并输出该矩阵。#include<stdio.h>main(){intcol,i,j,row;inta[2][3];printf("Enterarray(2*3):");for(i=0;i<2;i++)for(j=0;j<3;j++)scanf("%d",(9));(10)for(i=0;i<2;i++)for(j=0;j<3;j++)if(a[i][j]>a[row][col]){(11)}printf("max=a[%d][%d]=%d\n",row,col,a[row][col]);for(i=0;i<2;i++){for(j=0;j<3;j++)printf("%4d",a[i][j]);(12)}【供选择的答案】(9) A、&a[i][j] B、&a[j][i]C、a[i][j] D、a[j][i](10) A、row=col=2; B、row=col=0; C、a[row][col]=0; D、a[row][col]=-1;(11)A、row=j;col=i; B、a[row][col]=a[i][j]; C、row=i;col=j; D、a[row][col]=a[j][i];(12)A、printf("\n")}; B、}printf("\n"); C、; D、printf("\n");}要求掌握下列算法:累加累乘,级数求和,字符统计,素数,数位截取,完数,分解质数因子,最大公约数,最大最小。四、数组是同一种数据类型元素的有序集合。引入数组的目的可以扩充数据的表示范围,便于程序的操作。其主要知识点包括:(一)数组的定义和初始化089一、7;078一、7;078三、8;067三、9;09一、4数组必须先定义后使用。1.一维数组的定义格式:类型说明符数组名[常量表达式];例如:inta[10];该定义有4层含义:1)定义a数组有10个元素,即a[0]、a[1]、a[2]、a[3]、a[4]、…、a[9];2)下标从0开始,到9为止,不包括10,否则下标超界;数组在下标超界时,C语言不检查,但超过下标的数组元素的值是随机的。3)数组的10个元素在内存中连续存放,数组名a是数组的首地址。4)数组定义的范围必须是常量表达式,不能是变量。2.下标变量:一维数组的元素由单下标变量组成,其下标可以是:常数;a[3];a[i];表达式:a[2*i-1];下标变量:a[b[7]];3.二维数组的定义格式:类型说明符数组名[常量表达式1][常量表达式2];例如:inta[3][4];定义a为3行4列的数组二维数组可以看作一种特殊的一维数组,它的元素又是一个一维数组。二维数组a[3][4]可以看作一维数组a[3],它由3个元素a[0]、a[1]、a[2]组成,以a[0]、a[1]、a[2]为数组名,又可以组成3个一维数组:其中:a[0]-->a[0][0],a[0][1],a[0][2],a[0][3]a[1]-->a[1][0],a[1][1],a[1][2],a[1][3]a[2]-->a[2][0],a[2][1],a[2][2],a[2][3]即:a[0]是第一行的首地址,以a[0]为数组名,构成第1行的一维数组。a[1]是第二行的首地址,以a[1]为数组名,构成第2行的一维数组。a[2]是第三行的首地址;以a[2]为数组名,构成第3行的一维数组。4.一维数组的初始化有下列方法:在定义数组的同时可以对数组元素赋初值,例如:inta[10]={0,1,2,3,4,5,6,7,8,9};相当于:a[0]=0,a[1]=1,…,a[9]=92)可以只给一部分元素赋值,例如:inta[10]={0,1,2,3,4};表示只对前面5个元素赋初值,后5个元素初值为0。如果一个数组中全部元素赋同一个初值,也必须逐个写出,例如:inta[10]={0,0,0,0,0,0,0,0,0,0};4)对全部数组元素赋初值时可以不指定数组长度。例如:inta[]={1,2,3,4,5};系统自动将a的长度定义为5。但是,当数组长度与初值个数不相同时,必须写出数组长度。二维数组的初始化有下列方法:分行给二维数组赋初值(即按行赋初值)。例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};2)可以将所有数据写在一个“{}”内,系统自动按数组元素的排列顺序赋初值。例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};3)可以对部分元素赋初值,其余元素值自动为0。例如:inta[3][4]={{1},{5},{9}};即:1000500090004)如果对全部元素赋值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省略,系统按数据总个数和每行的列数确定出行数。例如:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};数组元素的处理(二)数组的遍历C语言中规定只能逐个引用数组元素而不能一次引用整个数组。数组的遍历遍历:下标i++指针p++结束条件:i<=n字符串a[i]!=’\0’或i<strlen(a)1.数组元素的输入和输出除了初始化以外,数组一般不允许整体赋值,数组的输入和输出一般通过循环来实现。例如:对一维数组有inta[10];定义后,输入格式为:for(i=0;i<10;i++)scanf("%d",&a[i]);输出格式为:for(i=0;i<10;i++)printf("%d",a[i]);对二维数组有inta[3][2];定义后,输入格式为:for(i=0;i<3;i++)for(j=0;j<2;j++) scanf(“%d”,&a[i][j]);输出格式为:for(i=0;i<3;i++){//矩阵形式输出for(j=0;j<2;j++)printf("%d",a[i][j]);printf("\n");}2.数组元素的累加;一维数组:for(i=0;i<10;i++)s=s+a[i];二维数组:for(i=0;i<3;i++)for(j=0;j<2;j++)s=s+a[i][j];阅读下列程序说明和程序,在每小题提供的若干可选答案中挑选一个正确答案。【程序】(循环控制,break,continue,输出语句的位置,一维数组)程序1#include<stdio.h>Voidmain(){ intflag=0,i; inta[7]={8,9,7,9,8,9,7}; for(i=0;i<7;i++) if(a[i]==7){ flag=i; break; } printf("%d\n",flag); flag=-1; for(i=6;i>=0;i--) if(a[i]==8){ break; flag=i; } printf("%d\n",flag); flag=0; for(i=0;i<7;i++) if(a[i]==9){ printf("%d",i); } printf("\n"); flag=0; for(i=0;i<7;i++) if(a[i]==7)flag=i; printf("%d\n",flag);}(13)程序运行时,第一行输出(13)。A、2 B、0 C、3 D、6(14)程序运行时,第二行输出(14)。A、4 B、-1 C、0 D、(15)程序运行时,第三行输出(15)。A、246 B、4 C、135 D、6(16)程序运行时,第四行输出(16)。A、246 B、2 C、135 D、6(三)常用算法1、最大最小:078二、31、逆置:089二、5;078四、2(1)for(i=0;i<=n/2;i++){t=a[i];a[i]=a[n-i-1];a[n-i-1]=t;}(2)for(i=0,j=n-1;i<j;i++,j--){t=a[i];a[i]=a[j];a[j]=t;}下面程序的功能是将一个字符串str的内容颠倒过来。解1:#include<string.h>#include<stdio.h>voidmain(){inti,j,k;/*int型k可当char型用*/charstr[]=“1234567”;for(i=0,j=strlen(str)-1;i<j;i++,j--)/*头尾交换,直到中间。*/{k=str[i];str[i]=str[j];str[j]=k;}for(i=0;i<strlen(str);i++)printf(“%c”,str[i]);}解2:#include<string.h>“#include<stdio.h>voidmain(){inti,n;charstr[]=“1234567”;n=strlen(str);for(i=0;i<n/2;i++)/*头尾交换,直到中间。*/{k=str[i];str[i]=str[n-1-i];str[n-1-i]=k;}for(i=0;i<n;i++)printf(“%c”,str[i]);}2、顺序查找:089四、2;067二、470017程序填空,不要改变与输入输出有关的语句。输入一个正整数repeat(0<repeat<10),做repeat次下列运算:输入一个正整数n(1<n<=10),再输入n个整数,将它们存入数组a中,再输入一个整数x,然后在数组a中查找与x相同的元素,如果找到,输出x在数组a中对应元素的最小下标,如果没有找到,输出相应信息。输入输出示例:括号内为说明#include<stdio.h>intmain(void){intflag,index,i,n,x;intrepeat,ri;inta[10];scanf("%d",&repeat);for(ri=1;ri<=repeat;ri++){ scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",

温馨提示

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

评论

0/150

提交评论