一、什么是循环嵌套?
其实循环嵌套没有什么新鲜的。你只需要理解循环体是什么就好。循环体就是程序在一定条件下反复执行的一段代码。而循环嵌套就是把某个循环塞到另一个循环的循环体里面去。
#include<stdio.h>
int main(){
for(int a=0;a<100;a++){
for(int b=0;b<100;b++){
printf("%d",a+b);
}
}
}
比如上面的代码,就使用了两层嵌套循环。
二、循环嵌套需要注意些什么?
1.考虑一下你电脑的感受。
C语言程序设计考试的最大允许时间一般为1000ms左右。这个时间对于绝大多数程序都是够用的,(考试不会出一些暴力解法特别费时的算法题目,如果遇到你不会的算法题目,建议暴力骗点分,写完程序直接跳)。在数据量不大的情况下,一般两层循环,甚至三层循环在结果没问题的情况下都能AC,但是你看看下面这个程序,是人干的事吗?
#include<stdio.h>
int main(){
for(int a=0;a<100;a++){
for(int b=0;b<100;b++){
for(int c=0;c<100;c++){
for(int d=0;d<100;d++){
for(int e=0;e<100;e++){
for(int f=0;f<100;f++){
for(int g=0;g<100;g++){
for(int h=0;h<100;h++){
for(int i=0;i<100;i++){
for(int k=0;k<100;k++){
long long value=(a+b+c+d+e+f)*1000+(g+h+i+k);
printf("%lld ",value);
}
}
}
}
}
}
}
}
}
}
}
这里有一个小的知识点:顺序进行的循环时间复杂度是要相加的,嵌套循环的时间复杂度是要相乘的 。比如一个循环的时间复杂度是O(logn),另外一个的时间复杂度是O(n),如果它们顺序执行(一先一后),则时间复杂度就是O(n)(不知道加法和乘法怎么算的可以去找找高数老师),如果嵌套起来,则是O(nlogn).
那你看看上面的代码,复杂度是多少?十层嵌套,复杂度O(n^10),别说一百的数据量,10个数据都不一定能AC。
2.控制语句break和continue只能控制一层循环。
break语句只能跳出它所在的最内层的循环。外层循环在内层循环被跳出之后还会继续,因为内层循环只是外层循环的循环体的一部分。continue更是同理。虽说break语句和continue语句只能控制一层,但这里还是不建议用goto语句跳出多层循环(跳着跳着就乱了,并且代码的执行效率特别低)。
3.大括号那些事
if,while,for 这些语句,如果循环体或语句块里只有一条语句,可以不加大括号(当然,萌新最好加哈)。
if(i==0)
j++;
i++;
例如,上面的代码中,当i=0时,会执行j++,但是无论i等不等于0,第三行i++都会执行。因为没有加大括号,if的管辖范围只有它下面的第一行语句 ,即j++。
4.代码的格式规范
很多同学代码堆起来以后条理非常混乱,尤其是变量较多或者多个选择结构和循环结构嵌套起来以后,界面就显得很混乱。这里提出几个建议。
1.变量规范命名:
请先掌握C语言变量名的命名语法规则。
尽量避免使用abcdefg或者a1,a2,a3之类,要不然变量一多分不清哪个是哪个了。常用的有两种规范。注意,两种规范不要混用!
①驼峰命名方式
小驼峰方式:从第二个单词开始,每个单词首字母单词大写,用于变量名,数组名,函数名:
int arrLength;
int numsSize;
大驼峰方式:从第一个单词开始每个单词首字母大写,用于结构体名:
struct StudentInformation{
/*codes here*/
};
结构体的知识,敬请期待!
②下划线命名方式
所有单词小写,之间用下划线连接。
bool** adjacent_list;
2.缩进规范
一般来说,大括号中的语句块要比大括号所在的语句整体向后缩进四个字符或一个制表符。(TAB),左括号要么与语句并在一行,要么放在下一行,与语句的首端齐平。
例如,以下两组代码都是符合我们认知的缩进规范的~
for(int i=0;i<numsSize;i++){
for(int j=0;j<numsSize;j++){
if(i==0&&j==0){
/*codes here*/
}
}
}
if(x==0)
{
printf("hello");
}
3.一行代码别太长。
别学我这么干就行(bushi)
if(Node1!=Node2&&Node1>=0&&Node2>=0&&Node1<NodesSize&&Node2<NodesSize&&weight>=0&&visited[Node1]==false&&visited[Node2]==false){
/*codes here*/
}
当然,如果迫不得已,你可以选择某个操作符另起一行。这个操作符一般放在第二行的位置。
if(Node1!=Node2&&Node1>=0
&&Node2>=0&&Node1<NodesSize&&Node2<NodesSize
&&weight>=0&&visited[Node1]==false
&&visited[Node2]==false){
/*codes here*/
}
三、练习
1.设计程序,打印九九乘法表。
打印样式如下:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
......
2.打印金字塔
输入:金字塔的高度h,满足1<h<=100,
输出:用字符‘*’ 表示的金字塔。
例如:
输入:
3
输出:
*
***
*****