循环语句
循环语句
主要知识
for(;???? while() do
{ {
} }while()
goto break continue
多组输入
循环嵌套
死循环
主要解决问题
对数组数据的输入输出
对需要遍历的问题寻找规律选取合适的循环语句求解
或者暴力(将所有可能的情况全部测试一遍)求解
用于判断一组数据中符合指定条件的数据个数
等等
个人的一些见解及所得
在使用for对数组进行操作时需注意是否越界否则后果严重 如扫雷题
for循环的格式 括号中必须有两个分号不论是否有循环变量判断条件for(;;)也是可以的这样就变成了死循环 可以在循环体中判断是否满足条件若满足break跳出循环 因此三种循环可以相互转化 但是对于先判断后操作还是先操作后判断要有明确的认识
在使用for循环只有当计数变量与所求问题中的数据变化相吻合时才可以将计数变量拿来使用
并且若在for(int i;;)循环中定义计数变量则该变量只能在该循环中有意义
for();是错的 加了分号之后循环体就成了空语句只起到延时的作用
for循环中各个语句也需要谨慎 等于 是== 若疏忽写成= 可能程序会死循环或其它情况。
循环的嵌套
嵌套时for应注意循环变量不能重名 尽量的减少嵌套的层数否则会延长时间倒置超时
多组输入(可以输入多组测试数据)
while(scanf ("%d",&n)!=EOF)
while(cin){ }
EOF为常量通常为-1因系统而异 scanf具有返回值其返回值为所接受到的数据的个数 当输入不正常时返回eof此时多组输入停止 (输入ctrl+z也可停止)
for循环中的错误判断(个人)
首先判断是否循环输入的时候输入有错误 尤其是字符串的读入(稍有不慎读入的字符串就会因为空格换行等操作影响以及二维数组读入字符串应注意字符串的长度) 字符串是否正确读入可以在输入之后 加一个输出语句观察是否理想
以上 均属个人见解如有错误敬请评论斧正一定及时改进
附上扫雷题目
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷数。
注:每个格子周围格有八个:上、下、左、右、左上、右上、左下、右下。
输入
第一行包含两个整数n和m,分别表示雷区的行数和列数。1 <= n <= 100, 1 <= m <= 100。
接下来n行,每行m个字符,‘’表示相应格子中是地雷,‘?’表示相应格子中无地雷。字符之间无任何分隔符。
输出
n行,每行m个字符,描述整个雷区。若相应格中是地雷,则用‘’表示,否则用相应的周围格地雷数表示。字符之间无任何分隔符。
#include<iostream>
using namespace std;
char a[102][102];
int b[102][102];
int main()
{
int m,n;
cin>>m>>n;
for(int i=1;i<=m;++i)
{
for(int j=1;j<=n;++j)
{
cin>>a[i][j];
if(a[i][j]=='*')
b[i+1][j]++,b[i][j+1]++,b[i+1][j+1]++,b[i-1][j]++,b[i-1][j-1]++,b[i][j-1]++,b[i-1][j+1]++,b[i+1][j-1]++;
}
}
for(int i=1;i<=m;++i)
{
for(int j=1;j<=n;++j)
{
if(a[i][j]=='*')
cout<<'*';
else
cout<<b[i][j];
}
if(i!=m)
cout<<endl;
}
return 0;
}
防止数组越界只需定义的数组下标比最多的数据还要大些这样让雷区在中间进行计数的时候带着雷区边缘多定义的数组一起计算输出时只需输出雷区多定义的数组不去输出即可 (个人见解)