do while循环
语法
do 循环语句; while(表达式);
执行流程
上面代码输出:0 1 2 3 4 5 6 7 8 9 10
do while 中至少循环执行一次
#include <stdio.h> int main() { int i = 10; do { if(5 == i) break; printf("%d\n", i); }while(i<10); return 0; } #include <stdio.h> int main() { int i = 10; do { if(5 == i) continue; printf("%d\n", i); }while(i<10); return 0; }
第一个代码输出:1 2 3 4 // 第二个代码输出:1 2 3 4 +死循环
do while循环中
break与continue在while循环中作用一模一样
break用于终止循环
continue是跳过后面的代码,执行下一次循环
循环练习题
1.计算 n的阶乘。
int main() { int n = 0; scanf("%d",&n); int i = 0; int ret = 1; for(i=1;i<= n;i++) { ret = ret*i; } printf("%d\n",ret); return 0; }
2.计算 1!+2!+3!+......+10!
int main() { int sum = 0; for(int j = 1;j <= 10 ;j++) { int ret = 1; for(int i = 1;i<=j;i++) { ret *= i; sum +=ret; } } printf("%d\n",sum); return 0; }
- 注意ret需要在第一层函数里重新赋值,再去执行第二层函数
3.二分法查找
- 在一个有序数组中查找具体的某个数字n。(讲解二分查找)
- 遍历法(复杂不推荐)
//在一个有序数组中查找具体的某个数字n int main(){ int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int k =0; scanf("%d",&k); int i = 0; int flag = 0; //遍历 for(i = 0;i <10; i++){ if(arr[i] == k){ printf("find it,its index is %d\n",i); flag = 1; break; } } if(flag == 0){ printf("can not find it\n"); } return 0; }
- 二分法查找(效率很高,但需要有序(降幂或者升幂))
- //在一个有序数组中查找具体的某个数字n
// 1 2 3 4 5 6 7 8 9 10 想要查找 7
//先求中间值的下标 (0+9)/2 = 4
// 比较 5 和 7
//在新的范围(6~10)继续求中间值下标 (5+9)/2 = 7
// 比较 8 和 7
//在新的范围(6~7)继续求中间值下标 (5+6)/2 = 5
// 比较 6 和 7
//在新的范围(7~7)继续求中间值下标 (6+6)/2 = 6
// 比较 7 和 7
//在一个有序数组中查找具体的某个数字n // 1 2 3 4 5 6 7 8 9 10 想要查找 7 //先求中间值的下标 (0+9)/2 = 4 // 比较 5 和 7 //在新的范围(6~10)继续求中间值下标 (5+9)/2 = 7 // 比较 8 和 7 //在新的范围(6~7)继续求中间值下标 (5+6)/2 = 5 // 比较 6 和 7 //在新的范围(7~7)继续求中间值下标 (6+6)/2 = 6 // 比较 7 和 7 int main(){ int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int sz = sizeof(arr)/sizeof(arr[0]); //数组元素个数 int k = 0; int flag = 0; 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("find it, the index is %d\n",mid); flag = 1; break; } } if(flag == 0){ printf("can not find it\n"); } return 0; }
4.编写代码,演示多个字符从两端移动,向中间汇聚。
//编写代码,演示多个字符从两端移动,向中间汇聚 #include <string.h> #include <windows.h> int main() { char arr1[] = "weclome to bit!!!!!!!!!"; char arr2[] = "***********************"; int left = 0; int right = strlen(arr1) - 1; while (left <= right) { arr2[left] = arr1[left]; arr2[right] = arr2[right]; printf("%s\n", arr2); Sleep(1000); // 停顿一秒 system("cls"); //清空屏幕 left++; right--; } printf("%s\n", arr1); return 0; }
- 注意在头文件#include <windows.h>中
- Sleep(1000)可以使循环中的输出间隔一秒
- system("cls"); 是终端层面的操作 cls是清空屏幕的意思
5.编写代码实现,模拟用户登录情景,并且只能登录三次。
- (只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
- 字符串不能用“==”比较
- strcmp 函数是比较字符串的大小的 头文件string.h
- > 输出返回值 >0
- == 输出返回值 =0
- < 输出返回值 <0
- strcmp(password,"123456") == 0 //则说明输入密码正确
- strcmp 是比较对应位置ascii码的大小
6.猜数字游戏实现
- 电脑随机生成1~100之间的数
- 接下来我们猜数字
- 如果猜小了,就告诉你猜小了
- 如果猜大了,就告诉你猜大了
- 如果猜对了,就告诉你猜对了,游戏结束
生成随机数
//rand函数生产的伪随机数
- 头文件 #include <stdlib.h>
//rand 函数生产的随机数的范围是: 0~RAND_MAX(32767)
//rand 函数在生产随机数之前,要使用srand函数设置随机数的生成器 - 头文件 #include <stdlib.h>
//time - 函数可以返回一个时间戳 - 头文件 #include <time.h> 目前仅仅用time函数返回一个时间戳
- 所以只用NULL作为空指针传入
//Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
//srand((unsigned int)time(NULL)); - //srand不用每次游戏都调用,只用在main函数调用一次 在game中只用rand就可以了
- //随机数是算法生成的 主要是rand来产生
#include <stdio.h> #include <stdlib.h> #include <time.h> void menu() { printf("**********************************\n"); printf("*********** 1.play **********\n"); printf("*********** 0.exit **********\n"); printf("**********************************\n"); } //RAND_MAX--rand函数能返回随机数的最大值。 void game(){ //1.生成随机数 //rand函数生产的伪随机数 头文件 #include <stdlib.h> //rand 函数生产的随机数的范围是: 0~RAND_MAX(32767) //rand 函数在生产随机数之前,要使用srand函数设置随机数的生成器 头文件 #include <stdlib.h> //time - 函数可以返回一个时间戳 头文件 #include <time.h> //Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。 //srand((unsigned int)time(NULL)); //srand不用每次游戏都调用,只用在main函数调用一次 在game中只用rand就可以了 //2.猜数字 int random_num = rand() % 100 + 1; //0~99+1 -> 1~100 int input = 0; while (1) //使循环一直执行下去 1一直是非0 { printf("请输入猜的数字>:"); scanf("%d", &input); if (input > random_num) printf("猜大了\n"); else if (input < random_num) printf("猜小了\n"); else { printf("恭喜你,猜对了\n"); break; } } } int main() { int input = 0; srand((unsigned)time(NULL)); do { menu(); printf("请选择>:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: break; default: printf("选择错误,请重新输入!\n"); break; } } while (input); return 0; }
time函数
- 在C语言中,可以使用time函数来获取当前时间的秒数。需要包含头文件<time.h>,然后调用time函数即可。下面是一个示例代码:
#include <stdio.h> #include <time.h> int main() { time_t currentTime; time(¤tTime); printf("当前时间的秒数:%ld\n", currentTime); return 0; }
- 在这个示例中,time(¤tTime)会将当前时间的秒数保存在变量currentTime中,然后通过printf函数打印出来。注意,time函数返回的是从1970年1月1日 00:00:00开始至今的秒数。
goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程。
例如:一次跳出两层或多层循环。 多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
goto语言真正适合的场景如下:
goto语句是不能跨函数跳转
下面是使用goto语句的一个例子,然后使用循环的实现方式替换goto语句:
一个关机程序
shutdown命令
system("shutdown -s -t 60"); -> 一分钟后关机
system("shutdown -a"); -> 取消关机
Windows 系统自带一个名为Shutdown.exe的程序,可以用于关机操作(位置在Windows\System32下),一般情况下Windows系统的关机都可以通过调用程序 shutdown.exe来实现的,同时该程序也可以用于终止正在计划中的关机操作。
shutdown -a 取消关机
shutdown -s 关机
shutdown -f 强行关闭应用程序
shutdown -m \\计算机名 控制远程计算机
shutdown -i 显示“远程关机”图形用户界面,但必须是Shutdown的第一个参数
shutdown -l 注销当前用户
shutdown -r 关机并重启
shutdown -s -t 时间 设置关机倒计时
shutdown -r -t 时间 设置重新启动倒计时
shutdown -h 休眠
//电脑将在1分钟内关机,如果输入:我是猪,就取消关机! #include <stdio.h> int main() { char input[10] = { 0 }; system("shutdown -s -t 60"); again: printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>"); scanf("%s", input); if (0 == strcmp(input, "我是猪")) { system("shutdown -a"); } else { goto again; } return 0; }
利用循环也可以实现
#include <stdio.h> #include <stdlib.h> int main() { char input[10] = { 0 }; system("shutdown -s -t 60"); while (1) { printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>"); scanf("%s", input); if (0 == strcmp(input, "我是猪")) { system("shutdown -a"); break; } } return 0; }