(六十五)for循环

for循环的格式为(注意,i需要声明,i可以用其他变量替代):

for(循环初始化; 循环测试; 循环更新}{循环体}

for(i的初始化; i的判断语句符合则执行括号内的代码; 符合后i的值增加或者减少){执行的代码;}

 

例如代码:

#include<iostream>

int main()
{
	using namespace std;
	int a = 10,i;	//初始化a=10,声明i
	cout << "a = " << a << endl;	//输出a的值
	for (i = 0;i < 5;i++)
	{
		a = a + 5;	//a+5
		cout << "a + 5 = " << a  << " 。i = " << i << endl;	//输出a+5后的值,然后输出i的值
	};
	cout << "i = " << i << endl;	//输出结束循环后i的值
	cout << "a = " << a << endl;	//输出结束循环后a的值
	system("pause");
	return 0;
}

输出:
a = 10
a + 5 = 15 。i = 0
a + 5 = 20 。i = 1
a + 5 = 25 。i = 2
a + 5 = 30 。i = 3
a + 5 = 35 。i = 4
i = 5
a = 35
请按任意键继续. . .

结论:

①在for后面的小括号内,三部分分别是:

(1)初始化变量i,且无论循环多少遍,初始化只执行一遍;

(2)判断语句,假如判断成立,则执行大括号内的程序,不成立,则结束for语句;

(3)变量i变化,用于制定执行多少遍语句。注意:假如是for(i=1;i<5;i++){a=a+1;}这一行代码,假如判断成立,先执行a=a+1,再执行i++。即先执行大括号里循环语句,再执行小括号内变化语句,相当于把第三段语句放在大括号内的循环语句最后进行执行。

 

②假如在for的小括号后面,不用大括号,比如:

for(i=1;i<5;i++)

cout<<"123"<<endl;

cout<<"456"<<endl;

那么循环执行的就是小括号后面第一行代码,而不是执行后面两行代码。

假如将两行代码都用大括号括起来,那么就是执行括起来的代码。

 

③循环执行步骤为:

(1)循环进行初始化,如i=1; 

(2)执行测试,判断是否符合要求,如i=1的确符合i<5;

(3)执行循环体,如cout<<"abc<<endl;

(4)循环更新,如i++。

然后跳到(2)开始执行测试,如果成立则跳到(3);

如果不成立,则结束循环,从(2)跳到(5)。

(5)执行循环后的第一行语句

 

④循环的测试语句的原理:

原理是判断表达式的bool值(bool值分true和false,true的值为1,flase的值为0),如果符合(为true),则结果转为1;如果不符合,则将结果转为0。

比如i<5; 假如i=1,的确小于5,于是i<5被值1替代,然后测试语句在执行的时候发现结果是1,那么执行循环语句。

又比如i=5,5不小于5,于是i<5被值0替代,测试语句在执行的时候,发现结果是0,于是结束执行循环语句。

 

正因为如此,假如我们把代码改为for(i=1;1;i++),那么就会无限执行循环体。

又假如把代码改为for(i=1;0;i++),那么就不会执行循环体。

 

⑤在循环初始化语句里进行声明:

例如for (int i=1;i<5;i++)。这样是有效的。

但问题在于在结束循环之后,执行循环外的代码时,i是无效的,会被认为,未被声明。

 

 

 

表达式的值:

例如表达式 a==540; 320<350; 1>5; 这样等的表达式。(注:不包括赋值符号=)

他们实际上都是有值的,值的表达形式是true或者flase。

例如 320<350的值是true,而1>5的值是false,a==540在不知道a的值时,是不确定的。

如代码:

#include<iostream>

int main()
{
	using namespace std;
	int a = 5;
	cout << "a<3的值是" << (a < 3) << endl;
	cout << "a>3的值是" << (a > 3) << endl;
	cout.setf(ios_base::boolalpha);	//以true或者false的形式显示结果
	cout << "a<3的值是" << (a < 3) << endl;
	cout << "a>3的值是" << (a > 3) << endl;
	cout << 1 << endl;
	system("pause");
	return 0;
}

输出

a<3的值是0

a>3的值是1

a<3的值是false

a>3的值是true

1

请按任意键继续. . .

 

注意:

①表达式(a<3)的结果是bool类型,但由于cout默认显示为int类型,因此,(a<3)被显示为0,而(a>3)被显示为1;

 

②cout.setf(ios_base::boolalpha);的作用就是,让cout正常显示bool类型,于是true被正常显示为true,而false被正常显示为flase。

 

③但是cout.setf(ios_base::boolalpha);不会将int类型的数字显示为bool类型的,因此,常量1依然被正常显示为1;

 

④表达式和语句的差别在于,表达式加上分号即为一行语句,但语句去掉分号不一定是表达式。如a>5是表达式,a>5;是语句。

但表达式变语句不一定有意义。例如a<5,然后cout<<(a<5)<<endl;并不能让输出变为true。

 

利用循环计算阶乘:

代码;

//计算阶乘
#include<iostream>

int main()
{
	using namespace std;
	long long a=1, i=1;	//使用long long格式是因为只有这样才能足够容纳结果
	for (i = 1;i < 16;i++)
	{
		a = i*a;	//算法是当前数,乘以之前数相乘的积。
		//如1的阶乘是1,2的阶乘是1的阶乘再乘以2。a代表之前数的阶乘,i代表现在的数
		cout << i << "!=" << a << endl;	//i输出是当前数,a为当前数的阶乘
	}
	system("pause");
	return 0;
}

输出:

1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
7!=5040
8!=40320
9!=362880
10!=3628800
11!=39916800
12!=479001600
13!=6227020800
14!=87178291200
15!=1307674368000
请按任意键继续. . .

利用循环给字符串不同字符赋值

上代码:

//自动给char类型字符赋值
#include<iostream>

int main()
{
	using namespace std;
	int i ;	//声明int变量i
	char abc[12];	//声明字符串abc,共有11个元素和最后的空字符
	for (i = 0;i < 10;i++)
	{
		abc[i] = char(i+97);	//第1个元素编号为0,被赋值为ASCII编码97+i的字符,注意,编码97为小写a
		cout << "abc[" << i << "] = " << abc[i] << endl;
	}
	//在i=10的时候,由于不再执行abc[i]=char(i+97);因此char[10]没有被赋值
	//char [i]=char(i+97)	这行代码可以显示abc[10]
	for (i = i;i >= 0;i--)
	{
		cout << "abc[" << i << "] = " << abc[i] << endl;	//倒着显示一遍,一直显示到char[0]
	}
	i = 10;
	abc[i] = char(i + 97);
	abc[11] = '\0';	//因为字符串是显示到空字符为止,代码值给abc字符串的每个字符赋值,但最后并没有给最后的空字符的位置赋值空字符
	//如果缺了这一行代码,显示abc的时候,在最后会显示 “烫烫烫烫”,是因为没有空字符的原因。
	cout << "abc = " << abc << endl;
	system("pause");
	return 0;
}

输出:

abc[0] = a
abc[1] = b
abc[2] = c
abc[3] = d
abc[4] = e
abc[5] = f
abc[6] = g
abc[7] = h
abc[8] = i
abc[9] = j
abc[10] =
abc[9] = j
abc[8] = i
abc[7] = h
abc[6] = g
abc[5] = f
abc[4] = e
abc[3] = d
abc[2] = c
abc[1] = b
abc[0] = a
abc = abcdefghijk
请按任意键继续. . .

注意:

①从abc[0]~abc[10]是11个元素,但是字符串的特点是,结尾是空字符,因此在声明的时候,需要是12个成员,即char abc[12];

假如是char abc[11];那么最后就会出问题。

 

②字符a的ASCII编码是97,第一个元素是0,所以abc[0]=char97; 这样abc[0]就是a了。

 

③空字符的赋值方法是:字符串名[最后一个编号]='\0';其中\0是空字符。

 

时间: 2024-08-01 05:05:35

(六十五)for循环的相关文章

DockOne微信分享(六十五):公有云上的容器实践分享

本文讲的是DockOne微信分享(六十五):公有云上的容器实践分享[编者的话]本次分享介绍普元基于微服务架构,在公有云上的一次容器实践,包括如何选型,做了哪些技术验证,遇到了哪些问题,如何解决的.分享中还包括对于云平台本身高可靠.高性能.持续发布.服务注册发现等方面的设计方案,以及后续的发展愿景及规划,旨在与大家探讨一些关于Docker.Kubernetes.CoreOS.Hystrix等具体技术的实践经验,同时希望大家能给我们的平台设计提供更好的建议. 大家好,我是普元软件的顾伟,很高兴有机会

算法系列(十五) 循环和递归在算法中的应用

一.递归和循环的关系 1. 递归的定义 顺序执行.循环和跳转是冯·诺依曼计算机体 系中程序设计语言的三大基本控制结构,这三种控制结构构成了千姿百态的算法,程序,乃至整个软件世 界.递归也算是一种程序控制结构,但是普遍被认为不是基本控制结构,因为递归结构在一般情况下都可 以用精心设计的循环结构替换,因此可以说,递归就是一种特殊的循环结构.因为递归方法会直接或间接 调用自身算法,因此是一种比迭代循环更强大的循环结构. 2. 递归和循环实现的差异 循 环(迭代循环)结构通常用在线性问题的求解,比如多项

GOLIVE5.0教程(六十五)

教程 步骤一.从Objects面板的Smart标签中将Rollover图标拖至文档窗口中,参见图16. 图16 将Rollover图标拖至此处 步骤二.进入Rollover Inspector 面板中的Name文本编辑框中输入按钮的名称. 在Web页面的设计与制作中,通过Rollover Inspector 面板为Rollover按钮指定一个名称是很有必要的,对于在多个Rollover按钮存在的情况下,该名称会给您带来极大的便利.GoLive 5要求所有图像按钮使用Web页面中唯一的名称,如1.

骗子狂发手机短信骗财六十五万

[本报讯](记者 于瀛 包力)靠着狂发短信,刘某和同案犯居然骗到了65万元巨款.昨天记者获悉,福田法院日前对这起诈骗案作出了一审判决,判处诈骗案犯刘某有期徒刑11年,并被处罚金10万元. 被告人刘某26岁,本科文化,从去年4月起,他伙同案犯"小春"(现在逃)租下了南山区大冲村一处民房,购买了电脑.连接器以及大量的手机.手机卡及银行卡,利用电脑通过手机群发"把钱直接打入某某账号,账户名某某"的短信,欺骗被害人将钱款转入诈骗短信指定的账号内.他们最初使用四部手机发送短信

曝刘晓庆新婚丈夫:五六十岁从商有婚史

导语:日前,刘晓庆[微博]被曝将在美国和自己的第四任丈夫完婚,不过男方的身份却一直未 曝光,引发多方猜测.近日,有媒体爆料,刘晓庆的准新郎年龄在五六十岁之间,是从商的华人,有过婚史,育有多名子女.据透露,两人认识多年,男方曾多次出入刘晓庆的朋友聚会,平时内敛低调,但十分支持刘晓庆的事业.刘晓庆(资料图片)据悉,刘晓庆曾有过三段婚史.第一段发生在1976年,当时为了能调往北京,刘晓庆与当时解放军总政治部歌剧团的小提琴手王立结婚,但1982年两人正式离婚.第二段,刘晓庆1981年拍摄<心灵深处>时

经销商生存环境透视:盘点十五种恶劣遭遇

经销商的弱势与生俱来,他们永远在夹缝中挣扎. 经销商的命运,永远在找品牌(厂家)做品牌然后被品牌抛弃的怪圈中循环,同时品牌也在找经销商.帮助经销商压经销商比经销商,最后换经销商的怪圈之中发展. 这对"欢喜冤家"相互依赖又相互算计,为什么经销商的命运总是飞鸟尽良弓藏,狡兔死走狗烹?为什么在零售卖场面前,经销商更是被压榨得永远伸不直腰? 策划/本刊编辑部 □执行/本刊记者 白 勇 智慧支持/樊晓军 两对"欢喜冤家" 经销商做生意,多少年来进货出货,只要供不应求就顺风顺水

让电脑启动更快的十五招

嫌脑启动太慢是每个脑迷的共同心病,让脑启动更快是大家的共同心愿,本人在使用脑过程中总结了加快脑启动速度的"十五式",与您分享. 一.BIOS的优化设置 在BIOS设置的首页我们进入"Advanced BIOS Features"选项,将光标移到"Frist Boot Device"选项,按"PageUP"和"PageDOWN"进行选择,默认值为"Floppy",这表示启动时系统会先从软驱

开发者论坛一周精粹(第十五期):Oracle发布多个Java漏洞更新-2017年7月

第十五期(2017年7月17日-2017年7月23日 ) 2017年7月18日,Oracle官方发布了2017年7月份的安全公告,安全公告中报告了多个漏洞,远程用户可以访问和修改目标系统上的数据,或可以在目标系统上获得提升的权限,或导致目标系统上的拒绝服务,涉及到的安全漏洞较多,安全风险较高. [漏洞公告]Oracle发布多个Java漏洞更新-2017年7月 https://bbs.aliyun.com/read/322152.html 您的MySQL数据在裸奔中吗?来不及了,快上车 https

kvm虚拟化学习笔记(十五)之kvm虚拟机动态迁移

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1300783 相比KVM虚拟机静态迁移中需要拷贝虚拟机虚拟磁盘文件,kvm虚拟机动态迁移无需拷贝虚拟磁盘文件,但是需要迁移到的虚拟主机之间需要有相同的目录结构虚拟机磁盘文件,本文这部分内容通过nfs来实现,当然也可以采用GFS2集群文件系统来实现,本文的动态迁移是基于共享存储动态迁移. KVM动态迁移目前有两种,一种是基于