目录
- :bell:前言:为什么循环的嵌套以`for`为主:question:
- :writing_hand:练习题:
-
- :one:打印矩形
-
- 1.1、`for`的嵌套
- 1.2、`while`的嵌套
- [1.3、`do while`的嵌套](#1.3、
do while
的嵌套)
- :two:打印等腰直角三角形
- :three:打印九九乘法表
- :four:打印1-100之间的素数
📝练前预警:
我们前面是已经学习了循环结构(for、while、do while)以及跳转语句(break、continue)还有跳转语句goto,如果没有学习过这个的可以打开下面链接进行学习,以便后面的练习不会看不懂代码
🔔前言:为什么循环的嵌套以for
为主❓
- 在前面学习了循环结构,这三种循环常常是会嵌套起来使用的,以便更好的解决问题
- 在循环结构的嵌套中,我们常常是使用for循环来进行嵌套
为什么呢?
- 因为for循环因其结构清晰、控制集中、与常见编程模式高度匹配而成为首选,特别是在处理数组、矩阵和固定次数的迭代时表现最佳。
- 而另两个循环结构会非常的冗长 ,结构不清晰,若嵌套多的话可读性降低,后面会有一个例子可以比较理解
✍️练习题:
这些练习题是由易到难(只对难的有详细的解释和注释),注意理解
1️⃣打印矩形
练习1:
- 要求:用
*
来打印3*7
大小的矩形- 下面是三种循环的嵌套 ,后面的练习题只会使用
for
循环的嵌套 ,如有要练习的可以自行练习
1.1、for
的嵌套
c
for循环:
#include<stdio.h>
int main()
{
int i = 0; //行
int j = 0; //列
for (i = 1; i <= 3; i++)
{
for (j = 1; j <= 7; j++)
printf("*"); //打印完7列的 * 后第一层for循环结束
/*第一层for循环结束,我们要换行,
不然会导致原本第二行的 * 紧跟着打印,
最后变成一行而不是三行了*/
printf("\n");
}
return 0;
}
1.2、while
的嵌套
c
while循环:
#include<stdio.h>
int main()
{
int i = 1; //行
while (i <= 3)
{
int j = 1; //列
while (j <= 7)
{
printf("*");
j++;
}
printf("\n");
i++; //打印完第一行后自增,打印第二行,直到打印完第三行后条件不满足,结束
}
return 0;
}
1.3、do while
的嵌套
c
do while循环:
#include<stdio.h>
int main()
{
int i = 1;
do
{
int j = 1;
do
{
printf("*");
j++;
} while (j <= 7);
printf("\n");
i++;
} while (i <= 3);
return 0;
}
- 我们可以看到上面的三个代码 ,它们想表达 的意思是一样 的,但它们所写的形式有所差别,其中for循环的是最为简便,理解起来也是比较好的,代码也比较简短清晰
2️⃣打印等腰直角三角形
练习2:
- 要求:可以自定义输入三角形的行号,输出对应的三角形
- 我们在打印
*
时我们为了显得等腰,我们可以在* 后面加个空格
c
#include <stdio.h>
int main()
{
int i=0;
int n=0;
printf("请输入三角形的行号:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
int j=1;
for(j=1;j<=i;j++)
{
printf("* ");
}
printf("\n");
}
return 0;
}
3️⃣打印九九乘法表
练习3:
- 要求:九九乘法表要每行打印阶梯状
- 每行的表达式之间要有跳格符
- 比如:
- 1*1=1
- 1*2=2 2*2=4
- 1*3=3 2*3=6 3*3=9
c
#include <stdio.h>
int main()
{
int i=0;
for(i=1;i<=9;i++)
{
int j=1;
for(j=1;j<=i;j++)
{
printf("%d*%d=%d\t",j,i,i*j);
}
printf("\n");
}
return 0;
}
4️⃣打印1-100之间的素数
练习4:
- 找出1-100之间的素数
- 素数(质数),只能被1和本身整除的整数,如2、3、5...
- 要求:
- 每5个素数换一行
- 每个素数之间要跳格
- 练习前的理解:
- way1、可以用
i
除2 ~ (i-1)
范围内的数字,如果被整除成功就不是素数 - way2、用平方根 :(这个作为拓展,建议尝试理解学习)
- way1、可以用
c
方法一:
#include<stdio.h>
int main()
{
int i = 0;
int count = 0; //计算素数的个数
for (i = 1; i <= 100; i++)
{
int j = 0;
for (j = 2; j < i; j++) //得到2~(i-1)的数
{
/*
当i=1,j(2)<i(1) 这个条件为假,不执行for循环,到if语句j(2)>=i(1)为真但因为 i(1)>1为假,不打印
当i=2,j(2)<i(2) 这个条件为假,不执行for循环,到if语句j(2)>=i(2)为真,打印素数值
当i=3,j(2)<i(3) 这个条件为真,进入for循环,i(3)%j(2)==0 为假,不跳离,j++,j=3,j(3)<i(3) 这个条件为假,到if语句j(3)>=i(3)为真,打印素数值
当i=4,j(2)<i(4) 这个条件为真,进入for循环,i(4)%j(2)==0 为真,跳离,到if语句j(2)>=i(4)为假,不打印
*/
if (i % j == 0) //判断非素数
break;
}
if (j >= i && i > 1) //因为1、2都无法通过上面的for循环,1是非素数(因此我们加一个判断条件i>1,避免打印非素数1)
{
count++;
printf("%d\t", i);
if (count % 5 == 0) //每五个素数,换一次行
printf("\n");
}
}
return 0;
}
c
方法二:
不建议:利用goto跳转语句:
#include <stdio.h>
#include<math.h> //下面用sqrt()开方函数需要包括的头文件
int main()
{
int i = 0;
int count = 0; //计数
//goto的标签(start)
start:
i++; // 首先i=1
if (i > 100) //i超过100,不在计算范围内,跳转到return 0;
goto end;
int j = (int)sqrt(i); //j接收i的开方值
if (i == 1) //如果i为1,直接算第二个值,因为1是非素数
goto start;
for (j = 2; j <= (int)sqrt(i); j++) //判断是否为素数
{
if (i % j == 0) //非素数,直接回到最开始,算下一个值,来进行判断是否为素数
goto start;
}
count++; //是素数,计数加一
printf("%d\t", i); //打印素数值
if (count % 5 == 0)
printf("\n");
goto start; //计算完一个素数值,要回到最初,算下一个是否为素数
//100以内的判断素数结束
end:
return 0;
}
***************************************
***************************************
也可以这样写:
#include <stdio.h>
#include<math.h> //下面用sqrt()开方函数需要包括的头文件
int main()
{
int i = 0;
int count = 0; //计数
//goto的标签(start)
start:
i++; // 首先i=1
for (; i <= 100; i++)
{
int j = (int)sqrt(i); //j接收i的开方值
if (i == 1) //如果i为1,直接算第二个值,因为1是非素数
goto start;
for (j = 2; j <= (int)sqrt(i); j++) //判断是否为素数
{
if (i % j == 0) //非素数,直接回到最开始,算下一个值,来进行判断是否为素数
goto start;
}
count++; //是素数,计数加一
printf("%d\t", i); //打印素数值
if (count % 5 == 0)
printf("\n");
goto start; //计算完一个素数值,要回到最初,算下一个是否为素数;当i=100时,回到最初,i++,i=101,但因为for循环条件不满足,只能离开循环,结束
}
return 0;
}
c
方法二:
推荐:简化代码(不使用goto):
#include <stdio.h>
#include<math.h>
int main()
{
int i = 0; //i 是100以内的整数
int count = 0; //计数(计算素数的个数)
for (i = 1; i <= 100; i++)
{
int flag = 1; //标记flag素数是1
int j = (int)sqrt(i); //得到i 的平方根,此时sqrt(i)得到的数是double类型,要转换为int类型
for (j = 2; j <= (int)sqrt(i); j++) //除了1和其本身,所以从2开始取余;这个会导致1、2、3无法进入循环判断是否是素数
{
if (i % j == 0) //判断会不会被整除(整除就非素数)
{
flag = 0; //不是素数,标记falg为0
break;
}
}
if (i == 1) //因为 1 无法进入循环判断是否为素数,我们就手动定义
flag = 0;
//为什么2、3也无法进入循环判断是否为素数,而我们不用定义呢?
//是因为我们最开始就认为100以内所有的数都为素数了,我们只需要将非素数的标记flag为0就可以了
if (flag == 1)
{
count++;
printf("%d\t", i);
/*下面的if语句最好在 if (flag == 1) 里面,
是因为如果在外面的话count=0会打印一次换行
当count=5时,打印一次换行,后面如果是非素数,count仍然为5,又打印一次空行*/
if (count % 5 == 0)
printf("\n");
}
}
return 0;
}
✒️小结:
- 以上就是练习代码,如果有不太理解的代码题,可以在评论区一起讨论学习的。
感谢大家的浏览🌹🌹