一:while
循环
C语言提供了3种循环语句,while
就是其中的一种,while
语句的语法结构和if
语句非常相似
语法格式:
while(判断表达式)
代码块;
先执行判断表达式,若不成立,则循环直接结束;若成立,则执行循环语句,待语句执行完后再继续判断是否进行下一次的循环
示例1:在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 1;
while(i <= 10)
{
printf("%d\n",i);
i = i + 1; //i++
}
return 0;
}
注意: 调试按钮 F10
/Fn+F10
示例2:输入一个正的整数,逆序打印这个整数的每一位
#include <stdio.h>
int main() {
int num, a;
printf("请输入一个正的整数: ");
scanf("%d", &num);
while (num != 0) {
a = num % 10;
printf("%d", a);
if (num > 0) {
printf("%c", ' ');
}
num = num / 10;
}
printf("\n");
return 0;
}
示例3:多组输入:使用while循环读取多组输入,直到
EOF
报错
#include <stdio.h>
int main() {
int a, b;
while (scanf("%d %d", &a, &b) != EOF) {
printf("%d\n", a + b);
}
return 0;
}
二:for
循环
for
循环是三种循环中使用最多的
语法格式:
for(表达式1;表达式2;表达式3)
代码块;
- 表达式1: 用于循环变量的初始化
- 表达式2: 用于循环结束条件的判断
- 表达式3: 用于循环变量的调整
执行流程:
- 首先执行1初始化循环变量 ——》接下来执行2的判断部分,若2的结果为假 ——》循环结束;
- 若2的结果为真 ——》执行代码块 ——》代码块执行完后 ——》执行3调整循环变量
- 之后再去2的地方进行判断 ——》若为假循环结束若为真则继续执行
注意: 在整个循环的过程中,表达式1只被执行一次
示例1:在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 0;
for(i=1;i<=10;i++)
{
printf("%d\n",i)
}
return 0;
}
注意: for
循环更加便于维护
示例2:计算1~100之间3的倍数之和
#include <stdio.h>
int main()
{
int i = 0;
int num = 0;
for(i=1;i<=100;i++)
{
if(i % 3 == 0)
{
num += i;
}
}
printf("num = %d\n",num);
return 0;
}
三:do...while
循环
do...while
循环是三种循环中用的最少的
语法格式:
do
代码块;
while(表达式);
注意:
while
和for
这两种循环都是先判断,当条件满足后进入循环,不满足则结束循环。而do...while
循环则是先执行循环语句(代码块),然后再执行while
后的判断,若为真则继续下一次循环;若为假则不在循环;所以在do...while
循环中代码块是至少执行一次的,这是do...while
循环特殊的地方
示例1:在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d",i);
i++;
}
while(i<=10);
return 0;
}
示例2:输入一个正整数,计算这个整数是几位数
#include <stdio.h>
int main()
{
int i = 0;
scanf("%d",&i);
int num = 0;
do
{
num++;
i = i / 10;
}
while(i);
printf("%d\n",num);
return 0;
}
四:break
和continue
语句
在循环执行的过程中,如果需要提前终止循环,就要用到break
和continue
这两个关键字
break
:终止循环,继续往后执行
示例1:打印1到10之间的数字,但当数字为5时退出循环
#include <stdio.h>
int main() {
int i = 1;
while (i <= 10) {
if (i == 5) {
break; // 当i等于5时,退出循环
}
printf("%d\n", i);
i++;
}
return 0;
}
示例2:打印1到10之间的数字,但当数字为5时退出循环
#include <stdio.h>
int main() {
int i = 0;
for (i = 1; i <= 10; i++) {
if (i == 5) {
break; // 当i等于5时,退出循环
}
printf("%d\n", i);
}
return 0;
}
示例3:打印1到10之间的数字,但当数字为5时退出循环
#include <stdio.h>
int main() {
int i = 1;
do {
if (i == 5) {
break; // 当i等于5时,退出循环
}
printf("%d\n", i);
i++;
} while (i <= 10);
return 0;
}
注意: break
在三种循环中几乎是没有区别的
continue
:跳出本次循环后面的代码,进入下一次循环
示例1:打印1到10之间除5之外的其他数字
#include <stdio.h>
int main() {
int i = 1;
while (i <= 10) {
if (i == 5) {
i++; // 当i等于5时,递增i并跳过当前迭代
continue;
}
printf("%d\n", i);
i++;
}
return 0;
}
示例2:打印1到10之间除5之外的其他数字
#include <stdio.h>
int main() {
int i = 0;
for (i = 1; i <= 10; i++) {
if (i == 5) {
continue; // 当i等于5时,跳过当前迭代
}
printf("%d\n", i);
}
retur 0;
}
示例3:打印1到10之间除5之外的其他数字
#include <stdio.h>
int main() {
int i = 1;
do {
if (i == 5) {
i++; // 当i等于5时,递增i并跳过当前迭代
continue;
}
printf("%d\n", i);
i++;
} while (i <= 10);
return 0;
}
注意: 在for
循环和在while
循环中continue
的效果会有所不同,因为在for
循环和在while
循环中用于循环变量的调整的位置有所不同;而在do...while
循环和while
循环中的continue
是非常相似的
五:循环的嵌套
示例1:找出100~200之间的质数(只能被1和其本身整除的数字),并打印在屏幕上
#include <stdio.h>
int main()
{
int i = 0;
for(i=100;i<=200;i++)
{
//判断i是否是素数
//使用2~i-1之间的数字去试除i
//如果i被整除了,i就不是素数
//如果2~i-1之间没有数字可以整除i,i就是素数
int j = 0;
int flag = 1; //假设i是素数
for(j=2;j<=i-1;j++)
{
if(i%j==0)
{
flag = 0;
break;
}
}
if(flag==1)
{
count++;
printf("%d",i);
}
}
printf("\ncount=%d\n",count);
return 0;
}
代码优化:
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
for(i=101;i<=200;i+=2)
{
//判断i是否是素数
//使用2~i-1之间的数字去试除i
//如果i被整除了,i就不是素数
//如果2~i-1之间没有数字可以整除i,i就是素数
int j = 0;
int flag = 1; //假设i是素数
for(j=2;j<=sqrt(i);j++) //sqrt()是库函数,是用来开平方的
{
if(i%j==0)
{
flag = 0;
break;
}
}
if(flag==1)
{
count++;
printf("%d",i);
}
}
printf("\ncount=%d\n",count);
return 0;
}
六:goto
语句
goto
语句可以实现在同一个函数内跳转到设置好的标号处
注意: goto
语句如果使用不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以goto
语句能不用就不要去使用;但在面对多层循环的代码中,goto
语句可以快速跳出
示例:goto语句的使用
#include <stdio.h>
int main()
{
printf("%s\n","哈哈");
printf("%s\n","嘟嘟");
goto end;
printf("%s\n","呜呜");
end:
printf("%s\n","跳过呜呜的打印");
printf("%s\n","呃呃");
return 0;
}
用goto语句实现一个死循环:
#include <stdio.h>
int main()
{
a:
printf("%s\n","呃呃");
goto a;
return 0;
}
七:猜数字游戏
/*
需求:
1.电脑自动生成1~100的随机数
2.玩家猜数字,根据猜测数据的大小给出反馈,直到猜对
*/
1.随机数生成
C语言提供了一个函数叫rand()
,这个函数是用来生成随机数的
rand()
函数的使用:
#include <stdlib.h> //rand()函数的头文件
int rand (void); //void指的是这个函数不需要参数
rand()
函数会返回一个伪随机数,这个随机数的范围在0~RAND_MAX
之间,这个RAND_MAX
的大小是依赖编译器实现的,编译器的不同,数字也会略有差异,但大部分编译器上是 32767
示例:
#include <stdlib.h>
#include <stdio.h>
int main()
{
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
return 0;
}
注意:
当我们重复运行这个代码时,我们会发现虽然第一次运行后产生的5个数字是相对随机的,但是往后的运行结果和第一次的一模一样。这是因为rand()
函数生成的随机数是伪随机的,伪随机数并不是真正的随机数,它是通过某种算法生成的随机数,真正的随机数是无法预测下一个值是多少的,而rand()
函数是对一个叫“种子”的基准值进行运算生成的随机数。之所以前面每次运行程序产生的随机序列是一样的,那是因为rand()
函数生成随机数的默认种子是1,如果要生成不同的随机数,就要让“种子”进行变化
2.srand()
C语言提供了srand()
函数用来初始化随机数的生成器(“种子”)
srand()
函数的使用:
void srand(unsigned int seed); //seed:种子
让程序在调用rand()
函数之前先调用srand()
函数,通过srand()
函数的参数seed
来设置rand()
函数生成随机数的时候的“种子”,只要“种子”在变化,那么每次生成的随机数序列也就变化起来了。也就是说给srand()
函数的种子如果是随机的,那么rand()
函数就能生成随机数
注意: srand()
函数不需要频繁的调用,一次运行程序中只需要调用一次就可以了
3.time()
在程序中一般是使用程序运行的时间作为种子,因为时间时刻在发生变化。而time()函数
就可以获得这个时间
time()
函数的使用:
#include <time.h> //time()函数的头文件
time_t time(time_t* timer); //time_t*是一个指针类型
time()
函数会返回当前的日历时间,其实返回的是计算机起始时间1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒,返回的类型是time_t
类型,其实本质上就是32位或者64位的整型类型。
time()
函数的参数timer
如果是非NULL
的指针的话,函数会将这个返回的差值放在timer
指向的内存中带回去;如果timer
是NULL
,就只返回这个时间的差值。time()
函数返回的这个时间差也被叫做:时间戳。
随机数的生成:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
srand((unsigned int)time(NULL));
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
return 0;
}
4.设置随机数生成范围
//生成0~99之间的随机数:
rand() % 100 //32767中的任何数模100,余数的范围是0~99
//生成1~100之间的随机数:
rand() % 100 + 1 //%100的余数是0~99,32767中的任何数模100再加1的范围就是1~100
//生成100~200之间的随机数:
100 + rand() % (200-100+1) //控制余数的范围是0~100之间,再加上100后就是100~200
//生成a~b之间的随机数:
a + rand() % (b-a+1)
代码运用:生成1~100之间的随机数
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
srand((unsigned int)time(NULL));
printf("%d\n",rand() % 100 + 1);
printf("%d\n",rand() % 100 + 1);
printf("%d\n",rand() % 100 + 1);
printf("%d\n",rand() % 100 + 1);
printf("%d\n",rand() % 100 + 1);
return 0;
}
5.游戏实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void menu() //void的意思就是没有返回类型
{
printf("********************************\n");
printf("************ 1.play ************\n");
printf("************ 0.exit ************\n");
printf("********************************\n");
}
void game()
{
int guess = 0;
//1.生成随机数
/*srand((unsigned int)time(NULL));*/
int r = rand()%100+1;
//2.猜数字
while (1)
{
printf("请猜数字 >>>");
scanf("%d", &guess);
if (guess > r)
{
printf("猜大了\n");
}
else if (guess < r)
{
printf("猜小了\n");
}
else
{
printf("恭喜你---猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
//打印菜单
menu();
printf("请选择 >>>");
scanf("%d", &input); //1或者0
switch (input)
{
case 1:
game();
break;
case 0:
printf("已经退出该游戏\n");
break;
default:
printf("输入错误,请重新输入1或0\n");
break;
}
} while (input);
return 0;
}
新添加一个限制次数的功能:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void menu() //void的意思就是没有返回类型
{
printf("********************************\n");
printf("************ 1.play ************\n");
printf("************ 0.exit ************\n");
printf("********************************\n");
}
void game()
{
int guess = 0;
//1.生成随机数
/*srand((unsigned int)time(NULL));*/
int r = rand()%100+1;
//2.猜数字
int count = 5;
while (count)
{
printf("你还有%d次机会\n",count);
printf("请猜数字 >>>");
scanf("%d", &guess);
if (guess > r)
{
printf("猜大了\n");
}
else if (guess < r)
{
printf("猜小了\n");
}
else
{
printf("恭喜你---猜对了\n");
break;
}
count--;
}
if (count == 0)
{
printf("失败---正确的值是%d\n",r);
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
//打印菜单
menu();
printf("请输入1/0 >>>");
scanf("%d", &input); //1或者0
switch (input)
{
case 1:
game();
break;
case 0:
printf("已经退出该游戏\n");
break;
default:
printf("输入错误,请重新输入1或0\n");
break;
}
} while (input);
return 0;
}