介绍: 在程序设计中,经常需要反复执行某一条语句或一个语句块,这种结构称为“循环结构”或者“重复结构”。计算机最擅长的就是重复做一件事情,所以循环结构在程序设计中应用非常广泛。
第一课.while语句
重点内容:
while语句的格式如下:
while(表达式){
循环体
}
其含义为:先计算表达式(一般称为循环条件)的值,当表达式的值为真(循环条件成立)时,去执行一次循环体。和if语句不同的是,执行完一次循环体后,while语句又回到开始处,继续计算和判断表达式的真假,决定是否再次执行循环体。也就是“当表达式成立时,不断重复执行循环体”,所以又称为“当型循环”。
典型例题:
1.输出10个“@”:
int i=1;
while(i<=10){
printf("@");
i++
}
如果把"i++"修改为"i+=2;",运行发现,程序输出5个“@”。如果再把“i<=10”修改为“i<1;”,运行发现,程序没有任何输出,因为第一次循环条件就不成立,循环体一次也没有执行。如果不小心将循环体中的语句“i++”漏了,程序会一直执行“printf("@");”语句,永远也不会结束。这种情况称为"死循环"。
2.统计正数
#include<iostream>
using namespace std;
int main(){
int x,s=0;
cin>>x;
while(x!=0){
if(x>0) s++;
cin>>x;
}
cout<<s<<endl;
return 0;
}
第二 课.do-while语句
重点内容:
do-while语句的格式如下:
do{
循环体
}while(表达式);
do-while是用于解决至少执行一次重复操作(循环体)的循环语句。其含义:先执行一次循环体,然后判断表达式是否成立,如果成立,则返回继续执行循环体,直到表达式不成立,才退出循环。一般称之为"直到型循环"。do-while语句和while语句都可以实现循环结构,区别是:do-while语句先执行循环体,在判断表达式。所以do-while语句至少执行一次循环体。
典型例题:
比较while语句和do-while语句的区别:
1.输出一行十个"@"。
#include<cstdio>
using namespace std;
int main(){
int i=1;
do{
printf("@");
i++;
}while(i<=10);
return 0;
}
2.统计正数
#include<cstdio>
using namespace std;
int main(){
int i=1;
do{
printf("@");
i++;
}while(i<=10);
return 0;
}
第三课:for语句
重点内容:
for语句的格式如下:
for(表达式1;表达式2;表达式3){
循环体
}
在实际应用中,如果重复执行的操作(循环体)次数是固定的,已知的,则一般使用for语句。
其含义为:先执行表达式1,再执行表达式2,如果表达式二成立,则执行循环体,执行循环体后执行表达式3,执行表达式三后回到表达式2,如果表达式2成立,继续执行上述操作,如果不成立,则结束操作。
典型例题:
比较while语句do-while语句for语句的区别:
1.输出一行十个"@"。
#include<cstdio>
using namespace std;
int main(){
for(int i=1;i<=10;i++)
printf("@");
printf("\n");
return 0;
}
2.正数统计
由于for语句执行循环次数是固定的,而此题执行循环的次数不固定,所以不能用for语句。
第四课:循环嵌套
重点内容:
在第三单元中,已经介绍了分支结构的嵌套。循环结构与之类似,也可以在一个循环语句的循环体里出现另一个循环语句,不管是while语句,do-while语句还是for语句。这样的循环结构称之为"循环嵌套"。
典型例题:
1.输出矩形。
#include<cstdio>
using namespace std;
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=1; i<=n;i++){
for(int j=1;j<=m;j++)printf("*");
printf("\n");
}
return 0;
}
2.与7无关的数
#include<iostream>
using namespace std;
int main(){
int n,ans=0;
cin>>n;
for(int i=1;i<=n;i++){
int flag1=1,flag2=1;
if(i%7==0) flag1=0;
int x=i;
while(x&&flag2){
if(x%10==7) flag2=0;
x=x/10;
}
if(flag1 && flag2) ans++;
}
cout<<ans<<endl;
return 0;
}
第五课:break和continue语句
重点内容:
1.break语句:在循环体中遇到break语句,就会立刻跳出循环体,执行循环结构后面的语句。
2.continue语句:在循环体中遇到continue语句,就会忽略本次循环的后续语句而去执行下一次循环。
典型例题:
1.用break语句:与7无关的数
#include<iostream>
using namespace std;
int main(){
int n,ans=0;
cin>>n;
for(int i=1;i<=n;i++){
int flag1=1,flag2=1;
if(i%7==0) flag1=0;
int x=i;
while(x){
if(x%10==7){flag2=0;break;}
x=x/10;
}
if(flag1&&flag2) ans++;
}
cout<<ans<<endl;
return 0;
}
2.用continue语句:与7无关的数
#include<iostream>
using namespace std;
int main(){
int n,ans=0;
cin>>n;
for(int i=1;i<=n;i++){
int flag=1;
if(i%7==0) continue;
int x=i;
while(x){
if(x%10==7){flag=0;break;}
x=x/10;
}
if(flag) ans++;
}
cout<<ans<<endl;
return 0;
}
3.素数的统计
输入两个正整数m,n,判断m,n之间(含m,n)一共有多少个素数。
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int m,n,i,j,ans=0;
cin>>m>>n;
for(i=m;i<=n,i++){
for(j=2;j<sqart(i);j++)
if(i%j==0) break;
if(j<sqrt(i)) continue;
ans++;
}
cout<<ans<<endl;
return 0;
}
感受总结:
已经学完了C++中的三大结构,虽然写程序对于我来说依旧很困难,但是通过这三大结构,基本可以解决所有问题,这也是让我很兴奋的。又可以掌握一项新技能啦!
回想起前几天做程序题的时候,我现在还有一点小激动⊙∀⊙!每天晚上洗漱完了,一个宿舍的人都在床上举着手机打程序,有时做不出来,到了隔天早自习,还会接着做。一个程序平均要用2个小时,虽然很浪费时间,但每每做出一道题时心里的激动是无法形容的。有时一个很简单的问题,程序表达出来是很难的,可是越是这样,我越觉得我能做出来,就这样,我虽是个急性子,但是我还是忍着心里的烦躁与不甘,做完了所有题。在做题的过程中,我还上网搜了一些关于编程的小知识点,例如:我学会了setw()函数,等等。
通过那几天的艰辛岁月,我也深深地相信写程序是真的会掉头发,也真的会让人上瘾。那几天我为了C++,我抛弃了数分和高代,希望老师不要生气啊!同时我也更加明确了我要学信息与计算科学这门专业的目标。
第六课:程序的调试与跟踪
重点内容:
1.静态查错:常见错误:语句顺序、思路、逻辑是否有误;语法是否有误,如关键字是否录入错误、变量是否没有定义就使用、变量的大小写问题、用错标点符号等 。还有其他常见的错误,如下:
(1)变量未赋初值
例如以下程序段是要输出a数组中的最大元素,但却没有给max赋初值,很有可能会造成输出答案错误(比如输入的全是负数)。
for(int i=1;i<=n;i++)
if(a[i]>max) max=a[i];
cout<<max<<endl;
(2)中间运算结果越界
例如以下几条语句:
int a=100000;
int b;
b=a*a/100;
cout<<b<<endl;
很明显,100000*100000/100=100000000,但是输出结果是错误的。原因是C++在进行编译时,先计算出"a*a",把它放到一个中间变量中,然后再把"/100"放到b中。而"a*a"的结果超出了int范围,这就是造成错误的根本原因。
(3)if-else语句混乱
初学者在使用if-else语句的嵌套时经常会出错。if-else语句的规则是:if语句可以没有else语句与之相匹配;else语句总是与它前面的、最近的if语句匹配。例如下面这个例子:
if(条件a)
if(条件b) 代码段b
else 代码段a
本例的原意是让“代码段a”在"条件a"不成立时执行,但由于else语句总是匹配最近的if语句,因此这个else语句是与“if条件b”这个语句相匹配的。也就是说,代码段a要满足条件a成立,条件b不成立才会执行,与原意相差甚远。
(4)实数比较出错
在比较两个实数是否相等是,如果直接用等号,往往会造成错误。这是浮点运算所造成的。解决办法是使用两数差的绝对值与一个相对极小量进行比较。
2.通过添加输出语句调试程序
这是在C++中调试程序常用的方法。
但是,一定要注意,使用这种方法调试程序结束后,一定要删去或注解掉"调试语句"。
比如想查看以下程序中,当“x%i==0”成立时变量x和i的值,则可以在if语句里面输出这两个变量的值。
#include<iostream>
using namespace std;
int main(){
int x;
cin>>x;
for(int i=2;i<x;i++){
if(x%i==0){
cout<<x<<" "<<i<<endl; //用于查看x和i的值
。。。。。。。。。(此程序下面省略)
3.借助IDE的调试工具实施单步跟踪
感受总结:
调试程序是编程很重要的一步,虽然用IDE很是方便,但依赖性太强。就我而言,能发现自己的错误并能正确纠正,也是一种技能,是学好程序设计这门课的必备条件。在以后的学习中,希望我,也希望大家能塌下心来,一步一步,静水流深,不急不缓。