• 微信号
  • 微信号
您当前的位置:首页 > 学海无涯 > 茑语花香>C++ For讲解与一本通平台讲解

C++ For讲解与一本通平台讲解

孤峰 孤峰家 2023-09-21 180人阅读

C++ For讲解~for 是什么for 是 C++ 中的保留字(说了N遍),作用是极其常见的,每个程序都可能会有(废话)。所以学好 for 语句是十分重要的。(简单来说就是学不好就干不了什么)

for 有什么用

而 for 是一种循环,它可以重复执行其括号内的语句。大大节省了代码量。

例如,从 1 输出到 100,在没学过 for 语句之前是这么做的:

#include<iostream>
using namespace std;
int **in(){
cout<<1<<' '<<2<<' '<<3<<' '<<......<<97<<' '<<98<<' '<<99<<' '<<100<<endl;
return 0;
}

而学过循环后,是这么做的:

#include<iostream>
using namespace std;
int **in(){
for(int i=1;i<=100;i++)
cout<<i<<' ';
return 0;
}

一眼望去,学过 for 语句会使程序更加轻巧。

for 语句教程

现在,我们来学习 for 语句。

下面是 for 语句的格式:

for(控制变量初始化表达式;条件表达式;增量表达式)
语句1;

可能有些难理解,首先,控制变量初始化表达式 是指 初始化控制 for 语句执行的变量,也就是说,这里的变量用于确定 for语句是否执行,起到的是 定义 的作用。

然后,条件表达式 是指 判断条件是否成立,如果成立则执行,否则跳出循环,它起到了 停止循环 的作用。

较后,增量表达式 是指 循环执行中改变变量 ,它起到了 改变循环中的数据 的作用。

for(控制变量初始化表达式;条件表达式;增量表达式){
语句1;
语句2;
...
}

for 语句可以使用大括号括起来,以执行多个语句。

for 语句执行过程

首先,程序执行 for 语句分为已下几个步骤:

初始化了 for 语句的控制变量。

查看条件表达式,看看其是否成立,当成立时执行3,不成立则跳出整个 for 语句。

执行其内部语句。

根据增量表达式变化变量。

回到2。

for 语句实例

相信大家都明白了 for 语句怎样执行的了。

下面是 for 语句的一个实例:

#include<iostream>
using namespace std;
int **in(){
int n,sum=0;
cin>>n;//输入 n
for(int i=1;i<=n;i++)//定义 i 变量;当 i 小于 n 时,执行 for 语句;i 变量每次增加 1
sum+=i;//同等于 sum=sum+i;
cout<<sum<<endl;//输出
return 0;
}

这段代码可以看出,执行一次循环,i 就会增加 1,当 i 大于 n 时,就不满足条件表达式里面的条件了,随即跳出循环。输出 sum。(这是一个从 1~n 求和的代码)

其实 for 语句中的什么控制变量初始化表达式,条件表达式和增量表达式,都可以不填,因为它只是说明此变量专门用于判断 for 语句是否执行。所以就可以像这样:

#include<iostream>
using namespace std;
int **in(){
for(;;){
语句1;
语句2;
...
}
return 0;
}

这样的 for 语句虽然可以执行,但其会无限的执行下去。

又例如求和的哪道题,依照这样,可以把控制变量初始化表达式,条件表达式和增量表达式放在语句处。

#include<iostream>
using namespace std;
int **in(){
int n,sum=0,i=1;//初始化变量 i
cin>>n;//输入 n
for(;;){
if(i>n) break;//当 i > n 时跳出循环(break作用),也就是条件表达式的作用
sum+=i;//同等于 sum=sum+i;
i++;//i 每次自增 1,相当于增量表达式
}
cout<<sum<<endl;//输出
return 0;
}

这段代码与上面求和的代码作用相同,只不过是把控制循环的 i 的处理位置放在了别的地方。但是像这样的题,建议使用第一种方法,这种方法比较无聊,有空的地方就可以放 i,没必要在语句里放 i 。

信息学奥赛一本通的题目

2016 - 2019,1059 - 10842016:【例4.1】for循环求和

求和的题目已经当做示例讲过了,这里就不在多讲。

下面是代码:

#include<iostream>
using namespace std;
int **in(){
int n,sum=0;
cin>>n;//输入 n
for(int i=1;i<=n;i++)//定义 i 变量;当 i 小于 n 时,执行 for 语句;i 变量每次增加 1
sum+=i;//同等于 sum=sum+i;
cout<<sum<<endl;//输出
return 0;
}

讲~ 过~ 了~

2017:【例4.2】输出偶数

这题用 for 语句模拟从 1~n 的每一个数,在判断它是否为偶数,如果是偶数就输出,否则什么也不干。这里要用到之前学的 if 语句,不会的可以去我之前的 C++ If讲解与一本通平台讲解 来看看。(强行推荐)

下面是代码:

#include<iostream>
using namespace std;
int **in(){
 int i,n;
 cin>>n;
 for(i=1;i<=n;i++)//枚举从 1n 的所有数
if(!i&1)//当 i 不是奇数时
cout<<i<<' ';//输出
 return 0;
}

当然,这样是可以,但如果数据大了,就像 1000000000 这样,要是用一个个去枚举,计算机早就超时了,怎么办?

思考一下,从 1~n 的偶数有怎样的特征?

2,4,6,8,10...

是不是每隔一个数就是一个偶数呢?利用这个特点,可以做出时间复杂度相对较简单的代码。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int i,n;
 cin>>n;
 for(i=2;i<=n;i+=2)//从 2 开始,每隔 1 个数就是一个偶数(就是加上2)
cout<<i<<' ';//因为 i 一直是偶数,所以可以直接输出
 return 0;
}

这就是一种优化。

2018:【例4.3】输出奇偶数之和

Emmm...这题只是与上面的有亿点不同。仔细想想就可以得出,只要用一个 sum 去把每次算出的奇偶数累加就可以了。但是因为它有两项,所以要用特殊的方法处理。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int i,n,sum=0,ans=0;
 cin>>n;
 for(i=1;i<=n;i++)
if(i&1)
ans+=i;
else
sum+=i;
 cout<<sum<<' '<<ans<<endl;
 return 0;
}

与上一题类似。

2019:【例4.4】求阶乘

阶乘是什么?(只对不懂什么是阶乘的人的教程,懂了的可以不看)

阶乘与乘方不是一个东西,千万不要搞混了,阶乘指的是从 1~n 的所有整数的乘积

1*2*3*4*5*...*n=n!

阶乘是个十分神奇的东西...

1! = 1,2! = 2,3! = 6,4! = 24,5! = 120,6! = 720,7! = 5040,8! = 40320,9! = 362880

这里都还能接受

10! = 3628800,11! = 39986100,12! = 479001600,13! = 6227020800,14! = 87178291200,15! = 130767436800,16! = 20922789888000,17! = 355687428096000,18! = 64023373705728000,19! = 121645100408832000,20! = 2432902008176640000

到这里已经很大了,所以,阶乘不是一个很好算的东西。但是,出题者十分好,把阶乘定在了1<=n<=20,刚好,long long 可以装下。

20!=2432902008176640000<2(64次方)=18446744073709551616

20!=2432902008176640000>2(32次方)=4294967296

long long 存放的范围大于 20!,但 int 小了,所以这题用 long long 才行。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int i,n;
 long long sum=1;//这里是个坑,不能像其他那样初始化为 0 ,因为 0 乘任何数都为 0
 cin>>n;
 for(i=1;i<=n;i++)//枚举 1~n 的数
sum*=i;//累乘
 cout<<sum<<endl;
 return 0;
}

过~

1059:求平均年龄

平均年龄怎么求?用年龄总和 ÷ 人数。因为此题要用到浮点数,所以要用 float 。(当然double也行,但是 double 比较慢,可以用 float 时就尽量用 float)

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
 int i,n,x;
 double sum=0;//初始化
 cin>>n;//输入
 for(i=1;i<=n;i++){//循环控制输入个数
cin>>x;//依次输入
sum=sum+x;//累加输入
 }
 printf("%.2lf",sum*1.0/n);//输出累加和/人数的商
 return 0;
}

这道题很简单,但是可能有人会有疑惑(吧,因为我之前也有,呵呵),for 语句中的输入是读一次就要求输入一次,每次输入的值都会覆盖当前的值。(以前不懂...)

1060:均值

与上一题类似,都是求平均值。

直接上代码:

#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
 int i,n;
 double x,sum=0;
 cin>>n;//输入 n
 for(i=1;i<=n;i++){//输入 ncin>>x;//输入 x
sum=sum+x;//累加
 }
 printf("%.4lf",sum*1.0/n);//输出平均值
 return 0;
}

过~~

1061:求整数的和与均值

就多了个求和。

下面是代码:

#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
 int i,n,x,sum=0;
 cin>>n;//输入数据个数
 for(i=1;i<=n;i++){//循环 ncin>>x;//输入
sum=sum+x;//累加
 }
 printf("%d %.5lf",sum,double(sum)*1.0/n);//输出
 return 0;
}

过~~~

1062:较高的分数

这题就是求较大值,靠的就是打擂台的方式,这种方式我在讲解 2056:【例3.7】较大的数 时就讲过了。而多个数据打擂台也是同样使用一个一个找的方法。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
 int i,n,x,**xn=-1;//**xn 初始化**小值
 cin>>n;
 for(i=1;i<=n;i++){
cin>>x;//输入 n 个数
if(x>**xn)//如果这个数要比当前的较大值大的话
**xn=x;//把较大值给 **xn
 }
 cout<<**xn<<endl;//输出较大值 **xn
 return 0;
}

打擂台是找较大值的最简单的方式。

1063:较大跨度值

题目已经说了

较大跨度值 = 较大值减去**小值

所以,我们要做的就是找出较大值和**小值,然后用较大值减**小值。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int **xn=0,i,n,x,minn=1001;//较大值定义一个小值,**小值定义一个大值
 cin>>n;
 for(i=1;i<=n;i++){
cin>>x;//循环输入
if(**xn<x)//如果它大于较大值
**xn=x;//覆盖
if(minn>x)//如果它小于**小值
minn=x;//覆盖
 }
 cout<<**xn-minn<<endl;//输出较大值减**小值
 return 0;
}

过~~~~

1064:奥运奖牌计数

没什么好讲的,直接累加。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int i,n,x,j,y,t,jsum=0,ysum=0,tsum=0;
 cin>>n;
 for(i=1;i<=n;i++){
cin>>j>>y>>t;//输入金银铜牌数量
jsum=jsum+j;//累加金牌数量
ysum=ysum+y;//累加银牌数量
tsum=tsum+t;//累加铜牌数量
 }
 cout<<jsum<<" "<<ysum<<" "<<tsum<<" "<<jsum+ysum+tsum<<endl;//输出
 return 0;
}

过~~~~~

1065:奇数求和

把 2018 改亿下就行了。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int n,m,sum=0;
 cin>>n>>m;
 for(n;n<=m;n++){//增量不一定为 i
if(n&1)//是否为奇数
 sum=sum+n;//累加
 }
 cout<<sum<<endl;//输出
 return 0;
}

过~~~~~~

1066:满足条件的数累加

这就是吧上一题换了个条件,其他都一样。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int i,x,y,sum=0;
 cin>>x>>y;//输入
 for(i=x;i<=y;i++)//枚举
if(i%17==0)//判断条件是否成立
sum=sum+i;//累计
 cout<<sum<<endl;//输出
 return 0;
}

过~~~~~~~

1067:整数的个数

很简单,定义三个变量,分别累加即可。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int i,n,x,sum1=0,sum5=0,sum10=0;
 cin>>n;
 for(i=1;i<=n;i++){
cin>>x;
if(x==1)//是否为 1
sum1++;//累加
else
 if(x==5)//是否为 5
sum5++;//累加
 else
if(x==10)//是否为 10
 sum10++;//累加
 }//此处可以用 switch 大家可以试试
 cout<<sum1<<endl<<sum5<<endl<<sum10<<endl;//输出
 return 0;
}

用 switch 试试吧。

1068:与指定数字相同的数的个数

改变一下判断就行了。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int n,y,x,i,sum=0;
 cin>>n>>y;
 for(i=1;i<=n;i++){
cin>>x;
if(x==y)//满足条件
sum++;//累加
 }
 cout<<sum<<endl;//输出
 return 0;
}

简单

1069:乘方计算

这题就是乘方了,不是阶乘。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int i,a,n,sum=1;
 cin>>a>>n;
 for(i=1;i<=n;i++)
sum=sum*a;//累乘
 cout<<sum<<endl;//输出
 return 0;
}

其实可以用 c**th 中的 pow 函数的。(比较偷懒)

1070:人口增长

按照题意算即可。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
 int i,n;
 double x;
 cin>>x>>n;
 for(i=1;i<=n;i++)
x=x*1.001;//0.1% = 0.001
 printf("%.4lf",x);
 return 0;
}

弄清题意即可

1071:菲波那契数

使用迭代的方式向前拓展。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int i,n;
 long long x=1,y=1,z;
 cin>>n;
 for(i=1;i<=n-2;i++){//注意是到 n-2 否则会超界
z=x+y;//计算新的数
y=x;//迭代...
x=z;//迭代...
 }
 cout<<x<<endl;
 return 0;
}

迭代拓展

1072:鸡尾酒疗法

算好即可。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 long a,b,n;
 double x,y;
 cin>>n;
 cin>>a>>b;
 x=b/(a/1.0);
 for(int i=2;i<=n;i++){
cin>>a>>b;
y=b/(a/1.0);
if(y-x>0.05)//判断
cout<<"better"<<endl;
else
if(x-y>0.05)
cout<<"worse"<<endl;
else
cout<<"same"<<endl;
 }
 return 0;
}

输出的字符不能错了,错了是十分吃亏的。

1073:救援

找到求的方式,在有一些基础知识即可做出。

代码如下:

#include<cstdio>
#include<c**th>
using namespace std;
int **in(){
 int i,n,p=0;
 double time=0,x=0,y=0;
 cin>>n;
 for(i=1;i<=n;i++){
cin>>x>>y>>p;//输入
time+=sqrt(x*x+y*y)/25.0+p*1.5;//求出时间
 }
 printf("%d",int(ceil(time)));//输出结果
 return 0;
}

要算好,不能写错数字。

1074:津津的储蓄计划

这个题只要模拟好每个月的金钱变化,确保无误。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int n,sum=0,s=0,yu,y;
 for(int i=1;i<=12;i++){
s+=300;
cin>>n;
yu=s-n;
if(yu<0){//出现负数,直接退出
cout<<"-"<<i;
break;
 }
 if(yu/100!=0){//保存整百的钱
 sum=sum+(yu/100)*100;
 yu=yu-(yu/100)*100;
}
s=yu;
if(i==12){//加倍奉还
 y=s+sum+(sum/10)*2;
 cout<<y;
}
 }
 return 0;
}

控制好每个月的金钱变化。

1075:药房管理

这道题是我卡的最久的...(其实是读不懂题目的样例...)

下面是代码:

#include<iostream>
using namespace std;
int a[101];//用了数组...
int **in(){
int sum=0,m,n,i;
cin>>m>>n;
for(i=1;i<=n;i++){
cin>>a;
if(m>=a)
m-=a;
else
sum++;
}
cout<<sum<<endl;
return 0;
}

用了数组,可能不好理解。

1076:正常血压

这题是求最长的持续时间,这是一个要注意的点。

下面是代码:

#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
 int n,i,x,y,sum=0,**x=0;
 cin>>n;
 for(i=1;i<=n;i++){
cin>>x>>y;
if(x>=90&&x<=140&&y>=60&&y<=90){//判断是否正常
 sum=sum+1;
 if(**x<sum)//判断是否比最长时间长
**x=sum;//覆盖较大值
}
else
sum=0;//重置
 }
 cout<<**x<<endl;//输出
 return 0;
}

明白了题意就十分简单了。

1077:统计满足条件的4位数

利用对四位整数的按位分离,求出千,百,十,个位,再进行计算。

下面是代码:

#include<iostream>
using namespace std;
int **in(){
 int i,a,b,c,d,e,n,sum=0;
 cin>>n;
 for(i=1;i<=n;i++){
cin>>a;
b=a%10;//分离个位
c=a%100/10;//分离十位
d=a%1000/100;//分离百位
e=a/1000;//分离千位
if((b-c-d-e)>0)//计算,判断是否成立
 sum=sum+1;
 }
 cout<<sum<<endl;
 return 0;
}

分离是重点。

1078:求分数序列和

分数序列:

,其中

根据序列变化来做,代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
 int i,n;
 double sum=0,x=2,y=1,z=0;
 cin>>n;
 for(i=1;i<=n;i++){
sum=sum+x/y;
z=x;//变换
x=x+y;
y=z;
 }
 printf("%.4lf",sum);
 return 0;
}

跟着题意走,分数九十九;再来点细节,AC不再竭。(奇怪的顺口溜...)

1079:计算分数加减表达式的值

分数加减表达式:

单数时是加,双数时是减。

根据这个求出值即可。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
 int n,i;
 double sum=0;
 cin>>n;
 for(i=1;i<=n;i++){
if(!i&1)//判断是加是减
sum=sum-1.0/i;//减
else
sum=sum+1.0/i;//加
 }
 printf("%.4lf\n",sum);
 return 0;
}

简单的判断就可以带过此题。

1080:余数相同问题

这题用来枚举的...

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int i,a,b,c;
 cin>>a>>b>>c;
 for(i=2; ;i++){//没有结束的条件
if(a%i==b%i&&b%i==c%i){//满足条件
 cout<<i<<endl;//直接输出
 return 0;//直接退出
}
 }
}

暴力出奇迹...

1081:分苹果

此题较好的方法是第一个分 1 个,第二个分 2 个,第三个分 3 个...以此类推。

较后求出总共需要的苹果数量。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int i,n,sum=0;
 cin>>n;
 for(i=1;i<=n;i++)//循环
sum=sum+i;//累加结果
 cout<<sum<<endl;//输出
 return 0;
}

不公平的分法...

1082:求小数的某一位

这道题可以模拟我们做除法竖式时所做的事,也就是求商,余。

代码如下:

#include<iostream>
using namespace std;
int **in(){
 int i,n,x,y,v,sum=0;
 cin>>x>>y>>n;
 for(i=1;i<=n;i++){//做竖式的过程
x=x*10;
v=x/y;
x=x%y;
 }
 cout<<v<<endl;//输出
 return 0;
}

利用做除法竖式的过程可以轻易解决这个问题。

1083:计算星期几

这题所做的乘方运算太大,long long 都装不下,但是要确切的数字有什么用呢,它一直在一周(7天)内循环,只要求出距离今天过了几天就行了,所以,在求乘方时可以将它 mod 7。

下面是代码:

#include<iostream>
#include<cstdio>
using namespace std;
int **in(){
 int n,i,a,b;
 cin>>a>>b;
 n=1;
 for(i=1;i<=b;i++)
n=n*a%7;//一直 mod 7
 switch(n){//判断过了几天
case 0:cout<<"Sunday"<<endl;break;
case 1:cout<<"Monday"<<endl;break;
case 2:cout<<"Tuesday"<<endl;break;
case 3:cout<<"Wednesday"<<endl;break;
case 4:cout<<"Thursday"<<endl;break;
case 5:cout<<"Friday"<<endl;break;
case 6:cout<<"Saturday"<<endl;break;
 }
 return 0;
}

mod 7 是至关重要的一步。

1084:幂的末尾

与上一题相似,出来末尾的三个数,其他位置上的数不可能影响到后三位数,所以,我们每次只需保留后三位即可。

下面是代码:

#include<iostream>
using namespace std;
int **in(){
int a,b,k=1,i=1;
cin>>a>>b;
for(i;i<=b;i++){//模拟过程
k*=a;//计算乘方
k%=1000;//取后三位
}
if(k>=100)//特判
cout<<k<<endl;
else if(k>=10)//特判
cout<<"0"<<k<<endl;
else//特判
cout<<"00"<<k<<endl;
return 0;
}

较后的特判不能忘了。

好了,题目都讲完了。

转载:感谢您阅览,转载请注明文章出处“来源从小爱孤峰知识网:一个分享知识和生活随笔记录的知识小站”。

链接:C++ For讲解与一本通平台讲解http://www.gufeng7.com/niaolang/1845.html

联系:如果侵犯了你的权益请来信告知我们删除。邮箱:119882116@qq.com