C语言总结三:控制语句之循环语句详细总结

      代码逻辑中需要重复执行某一操作时,便需要利用到循环语句,并且通常与break和continue语句结合使用,这提高了代码的适用性,本篇博客重点介绍三种循环语句:while循环、for循环、do...while循环,实际开发中常用的是while循环和for循环。

目录

 一、while循环

1.1 基本语法结构

1.2 while循环语句执行流程

1.3 while循环语句中的break和continue用法

1.3.1 while循环语句中的break

1.3.2 while循环语句中的continue

二、for循环

2.1 基本语法结构

2.2 for循环语句执行流程

2.3 for循环语句中的break和continue

2.3.1  for循环语句中的break

2.3.2  for循环语句中的continue

三 、do...while循环

3.1 基本语法结构

3.2 do ...while循环语句执行流程

3.3 do ...while循环语句中的break和continue

3.3.1 do...while语句中的break

3.3.2 do...while语句中的continue

四、编程练习 (掌握编程思想套路)

4.1 计算1+2+3+4+...100

4.2 计算1+2+3+4+...n,n由键盘输入

4.3 计算5的阶乘5!

4.4 计算n的阶乘n!,n由键盘输入

4.5 计算 1!+2!+3!+4!+5!

4.6 计算 1!+2!+3!+4!+.....n!,n由键盘输入

4.7 键盘输入一个数,判断这个数是否是素数,并打印出来

4.8 判断100-200之间哪些数是素数,并打印出来

4.9  输出1900-2000之间的闰年

4.10 求两个数的最大公约数和最小公倍数

4.11  打印9*9乘法表

4.12 计算斐波那契数列指定项(笔试重点)

4.13 从键盘输入一个数,输出它是几位数

4.14 穷举法题目1:现有面值为1角、2角、5角、1元的纸币若干张,请求出组合起来为3.5元的所有可能情况,输出所有可能的情况及种数。

4.15 穷举法题目2:两个乒乓球队进行比赛,各出3人,甲队为 A,B,C,3人,乙队为 X,Y,Z三人,已抽签决定比赛名单,有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编编程序找出3对赛手的名单。

4.16 输出所有的水仙花数

4.17 编程找出1000之内所有完数

4.18 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成功,如果三次均输入错误,则退出程序。

五、Sleep()函数和清屏指令system("cls")

六、猜数字小游戏

七、小结:三种循环结构

八、死循环(无限循环)

九、循环嵌套



 一、while循环

1.1 基本语法结构

       我们已经掌握了,if语句: 当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次。 由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。 那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环。while语句的语法结构和if语句非常相似。

 需要注意的是:有多条循环语句时,需要使用花括号括起来,代表一个代码块!

1.2 while循环语句执行流程

      While循环是先进入判断表达式判断为真,执行语句,然后循环变量加1,如果为假跳出循环,判断条件至少要执行一次先判断再做事! 

#include <stdio.h>
int main()
{
	int i = 0;     //定义一个初始变量
	while (i <= 10)//这是判断条件
	{
		printf("%d\n", i);
		i++;         //调整部分
	}
	return 0;
}

       初始i==0,进入while循环语句进行判断0<=10为真所以执行循环语句,打印0之后i++,进行下一次判断: 1<=10为真,直到i=11,11<=10为假,不再执行循环语句。所以最终会打印0-10。也就是说,判断条件执行了11次,但是内部的循环语句只会执行10次。

1.3 while循环语句中的break和continue用法

1.3.1 while循环语句中的break

#include <stdio.h>
int main()
{
	int i = 0;     //定义一个初始变量
	while (i <= 10)//这是判断条件
	{
		if (i == 5)
			break;
		printf(" %d\n", i);
		i++;      //调整部分
	}
	return 0;
}

       将上面循环打印0-10的代码多加了一个if判断和break语句,即当i==5时跳出循环体,不在执行后面的循环。运行结果如下:

总结:

      break在while循环中的作用: 其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。 

1.3.2 while循环语句中的continue

//continue 代码实例1
#include <stdio.h>
int main()
{
     int i = 1;
     while(i<=10)
     {
       if(i == 5)
       continue;   //i=5时会跳过continue后续代码,因此i不会进行自增,陷入死循环,转到条件判断部分
       printf("%d\n", i);
       i++;
     }
    return 0;
}

运行结果如下: 

      可以看到当打印到4的时候代码陷入死循环,这是因为continue的作用是跳过此次循环直接进入下一次循环,那么当i==5时编译器遇到了contiue语句,它就会直接跳出此次循环,因此并未执行i++操作,所以此时i还是等于5,继续下一次循环又会遇到continue语句,依然无法执行i++操作,所以i的值一直为5,代码循环执行,陷入死循环。

//continue 代码实例2
#include <stdio.h>
int main()
{
    int i = 1;
    while(i<=10)
   {
      i++;
      if(i == 5)
      continue; //i=5时会跳过continue后续代码,由于i的自增在continue前面,不会陷入死循环,转到条件判断部分,进行下一次循环
      printf("%d ", i);
   }
   return 0;
}

运行结果如下:

总结:

      continue在while循环中的作用就是: continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

 1.3.3 读取字符串的缓冲区问题

       在实际开发中,用户从键盘输入密码时(需要连续输入多个字符,包含空格和回车符\n),此时利用scanf()函数读取字符串,是会出现问题的,同时对于scanf()函数和getchar()函数在读取字符时是从缓冲区读取的,而不是直接从键盘获取,二者是有区别的!(这是输入流不可以使用flush()函数清理缓冲区,flush()函数可以用来清理输出流的缓冲区,但是不可以清理输入流的缓冲区,如scanf()函数读取字符串!!!它的作用是将缓冲区的字符全部写入到文件中!与后面学的文件操作有关)

  1. scanf()函数不会读取空格和换行符\n(回车);
  2. getchar()会读取空格和换行符\n。

        这就导致出现一个常见的问题:当scanf()函数读取字符串时,把缓冲区的字符都可以读到,但是换行符\n会留在缓冲区,要想正确的实现代码逻辑,必须要对缓冲区进行清理!getchar()函数可以读取换行符,因此可以用来清理掉单个的换行符'\n'。

    要想清理缓冲区的多个字符,可以结合使用while()循环,一直从缓冲区读取字符,直到把换行符\n也读取!

清理缓冲区的办法:

二、for循环

2.1 基本语法结构

表达式1

      表达式1为初始化部分,用于初始化循环变量的。

表达式2

     表达式2为条件判断部分,用于判断循环是否终止。

表达式3

      表达式3为调整部分,用于循环条件的调整。 

同样需要注意的是:有多条循环语句时,需要使用花括号括起来,代表一个代码块!

2.2 for循环语句执行流程

      for循环的执行过程:先执行初始化部分(只会被执行一次),再执行条件判断部分,然后执行循环语句,最后执行调整部分。 

#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf(" %d  ", i);
	}
	return 0;
}

 运行结果为:

总结:

        我们对比for循环和while循环,可以明显看出for循环比while循环简单更高效。

🔺for循环相对于while循环的优点:

        在while循环中也有for循环的三个表达式条件。但是由于代码风格的问题使得三个部分可能偏离较远,这样查找修改就不够集中和方便。所以for循环的风格更好,使用频率也最高。

2.3 for循环语句中的break和continue

2.3.1  for循环语句中的break

#include <stdio.h>
int main()
{
     int i = 0;
     for(i=1; i<=10; i++)
     {
       if(i == 5)
       break;
       printf("%d ",i);
     }
     return 0;
}

运行结果如下:

      通过运行结果看出,break语句在for循环和while循环一样直接终止循环。

🔺break在for循环中的作用:

        永久的终止循环,只要遇到break循环,循环就终止!

2.3.2  for循环语句中的continue

#include <stdio.h>
int main()
{
    int i = 0;
    for(i=1; i<=10; i++)
    {
       if(i == 5)
       continue;
    printf("%d ",i);
    }
    return 0;
}

运行结果如下:

根据运行结果来推断当i等于5时跳过了后面的语句,来到了调整部分。

🔺得出结论:会跳过continue后面的语句,直接去调整部分

建议:

1.不要在for循环体内修改循环变量,防止for循环失去控制

2.建议for循环的循环控制变量采“前闭后开区间”的写法


注意事项:
        初始化,判断部分,调整部分都可以被省略,但是判断部分被省略的话意味判断部分恒为真,那么会进入死循环!

三 、do...while循环

3.1 基本语法结构

     注意while后的分号不能少!同样需要注意的是:有多条循环语句时,需要使用花括号括起来,代表一个代码块!

3.2 do ...while循环语句执行流程

       do while循环的执行流程:先执行循环语句,之后在进入调整部分,最后进入判断语句,循环体至少要执行一次。循环体包括循环语句和调整部分。先做事再进行判断! 循环至少执行一次,使用的场景有限,所以不是经常使用。

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        printf("%d ", i);
        i++;
    }while(i<=10);
    return 0;
}

运行结果如下:

3.3 do ...while循环语句中的break和continue

3.3.1 do...while语句中的break

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        if(5 == i)
            break;
        printf("%d ", i);
        i++;
    }while(i<=10);
    
 return 0;
}

运行结果如下:

       根据运行结果可以看出breal语句在do while循环和前两种循环作用是一样的

🔺break在do while循环中的作用:

        永久的终止循环,只要遇到break循环,循环就终止

3.3.2 do...while语句中的continue

#include <stdio.h>
int main()
{
     int i = 1;
     do
     {
        if(5 == i)
            continue;
        printf("%d ", i);
        i++;
     }while(i<=10);    
 return 0;
}

运行结果:

     从运行结果看出continue语句在do while循环和while循环的作用是一样的。

🔺continue在do while循环中的作用:

跳过本次循环后面的代码,直接去判断部分

 

四、编程练习 (掌握编程思想套路)

4.1 计算1+2+3+4+...100

编码思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示   

        首先产生1-100数字,然后重复执行加法操作,申请临时变量保存计算结果,将计算结果打印出来即可。重复执行加法操作,while循环或者for循环即可实现。

//while循环实现
#include <stdio.h>
int main()
{
	int i = 1;
	int sum = 0;
	while (i <= 100)
	{
		sum += i;
		i++;
	}
	printf("1-100的和为:%d", sum);
	return 0;
}

//for循环实现
#include <stdio.h>
int main()
{
	int i = 0;
	int sum = 0;
	for (i = 1; i <= 100; i++)
	{
		sum += i;
	}
	printf("1-10的和为:%d", sum);
	return 0;
}

运行结果为: 

4.2 计算1+2+3+4+...n,n由键盘输入

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

       此题与上道题不同的是:n是由用户自己输入的,是一个不确定的数,基本思想相同。首先产生1-100数字,然后重复执行加法操作,申请临时变量保存计算结果,将计算结果打印出来即可。while循环或者for循环即可实现。

//while循环实现
#include <stdio.h>
int main()
{
	int i = 1;
	int sum = 0;
	int n = 0;
	scanf("%d", &n);
	while (i <= n)
	{
		sum += i;
		i++;
	}
	printf("1-100的和为:%d\n", sum);
	return 0;
}

//for循环实现
#include <stdio.h>
int main()
{
	int i = 1;
	int sum = 0;
	int n = 0;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		sum += i;
	}
	printf("1-100的和为:%d\n", sum);
	return 0;
}

运行结果为: 

4.3 计算5的阶乘5!

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

       首先需要明白阶乘怎么计算?1*2*3*4*5=5!,因此求阶乘本质和求和类似,先产生1-5的数字,然后把他们乘起来(连乘操作),申请临时变量保存计算结果,打印出计算结果即可。while循环或者for循环即可实现。

//while循环实现
#include <stdio.h>
int main()
{
	int i = 1;
	int ret = 1;
	while (i <= 5)
	{
		ret *= i;
		i++;
	}
	printf("5的阶乘为:%d", ret);
	return 0;
}

//for循环实现
#include <stdio.h>
int main()
{
	int i = 1;
	int ret = 1;
	for (i = 1; i <= 5; i++)
	{
		ret *= i;
	}
	printf("5的阶乘为:%d", ret);
	return 0;
}

 运行结果为:

4.4 计算n的阶乘n!,n由键盘输入

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

      此题与上道题不同的是:n是由用户自己输入的,是一个不确定的数,基本思想相同。先产生1-n的数字,然后把他们乘起来(连乘操作),申请临时变量保存计算结果,打印出计算结果即可。while循环或者for循环即可实现。

//while循环实现
#include <stdio.h>
int main()
{
	int i = 1;
	int ret = 1;
	int n = 0;
	scanf("%d", &n);
	while(i<=n)
	{
		ret *= i;
		i++;
	}
	printf("%d的阶乘为:%d", n,ret);
	return 0;
}

//for循环实现
#include <stdio.h>
int main()
{
	int i = 1;
	int ret = 1;
	int n = 0;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		ret *= i;
	}
	printf("%d的阶乘为:%d", n,ret);
	return 0;
}

4.5 计算 1!+2!+3!+4!+5!

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

     这道题与4.3不同,它是单独计算1-5的阶乘,然后把每个阶乘计算结果加起来,因此它是先进行连乘操作,在进行连加操作。双层for循环即可实现,内层循环计算计算每个数字的阶乘,外层循环把每个计算结果加起来,最后打印计算结果,while循环或者for循环即可实现。

//while循环实现
#include <stdio.h>
int main()
{
	int i = 1;
	int j = 1;
	int sum = 0;
	int ret = 1;
    //计算5个数的阶乘
	while (i <= 5)
	{
        //每次计算一个数的阶乘时,需要把ret置为1
		ret = 1;
		j = 1;
		while( j <= i)
		{	
			ret *= j;
			j++;
		}
		sum += ret;
		i++;
	}
	printf("1!+2!+3!+4!+5!的结果为:%d", sum);
	return 0;
}

//for循环实现
#include <stdio.h>
int main()
{
	int i = 1;
	int j = 1;
	int sum = 0;
	int ret = 1;
	for (i = 1; i <= 5; i++)
	{
		ret = 1;
		for (j = 1; j <= i; j++)
		{
			ret *= j;
		}
		sum += ret;
	}
	printf("1!+2!+3!+4!+5!的结果为:%d", sum);
	return 0;
}

4.6 计算 1!+2!+3!+4!+.....n!,n由键盘输入

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

       这道题与4.5不同,n是由用户自己输入的,是一个不确定的数,基本思想相同。然后把每个阶乘计算结果加起来,因此它是先进行连乘操作,在进行连加操作。双层for循环即可实现,内层循环计算计算每个数字的阶乘,外层循环把每个计算结果加起来,最后打印计算结果,while循环或者for循环即可实现。

//while循环实现
#include <stdio.h>
int main()
{
	int i = 1;
	int j = 1;
	int sum = 0;
	int ret = 1;
	int n = 0;
	scanf("%d", &n);
	while (i <= n)
	{
		ret = 1;
		j = 1;
		while (j <= i)
		{
			ret *= j;
			j++;
		}
		sum += ret;
		i++;
	}
	printf("1!+2!+3!+4!+...%d!的结果为:%d",n, sum);
	return 0;
}


#include <stdio.h>
int main()
{
	int i = 1;
	int j = 1;
	int sum = 0;
	int ret = 1;
	int n = 0;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		ret = 1;
		for (j = 1; j <= i; j++)
		{
			ret *= j;
		}
		sum += ret;
	}
	printf("1!+2!+3!+4!+...+%d!的结果为:%d", n,sum);
	return 0;
}

4.7 键盘输入一个数,判断这个数是否是素数,并打印出来

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

       首先需要明白什么是素数,素数是指只能被1和自身整除的正整数,而不能被其他正整数整除的数。换句话说,素数只有两个正因子:1和它本身。一个数的因数一定比这个数小,并且能被这个数整除,则是这个数的因数。取余便可以判断能否被整除!

       本题采用试除法(穷举法),让这个数从2到这个数减1进行取余操作,如果for循环全部执行完毕,未发现整除(取余)的数,则这个数是素数;如果只要有一个数不满足整除,则直接退出循环,它不是素数。

编程技巧:

        如何根据循环是正常结束还是由于满足条件提前结束,执行不同的操作?
第1种方法:根据循环变量的取值不同来判断,从而执行不同的操作。
第2种方法:设立标志位,满足条件时改变标志位的值,最后根据标志位的值来判断,从而执行不同的操作。

//解法一根据循环正常结束和由于满足条件提前结束循环的循环变量的值不同,来判断两种结果:
#include <stdio.h>
int main()
{
	int num=0;
	int i=2;
	printf("请输入一个数:\n");
	scanf("%d", &num);
	for (i = 2; i <= num - 1; i++)
	{
		if (num % i == 0)
			break;
	}
	//循环退出时i==num,可以作为判断的标志
	if (i == num)
	{
		printf("这是一个素数\n");
	}
	else
	{
		printf("这不是素数\n");
	}
	return 0;
}


//解法二://设立标志位flag,可以作为判断的标志,刚开始标志位置1代表是素数,满足条件退出时flag置0,那么可以根据flag的值可以判断属于哪种情况。
#include <stdio.h>
int main()
{
	int num=0;
	int i=2;
	int flag = 1;   //设立标志位flag,可以作为判断的标志
	printf("请输入一个数:\n");
	scanf("%d", &num);
	for (i = 2; i <= num - 1; i++)
	{
		if (num % i == 0)
		{
			flag = 0;
			break;
		}
	}
	if (flag == 1)                    //括号内的条件也可以是一个取值只能是0和1的变量
	{
		printf("这个数是素数\n");
	}
	else
	{
		printf("这个数不是素数\n");
	}
	return 0;
}

运行结果为: 

4.8 判断100-200之间哪些数是素数,并打印出来

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

   这道题与上道题不同的是:筛选某个区间的数是否是素数,只需要产生100-200之间的数,然后进行逐个判断即可!基本思想同上道题。

//解法一根据循环正常结束和由于满足条件提前结束循环的循环变量的值不同,来判断两种结果:
#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i = 100; i <= 200; i++)
	{
		for (j = 2; j <= i - 1; j++)
		{
			if (i % j == 0)
				break;
		}
		if (j == i)
			printf("%d是素数!\n", i);
	}
	return 0;
}

//解法二://设立标志位flag,可以作为判断的标志,刚开始标志位置1代表是素数,满足条件退出时flag置0,那么可以根据flag的值可以判断属于哪种情况。
#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	
	for (i = 100; i <= 200; i++)
	{
		bool flag = 1;
		for (j = 2; j <= i - 1; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag==1)
			printf("%d是素数!\n", i);
	}
	return 0;
}

运行结果为:

4.9  输出1900-2000之间的闰年

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

       首先要知道什么是闰年?平年一年只有365天,闰年是指在一年中有366天的年份。为了与平年相区别,闰年多出来的一天通常是在2月份,即2月29日。

符合下面两个条件之一的年份是闰年:
(1)能被4整除但不能被100整除;
(2)能被100整除且能被 400 整除;

      基本思想:产生1900-2000的数据进行判断,满足题干条件(if语句判断即可)的年份打印输出即可。
编程技巧:

       常用判断能否整除的方法:一个数能否被一个数整除,只需要对该数取余即可,余数为0,则代表可以整除,反之,不可整除。

#include <stdio.h>
int main()
{
    int  year =1900;
	for (year = 1900; year <= 2000; year++)
	{
		if (year % 4 == 0 && year % 100 != 0 || year % 100 == 0 && year % 400 == 0)
		{
			printf("%d是闰年!\n", year);
		}
	}
	return 0;
}

 运行结果为:

4.10 求两个数的最大公约数和最小公倍数

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

        首先需要明白最大公约数和最小公倍数是什么?

         两个数的最大公约数是指能同时被这两个数整除的最大正整数

         两个数的最小公倍数是指能同时被这两个数整除的最小正整数

二者之间的关系:最小公倍数=两个正整数的乘积/两个数的最大公约数

基本思想:

解法一:穷举法
       最大公约数:15和25—5。先取二者中的较小数,从这个数开始依次从大到小,判断两个数能否同时被这些数中的一个数整除,最开始满足整除的那个数便是最大公约数。
      最小公倍数:15和25—75。先挑选两个数中的较大数和较小数,较小数从1开始乘,乘到最大数,满足较小数乘以这个数并且能够整除较大数,这个数便是最小公倍数。

解法二:辗转相除法
      先通过比较确定两个数的较大数和较小数,用较大数对较小数取余得到商和余数,再用上一步的较小数对余数再取余,依次循环进行,直到余数为0,返回最后一次的较小数。
     如15和25,25%15=1余10,15%10=1余5,10%5=2余0,余数为0,返回5;如果一开始用较小数对较大数取余会怎么样呢?
     如15和25,15%25=0余15,25%15=1余10,15%10=1余5,10%5=2余0,余数为0,返回5,可见,只是多了最开始的第一步。


//解法一:
#include <stdio.h>
//最大公约数
int max_commennt1(int num1, int num2)
{
	int min = num1 > num2 ? num2 : num1;
	for (int i = min; i >= 1; i--)
	{
		if (num1 % i == 0 && num2 % i == 0)
		{
			return i;
		}
	}
	return -1;       //保证程序有正常出口,返回的值不要在结果范围之内。
}

//最小公倍数
int min_commennt1(int num1, int num2)
{
	int min = num1 > num2 ? num2 : num1;
	int max = num1 > num2 ? num1 : num2;
	for (int i = 1; i <= max; i++)
	{
		if (min * i % num2 == 0)
		{
			return min * i;
		}
	}
	return -1;
}


int main()
{
	int a, b;
	printf("从键盘输入两个数:\n");
	scanf("%d%d", &a, &b);
	int res1 = max_commennt1(a, b);
	int res2 = min_commennt1(a, b);
	printf("%d和%d的最大公约数为:%d\n", a, b, res1);
	printf("%d和%d的最小公倍数为:%d\n", a, b, res2);
	return 0;
}
//解法二
#include <stdio.h>
int max_commennt2(int num1, int num2)
{
	//确定两个数的最大数和最小数
	int  min = num1 < num2 ? num1 : num2;
	int  max = num1 < num2 ? num2 : num1;
	int mod;
	do
	{
		mod = max % min;
		if (mod == 0)
		{
			break;
		}
		max = min;
		min = mod;
	} while (mod != 0);
	return min;
}

int min_commennt2(int num1, int num2)
{
	int max_com = max_commennt2(num1, num2);//调用函数,实现求出两个数的最大公约数
	return num1 * num2 / max_com;
}

int main()
{
	int a, b;
	printf("从键盘输入两个数:\n");
	scanf("%d%d", &a, &b);
	int res1 = max_commennt2(a, b);
	int res2 = min_commennt2(a, b);
	printf("%d和%d的最大公约数为:%d\n", a, b, res1);
	printf("%d和%d的最小公倍数为:%d\n", a, b, res2);
	return 0;
}

运行结果为:

4.11  打印9*9乘法表

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

基本思想:乘法表由行和列组成,双层for循环即可实现,外层for循环控制行数的变化,内层for循环控制列的变化,即每一行有几组。

#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i = 1; i <= 9; i++)
	{
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%d\t", i, j, i * j);
		}
		printf("\n");
	}
	return 0;
}

 运行结果为:

4.12 计算斐波那契数列指定项(笔试重点)

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

题目解读:斐波那契数列:前两项为1,从第三项开始,每一项都是前两项之和;即:1、1、2、3、5、8、13...

编程思路:

      第1项和第2项都为1,单独利用分支赋值为1,从第三项开始,重复执行加法.
如何实现从第三项开始,重复执行加法呢?利用一个for循环实现加法循环,在函数体内通过赋值更新数据。

#include <stdio.h>
int main ()
{
	int n=0;
	int f1=1, f2=1, f3=1;
	printf("请输入第几项:\n");
	scanf("%d",&n);
	if(n==1||n==2)
	{
		printf("%d", 1);
	}
	else
	{
		for (int i = 3; i <= n; i++)
		{
			f3 = f1 + f2;
			f1 = f2;
			f2 = f3;
		}
		printf("第%d项为:%d",n,f3);
	}
	return 0;
}

 运行结果为:

4.13 从键盘输入一个数,输出它是几位数

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

基本思想:整除操作可以得到一个数的商,取余操作可以得到一个数的余数;
       想要判断一个数有几位数,可以将这个数每次整除10,进行循环,循环终止条件整除结果为0,则退出循环;

       原理:计数器思想!每一次整除10,相当于划掉一位数,这时计数器加一,直到走出循环。
       如:123/10=12余3;12/10=1余2;1/10=0余1

#include <stdio.h>
int main()
{
	int num = 0;
	int bit = 0;
	printf("请输入一个数:\n");
	scanf("%d", &num);
	while (num != 0)
	{
		num/=10;
		bit++;
	}
	printf("这是一个%d位数",bit);
	return 0;
}

运行结果为: 

4.14 穷举法题目1:现有面值为1角、2角、5角、1元的纸币若干张,请求出组合起来为3.5元的所有可能情况,输出所有可能的情况及种数。

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

思路:穷举法,找出每一类的区间范围,利用for循环嵌套进行遍历,然后挑出满足条件的组合,穷举法的本质就是循环迭代,找到所有满足条件的。

#include <stdio.h>
void show()
{
	int count = 0;
	for (int i1 = 0; i1 <= 35; i1++)
	{
		for (int i2 = 0; i2 <= 17; i2++)
		{
			for (int i5 = 0; i5 <= 7; i5++)
			{
				for (int i10 = 0; i10 <= 3; i10++)
				{
					if (i1 * 1 + i2 * 2 + i5 * 5 + i10 * 10 == 35)
					{
						count++;
						printf("第%d组合情况为:1角:%d张,2角:%d张,5角:%d张,1元:%d张\n", count, i1, i2, i5, i10);
					}
				}
			}
		}
	}
	printf("共计%d种情况\n", count);
}

int main()
{
	show();
	return 0;
}

 运行结果为:

4.15 穷举法题目2:两个乒乓球队进行比赛,各出3人,甲队为 A,B,C,3人,乙队为 X,Y,Z三人,已抽签决定比赛名单,有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编编程序找出3对赛手的名单。

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

#include <stdio.h>
void player()
{
	for (char A = 'X'; A <= 'Z'; A++)//A、B、C变量存放的是对手
	{
		for (char B = 'X'; B < 'Z'; B++)
		{
			for (char C = 'X'; C < 'Z'; C++)
			{
				if (A != 'X' && C != 'X' && C != 'Z' && A != B && B != C && A != C)   //隐含条件单打
				{
					printf("A的对手为:%c\nB的对手为:%c\nC的对手为:%c", A, B, C);
					return;      //程序结束标志
				}
			}
		}
	}
}
int main()
{
	player();
	return 0;
}

运行结果为: 

4.16 输出所有的水仙花数

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

水仙花数是一个特殊的三位数,它的每个位上的数字的立方和等于它本身。

例如,153就是一个水仙花数,因为 1^3+5^3+3^3=153

思想:

      判断一个三位数是否是水仙花数,可以按照上述条件进行计算。将该三位数的各个位上的数字取出,然后分别计算它们的立方和,最后判断是否等于原来的三位数。如果等于,则该数是水仙花数;否则,不是水仙花数。

编程技巧:

       如何获取一个数的个位、十位、百位?
1、对于一个数,每次整除10,就会把原数据划掉一位;如:123/10=12划掉3,12/10=1划掉2;
2、不管几位数,想取到一个数的最后一位数,就需要使用 % 10 来取余数获得;如:123%10=3
结合这两者便可得到一个数的个位、十位、百位

#include <stdio.h>
#include <math.h>
void search()
{
   int gewei=0, shiwei=0, baiwei=0;
  for (int i = 100; i <= 999; i++)
  {
	gewei = i % 10;  //相当于 i/10^0 % 10即i/1% 10,原理就是:划掉0位数,取出最后一位数
	shiwei = i / 10 % 10; //相当于 i/10^1 % 10即i/10% 10,原理就是:划掉1位数,取出最后一位数
	baiwei = i / 100 % 10;//相当于i/10^2 % 10即i/100% 10,原理就是:划掉2位数,取出最后一位数
	if (i == pow(gewei, 3) + pow(shiwei, 3) + pow(baiwei, 3))
	{
	   printf("%d是水仙花数\n", i);
	}
  }
}

int main()
{
	search();
	return 0;
}

运行结果为:

 

4.17 编程找出1000之内所有完数

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

      完数是指一个正整数的所有正因子(除了它本身以外的因子)的和等于它本身的数。换句话说,一个数如果等于它的因子之和,就是完数。

例如,28是一个完数,因为28的所有正因子(除了28本身)是1、2、4、7、14,而它们的和 1+2+4+7+14=281+2+4+7+14=28,恰好等于28。

思想:

要判断一个数是否是完数,可以按照以下步骤进行:

  1. 计算这个数的所有正因子(除了它本身以外的因子)。
  2. 将这些因子相加。
  3. 判断相加的结果是否等于原来的数。

如果相加的结果等于原来的数,那么这个数就是完数。否则,它不是完数。

#include <stdio.h>
void  wanshu()
{
	for (int i = 1; i <= 1000; i++) //i代表每一个数,j代表每个数的因子,sum用来存放因子之和。
	{
		int sum = 0;               //对于每个数因子求和,sum都需要重新置为0!
		for (int j = 1; j < i; j++)
		{
			if (i % j == 0)
			{
				sum += j;
			}
		}
		if (sum == i)
		{
			printf("1-1000内的完数有:%d\n", i);
		}
	}
}

int main()
{
	wanshu();
	return 0;
}

 运行结果为:

4.18 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成功,如果三次均输入错误,则退出程序。

编程思想:

      1、 输入数据

      2、 数据处理计算

      3、 计算结果展示 

#include <stdio.h>
#include <string.h>
int main()
{
    char psw[10] ={0};
    int i = 0;
    int j = 0;
    for (i = 0; i < 3 ; i++)
     {
        printf( "请输入密码:\n");
        scanf("%s", psw);
        if (strcmp(psw, "password" ) == 0)
            break;
     }
    if (i == 3)
        printf("三次密码均输入错误!退出\n");
    else
        printf( "登陆成功!\n");
}

运行结果为:

五、Sleep()函数和清屏指令system("cls")

        Sleep() 函数和 system("cls")指令通常是在编程中用于控制程序执行流程和清空屏幕的两个常见工具。

1. Sleep() 函数:

    Sleep()函数是在 Windows 环境下的 <windows.h>头文件中定义的函数,用于让程序暂停执行一段时间,以便于控制程序的执行速度。其语法为:unsigned int sleep(unsigned int seconds);其中,milliseconds是指定暂停的时间,以毫秒为单位。函数调用将使程序在执行到这一行时暂停指定的时间,然后继续执行后面的代码。

#include <windows.h>

int main() {
    // 暂停 5000 毫秒(即 5 秒)
    Sleep(5000);

    // 继续执行后续代码
    return 0;
}

2. system("cls")指令:

      system("cls")是一个命令行指令,用于在 Windows 操作系统上清空命令行窗口的内容。这个指令会调用系统命令行清屏的功能。在其他操作系统上,可能使用 system("clear")来实现相同的效果。 system("cls")函数是在 Windows 环境下的 <stdlib.h>头文件中定义的函数。

#include <stdlib.h>
int main() {
    // 清空命令行窗口内容
    system("cls");

    // 继续执行后续代码
    return 0;
}

      总的来说,Sleep()函数用于控制程序的执行速度,而 system("cls") 指令用于清空命令行窗口的内容。在实际的程序中,这两者通常用于控制输出的节奏和清理屏幕,以提高用户体验。

字符串替换:编写代码,演示多个字符从两端移动,向中间汇聚。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
//练习1,字符串替换;
#include<string.h>
int main() {
	char arr1[] = "welcome to bit!!!!!!";
	char arr2[] = "####################";
	int left = 0;
	int right =strlen(arr1);
	for (int z = 0; z <= 9; z++) {
		arr2[left] = arr1[left];
		arr2[right-1] = arr1[right-1];
		left++;
		right--;
		printf("%s\n", arr2);
		Sleep(1000);//延时1000ms
	}
	return 0;
}

         若不使用Sleep()函数则会直接输出十行结果,若我们在for循环中加入Sleep()函数则会在每一行输出中间停顿1000毫秒。 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
//练习1,字符串替换;
#include<string.h>
int main() {
	char arr1[] = "welcome to bit!!!!!!";
	char arr2[] = "####################";
	int left = 0;
	int right =strlen(arr1);
	for (int z = 0; z <= 9; z++) {
		arr2[left] = arr1[left];
		arr2[right-1] = arr1[right-1];
		left++;
		right--;
		printf("%s\n", arr2);
		Sleep(1000);//延时1000ms
		system("cls");//system函数是库函数,cls是控制台屏幕清空指令
 
	}
	return 0;
}
 

在输出之前会清空控制台屏幕。 

六、猜数字小游戏

实现的主要功能:

     用户进入程序后可选择是否进行游戏,不玩则退出程序,玩游戏则进行猜 1~100 的数字,若不正确则提示猜数字是大了还是小了,直到猜中数字则结束本局,结束游戏后可再次进入菜单进行选择。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
	printf("**********************************\n");
	printf("*********** 1.play     **********\n");
	printf("*********** 0.exit     **********\n");
	printf("**********************************\n");
}
//RAND_MAX--rand函数能返回随机数的最大值。
void game()
{
	int random_num = rand() % 100 + 1;
//用rand()函数生成随机数范围是0 -32767,%100+1控制随机数范围在1-100之间
	int input = 0;
	while (1)
	{
		printf("请输入猜的数字>:");
		scanf("%d", &input);
		if (input > random_num)
		{
			printf("猜大了\n");
		}
		else if (input < random_num)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}
int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do
	{
		menu();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("选择错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

注意事项:

1、使用rand()函数生成一个伪随机数范围为0~32767,猜数字的范围为1~100所以我们对rand()%100+1控制生成随机数的范围为1~100并用int型变量ret接收随机数。

    使用rand()函数需要使用头文件#include<stdlib.h>

2、在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。

      在主程序中我们使用srand()函数设置种子,这样能确保在一整局猜数字游戏中种子不发生改变,同时利用srand((unsigned int)(time(NULL))使用时间戳生成种子,保证不同局游戏中生成的种子不同,因为时间一直在变动,因此不同局游戏生成的随机数也不同。

    使用时间戳需要使用头文件#include<time.h>

运行结果为:

 

七、小结:三种循环结构

八、死循环(无限循环)

适用场景: •开发中,有时并不确定需要循环多少次,需要根据循环体内部某些条件,来控 制循环的结束(使用 break)。 如果此循环结构不能终止,则构成了死循环!开发中要避免出现死循环。

while(1)
{
}

//或者
while(1);
for(;;){
}

//或者
for(;;);

九、循环嵌套

 所谓嵌套循环,是指一个循环结构 A 的循环体是另一个循环结构 B。比如,for 循环 里面还有一个 for 循环,就是嵌套循环。其中,for ,while ,do-while 均可以作为外层循环或内层循环。

      执行特点:外层循环执行一次,内层循环执行一轮。

for(初始化语句①; 循环条件语句②; 迭代语句⑦) 
{
   for(初始化语句③; 循环条件语句④; 迭代语句⑥) 
   {
         循环体语句⑤;
   }
}
//执行过程:① - ② - ③ - ④ - ⑤ - ⑥ - ④ - ⑤ - ⑥ - ... - ④ - ⑦ - ② - ③
- ④ - ⑤ - ⑥ - ④.

以上便是循环语句的所有内容, 可以留下你们点赞、关注、评论,您的支持是对我极大的鼓励,下期再见!

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来可期,静待花开~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值