赞
踩
C++如何跳出多层循环
虽然说语言是互通的,各种计算机语言的基本逻辑结构是类似的,但不同的语言之间还是有一些差别的。如循环中的break,在java中可以后面带标志:break [flag](flag为要结束的循环层数),但在C++中没有这个标志。
那C++中如何跳出多重循环呢?
问题主题:抽签 |
问题描述: 将写有数字的numOfCard个卡片放入口袋中,从口袋中抽取4次卡片,每次记录卡片的数字后将其放回口袋中。设卡片上写的数字为k1、k2、k3...kn,如果这4个数字的和为sum,则输出”Yes”,否则输出”No” 限制条件: 1<=numOfCard<=50 1<=sum<=108 1<=ki<=108 |
样例1: 输入 numOfCard = 3 Sum = 10 K = {1, 3, 5} 输出 Yes 样例2: 输入 numOfCard = 3 Sum = 9 K = {1, 3, 5} 输出 No |
你可能会将程序写成这样:
void drawLots() { //从标准输入读入 int numOfCard, sum; int k[MAX_N]; cout<<"输入numOfCard和sum"<<endl; cin>>numOfCard>>sum; cout<<"请输入这sum张卡片的数字"<<endl; for(int i=0; i<numOfCard; i++) { cin>>k[i]; } bool result = false; int _sum = 0; for(int a = 0; a < numOfCard; a ++) { for(int b = 0; b < numOfCard; b ++) { for(int c = 0; c < numOfCard; c++) { for(int d = 0; d < numOfCard; d ++) { _sum = k[a] + k[b] + k[c] + k[d]; if(_sum == sum) { result = true; break; } } } } } if(result){ cout<<"Yes"<<endl; } else cout<<"No"<<endl; } |
但是上面的break并没有结束循环(即没有跳出多层循环),而只是跳出了本层循环。如果你不明白为什么会这样,可以参考我之前写的一篇文章:再探java基础——break和continue的用法
或者,你可以将程序稍微改动一下来验证:
void drawLots() { //从标准输入读入 int numOfCard, sum; int k[MAX_N]; cout<<"输入numOfCard和sum"<<endl; cin>>numOfCard>>sum; cout<<"请输入这sum张卡片的数字"<<endl; for(int i=0; i<numOfCard; i++) { cin>>k[i]; } bool result = false; int _sum = 0; for(int a = 0; a < numOfCard; a ++) { for(int b = 0; b < numOfCard; b ++) { for(int c = 0; c < numOfCard; c++) { for(int d = 0; d < numOfCard; d ++) { _sum = k[a] + k[b] + k[c] + k[d]; if(_sum == sum) { result = true; break; } } } } } cout << "_sum:" << _sum << " " << "sum:" << sum << endl; if(result){ cout<<"Yes"<<endl; } else cout<<"No"<<endl; } |
输入样例1,结果为:
_sum:20 sum:10
Yes
原因:_sum:20是因为break并没有结束循环(即没有跳出多层循环),而只是跳出了本层循环,运行到循环最后一次时 k[a] == k[b] == k[c] == k[d] == 5;
那么,如何让程序跳出多重循环呢?
1. java中有break [flat]的用法,可以解决这个问题,试了一下,但发现C++里不行,会报错,可能C++里没有这个用法;2. C/C++有个强制跳转的语法goto;3. 加判断标志,不满足条件时逐层终止
void drawLots() { //从标准输入读入 int numOfCard, sum; int k[MAX_N]; cout<<"输入numOfCard和sum"<<endl; cin>>numOfCard>>sum; cout<<"请输入这sum张卡片的数字"<<endl; for(int i=0; i<numOfCard; i++) { cin>>k[i]; } bool result = false; int _sum = 0; for(int a = 0; a < numOfCard; a ++) { for(int b = 0; b < numOfCard; b ++) { for(int c = 0; c < numOfCard; c++) { for(int d = 0; d < numOfCard; d ++) { _sum = k[a] + k[b] + k[c] + k[d]; if(_sum == sum) { result = true; goto breakLoop; } } } } } breakLoop: cout << "_sum:" << _sum << " " << "sum:" << sum << endl; if(result){ cout<<"Yes"<<endl; } else cout<<"No"<<endl; } |
输入样例1.
结果:
_sum:10 sum:10
Yes
void drawLots() { //从标准输入读入 int numOfCard, sum; int k[MAX_N]; cout<<"输入numOfCard和sum"<<endl; cin>>numOfCard>>sum; cout<<"请输入这sum张卡片的数字"<<endl; for(int i=0; i<numOfCard; i++) { cin>>k[i]; } bool result = false; bool isBreakLoop = true; int _sum = 0; for(int a = 0; a < numOfCard && isBreakLoop; a ++) { for(int b = 0; b < numOfCard && isBreakLoop; b ++) { for(int c = 0; c < numOfCard && isBreakLoop; c++) { for(int d = 0; d < numOfCard && isBreakLoop; d ++) { _sum = k[a] + k[b] + k[c] + k[d]; if(_sum == sum) { result = true; isBreakLoop = false; } } } } } cout << "_sum:" << _sum << " " << "sum:" << sum << endl; if(result){ cout<<"Yes"<<endl; } else cout<<"No"<<endl; } |
输入样例1.
结果:
_sum:10 sum:10
Yes
本人还是建议采用方法二,因为方法二更符合结构化的程序设计,使代码更整洁,可读性更强!我还是尽量避免使用goto。
欢迎加入"C/C++梦之队" 学习群:226157456
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。