分支和循环语句2

简介: 分支和循环语句2



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;
}
  1. 注意ret需要在第一层函数里重新赋值,再去执行第二层函数

3.二分法查找

  1. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)
  2. 遍历法(复杂不推荐)
//在一个有序数组中查找具体的某个数字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;
}
  1. 二分法查找(效率很高,但需要有序(降幂或者升幂))
  2. //在一个有序数组中查找具体的某个数字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;
}
  1. 注意在头文件#include <windows.h>中
  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 <stdlib.h>
       //rand 函数生产的随机数的范围是: 0~RAND_MAX(32767)
       //rand 函数在生产随机数之前,要使用srand函数设置随机数的生成器
  2.     头文件 #include <stdlib.h>
       //time - 函数可以返回一个时间戳
  3.    头文件 #include <time.h> 目前仅仅用time函数返回一个时间戳
  4.     所以只用NULL作为空指针传入
       //Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
       //srand((unsigned int)time(NULL));
  5.    //srand不用每次游戏都调用,只用在main函数调用一次 在game中只用rand就可以了
  6.   //随机数是算法生成的 主要是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函数

  1. 在C语言中,可以使用time函数来获取当前时间的秒数。需要包含头文件<time.h>,然后调用time函数即可。下面是一个示例代码:
#include <stdio.h>
#include <time.h>
int main() {
    time_t currentTime;
    time(&currentTime);
    printf("当前时间的秒数:%ld\n", currentTime);
    
    return 0;
}
  1. 在这个示例中,time(&currentTime)会将当前时间的秒数保存在变量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;
}
相关文章
|
6月前
|
Go C语言
分支语句与循环语句,详细讲解
分支语句与循环语句,详细讲解
|
7月前
|
C语言
分支和循环语句
分支和循环语句
41 1
|
6月前
|
数据安全/隐私保护
分支和循环语句(2)
分支和循环语句(2)
35 1
|
6月前
|
C语言
分支和循环语句(3)
分支和循环语句(3)
37 0
分支和循环语句(3)
|
6月前
|
C语言
分支和循环语句(1)
分支和循环语句(1)
48 0
|
算法
分支与循环语句的练习
分支与循环语句的练习
|
7月前
|
存储 缓存 Linux
分支与循环语句1
分支与循环语句1
43 0
|
7月前
|
缓存 编译器 Go
分支语句和循环语句
分支语句和循环语句
73 0
|
编译器 C语言 C++
分支语句和循环语句上
分支语句和循环语句
61 0
分支语句和循环语句上
|
C语言
分支语句和循环语句(1)
分支语句和循环语句(1)
55 0