P 71 for循环注意事项和细节 2022/9/17
一、注意事项和细节说明
- 循环条件是 返回一个表示真(非0)假(0) 的表达式
- for(;循环判断条件;) 中的初始化和变量迭代可以不写(写到其它地方),但是两边的分号不能省略。
// 写法二:可以将变量的初始化和迭代放在其他地方。
#include<stdio.h>
void main(){
int i = 1;
for(; i<=5;){
printf("\n你好,尚硅谷~ i=%d",i);
i++;
}
getchar();
}
- 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,
循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开。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();
}
P 73 while循环执行流程分析 2022/9/19
一、基本语法
①循环变量初始化;
while(②循环条件){
③循环体(多条语句);
④循环变量迭代;
}
二、while循环执行流程分析
1 . 画出流程图
注意:先判断,在执行
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(); // 暂停控制台
}
P 75 doWhile执行流程分析 2022/9/20
一、基本语法
①循环变量初始化;
do{
②循环体(多条语句);
③循环变量迭代;
}while(④循环条件);
注意:do – while 后面有一个 分号,不能省略.
二、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 . 流程图
注意:先执行,在判断
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) [化繁为简, 先死后活]
#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();
}