分支和循环语句2

目录

do while循环

语法

执行流程

循环练习题

1.计算 n的阶乘。

2.计算 1!+2!+3!+......+10!

3.二分法查找 

4.编写代码,演示多个字符从两端移动,向中间汇聚。

5.编写代码实现,模拟用户登录情景,并且只能登录三次。

6.猜数字游戏实现

生成随机数

time函数

 goto语句

shutdown命令


do while循环

语法

do

循环语句; 

while(表达式);

执行流程

分支和循环语句2_第1张图片

 上面代码输出: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是跳过后面的代码,执行下一次循环

循环练习题

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!

  1. 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.二分法查找 

  1. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)

  2. 遍历法(复杂不推荐)

  3. //在一个有序数组中查找具体的某个数字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;
    }

    二分法查找(效率很高,但需要有序(降幂或者升幂))

  4. //在一个有序数组中查找具体的某个数字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.编写代码,演示多个字符从两端移动,向中间汇聚。

  1. //编写代码,演示多个字符从两端移动,向中间汇聚
    #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 中 

  2. Sleep(1000)可以使循环中的输出间隔一秒

  3. system("cls"); 是终端层面的操作 cls是清空屏幕的意思

5.编写代码实现,模拟用户登录情景,并且只能登录三次。

  1. (只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。

  2. 字符串不能用“==”比较

  3. strcmp 函数是比较字符串的大小的 头文件string.h

  4. >    输出返回值 >0

  5. == 输出返回值 =0

  6. <   输出返回值 <0

  7. strcmp(password,"123456") == 0 //则说明输入密码正确

  8. strcmp 是比较对应位置ascii码的大小

6.猜数字游戏实现

  1. 电脑随机生成1~100之间的数

  2. 接下来我们猜数字

  3. 如果猜小了,就告诉你猜小了

  4. 如果猜大了,就告诉你猜大了

  5. 如果猜对了,就告诉你猜对了,游戏结束

生成随机数

              //rand函数生产的伪随机数

  1.     头文件 #include

        //rand 函数生产的随机数的范围是: 0~RAND_MAX(32767)

        //rand 函数在生产随机数之前,要使用srand函数设置随机数的生成器

  2.      头文件 #include

        //time - 函数可以返回一个时间戳 

  3.     头文件 #include 目前仅仅用time函数返回一个时间戳

  4.      所以只用NULL作为空指针传入

        //Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

        //srand((unsigned int)time(NULL));

  5.     //srand不用每次游戏都调用,只用在main函数调用一次 在game中只用rand就可以了

  6.    //随机数是算法生成的 主要是rand来产生

  7. #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;
    }
  8. 分支和循环语句2_第2张图片

time函数

  1. 在C语言中,可以使用time函数来获取当前时间的秒数。需要包含头文件,然后调用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开始至今的秒数。

 goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。

但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程。

例如:一次跳出两层或多层循环。 多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

goto语言真正适合的场景如下:

分支和循环语句2_第3张图片

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 
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;
}

你可能感兴趣的:(详识C语言,c语言,算法,开发语言)