循环语句
while
for
do while
while
重点:break是用于永久的终止循环
continue跳过本次循环后面的代码,直接去判断部分进行下一次循环的判断
练习题
int main()
{
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
int ch = 0;
/*ch = getchar();*/
//前面输入密码后,遗留了空格后的字符,用getchar字符吸收,直到遇到\n后,再继续往下走
while ((ch = getchar()) != '\n')
{
;
}
printf("请确认密码(Y/N):>");
int ret = getchar(); //获取输入的字符,保存到变量ret
if('Y' == ret) //如果输入的是Y,则打印yes
{
printf("yes\n");
}
else
printf("no\n"); //如果不是,则打印no
return 0;
}
for循环
为什么有了while循环还需要for循环呢?
因为for循环增加了初始化变量部分和循环条件的调整部分。
for循环的语法: for(表达式1;表达式2;表达式3;)
循环语句:
表达式1为初始化部分,用于初始化循环变量
表达式2为条件判断部分
表达式3为调整部分,用于循环条件的调整
练习题--循环打印出数组中的每一个元素
//sizeof(arr) 数组的总大小,单位是字节
//sizoof(arr[0]) 数组元素的大小
练习题--循环打印出数组中的每一个元素
int main()
{
int arr[] = {21,25,32,4,53,15,35,65,68,79,84,31};
int i = 0;
//sizeof(arr) 数组的总大小,单位是字节
//sizoof(arr[0]) 数组元素的大小
int sz = sizeof(arr)/sizeof(arr[0]);
while (i < sz)
{
printf("%d ", arr[i]);
i++;
}
return 0;
}
练习题--出生日期输入输出
//使用%4d,可以指定输入数据域宽
//输出数据使用%0d格式控制符,输出数值时指定前面的空位置填0
int main()
{
//输入数据
int year = 0;
int month = 0;
int date = 0;
//使用%4d,可以指定输入数据域宽
scanf("%4d%2d%2d", &year, &month, &date);
//输出数据使用%0d格式控制符,输出数值时指定前面的空位置填0
printf("year=%d\n", year);
printf("month=%02d\n",month);
printf("date=%02d\n", date);
return 0;
}
练习题--学生信息输入输出
//0.0 后面的f表示这个 0.0 的类型是flaot,如果一个浮点数后面后没有加f,那么C语言默认它是double类型的。
//%.2f是float后的小数只输出两位
int main()
{
int stu = 0;
float a = 0.0f; //0.0 后面的f表示这个 0.0 的类型是flaot,如果一个浮点数后面后没有加f,那么C语言默认它是double类型的。
float b = 0.0f;
float c = 0.0f;
printf("请输入您的学号和各科目成绩:");
scanf("%8d;%f,%f,%f", &stu,&a,&b,&c);
//%.2f是float后的小数只输出两位
printf("The each subject score of NO.%8d is %.2f,%.2f,%.2f.\n",stu,a,b,c);
return 0;
}
练习--找最大数
int main()
{
int a = 0;
int i = 1;
int max = 0;
scanf("%d", &max);
while (i < 4)
{
scanf("%d", &a);
if (a > max)
max = a;
i++;
}
printf("%d", max);
return 0;
}
练习--计算球体的体积
球体体积公式为V=4/3*Πr³,Π=3.1415926
//计算球体面积
int main()
{
//球体体积公式为V = 4 / 3 * Πr³,Π = 3.1415926
double r = 0.0;
printf("请输入球体的半径:");
scanf("%lf",&r);
//输出
double v = 0.0;
v = 4 / 3.0 * 3.1415926 * r * r * r;
printf("球体的体积为:%.3lf\n",v);
return 0;
}
do...while()循环
do语句的特点:循环至少执行一次,使用的场景优先,所以不是经常用。
语法结构:
do
循环语句;
while(表达式);
例:
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
练习题:计算n的阶乘;
int main()
{
int i = 1;
int n = 0;
int ret = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
ret = ret * i; //循环的数字乘以之前的乘积
}
printf("%d ", ret);
return 0;
}
//练习题--在有序数组中查找某个数字(二分查找)
int main()
{
int i = 0;
int k = 0;
int arr[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int sz = sizeof(arr) / sizeof(arr[0]);
printf("请输入要查找的数字:");
scanf("%d", &k);
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
right = mid - 1;
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
练习题--//编写代码,演示多个字符从两端移动,向中间汇聚
#include<windows.h>
int main()
{
char a[] = {"Hello,World!"};
char b[] = { "************" };
int sz = sizeof(a) / sizeof(a[0]); //也可以写做:strlen(a);
int right = sz - 2; //为什么要减2? 因为要算上/0的位置
int left = 0;
printf("%s\n", b);
while (right >= left)
{
b[left] = a[left];
b[right] = a[right];
printf("%s\n", b);
Sleep(1000); //休眠
//system("cls"); //清空屏幕 system是库函数,可以执行系统命令
left++;
right--;
}
return 0;
}
//编写代码实现模拟用户登录情景,只能登录3次(3次错误,退出)
//比较2个字符串是否相等,不能使用==,而应该使用一个库函数:strcmp
//如果返回值为0,表示两个字符串相等;
#include <string.h>
int main()
{
char password[10] = "0755";
int i = 0;
char input[10] = {0};
for (i = 1; i <= 3; i++)
{
printf("请输入您的登录密码:");
scanf("%s", input);
if (strcmp(input,password) == 0)
{
printf("登录成功\n");
break;
}
else
printf("输入有误,请再次输入\n");
}
if (i > 3)
{
printf("三次密码均输入错误,退出程序\n");
}
return 0;
}
练习题
//猜数字游戏
#include <stdlib.h>
#include <time.h>
#include<windows.h>
void menu() //游戏菜单
{
printf("******************************\n");
printf("********* 1.play *********\n");
printf("********* 0.exit *********\n");
printf("******************************\n");
}
void game() //游戏函数
{
srand((unsigned int)time(NULL)); //生成跟随系统时钟的随机函数
int guess = 0;
//1.生成随机数
int ret = rand()%100+1; // x/100的余数一定小于100,从而生成小于100的随机数
//printf("%d\n", ret);
//2.猜数字
while (1)
{
printf("请猜数字:");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("猜数字\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择!\n");
break;
}
} while (input);
return 0;
}
go to语句
goto语句为无条件转向语句。它的作用是无须任何条件,直接就可以使得程序跳转到该语句标号(Label)所标识的语句处去执行,
语句标号代表goto语句转向目标位置
在多层循环这种场景下使用break是达不到目的的,它只能从最内层循环退出到上一层的循环
语法
int main()
{
again:
printf("123\n");
printf("456\n");
goto again; //跳转到again位置一直循环打印
return 0;
}
练习题--一个关机程序
#include <stdio.h>
#include <Windows.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char input[10] = { 0 };
system("shutdown -s -t 60"); //设置60秒关机
again:
printf("电脑将在1分钟内关机,如果输入:123 就取消关机\n请输入:");
scanf("%s", input);
if (strcmp(input, "123") == 0)
{
system("shutdown -a");
}
else
goto again;
return 0;
}