目录
do while循环
语法
执行流程
循环练习题
1.计算 n的阶乘。
2.计算 1!+2!+3!+......+10!
3.二分法查找
4.编写代码,演示多个字符从两端移动,向中间汇聚。
5.编写代码实现,模拟用户登录情景,并且只能登录三次。
6.猜数字游戏实现
生成随机数
time函数
goto语句
shutdown命令
do
循环语句;
while(表达式);
上面代码输出:0 1 2 3 4 5 6 7 8 9 10
do while 中至少循环执行一次
#include
int main() {
int i = 10;
do
{
if(5 == i)
break;
printf("%d\n", i);
}while(i<10);
return 0;
}
#include
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是跳过后面的代码,执行下一次循环
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;
}
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需要在第一层函数里重新赋值,再去执行第二层函数
在一个有序数组中查找具体的某个数字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;
}
//编写代码,演示多个字符从两端移动,向中间汇聚
#include
#include
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
Sleep(1000)可以使循环中的输出间隔一秒
system("cls"); 是终端层面的操作 cls是清空屏幕的意思
(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
字符串不能用“==”比较
strcmp 函数是比较字符串的大小的 头文件string.h
> 输出返回值 >0
== 输出返回值 =0
< 输出返回值 <0
strcmp(password,"123456") == 0 //则说明输入密码正确
strcmp 是比较对应位置ascii码的大小
电脑随机生成1~100之间的数
接下来我们猜数字
如果猜小了,就告诉你猜小了
如果猜大了,就告诉你猜大了
如果猜对了,就告诉你猜对了,游戏结束
//rand函数生产的伪随机数
头文件 #include
//rand 函数生产的随机数的范围是: 0~RAND_MAX(32767)
//rand 函数在生产随机数之前,要使用srand函数设置随机数的生成器
头文件 #include
//time - 函数可以返回一个时间戳
头文件 #include
所以只用NULL作为空指针传入
//Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
//srand((unsigned int)time(NULL));
//srand不用每次游戏都调用,只用在main函数调用一次 在game中只用rand就可以了
//随机数是算法生成的 主要是rand来产生
#include
#include
#include
void menu() {
printf("**********************************\n");
printf("*********** 1.play **********\n");
printf("*********** 0.exit **********\n");
printf("**********************************\n");
}
//RAND_MAX--rand函数能返回随机数的最大值。
void game(){
//1.生成随机数
//rand函数生产的伪随机数 头文件 #include
//rand 函数生产的随机数的范围是: 0~RAND_MAX(32767)
//rand 函数在生产随机数之前,要使用srand函数设置随机数的生成器 头文件 #include
//time - 函数可以返回一个时间戳 头文件 #include
//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;
}
在C语言中,可以使用time函数来获取当前时间的秒数。需要包含头文件
#include
#include
int main() {
time_t currentTime;
time(¤tTime);
printf("当前时间的秒数:%ld\n", currentTime);
return 0;
}
在这个示例中,time(¤tTime)会将当前时间的秒数保存在变量currentTime中,然后通过printf函数打印出来。注意,time函数返回的是从1970年1月1日 00:00:00开始至今的秒数。
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程。
例如:一次跳出两层或多层循环。 多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
goto语言真正适合的场景如下:
goto语句是不能跨函数跳转
下面是使用goto语句的一个例子,然后使用循环的实现方式替换goto语句:
一个关机程序
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
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
#include
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;
}