liyifeng295641 发表于 2023-12-27 19:13:38

C语言while语句和do...while语句02

本帖最后由 liyifeng295641 于 2024-1-3 15:54 编辑

下面是小甲鱼课后的练习题,就第16行有点不理解,@FishC
题目:
2. C 语言中有个 atoi 函数(定义于 <stdlib.h> 头文件中),用于将字符串中的值解析为对应的整型数字。现在要求我们自己写一个程序,实现类似的功能。
基本要求:

A. 将用户输入的字符串中代表数字的字符转换为整型数值

B. 打印转换结果

C. 只打印第一组数字

提示:你可以使用 break 语句在适当的时候跳出循环。

#include <stdio.h>

int main()
{
      int ch;
      int num = 0;

      printf("请输入待转换的字符串:");

      do
      {
                ch = getchar();

                if (ch >= '0' && ch <= '9')
                {
                        num = 10 * num + (ch - '0');
                }
                else
                {
                        if (num)
                        {
                              break; // 如果已有数字,则退出循环
                        }
                }

      }
      while (ch != '\n');

      printf("结果是:%d\n", num);

      return 0;
}

FishC 发表于 2023-12-27 19:13:47

这段代码的作用是统计输入字符串中包含的数字个数。在第16行,是对输入字符进行判断,判断其是否为数字字符。条件 ch >= '0' && ch <= '9' 表示字符 ch 的 ASCII 码值在 '0'(十进制为48)和 '9'(十进制为57)之间。如果满足该条件,说明 ch 是一个数字字符,num 就加1。

以下是完整的代码:

#include <stdio.h>

int main()
{
    int ch;
    int num = 0;

    printf("请输入待转换的字符串:");

    do
    {
      ch = getchar();

      if (ch >= '0' && ch <= '9')
      {
            num++;
      }

    } while (ch != '\n');

    printf("字符串中包含的数字个数为:%d\n", num);

    return 0;
}

该程序会不断读取输入字符,直到遇到回车符('\n')。在输入过程中,如果输入的字符是数字字符,则 num 加1。最后输出统计结果。希望能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2023-12-27 19:17:42

FishC 发表于 2023-12-27 19:13
这段代码的作用是统计输入字符串中包含的数字个数。在第16行,是对输入字符进行判断,判断其是否为数字字符 ...

小甲鱼说这段代码是实现atoi 函数的作用,不是找字符串中包含的数字个数的。这个笨蛋

FishC 发表于 2023-12-27 19:17:53

liyifeng295641 发表于 2023-12-27 19:17
小甲鱼说这段代码是实现atoi 函数的作用,不是找字符 ...

非常抱歉,我理解错了你的问题。你是问关于实现 `atoi` 函数的问题。

事实上,`atoi` 函数是将字符串转换为整数的函数。下面是一个简单的实现示例:
#include <stdio.h>

int atoi(const char *str) {
    int result = 0;
    int sign = 1;
    int i = 0;

    // 处理正负符号
    if (str == '-') {
      sign = -1;
      i++;
    }

    // 遍历字符串,并逐个将字符转换为数字
    while (str != '\0') {
      if (str >= '0' && str <= '9') {
            result = result * 10 + (str - '0');
            i++;
      } else {
            break; // 遇到非数字字符停止转换
      }
    }

    return result * sign;
}

int main() {
    char str[] = "12345";
    int num = atoi(str);

    printf("%d\n", num); // 输出:12345

    return 0;
}

以上代码中的 `atoi` 函数实现了将字符串转换为整数的功能。它首先判断字符串的符号位(正负号),然后遍历字符串,将每个数字字符转换为整数并累加到结果中。当遇到非数字字符时,停止转换并返回结果。

希望这次回答能够帮到你,对之前的回答不准确表示诚挚的歉意。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2023-12-27 19:28:46

FishC 发表于 2023-12-27 19:17
非常抱歉,我理解错了你的问题。你是问关于实现 `atoi` 函数的问题。

事实上,`atoi` 函数是将字符串转 ...

这段代码用于将字符串中的值解析为对应的整型数字
比如说:输入:123fishc 输出:123
#include <stdio.h>

int main()
{
      int ch;
      int num = 0;

      printf("请输入待转换的字符串:");

      do
      {
                ch = getchar();

                if (ch >= '0' && ch <= '9')
                {
                        num = 10 * num + (ch - '0');
                }
                else
                {
                        if (num)
                        {
                              break; // 如果已有数字,则退出循环
                        }
                }

      }
      while (ch != '\n');

      printf("结果是:%d\n", num);

      return 0;
}
我不理解的是16行代码,

FishC 发表于 2023-12-27 19:28:58

liyifeng295641 发表于 2023-12-27 19:28
这段代码用于将字符串中的值解析为对应的整型数字
比 ...

这段代码就是用来实现将输入的字符串转换为对应的整数数字。它通过逐个读取字符,判断是否为数字字符,然后将其转换为对应的数字值,并累加到`num`变量中。

#include <stdio.h>

int main(){
    int ch;
    int num = 0;
    printf("请输入待转换的字符串:");

    do {
      ch = getchar();
      if (ch >= '0' && ch <= '9') { // 判断是否为数字字符
            num = num * 10 + (ch - '0'); // 将字符转换为数字并累加到num中
      }
    } while (ch != '\n');

    printf("转换后的整数为:%d\n", num);

    return 0;
}

例如,如果输入字符串"123fishc",程序会逐个读取字符,当读取到'1'、'2'、'3'时,判断它们是数字字符,然后将它们转换为相应的数字1、2、3,并累加到`num`变量中。最后,程序会输出转换后的整数123。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2023-12-27 19:34:52

FishC 发表于 2023-12-27 19:28
这段代码就是用来实现将输入的字符串转换为对应的整数数字。它通过逐个读取字符,判断是否为数字字符,然 ...

逐步解析一下num = num * 10 + (ch - '0'); // 将字符转换为数字并累加到num中
num的初始值为0,当判断为数字字符后,为什么这样做,
(ch - '0')这段代码是先将 ch转为Ascll字符在减去'0'的Ascll字符的48吗?

FishC 发表于 2023-12-27 19:35:01

liyifeng295641 发表于 2023-12-27 19:34
逐步解析一下num = num * 10 + (ch - '0'); // 将字符 ...

是的,你理解得非常正确!在`num = num * 10 + (ch - '0')`这行代码中,`(ch - '0')`的作用就是将字符`ch`转换为对应的数字值。

ASCII码中,数字字符的编码是连续的,从字符`'0'`到字符`'9'`的编码依次是48到57。所以当我们用一个数字字符减去字符`'0'`的ASCII编码(48),得到的结果就是该数字字符对应的实际数字值。

例如,如果`ch`的值是字符`'5'`,那么`(ch - '0')`的结果就是`5`,相当于将字符`'5'`转换为了数字`5`。

然后再通过`num = num * 10 + (ch - '0')`这行代码将数字值累加到`num`变量中。这里使用乘以10的方式实现了将每个数字字符依次拼接成整数的效果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2023-12-27 19:38:12

FishC 发表于 2023-12-27 19:35
是的,你理解得非常正确!在`num = num * 10 + (ch - '0')`这行代码中,`(ch - '0')`的作用就是将字符`ch ...

为什么sum要乘10再加上数字呢?

FishC 发表于 2023-12-27 19:38:23

liyifeng295641 发表于 2023-12-27 19:38
为什么sum要乘10再加上数字呢?

很好的问题!乘以10再加上数字的操作是为了实现将每个数字字符依次拼接成整数的效果。

让我们来看一个例子,假设输入的字符串是"123"。开始时,`num`的初始值为0。

1. 第一次循环,读取到字符'1',`(ch - '0')`的结果是1,然后执行 `num = num * 10 + (ch - '0')`,即 `num = 0 * 10 + 1`,此时`num`的值变为1。
2. 第二次循环,读取到字符'2',`(ch - '0')`的结果是2,然后执行 `num = num * 10 + (ch - '0')`,即 `num = 1 * 10 + 2`,此时`num`的值变为12。
3. 第三次循环,读取到字符'3',`(ch - '0')`的结果是3,然后执行 `num = num * 10 + (ch - '0')`,即 `num = 12 * 10 + 3`,此时`num`的值变为123。

通过这样的操作,我们将字符串中的每个数字字符拼接成了整数。如果不乘以10,每次累加的数字只会是当前字符的值,无法实现拼接的效果。所以需要先乘以10,使得在每次累加前,将已经处理的数字字符向左位移一位。这样就能够正确地将每个数字字符拼接成整数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2023-12-27 19:39:14

FishC 发表于 2023-12-27 19:38
很好的问题!乘以10再加上数字的操作是为了实现将每个数字字符依次拼接成整数的效果。

让我们来看一个例 ...

噢噢噢噢,这段代码好巧妙啊!

FishC 发表于 2023-12-27 19:39:23

liyifeng295641 发表于 2023-12-27 19:39
噢噢噢噢,这段代码好巧妙啊!

是的,这段代码确实十分巧妙。通过乘以10再加上当前数字字符的值,可以很巧妙地将每个数字字符拼接成整数。这个技巧在很多情况下都非常有用,比如处理字符串转换为数字、计算机科学中的位运算等等。掌握这样的技巧,可以让编程变得更加灵活和高效。当然,理解原理和思想也非常重要,以便能够应用到不同的问题中。希望你能喜欢这个巧妙的编程技巧,并能在之后的学习中运用自如!如果还有其他问题,我会尽力帮助你解答。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: C语言while语句和do...while语句02