C语言 | 第八章 | 控制结构 循环-2

P 71 for循环注意事项和细节 2022/9/17

一、注意事项和细节说明

  1. 循环条件是 返回一个表示真(非0)假(0) 的表达式
  2. for(;循环判断条件;) 中的初始化和变量迭代可以不写(写到其它地方),但是两边的分号不能省略
//  写法二:可以将变量的初始化和迭代放在其他地方。
#include<stdio.h>
void main(){
	int i = 1;
	for(; i<=5;){
		printf("\n你好,尚硅谷~ i=%d",i);
	i++;
	}
	getchar();
}
  1. 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,

​ 循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开。for(i = 0, j = 0; j < count; i++, j += 2)

#include<stdio.h>
void main(){
	// 分析输出
	//   i=0 j=0
	//   i=1 j=2
	//   i=2 j=4
	//   i=3 j=6
	int i;
	int j;
	for (i = 0,j = 0;i <= 3;i++,j += 2){   // 先进行判断,输入后在进行迭代
		printf("\ni=%d j=%d",i,j);
 
	}
	// 最后我们退出for循环后i和j是等于多少?
		printf("\n最后i=%d j=%d",i,j);   // i = 4,j = 8
	getchar(); 
}

P 72 for循环课堂练习题 2022/9/17

一、课堂练习

题目一:打印1~100之间所有是9的倍数的整数的个数及总和. [使用for完成]

#include<stdio.h>

void main(){
	
	// 打印1~100之间所有是9的倍数的整数的个数及总和. [使用for完成]
	// 分析:
	// 1. 定义变量 count 记录个数
	// 2. 定义变量 sum  记录总和
	int i = 0;  // 这里定义了int=0; for循环里可以写或者不写
	int count = 0;
	int sum = 0;
	for(i = 1;i <= 100;i++){
		// 判断i 是不是9 的倍数	
		if(i % 9 == 0){  // 等于0,则就是9的倍数,则执行下面操作
			count++;    // 统计个数
			sum += i;   //  累记到sum,最终得出总和
		}
	}
	printf("\ncount = %d sum = %d",count,sum);

	getchar();
}

题目二:

// 题目二:
// ? 输出一个数,输出全部两个数相加等于它的加法运算?
// 分析:
// 1. 先接收用户的输入num
// 2. 使用for循环来输出 0 -- > num 的各种组合方式
// 3. 使用先死后活的方法来编程和思考,假定num就是=>6,然后在把6改成变量
// 4. 当我们编程思维建立后,就可以一步到位,现在可以分步走
#include<stdio.h>

void main(){
	//int num = 6;
	int i = 0;
	int num;
	printf("请输入两位数");
	scanf("%d",&num);

	for(i = 1;i <= num; i++){
		printf("\n%d + %d = %d",i,num-i,num);
	}
	getchar();
	getchar();
}

image-20220918152305830

P 73 while循环执行流程分析 2022/9/19

一、基本语法

①循环变量初始化;
while(②循环条件){

③循环体(多条语句);
④循环变量迭代;

}

二、while循环执行流程分析

1 . 画出流程图

注意:先判断,在执行

image-20220919221158232

2 . 使用while循环完成前面的题

#include<stdio.h>

void main(){
	// 输出
	int i = 1; // 1. 循环变量初始化
	while(i <= 5){   // 2. 循环语句
		printf("\n 你好尚硅谷 i=%d",i);  // 3. 循环体
		i++;   // 4. 变量的迭代
	}
	getchar();
}

P 74 while循环课堂练习题 2022/9/19

一、练习题目解析

题目一:打印1—100之间所有能被3整除的数

#include<stdio.h>
void main(){
	// 1) 打印1—100之间所有能被3整除的数
	int  i = 1;
	int max =100;
	while(i <= max){
		if(i % 3 == 0){
		printf("\ni = %d 能被3整除",i);
		}
		i++;
	}
	getchar();
}

题目二: 打印40—200之间所有的偶数

#include<stdio.h>
void main(){
// 2) 打印40—200之间所有的偶数
	int i = 40;
	int max = 200;
	while(i <= max){
		if(i % 2 == 0){
		printf("\ni = %d 是偶数",i);
		}
	i++;
	}
	getchar();
}

题目三:不断输入姓名,直到输入 “exit” 为止[使用while完成]

#include<stdio.h>
#include<string.h>
void main(){
	// 问题:不断输入姓名,直到输入 "exit" 为止[使用while完成]
	// 分析:
	// 1. 需要接收用户的输入,字符串[字符数组]
	// 2. 提示: <string.h> 有一个strcmp 函数,判断两个字符串是否相同
	// int strcmp(const char str1, const char str2)
	// 把str 所指向的字符串和 str2所指向的字符串进行比较,
	// 返回0表示相等,返回非0表示不相等。

	char name [10] = "";

	while(strcmp(name,"exit")!=0) {  // exit -> 0 != 0 不成立
		printf ("请输入名字");
		scanf("%s",name);  // 这里不需要加&,因为数组的名称就是地址
		printf("你输入的名字是=%s",name);
	}
	printf("\n退出while循环");
	getchar(); // 过滤掉回车
	getchar(); // 暂停控制台
}

image-20220919225441761

P 75 doWhile执行流程分析 2022/9/20

一、基本语法

①循环变量初始化;
do{
       ②循环体(多条语句);
       ③循环变量迭代; 
 }while(④循环条件);
注意:dowhile 后面有一个 分号,不能省略.

二、do……while循环流程分析

1 . 五句话输出

#include<stdio.h>

void main(){
		// 5句话“你好尚硅谷”
	 int i = 1;   // 循环变量初始化
	 int max = 5; // 循环的最大次数
	 do{
		printf("你好,尚硅谷 i=%d\n",i);  // 循环体
		i++;   // 循环变量的迭代
	 }while(i <= max );  // 循环条件
   	 printf("\ni=%d",i);  // i = ?,此时 i = 6
	 getchar();
}

2 . 流程图

注意:先执行,在判断

image-20220920224319586

P 76 doWhile课堂练习题 2022/9/21

一、注意事项和细节说明

  • 循环条件是返回家一个表示真(非0)假(0)的表达式。
  • dowhile循环是先执行,在判断;而while循环是先判断,在执行。

二、课堂练习题

题目一:打印1-100

#include<stdio.h>
w
void main(){

	 int i = 1;   // 循环变量初始化
	 int max = 100; // 循环的最大次数
	 do{
		printf("此时的数是=%d\n",i);  // 循环体
		i++;   // 循环变量的迭代
	 }while(i <= max );  // 循环条件
	 getchar();
}

题目二:打印1-100的和

#include<stdio.h>

main(){
	int i = 1;
	int max = 100;
	int sum = 0;
	do{
		sum = sum + i;
		i++;
	}while(i <= max);
	printf("total is %d\n",sum);
	getchar();
}

题目三:统计1——200之间能被5整除但不能被3整除的个数

#include<stdio.h>

void main(){
	// 统计1——200之间能被5整除但不能被3整除的个数
	// 分析:
	// 1 . 使用dowhile
	// 2 . 定义一格count保存满足条件的数的个数
	// 3 . 定义i = 1 max = 200控制循环的个数
	int i = 1;
	int max = 200;
	int count = 0;
	do{
		// 做一个判断
		if((i % 5 == 0) && (i % 3 != 0)){
			count++; // 累积
		}
		i++;
	}while(i <= max); // 循环条件
	printf("1-200间能被5整除但是不能被3整除的个数 count = %d",count);
	getchar();
}

题目四:如果老公同意老婆购物,则老婆将一直购物,直到老公说不同意为止[printf(“老婆问:我可以继续购物吗?y/n”)]

#include<stdio.h>
void main(){
	char answer = ' ';
	do {
		printf("老婆问:我可以继续购物吗?y/n");
		scanf("%c",&answer);   // 获取用户输入
		getchar();   // 过滤掉回车符
	}while(answer == 'y');
	printf("老婆终于退出购物");
	getchar();
	}

P 77 多重循环应用实例 (1) 2022/9/21

一、基本介绍

  • 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while均可以作为外层循环和内层循环。【建议一般使用两层,最多不要超过3层】, 如果嵌套循环过多,会造成可读性降低
  • 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环, 举例说明。
  • 设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。

二、应用实例

  • 统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。

​ 统计三个班及格人数,每个班有5名同学。

#include<stdio.h>

void main(){
	// 问题一:统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。

	// 分析:
	// 编程技巧,1. 先死后活 2.先简单在复杂(分解)3.根据需求增加或者修改相应的代码
	// 1 . 各个班的平均分
	// 2 . 所有班级的平均分,得到所有班级的总分allClassTotalScore
	// 3 . 定义变量表示班级的个数 classNum ,定义变量表示学生个数 stuNum
	// 4 . 定义变量classTotalScore 每个班级总分
	// 5 . 定义 变量score,接收学生成绩
	// 6 . 使用两层for循环

	// 问题二:增加新功能 统计三个班及格人数,每个班有5名同学
	// 分析
	// 1. 定义一个变量count,保存及格人数
	// 2. 当接收到一个学生成绩后,就看看是否及格,如果及格,就累计到count
	int stuNum = 5;
	int classNum = 3;
	double classTotalScore = 0.0;
	double score = 0.0;
	double  allClassTotalScore = 0.0;
	int count = 0 ; //  及格人数
	int i,j;
	for(i = 1; i<= classNum; i++){ // 控制班级循环次数
	
		// 每次给一个班级输入成绩时需要清零
		classTotalScore = 0.0;
		for(j = 1; j <= stuNum; j++){  // 控制学生循环次数	
			printf("\n请输入第%d班级的 第%d个学生的成绩",i,j);
			scanf("%lf",&score);
			if(score >= 60){
			count++;
			}
			
		classTotalScore += score;  // 累积成绩
		}

	allClassTotalScore += classTotalScore;  // 累积所有班级成绩
		// 当内层的for循环结束后,就得到了该班级的总成绩
		printf("\n第%d个班级的平均分 = %.2f",i,classTotalScore / stuNum);
	}	

	// 输出所有班级的成绩(所有班总成绩/)
	printf("\n所有班级的平均分 =%.2f",allClassTotalScore / (classNum*stuNum));
	printf("\n所有班级的及格人数 =%d",count);
	getchar();
	getchar();
}

P 78 多重循环应用实例 (2) 2022/9/22

一、应用实例

题目一:打印出九九乘法表

#include<stdio.h>

void main(){

	// 99 乘法表
	// 分析:
	// 1 . 先打印1列
	// 2 . 在打印多列
    // 3 . 先死后活,功能逐步完善
	int i,j;  
	for(i = 1; i <=9 ; i++){    // 先判断,在进行执行
		// 因为每一行都在增加算式,所以使用一个for循环控制
		for(j=1; j<=i ; j++){   
		printf("%d * %d = %d  ",j,i,i * j);   // 总的来说是一行一行的进行打印出来,分析流程图即可分析出原理
		}
		printf("\n");
	}
	getchar();
}

P 79 经典案例打印空心金字塔 2022/10/26

一、经典案例

  • 使用 for 循环完成下面的案例请编写一个程序,可以接收一个整数,表示层数(totalLevel),打印出金字塔。

​ (stars.c) [化繁为简, 先死后活]

image-20221026191611817

#include<stdio.h>
void main(){

	// 打印空心金字塔

	// 化繁为简, 先死后活
	
	//分析:
	// 1.打印矩形
	/*
	*****
	*****
	*****
	*****
	*****
	*/
	// 2.打印半个金字塔
	/*
	*
	**
	***
	****
	*****
	*/
	// 3.打印整个金字塔
	/*						a :表示层数
				*				// 1个*		(2*a)-1-->(2 * 1 )- 1=1		空格有:4个    (总的层数减 i)= 5-1=4
			   ***				// 3个*		(2*a)-1-->(2 * 2 )- 1=3		空格有:3个		(总的层数减 i)= 5-2=3
			  *****			// 5个*		(2*a)-1-->(2 * 3 )- 1=5		空格有:2个		(总的层数减 i)= 5-3=2
			 *******			// 7个*		(2*a)-1-->(2 * 4 )- 1=7		空格有:1个		(总的层数减 i)= 5-4=1
			*********		// 9个*		(2*a)-1-->(2 * 5 )- 1=9		空格有:0个		(总的层数减 i)= 5-5=0
	*/
	// 4.打印空心金字塔
		/*						//在输出*号的时候需要考虑是否输出* 还是空格?
							// 分析:
				*			// a = 1 该输入*号就是输入*号
			   * *			// 第一个*和最后一个*输出*,其他应该输出空格 
			  *   *			// 第一个*和最后一个*输出*,其他应该输出空格	
			 *     *		// 第一个*和最后一个*输出*,其他应该输出空格 
		    *********	   // a = 5  该输入* 就输入*	号
	*/
	// 5. 打印空心菱形
	// 将五层可以改成一个变量totalLevel
	
	int a,b,c,totalLevel = 5;   // 定义a表示层数,b表示* 的个数,c来表示空格
	for(a = 1;a <= totalLevel;a++){
		// 输出空格
		for(c=1; c<=totalLevel - a;c++){
		printf(" ");
		}
		for(b = 1;b<= 2 * a - 1;b++){   // 打印半个金字塔将b<=a即可,a为行数,每层的*与层数相等。
														//  打印整个金字塔就将改为b<=2*a-1,每一层的*的个数的规律		
			if(b == 1 || b == 2*a-1|| a == totalLevel){  // a = 5,表示最后一层,a表示层,所以使用最后一层
				printf("*");   // 打印空心金字塔,在此处考虑输出空格
			}else{
			printf(" ");
			}
		}
		printf("\n");
	}
	getchar();
}

P 80 多重循环内容梳理 2022/12/12

一、梳理

  • 概念,注意事项

  • 题目练习

  • 空心菱形的练习

#include<stdio.h>
void main(){
	int i,j,k,total=9;
	for(i=1;i<=total;i++){  
		for(k=1;k<=total-i;k++){
			printf(" ");
		}
			for(j=1;j<=2*i-1;j++){
				if(j==1 || j==2*i-1 ){
				printf("*");
				}else{
				printf(" ");}
		}
printf("\n");
	}
for(i=total-1;i>=1;i--){  
		for(k=1;k<=total-i;k++){
			printf(" ");
		}
			for(j=1;j<=2*i-1;j++){
				if(j==1 || j==2*i-1 ){
				printf("*");
				}else{
				printf(" ");}
		}
printf("\n");
	}
getchar();
}
上一篇:自主封装线程池(threadpool)


下一篇:C++中对象的构造与析构