分支语句与循环语句——练习

简介: 分支语句与循环语句——练习
1. 计算 n的阶乘。
2. 计算 1!+2!+3!+……+10!
3. 在一个有序数组中查找具体的某个数字n。(二分查找)
4. 编写代码,演示多个字符从两端移动,向中间汇聚。
5. 编写代码实现,模拟用户登录情景,并且只能登录三次。
(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。)
6.猜数字游戏
7.关机程序

1.计算n的阶乘

#include<stdio.h>
int main()
{
  int n = 0;
  scanf("%d", &n);//n这个数必须是个具体的数,所以我们必须输入一个具体的值
  int i= 0;
  int ret = 1;
    for (i = 1; i <= n; i++)
    {
      ret = ret * i;//产生n的阶乘。例如3的阶乘是6,只是一个数的阶乘
    }
    printf("%d", ret);
  return 0;
}

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

#include<stdio.h>
int main()
{
  int i = 0;
  int ret = 1;
  int j = 0;
  int sum = 0;
  for (j = 1; j <= 10; j++)
  {
    ret = 1;
    for (i = 1; i <= j; i++)
    {
      ret = ret * i;
    }
    sum = sum + ret;
  }
  printf("%d", sum);
  return 0;
}

解释:


内层循环:通过i的循环改变ret的值,从而实现1*2*3..的某个数的阶乘。


✔✔✔特别提醒:ret的值必须初始化为1,i的值也必须从1开始循环。


外层循环:通过j实现1~10的数进行内层循环算出阶乘,出内层循环实现相加。


✔✔✔关于*=  +=:ret=ret*i(ret*=i)   sum=sum+ret(sum+=ret)

提高效率:

#include<stdio.h>
int main()
{
  int i= 0;
  int ret = 1;
  int sum = 0;
    for (i = 1; i <= 10; i++)
    {
      ret = ret * i;
      sum = sum + ret;
    }
    printf("%d", sum);
  return 0;
}
//在前一个数的阶乘基础上乘上当前的数字,提高效率
//1!=1*1
//2!=1*1*2
//3!=1*1*2*3
//4!=1*1*2*3*4

3.在一个有序数组中查找具体某个数n。(二分查找)

第一种:遍历(有序无序均可,效率低)

//第一种方法——遍历
//有序数组
//数组下标
//效率低
#include<stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int k = 0;
  scanf("%d", &k);//输入要查找的值
  int i = 0;
  int flag = 0;//flag为假
  for (i = 0; i <= 9; i++)
  {
    if (arr[i] == k)
    {
      printf("找到了,下标为:%d\n", i);
      flag = 1;//找到变成真的
      break;   //找到就不用再循环了,在所有都遍历的情况上提高效率
    }
  }
  if (flag == 0)//遍历了全部还是没找到
    printf("没找到");
  return 0;
}

第二种:二分查找(折半查找,效率高,有序数组且不一定连续)

二分查找只用了4次就找到了这个我们需要的数字。√√√√√那我们写程序需要哪些变量???

寻找的值k


左下标left


右下标right


中间值下标mid=(left+right)/2


中间值arr【mid】和k比较——用分支语句来写一次二分查找


多次二分查找需要循环——while循环


如果小于k


left=mid+1,right不变,mid改变


如果大于k


right=mid-1,left不变,mid改变


如果等于k


找到了!!!flag==1


没找到           flag==0


//第二种
//折半查找——二分查找
//分清楚下标和数组数字
//效率高 有序数组 不一定连续
#include<stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int size = sizeof(arr) / sizeof(arr[0]);//就算数组的元素的个数
  int k = 0;
  scanf("%d", &k);//输入要查找的值
  int flag = 0;
  int left = 0;
  int right = size-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);
      flag = 1;//必须要设置flag
      break;
    }
    }//循环体只是一次二分查找
  if (flag == 0)//注意不是flag=0,赋值🆗
    printf("没找到\n");
  return 0;
}

关于计算数组中元素的个数

//数组中元素的个数的计算sizeof
#include<stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  printf("数组的空间大小:%d\n", sizeof(arr));//单位字节
  printf("数组中1个元素的大小:%d\n", sizeof(arr[7]));//单位字节
  printf("数组中有多少个元素:%d\n", sizeof(arr)/sizeof(arr[7]));//单位个
}

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

数组中元素的计算问题:

//数组中元素的个数的计算sizeof
#include<stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  printf("数组的空间大小:%d\n", sizeof(arr));
  printf("数组中1个元素的大小:%d\n", sizeof(arr[7]));
  printf("数组中有多少个元素:%d\n", sizeof(arr)/sizeof(arr[7]));
}
//数组中元素的计算字符串sizeof和strlen
#include<stdio.h>
#include<string.h>
int main()
{
  char arr[] = "a,b,c";
  printf("数组中元素的个数:%d\n", sizeof(arr) / sizeof(arr[0]));
  printf("数组中最右元素的下标:%d\n", sizeof(arr) / sizeof(arr[0]) - 2);
  //-2指的是下标从0开始和减去"\0"
  printf("数组中元素的个数:%d\n", strlen(arr));
  //strlen是不计算"\0"的,需要包含头文件#include<string.h>
  printf("数组中最右元素的下标:%d\n", strlen(arr) - 1);
  //所以只要-1就是指的是下标从0开始
  return 0;
}

编写代码:

//4. 编写代码,演示多个字符从两端移动,向中间汇聚。
 #include<stdio.h>
#include<windows.h>
int main()
{
  char arr1[] = "hello word!!" ;//无{}
  char arr2[] = "************" ;
  int left = 0;
  int right = sizeof(arr1) / sizeof(arr1[0]) - 2;
  while (left <= right)
  {
    arr2[left] = arr1[left];
    arr2[right] = arr1[right];
    /*arr1[left]=arr2[left];
    arr1[right]=arr2[right];*/
    printf("%s\n",arr2);
    Sleep(1000);
    system("cls");//清空屏幕
    left++;//变化循环
    right--;
  }
  printf("%s\n", arr2);
  return 0;
}

1700199898247.png

屏幕录制 2023-07-23 100119

Sleep函数的介绍:

概念:Sleep函数可以使计算机程序(进程,任务或线程)进入休眠,使其在一段时间处于非活跃状态。当函数设定的计时器到期或者接收到型号,程序发生中断都会导致程序运行。


语法:Sleep() ()里的是时间数字,单位为毫秒。1000毫秒就是1秒。


注意:需要使用时需要包含头文件

system("cls")

清除屏幕的内容。

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

(只允许输入三次密码,如果密码正确则提示登录成功;反之,则退出程序)

#include<stdio.h>
#include<string.h>
int main()
{
  int i = 0;
  char ch[20] = { 0 };
  int flag = 0;
  for(i = 1; i <= 3; i++)
  {
    printf("请输入密码:\n");
    scanf("%s", &ch);
    //if (ch == "123456")//两个字符串判断相等一定不能用“==”🆗?
    if(strcmp(ch,"123456") == 0)
    {
      printf("登录成功\n");
      flag = 1;
      break;
    }
    else
    {
      printf("密码错误\n");
    }
  }
  if(flag == 0)
  printf("退出程序\n");
  return 0;
}

不同写法:

#include<stdio.h>
int main()
{
  int i = 0;
  char ch[20] = { 0 };
  int flag = 0;
  for (i = 0; i < 3; i++)//边界条件很重要
  {
    printf("请输入密码:\n");
    scanf("%s", &ch);
    if(strcmp(ch,"123456") == 0)
    {
      printf("登录成功\n");
      break;
    }
    else
    {
      printf("密码错误\n");
    }
  }
  if (i == 3)//关于“=”和“==”的区别也很重要
    printf("退出程序\n");
  return 0;
}

strcmp函数:

关于字符串之间不能用"==" ,所以我们引出一个函数strcmp。


strcmp函数是比较字符串大小的。(实质:比较不是内容大小,而是字符串的起始地址)


例如:(strmp(password ,"123456") == 0)


strcmp函数的返回值为0,则两个字符串相等。


                      返回值<0,则两个字符串关系<


                      返回值>0,则两个字符串关系>


strcmp函数包含头文件#include


6.猜数字游戏的实现

实现用户选择

void menu()
{
  printf("***********************\n");
  printf("********Play.1*********\n");
  printf("********Over.0*********\n");
  printf("***********************\n");
}
void game()
{
  //实现游戏
}
#include<stdio.h>
int main()
{
  //实现选择
  int input = 0;
  do
  {
    printf("游戏选择如下:\n");
    menu();//设置一个游戏菜单函数
    printf("请玩家选择:\n");
    scanf("%d", &input);
    switch (input)
    {
        case(1):
        printf("进入游戏\n");
        game();//实现游戏逻辑
        break;
      case(0):
        printf("游戏结束\n");
        break;
      default:
        printf("输入错误,请重新输入\n");
        break;
    }
  } while (input);
  //input=1或其他(只要是非0)都是表达式为真,进入循环
  //input为0 表达式为假,跳出循环
  return 0;
}

当然,除了switch语句还可以使用if else语句,大家可以动手试一试🙂🙂🙂🙂🙂

实现随机数

✔✔✔✔先介绍三个函数。

rand函数


rand函数返回值为int,参数不接受。


rand函数虽然要生成随机数,但是如果你测试就会发现生成的随机数基本都有规律和相同。


rand函数生成的是伪随机数。


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


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


✔✔✔我们就引入srand函数

srand函数


srand函数需要头文件  #include


srand函数返回值无,参数接受unsigned int类型


seed函数是随机数生成器的种子,种子不一样则生成的随机数rand也不一样。


(根据种子+算法=生成随机数rand)。


????这里我们陷入了一个问题,为了生成随机数我们又需要一个随机的种子。


✔✔✔我们就引入time函数来生成我们的种子

time函数


time函数需要头文件#include

time函数的返回值类型time_t (本质是long long 的整形)  参数接受类型为指针。

time函数的返回值是一个时间戳。

时间戳

时间戳简单来说就是时间和数字之间的转换。

时间:当前计算机的时间相较于计算机的起始时间之间的差值。

//生成随机数
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
int main()
{
  srand((unsigned int)time(NULL));
  int ret = rand();
  printf("%d", ret);
  return 0;
}
//srand((unsigned int)time(NULL));
//time接受的参数是指针,放入一个空指针就🆗了(相当于0)
// srand需要的返回值值unsigned int 类型  void srand (unsigned int seed);
// 这里我们需要强制转换把time_t转换称unsigned int


void game()
{
  int ret = rand()%100+1;
//取模得到余数1~99之间+1就是1~100之间的随机数
}

实现游戏逻辑

void game()//游戏逻辑的实现
{
  int ret = rand()%100+1;
  int guess = 0;
  while (1)//如果不跳出去,永远死循环循环
  {
    printf("请输入你猜测的数字:\n");
    scanf("%d", &guess);
    if (guess < ret)
      printf("猜小了\n");
    else if (guess > ret)
      printf("猜大了\n");
    else
    {
      printf("恭喜你猜中了!\n");
      break;
    }
  }
}

总代码

#include<stdlib.h>
#include<time.h>
#include<stdio.h>
void menu()
{
  printf("***********************\n");
  printf("********Play.1*********\n");
  printf("********Over.0*********\n");
  printf("***********************\n");
}
void game()//游戏逻辑的实现
{
  int ret = rand()%100+1;//取模得到余数1~99之间+1就是1~100之间的随机数
  int guess = 0;
  while (1)//如果不跳出去,永远死循环循环
  {
    printf("请输入你猜测的数字:\n");
    scanf("%d", &guess);
    if (guess < ret)
      printf("猜小了\n");
    else if (guess > ret)
      printf("猜大了\n");
    else
    {
      printf("恭喜你猜中了!\n");
      break;
    }
  }
}
#include<stdio.h>
int main()
{
  //实现选择
  int input = 0;
  srand((unsigned int)time(NULL));
  //srand不需要频繁调用,只用调用一次即可
  do
  {
    printf("游戏选择如下:\n");
    menu();//设置一个游戏菜单函数
    printf("请玩家选择:\n");
    scanf("%d", &input);
    switch (input)
    {
        case(1):
        printf("进入游戏\n");
        game();//实现游戏逻辑
        break;
      case(0):
        printf("游戏结束\n");
        break;
      default:
        printf("输入错误,请重新输入\n");
        break;
    }
  } while (input);
  //input=1或其他(只要是非0)都是表达式为真,进入循环
  //input为0 表达式为假,跳出循环
  return 0;
}

7.关机程序的实现

#include<stdio.h>
int main()
{
  char input[20] = { 0 };
  system("shutdown -s -t 180");//开始倒计时关机
  //命令是关机
again:
  printf("开始关机倒计时,请输入:我是猪,取消关机\n");
  scanf("%s", &input);
  if (strcmp(input, "我是猪") == 0)
  {
    system("shutdown -a");
    //取消关机的命令
    printf("已经取消关机\n");
  }
  else
  {
    goto again;
  }
  return 0;
}
#include<stdio.h>
int main()
{
  char input[20] = { 0 };
  system("shutdown -s -t 180");//开始倒计时关机
  //命令是关机
    while (1)
  {
    printf("开始关机倒计时,请输入:我是猪,取消关机\n");
    scanf("%s", &input);
    if (strcmp(input, "我是猪") == 0)
    {
      system("shutdown -a");
      //取消关机的命令
      printf("已经取消关机\n");
      break;
    }
  }
  return 0;
}

"shutdown -s -t"

关机命令,t的单位秒

"shutdown -a"

取消关机

以上就是关于分支与循环的练习,大家可以实操!

✔✔✔✔感谢大家的阅读,欢迎大家指正不错和错误

代码---------------→【gitee:https://gitee.com/TSQXG

联系---------------→【邮箱:2784139418@qq.com】

目录
相关文章
|
5月前
|
Go C语言
分支语句与循环语句,详细讲解
分支语句与循环语句,详细讲解
|
6月前
|
算法 Unix 数据安全/隐私保护
分支和循环语句2
分支和循环语句2
58 0
|
6月前
|
存储 缓存 Linux
分支与循环语句1
分支与循环语句1
40 0
|
6月前
|
缓存 编译器 Go
分支语句和循环语句
分支语句和循环语句
69 0
|
编译器 C语言 C++
分支语句和循环语句上
分支语句和循环语句
58 0
分支语句和循环语句上
|
11月前
|
数据安全/隐私保护 C语言
分支语句与循环语句(2)
分支语句与循环语句(2)
57 0
|
11月前
|
C语言
分支语句和循环语句(1)
分支语句和循环语句(1)
51 0
|
缓存 Go 数据安全/隐私保护
分支语句和循环语句下
分支语句和循环语句
74 0
|
编译器
分支语句与循环语句题
分支语句与循环语句题
69 0
|
数据安全/隐私保护
【分支语句与循环语句】
【分支语句与循环语句】
53 0