学C的第八天(完成猜字谜游戏复习之前的内容;了解goto转向语句;补充知识点;练习,学习试除法和辗转相除法)-1

简介: 复习之前学C的内容:猜数字游戏:1. 电脑会随机生成一个数2. 猜数字: a> 猜大了,提醒猜大了,继续猜 b> 猜小了,提醒猜小了,继续猜 c> 猜对了,恭喜你,猜对了,结束游戏3. 玩完一把不过瘾可以继续玩,不用退出程序

复习之前学C的内容:

猜数字游戏:


1. 电脑会随机生成一个数


2. 猜数字:


       a> 猜大了,提醒猜大了,继续猜


       b> 猜小了,提醒猜小了,继续猜


       c> 猜对了,恭喜你,猜对了,结束游戏


3. 玩完一把不过瘾可以继续玩,不用退出程序


新知识点 -- 生成随机数:


   通过rand()函数生成随机数,调用rand()函数之前要先调用srand()函数

   而srand()函数设置随机数生成起点时,需要time()函数返回一个时间戳

   time函数不想用,可以直接给time()函数传递空指针(NULL)


srand()函数:


使用rand()函数前最好使用srand()函数,用于设置随机数的生成起点,要给srand传送一个变化的值,值得是无符号整型(unsigned int),计算机上的时间是时刻发生变化的,可用其作为()中的值。


srand()函数最好不要频繁调用,会一直重新设置随机数得生成起点,导致生成的随机数太接近不够随机,且调用得太快有可能会生成一样的随机数,所以srand() 只调用一次就好了,可以放在主函数中

ad07b6609912462c8a072d3377fd44ed.png

rand()函数:


利用库函数rand()生成随机数,随机数的范围是:0~32767(7FFF)

1956521105ab43caa23208417c687029.png

time()函数:


  time()函数可以返回时间戳,因为时间是一直在变化的,所以时间戳也是一直变化的

  time()的()中要写指针,可以用NULL空指针

   time()返回值是time_t类型的,本质是一个longlong整型,所以可以作为srand函数()中的值,使用强制类型转换(unsigned int)即可

8e6ed1138d91454c91107f06a877c0ee.png

实现代码:)

#include <stdio.h>
#include <stdlib.h>;
#include <time.h>
void menu() // 定义一个菜单函数,调用时打印一个菜单
{
  printf("*******************************************\n");
  printf("************ 1.play 0.exit ************\n");
  printf("*******************************************\n");
}
void game()// 自定义一个函数,完成 玩游戏代码
{
  //1. 生成随机数
  // 通过rand()函数生成随机数,调用rand()函数之前要先调用srand()函数
  // 而srand()函数设置随机数生成起点时,需要time函数返回一个时间戳
  // time函数不想用,可以直接给time()函数传递空指针(NULL)
  int ret = rand() % 100 + 1;
  // 利用库函数rand()生成随机数
  // 随机数的范围是:0~32767(7FFF)
  // 随机数 % 100 后余数只能是 0~99的数,在加1 就是 1~100的数,把随机数控制在1~100之间
  //printf("%d\n", ret);
  //2, 猜数字
  int guess = 0;
  while (1) // 死循环,一直猜,直到猜大了break跳出循环
  {
    printf("请猜数字:>");
    scanf("%d", &guess); //输入猜的数字
    if (guess > ret)
    {
      printf("猜大了\n");
    }
    else if (guess < ret)
    {
      printf("猜小了\n");
    }
    else
    {
      printf("恭喜你,猜对了\n");
      break;
    }
  }
}
int main()
{
  //打印菜单
  //1.玩游戏
  //0.退出游戏
  int input = 0; // 打印菜单后让玩家选择1或0
  srand((unsigned int)time(NULL));
  // 使用rand()函数前最好使用srand()函数,用于设置随机数的生成起点
  // 要给srand传送一个变化的值,值得是无符号整型(unsigned int),计算机上的时间是时刻发生变化的,可用其作为()中的值
  // 
  // time()函数可以返回时间戳,因为时间是一直在变化的,所以时间戳也是一直变化的
  // time()的()中要写指针,可以用NULL空指针
  // time()返回值是time_t类型的,本质是一个longlong整型,所以可以作为srand函数()中的值
  //
  // srand()函数最好不要频繁调用,会一直重新设置随机数得生成起点,
  // 导致生成的随机数太接近不够随机,且调用得太快有可能会生成一样得随机数
  // 所以srand() 只调用一次就好了,可以放在主函数中
  do // 先玩一把再说,再看要不要再玩,使用do while循环
  {
    menu(); //自定义一个菜单函数
    printf("请选择:>");
    scanf("%d", &input); // 1 0
    switch (input)
    {
    case 1: {
      game(); // 自定义一个函数,完成 玩游戏代码
      break;
    }
    case 0: {
      printf("退出游戏\n");
      break;
    }
    default: {
      printf("选择错误\n");
      break;
    }
    }
  } while (input); // 选了1(非0),条件成立,再玩一次,选0则不玩退出游戏
  return 0;
}

网络异常,图片无法展示
|
image.png

网络异常,图片无法展示
|

补充第六天内容 -- goto转向语句

C语言中提供了可以随意滥用的goto语句和标记跳转的标号。

//goto语句:
#include <stdio.h>
int main()
{
again://(顶格写)
  printf("hehe\n");
  goto again; //跳转到again的地方去
  //随意跳转的goto语句
  //标记跳转的标号:again
  return 0;
}


image.png

从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易地写出代码

(使用goto语句:)

//关机程序
//1. 程序运行起来后,1分钟内电脑关机
//2. 如果输入:我是猪,就取消关机
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 类似java的import进入需要用的类
int main()
{
  char input[20] = { 0 }; // 接收“我是猪”,哈哈哈
  //程序倒计时关机
  system("shutdown -s -t 60"); // 用system函数调用系统的倒计时关机命令
again:
  printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
  scanf("%s", input); // 数组名本来就是地址,不用加&
  if (strcmp(input, "我是猪") == 0) // strcmp这里需要<string.h>头文件
  {
    system("shutdown -a"); // 调用系统的取消关机命令
    // system这里需要<stdlib.h>头文件
  }
  else
  {
    goto again;
  }
  return 0;
}

ec10596fef57449bb486a5eed083a50c.png

c5dc3ebe16fa415f8771372500ccee30.png

157736705664440c98b5cc9a4cb61ad4.png

(不用goto语句也可以很容易地写出该程序:)

//关机程序
//1. 程序运行起来后,1分钟内电脑关机
//2. 如果输入:我是猪,就取消关机
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 类似java的import进入需要用的类
int main()
{
  char input[20] = { 0 }; // 接收“我是猪”,哈哈哈
  //程序倒计时关机
  system("shutdown -s -t 60"); // 用system函数调用系统的倒计时关机命令
  while (1) // 条件非0,一直为真,死循环
  {
    printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
    scanf("%s", input); // 数组名本来就是地址,不用加&
    if (strcmp(input, "我是猪") == 0) // strcmp这里需要<string.h>头文件
    {
      system("shutdown -a"); // 调用系统的取消关机命令
      // system这里需要<stdlib.h>头文件
      break;
    }
  }
  return 0;
}


网络异常,图片无法展示
|

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

例如:一次跳出两层或多层循环。

(多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环)

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

for(...)
{
    for(...)
    {
        for(...)
        {
            if(disaster)
            {
                goto error;
            }
        }
    }
}
....
error:
    if (disaster)
    {
        //处理错误情况
    }

goto语句是不能跨函数的,只能在一个函数中跳转。

补充知识点:


1. char是字符类型,字符的本质是字符的ASCII码值,ASCII码值是整型,使用字符类型在归类的时候,是可以划分到整型家族的。(使用switch()的括号里是可以为char类型的值的)


2. 指针变量是用来存放地址的,地址大小要么是 32bit 要么是 64bit,所以变量的大小也要么是 32bit 要么是 64bit ,即 4个字节 或 8个字节 , 不管什么类型的指针变量,在同一操作系统下,指针变量的大小都是一样的。

练习:

1.打印1~100之间的3的倍数的数字:(新思路)

//练习1:(新思路)
#include <stdio.h>
int main()
{
  //先产生1~100之间的数字
  int i = 0;
  for ( i = 3; i <= 100; i+=3)
  {
    printf("%d  ", i);
  }
  return 0;
}

ddf3c500552c4f61948ba9ff7f81677d.png

2.写代码将三个从键盘输入的整数按从大到小输出:(新思路)

// 练习2:(新思路)
#include <stdio.h>
int main()
{
  int a = 0;
  int b = 0;
  int c = 0;
  // 输入
  scanf("%d %d %d", &a, &b, &c);
  // 计算(不用比较来进行排序) 
  // 直接按打印的顺序把最大值赋给打印时的最大值,拍下去
  if (a < b) 
  {
    int tmp = a; 
  // 调换两个变量的值时,需要创建一个中间值存储其中一个变量
    a = b;
    b = tmp; 
  // a已换成了b的值,所以用存储了a值的中间值tmp来进行赋值
  }
  if (a < c)
  {
    int tmp = a; // 局部变量tmp会自动销毁
    a = c;
    c = tmp;
  }
  //上面两个循环之后,保证最大值在a中,打印时就把a放最前就好了
  if (b < c)
  {
    int tmp = b;
    b = c;
    c = tmp;
  }
  // 把第二大的值放在b中,最小值放c中
  //输出
  printf("%d %d %d\n", a, b, c); // 大 -> 小
  return 0;
}

e83ab78af19c4e5a88e488204549f456.png

相关文章
|
1月前
|
C语言
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计(第五版)谭浩强
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计(第五版)谭浩强
|
1月前
|
存储 C语言
C程序设计内容与例题讲解 -- 第三章第二部分(第五版)谭浩强
C程序设计内容与例题讲解 -- 第三章第二部分(第五版)谭浩强
|
1月前
|
存储 移动开发 C语言
# C程序设计内容与例题讲解 -- 第三章第一部分(第五版)谭浩强
# C程序设计内容与例题讲解 -- 第三章第一部分(第五版)谭浩强
|
1月前
|
C语言 数据格式
C程序设计内容与例题讲解 -- 第三章第三部分(第五版)谭浩强
C程序设计内容与例题讲解 -- 第三章第三部分(第五版)谭浩强
|
1月前
|
C语言
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计第二部分(第五版)谭浩强
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计第二部分(第五版)谭浩强
|
1月前
|
算法 调度
C程序设计内容与例题讲解 -- 第二章(第五版)谭浩强
C程序设计内容与例题讲解 -- 第二章(第五版)谭浩强
|
9月前
学C的第八天(完成猜字谜游戏复习之前的内容;了解goto转向语句;补充知识点;练习,学习试除法和辗转相除法)-2
3.写一个代码,打印100-200之间的素数:(新思路:试除法) (判断i是否为素数:用 2到i-1 之间的数字去试除 i,如果能整除则i不是素数)
(思维)(必要做题步骤)(皮卡丘与 Codeforces )D - 先来签个到
(思维)(必要做题步骤)(皮卡丘与 Codeforces )D - 先来签个到
75 0
|
C++
AcWing语法基础课笔记 第二章 printf语句与C++中的判断结构
学习语言最好的方式就是实践,每当掌握一个新功能时,就要立即将这个功能应用到实践中。 ——闫学灿
69 0