C语言——循环的嵌套小练习

目录

📝练前预警:

我们前面是已经学习了循环结构(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、用平方根 :(这个作为拓展,建议尝试理解学习)
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;
}

✒️小结:

  • 以上就是练习代码,如果有不太理解的代码题,可以在评论区一起讨论学习的。

感谢大家的浏览🌹🌹

相关推荐
摇滚侠11 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
小向是个Der11 小时前
嵌入式进阶——MCU上电后的动作
c语言·单片机·mcu·学习·链接脚本
silvamux_13 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
bkspiderx14 小时前
基于Socket的广播通信及C语言实现详解
c语言·开发语言·socket·广播·socket的广播通信
蒸蒸yyyyzwd14 小时前
kafka、redis、mysql不熟悉问题总结
笔记·八股
hgy896914 小时前
深度学习(小白笔记)——迁徙
人工智能·笔记·深度学习
摇滚侠14 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python
辣知15 小时前
辣知·化智93 被历史尘封的鬻子
学习
每天题库17 小时前
西藏安全员 A 证备考真题题库 强化重点知识刷题提升通过率
学习·安全·考试·题库·考证
Be for thing17 小时前
PyTorch基础|Tensor张量详解,张量创建、数据类型与常用操作
pytorch·学习·1024程序员节