目录
循环结构
while循环
基本while循环
do while循环
for循环
跳转语句
break
continue
goto
单纯的循环的常规操作
循环嵌套
循环嵌套的问题
作业
经典问题 百鸡百钱
经典问题 斐波拉契数列
循环结构
while循环
while("条件成立")
{
printf("执行循环");
}
printf("条件不成立,执行这里!");
基本while循环
-
条件控制循环次数
-
条件的改变:往不满足的情况靠拢
-
特殊形态
示例代码
#include<stdio.h>
#include<stdbool.h>
int main()
{
int count = 0;
while (count < 3)
{
printf("这是第%d次循环\n", count + 1);
count++;
}
//奇葩写法 学会看出执行过程即可
int i = 0, j = 3;
while (i++, i < j)
{
printf("这是第%d次循环\n",i);
}
//死循环
while (1);
while (true);
return 0;
}
do while循环
do
{
printf("执行循环");
}while("条件成立");
printf("条件不成立到这里");
-
无论条件成立与否,至少执行一次
-
do while(0) 宏边界
#include<stdio.h>
int main()
{
do
{
printf("条件不成立,也要执行一次!\n");
} while (0);
int count = 0;
do
{
printf("这是第%d次循环\n", count + 1);
count++;
} while (count < 3);
printf("循环结束!\n");
return 0;
}
for循环
for (size_t i = 0; i < length; i++)
//for(循环变量的初始化;循环条件;改变循环条件)
{
printf("执行循环")
}
示例代码
#include<stdio.h>
int main()
{
for (int i = 0; i < 3; i++)
//{
printf("这是第%d次循环\n", i);
//}
//逗号表达式写法
for (int i = 0, j = 3; j, i < j; i++, j--)
{
printf("%d\t%d\n", i, j);
}
return 0;
}
跳转语句
break
-
只能在switch或者循环中使用
-
跳出整个循环(一个循环,即循环嵌套的一层循环)
continue
-
只能在循环中使用
-
退出本次循环(一次循环),提前进入条件判断
goto
示例代码
#include<stdio.h>
int main()
{
for (int i = 0; i <= 3; i++)
{
if (i == 2)
break;
printf("这是第%d次循环\n", i + 1);
}
printf("break跳到这里\n");
for (int i = 0; i <= 3; i++)
{
if (i == 2)
continue; //中场休息
printf("这是第%d次循环\n", i + 1);
}
int count = 0;
code:
printf("goto跳转到这里!\n");
if (count < 3)
{
count++;
goto code;
}
return 0;
}
单纯的循环的常规操作
#include<stdio.h>
int main()
{
//求累加和
int sum = 0;
for (int i = 1; i <= 100; i++)
{
sum += i;
}
//求阶乘
printf("sum=%d\n", sum);
int num = 0;
sum = 1;
printf("请输入阶乘最大项:\n");
scanf_s("%d", &num);
for (int i = 1; i <= num; i++)
{
sum *= i;
}
printf("sum=%d", sum);
return 0;
}
循环嵌套
示例代码
#include<stdio.h>
#include<stdbool.h>
int main()
{
//描述行列变换
int row = 4;
int cols = 5;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < cols; j++)
{
printf("%d%d\t", i, j);
}
printf("\n");
}
//行列变换序号化
printf("===============序号化==============\n");
for (int i = 0; i < row; i++)
{
for (int j = 0; j < cols; j++)
{
printf("%d\t", i * row + j);
}
printf("\n");
}
printf("==========================9*9乘法表================================\n");
//9*9乘法表
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
printf("%d\t", i * j);
}
printf("\n");
}
//描述多条件筛选
//求素数(只能被1和自身整除的数)
int num = 0;
printf("======判断素数======\n");
printf("请输入一个数:");
scanf_s("%d", &num);
bool result = true; //标记法
for (int i = 2; i < num; i++)
{
if (num % i == 0)
{
result = false;
break;
}
}
//根据result的值判定结果
if (result)
{
printf("%d是素数\n", num);
}
else
{
printf("%d不是素数\n", num);
}
//找100-1000之间的素数
printf("==================100-1000之间的素数================\n");
int temp = 0;
for (int i = 100; i <= 1000; i++)
{
bool isOk = true;
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
isOk = false;
break;
}
}
if (isOk)
{
printf("%d\t", i);
temp++;
if (temp % 7 == 0)
{
printf("\n");
}
}
}
//求水仙花数
printf("\n======判断水仙花数======");
int iNum = 0;
bool End = true;
printf("\n请输入一个数(100<n<1000):");
scanf_s("%d", &iNum);
int a = iNum / 100;
int b = iNum / 10 % 10;
int c = iNum % 10;
if ((a * a * a + b * b * b + c * c * c) != iNum)
End = false;
if (End)
printf("%d是水仙花数\n", iNum);
else
printf("%d不是水仙花数\n", iNum);
//数列问题
/*
* 1+(1-1)
** 1+(2-1)
*** 1+(3-1)
**** an=n
*****
*/
printf("=====输出直角=====\n");
for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= i; j++)
{
printf("*");
}
printf("\n");
}
/*
*
***
*****
*******
*********
*/
printf("=====输出金字塔=====\n");
for (int i = 1; i <= 5; i++)
{
for (int k = 1; k <= 5 - i; k++)
{
printf(" ");
}
for (int j = 1; j <= 2 * i - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
循环嵌套的问题
示例代码
#include<stdio.h>
int main()
{
for (int i = 0; i < 3; i++)
{
printf("i只能在{}中使用\n");
}
int i = 0; //i在下面都可以用
for (i = 0; i < 3; i++)
{
printf("i在下面都可以用\n");
}
//当i=1,j=1时退出循环
i = 0;
int j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
if (i == 1 && j == 1)
{
break; //只跳出一层循环
}
printf("%d%d\t", i, j);
}
if (i == 1 && j == 1)
{
break;
}
}
printf("\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
if (i == 1 && j == 1)
{
goto code;
}
printf("%d%d\t", i, j);
}
}
code:
printf("\ngoto放到循环嵌套的退出时非常方便!");
return 0;
}
作业
经典问题 百鸡百钱
一只公鸡cock值五钱,一只母鸡hen值三钱,三只小鸡(chick)值一钱 100钱,买100只鸡,请问公鸡,母鸡,小鸡各多少只? 全买公鸡:20只 全买母鸡:33只 全买小鸡: 100只
#include<stdio.h>
int main()
{
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 33; j++)
{
if (((i * 5 + j * 3 + (100 - i - j)/3) == 100)&&((100-i-j)%3==0))
printf("公鸡:%d只\t母鸡:%d只\t小鸡:%d只\n", i, j, 100 - i - j);
}
}
}
经典问题 斐波拉契数列
1 1 2 3 5 8 13 ...
f(n)=1 n<=2
f(n) = f(n-1)+f(n-2)
用户输入n 求出f(n)的值:
#include<stdio.h>
int Fib(int n)
{
if (n == 1 || n == 2)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}
int main()
{
//递推求解
int n = 0, vlue=0, t1 = 1, t2 = 1;
printf("请输入所求项数(n):");
scanf_s("%d", &n);
if (n == 1 || n == 2)
{
printf("第%d项值为1\n", n);
}
else
{
for (int i = 0; i < n - 2; i++)
{
vlue = t1 + t2;
int temp = t2;
t2 = vlue;
t1 = temp;
}
printf("第%d项值为%d\n", n, vlue);
}
//递归求解
n = 0;
printf("请输入所求项数(n):");
scanf_s("%d", &n);
//Fib(n);
printf("第%d项值为%d\n", n,Fib(n));
return 0;
}