C语言阶段性知识点总结4.docx
《C语言阶段性知识点总结4.docx》由会员分享,可在线阅读,更多相关《C语言阶段性知识点总结4.docx(13页珍藏版)》请在冰豆网上搜索。
![C语言阶段性知识点总结4.docx](https://file1.bdocx.com/fileroot1/2023-1/29/dbba8a46-0ea6-4667-98e2-fd53abcb60bb/dbba8a46-0ea6-4667-98e2-fd53abcb60bb1.gif)
C语言阶段性知识点总结4
石家庄市求实电脑职业培训学校
全国计算机等级考试二级C语言程序设计
阶段性知识点总结(4)
知识点范围:
第五章
第五章循环结构
根据条件的成立与否,某些语句被执行多次的结构被称为“循环结构”
知识点1while当型循环的使用方法:
【教程第50页~55页】
1、格式1:
前测试当型循环。
while(条件)
{循环体;
}
2、格式2:
后测试当型循环。
do
{循环体;
}while(条件);
3、【累加器】计算1+2+3+……+100的结果。
变量
初值
一
二
三
……
退出
i
0
1
2
3
......
99
100
101
sum
0
=0+0+1+2+3+……+99+100
inti=0,sum=0;
while(i<=100)
{sum=sum+i;
i++;
}
printf(“sum=%d\n”,sum);
可将程序变为:
变量
初值
一
二
三
……
退出
i
2
3
4
5
......
99
100
101
sum
1
=1+2+3+4+5+……+99+100
inti=2,sum=1;
while(i<=100)
{sum=sum+i;
i++;
}
printf(“sum=%d\n”,sum);
4、【连乘器】计算1*2*3*……*10的结果。
inti=2;
doubles=1;
while(i<=10)
{s=s*i;
i++;
}
printf(“s=%lf\n”,s);
********************************************************************
知识点2for计数循环的使用方法【教程第55页~57页】
一、格式:
for(表达式1;表达式2;表达式3)
{循环体;
}
执行流程:
(1)计算表达式1;
(2)计算表达式2,看表达式2是否成立。
成立(表达式2结果为非0),转向执行(3)。
不成立(表达式2结果为0),转向执行(5)。
(3)执行循环体。
(4)计算表达式3,并转向执行
(2)。
(5)退出循环,执行for循环以下的句子。
二、利用for循环实现累加器:
inti,sum=0;
for(i=0;i<=100;i++)
sum=sum+i;
printf(“sum=%d\n”,sum);
分析:
1、for循环一般需要一个循环变量(例如:
i)。
2、表达式1决定了循环变量的初值。
3、表达式2决定了循环变量的终值。
4、表达式3决定了循环变量的步长。
根据循环头分析循环体的执行次数:
for(i=1;i<=10;i++)循环体执行次数:
10次。
for(i=0;i<=10;i++)循环体执行次数:
11次。
for(i=1;i<10;i++)循环体执行次数:
9次。
for(i=1;i<=10;i+=2)循环体执行次数:
5次。
结论:
循环体执行次数=
(1)初值<终值,则步长>0。
(2)初值<终值,则步长<0。
三、实例1:
输出所有的水仙花数。
【各个位的立方和等于本身的三位数】
问题1:
如何表示三个数字的立方和。
方法1:
a*a*a+b*b*b+c*c*c
方法2:
利用math.h(数学头文件)所含有的库函数。
abs(x),返回整型数据x的绝对值。
fabs(x),返回实型数据x的绝对值。
sqrt(x),返回x的算术平方根。
pow(x,y),返回x的y次方。
exp(x),返回自然对数底e的x次方。
问题2:
如何表示三位数的各个位。
设三位数为i,则:
个位:
i%10
十位:
i/10%10
百位:
i/100
#include
#include
main()
{inti;
intgw,sw,bw;
for(i=100;i<=999;i++)
{gw=i%10;
sw=i/10%10;
bw=i/100;
if(pow(gw,3)+pow(sw,3)+pow(bw,3)==i)
printf(“%d\t”,i);
}
}
********************************************************************
知识点3分析利用for循环实现的累加器程序。
inti,sum=0;
for(i=0;i<=100;i++)
sum=sum+i;
printf(“sum=%d\n”,sum);
1、for循环的三个表达式中,表达式1只执行了1次;表达式3的执行次数与循环体相同。
2、依据上述分析,表达式1可以删除,放在for循环以外;表达式3可以删
除,放在循环体以内。
但是分号不能少。
inti=0,sum=0;
for(;i<=100;)
{sum=sum+i;
i++;
}
printf(“sum=%d\n”,sum);
将分号删除的同时把for换为while,程序与利用while实现的累加器完全相同。
说明for循环和while循环是可以互相转换的。
3、表达式2也可以删除,需要借助break形成非正常化出口。
inti=0,sum=0;
for(;;)
{sum=sum+i;
i++;
if(i>100)break;
}
printf(“sum=%d\n”,sum);
4、结论:
break只可以用于swithc体和循环体,在循环体中的功能为退出循环体,执行循环以下的语句。
********************************************************************
知识点4素数问题。
【质数:
只能被1和它本身整除的数】
一、输出100以内的所有素数:
inti;
printf(“1\t2\t3\t5\t7\t”);
for(i=11;i<=97;i+=2)
if(i%3!
=0&&i%5!
=0&&i%7!
=0)printf(“%d\t”,i);
注意:
该种方法只适用于计算100以内的素数。
二、通用算法:
1、让任意数字x与2、3、4、……,
相除,若余数均不为0,则x为素数。
2、让任意数字x与2、3、4、……,
相除,若余数均不为0,则x为素数。
【算法1】利用循环终值判断循环是否正常退出。
#include
#include
main()
{intx,i;
printf(“请输入一个整数:
”);
scanf(“%d”,&x);
for(i=2;i<=sqrt(x);i++)
if(x%i==0)break;
if(i<=sqrt(x))
printf(“Yes\n”);
else
printf(“No\n”);
}
【算法2】利用标志变量判断循环是否正常退出。
#include
#include
main()
{intx,i,f=0;
printf(“请输入一个整数:
”);
scanf(“%d”,&x);
for(i=2;i<=sqrt(x);i++)
if(x%i==0)
{f=1;
break;
}
if(f==0)
printf(“Yes\n”);
else
printf(“No\n”);
}
********************************************************************
知识点5斐波那契数列问题。
数列:
1,1,2,3,5,8,13,……
数列特征:
数列中任意数为相邻前两数之和。
分析:
在已知规律的情况下,至少知道前两个数,数列才可以依次排开。
intf1=1,f2=1,f;
f=f1+f2;
f1=f2;
f2=f;
【题型1】输出该数列的前20项,每五项一行。
#include
main()
{intf1=1,f2=1,f;
inti=3;
printf(“%d\t%d\t”,f1,f2);
while(i<=20)
{f=f1+f2;
f1=f2;
f2=f;
printf(“%d\t”,f);
if(i%5==0)printf(“\n”);
i++;
}
}
【题型2】输出该数列的第20项。
#include
main()
{intf1=1,f2=1,f;
inti=3;
while(i<=20)
{f=f1+f2;
f1=f2;
f2=f;
i++;
}
printf(“fib(20)=%d”,f);
}
【题型3】计算该数列前20项的和。
#include
main()
{intf1=1,f2=1,f;
inti=3,sum=f1+f2;
while(i<=20)
{f=f1+f2;
sum=sum+f;
f1=f2;
f2=f;
i++;
}
printf(“fsum(20)=%d”,sum);
}
********************************************************************
知识点6循环嵌套的使用。
*****
*****
*****
*****
【例题1】完成利用星号构成的矩形的输出。
inti,j;
for(i=1;i<=4;i++)
{for(j=1;j<=5;j++)
printf(“*”);
printf(“\n”);
}
【例题2】完成利用星号构成的直角三角形的输出。
*
**
***
****
*****
inti,j;
for(i=1;i<=5;i++)
{for(j=1;j<=i;j++)
printf(“*”);
printf(“\n”);
}
结论:
利用循环嵌套实现特殊形状的输出,外层循环控制行(外行),内存循环控制列(内列)。
【例题3】完成利用星号构成的平行四边形的输出。
****
****
****
****
分析:
1—3s—4*
2—2s—4*
3—1s—4*
4—0s—4*
inti,j;
for(i=3;i>=0;i--)
{for(j=1;j<=i;j++)
printf(“”);
for(j=1;j<=4;j++)
printf(“*”);
printf(“\n”);
}
【例题4】完成利用星号构成的等腰三角形的输出。
*
***
*****
*******
分析:
1—3s—1*
2—2s—3*
3—1s—5*
4—0s—7*
解法1:
已知行数和空格个数与星号个数之间的对应关系。
inti,j;
for(i=1;i<=4;i++)
{for(j=1;j<=4-i;j++)
printf(“”);
for(j=1;j<=2*i-1;j++)
printf(“*”);
printf(“\n”);
}
解法2:
找不到对应的关系。
inti,j;
intt=1;
for(i=3;i>=0;i--)
{for(j=1;j<=i;j++)
printf(“”);
for(j=1;j<=t;j++)
printf(“*”);
*
***
*****
*******
*****
***
*
t+=2;
printf(“\n”);
}
【例题5】完成利用星号构成的菱形的输出。
#include
main()
{inti,j;
ints=1,t=5;
for(i=3;i>=0;i--)
{for(j=1;j<=i;j++)printf(“”);
for(j=1;j<=s;j++)printf(“*”);
s+=2;
printf(“\n”);
}
for(i=1;i<=3;i++)
{for(j=1;j<=i;j++)printf(“”);
for(j=1;j<=t;j++)printf(“*”);
t-=2;
printf(“\n”);
}
}
********************************************************************
知识点7continue的使用。
一、continue的作用:
退出本次循环,执行下一次循环。
当continue用于
for循环体内时,需要先计算表达式3,再执行下一次循环。
二、利用continue实现素数问题。
#include
#include
main()
{intx,i,f=0;
printf(“请输入一个整数:
”);
scanf(“%d”,&x);
for(i=2;i<=sqrt(x);i++)
if(x%i!
=0)
continue;
else
{f=1;
break;
}
if(f==0)
printf(“Yes\n”);
else
printf(“No\n”);
}
********************************************************************
知识点8闰年问题。
1、判断一年是否为闰年的算法:
(1)公元年数如能被4整除,而不能被100整除,则是闰年。
(2)公元年数能被400整除也是闰年。
2、程序:
#include
main()
{intyear,i=0;
for(year=2000;year<=3000;year++)
{if(year%4==0&&year%100!
=0)
{printf(“%d,”,year);
i++;
}
if(year%400==0)
{printf(“%d,”,year);
i++;
}
if(i%10==0)printf(“\n”);
}
}