C语言总复习资料.docx
《C语言总复习资料.docx》由会员分享,可在线阅读,更多相关《C语言总复习资料.docx(106页珍藏版)》请在冰点文库上搜索。
C语言总复习资料
C语言总复习资料
算法口诀
累加累乘整除性,最大最小双重循,
一查两排两遍历,函数调用文件行。
3.1.1选择结构
一.控制结构:
1.简单判断:
if(表达式)语句
2.选择分支:
if(表达式)语句1else语句2
3.多条件选择:
if(表达式1)语句1
elseif(表达式2)语句2
elseif(表达式3)语句3
……
else语句n
4.情况语句:
switch(表达式)
{case常量表达式1:
语句段1
case常量表达式2:
语句段2
……
case常量表达式n:
语句段n
default:
语句段n+1
}
5.嵌套的if-else语句
if(表达式1)
if(表达式2)语句1
else语句2
else
if(表达式3)语句3
else语句4
二.说明:
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值。
(01.1)
#include
#include
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输入输出、文件
#include数学
#include字符串
#include字符
#include其它
常用数学函数:
exexp(x)
xypow(x,y)
|x|fabs(x)abs(x)
lnxlog(x)
lgxlog10(x)
x1/2sqrt(x)
编程:
05秋五.105春五.101五.1
阅读:
05秋四.105春四.1
3.1.2循环结构
一.控制结构
1.当型循环:
while(表达式)语句
2.直到型循环:
do语句while(表达式);
3.步长型循环:
for(表达式1;表达式2;表达式3)语句
二.说明:
1.第1种当型循环当“表达式”为非0值时,执行语句,“语句”部分就是循环体,while循环是先判断后执行。
如果语句部分包含一个以上的语句,那么应该用复合语句“{}”的形式。
在循环体中应有使循环趋于结束的语句。
否则会造成死循环。
当表达式一开始就不成立时,会造成一次也不做的循环。
2.第2种直到型循环先执行“语句”,后判断“表达式”,即至少执行一次循环体。
当“表达式”的值为非0时,返回重新执行“语句”。
对于同一个问题,既可以用while语句,也可以用do-while语句处理。
while语句可能一次也不执行循环体,但do-while语句至少执行一次循环体。
特别要注意while语句后加分号;。
3.第3种步长型循环是应用最广泛,也是最重要的一种控制格式。
其执行过程是:
1)求解表达式1;
2)求解表达式2:
如果值为真(非0),则执行“语句”部分;
如果值为假(0),则结束循环;
3)当表达式2为真时,在执行了“语句”部分后,求解表达式3;
4)转到第2步继续执行.
在步长型循环的一般格式中,表达式1、表达式2、表达式3可以是任意表达式,理解和在程序设计实践中掌握for语句的格式和功能,是学习程序设计的重要一环。
必须认真掌握。
for语句最常用的形式:
for(循环变量赋初值;循环结束条件;循环变量加步长)语句所以把它称为步长型循环。
4.break语句:
break语句除了可以用来跳出switch结构之外,还可以用来从循环体内跳出循环。
语句的一般形式:
break;
5.cntinue语句:
其作用是结束本次循环。
即跳过循环体中的continue后面的其它语句,接着进行下一次是否执行循环的判断。
语句的一般形式:
continue;
break语句和continue语句的区别是:
(1).break语句结束整个最内层循环,不再进行条件判断。
(2)continue语句只结束本次循环,直接进行是否执行下一次循环的判断。
6.循环结构的最基本应用,可以实现程序中的计数和累加、累乘。
一、累加累乘
基本知识:
不变式
功能
公式
初值
X=X+1
计数
0
S=S+X
累加
∑
0
S=S*I
累乘
N!
1
S=S*X
累乘
Xn
1
实现上述功能的程序如下:
(1)求1+2+3+……+n
#include
voidmain()
{
inti,,n,sum;
scanf("%d",&n);
sum=0;
for(i=1;i<=n;i++)
sum=sum+i;
printf(“%d\n”,sum);
}
(2)求n!
#include
voidmain()
{
inti,n;
doubleproduct;
printf("inputn:
\n");
scanf("%d",&n);
product=1;/*置阶乘product的初值为1*/
for(i=1;i<=n;i++)/*循环重复n次,计算n!
*/
product=product*i;
printf("product=%.0f\n",product);
}
intfactorial(intn)//定义计算n!
的函数
{inti,fact=1;
for(i=1;i<=n;i++)//循环
fact=fact*i;//累乘
returnfact;//返回n!
的值
}
(3)求xn
#include
voidmain()
{
inti,n;
doublex,power;
printf("inputx,n:
\n");
scanf("%lf%d",&x,&n);
power=1;/*置power的初值为1*/
for(i=1;i<=n;i++)/*循环重复n次,计算x的n次幂*/
power=power*x;
printf("%0.f\n",power);
}
doubleexpon(doublex,intn)
{inti;
doublepower=1.0;
for(i=1;i<=n;i++)
power=power*x;
returnpower;
}
应用:
级数求和
1.输入x、n后输出下列算式的值。
(次数控制)
解1:
#include
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
voidmain()
{floats,t,x;;inti,n;
scanf("%f%d",&x,&n);
s=0;t=-1;
for(i=1;i<=n;i++){t=-t*x/i;s+=t;}
printf("%f\n",s);
}
解3(函数调用)
#include
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*expon(x,i)/factorial(i);
t=-t;
}
printf("%f\n",s);
}
intfactorial(intn)
{inti,fact=1;
for(i=1;i<=n;i++)
fact=fact*i;
returnfact;
}
doubleexpon(doublex,intn)
{inti;
doublepower=1.0;
for(i=1;i<=n;i++)
power=power*x;
returnpower;
}
2.求菲波那契(Fibonacci)序列:
1,1,2,3,5,8,……。
请输出前10项。
#include
voidmain()
{
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
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
#include/*使用绝对值函数fabs*/
voidmain()
{
intflag,t;
doubleitem,pi;/*pi用于存放累加和*/
lag=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);
}
编程:
06804五.202五.2
阅读:
06105秋105春1
二、整除性(循环与分支的嵌套)
基本知识:
x%y==0
简单应用
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=sum/count;
printf("%f",sum);
}
2.输入一行字符,统计其中英文字母、空格或回车、数字和其他字符的个数。
#include
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);
}
3.素数
(1)输入一个正整数m,判断它是否为素数。
#include
voidmain()
{
inti,m;
printf("Inputanumber:
");/*输入提示*/
scanf("%d",&m);
for(i=2;iif(m%i==0)break;
/*若m能被某个i整除,则m不是素数,提前结束循环*/
if(i>=m/2)/*如果循环正常结束,说明m不能被任何一个i整除,则m是素数*/
printf("%disaprimenumber!
\n",m);
else
printf("No!
\n");
}
(2)求500以内的全部素数,每行输出10个。
解1
#include
#include/*使用求平方根函数,需要包含数学库*/
voidmain()
{
intcount,i,m,n;
count=0;*count用于控制输出格式,每行输出10个数*/
for(m=2;m<=500;m++){
n=sqrt(m);
for(i=2;iif(m%i==0)break;
if(i>=n){/*如果m是素数*/
printf("%6d",m);/*输出m*/
count++;/*累加已经输出的素数个数*/
if(count%10==0)printf(“\n”);/*输出数10的倍数,换行*/
}
}
printf("\n");
}
解2/*使用函数求500以内的全部素数,程序版本2*/
#include
#includeintprime(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;iif(x%i==0){/*如果x不是素数*/
res=0;/*判断结果为0*/
break;/*中止循环*/
}
returnres;/*把判断结果回送主函数*/
}
(3)f(intn)
{
inti,j;
if(n%2||n==2){
printf("Error:
%disanoddnumberorequalsto2!
\n",n);
return;
}
for(i=n-2;i>=n/2;i--){
for(j=2;i%j;j++);
if(j!
=i)continue;
for(j=2;(n-i)%j;j++);
if(j!
=n-i)continue;
printf("%3d=%3d+%3d",n,i,n-i);
}
}
inttest_data[]={6,8,10};
main()
{
inti;
for(i=0;i<3;i++)
f(test_data[i]);
}
问题1.程序输出的结果为:
_____________.
问题2.函数f(intn)的功能是:
___________.
4.数位截取
基本知识:
while(x)
{d=x%10;
处理
x=x/10;
}
(1)输入一个正整数,将其逆序输出。
例如,输入12345,输出54321
scanf(“%d”,&x);
while(x>0)
{printf(“%d”,x%10);
x=x/10;
}
(2)从键盘读入一个整数,统计该数的位数。
例如,输入1234,输出4;输入0,输出1。
#include
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
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
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
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
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);
}
}
5.分解因子
(1)(完数)
程序设计题:
考生目录下有Design.c程序,请完成以下功能:
在6至1000内找出所有的“完数”,说明:
某数等于其诸因子之和则该数为完数,如6=1+2+3,28=1+2+4+7+14则6、28就是完数