c++ 如何理解这些功能背后的逻辑?

2mbi3lxu  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(139)
#include <iostream>
#include <cstring>

using namespace std;

long digitToLong(char c) { // function returns the value type long (c - '0') and takes the char c as an argument. 
    return c - '0';  // c is equal to (text[i]) and 0 is the code ascii assigned as a nr 0.
}

long toLong(string text) {. /* takes a text that represents a number and then transfers              the text into a number.*/
    long result = 0;  

    for (int i = 0; i < text.length(); i++) { /* for loop that iterates through every character included in a text length.*/
        result *= 10;  
        result += digitToLong(text[i]); 
    }

    return result;
}

int main() {
    char number[] = "0123456789";

    cout << (toLong("0") == 0) << endl; 
    cout << (toLong("1") == 1) << endl;
    cout << (toLong("2") == 2) << endl;
    cout << (toLong("5") == 5) << endl;
    cout << (toLong("12") == 12) << endl;
    cout << (toLong("123") == 123) << endl;
    cout << (toLong("12345") == 12345) << endl;
}

在上面的代码中,我的老师使用了字符串到长字符串的转换方法,我们将每个字符与其ASCII值进行比较,然后获得该数字字符的值。我试图描绘这个转换的过程,我被上面的两行代码卡住了,因此我把我的问题直接问到StackOverflow社区,希望这个问题能得到回答。行结果 *= 10;并且result += digitToLong(text[I])也可以写成 result = result * 10 + (c - '0')正确吗?为什么要把result乘以10?我假设这是因为在十进制中,乘以10会将所有数字移到左边,改变它的值。它在现实中是如何应用于这段代码的?其背后的“机制”是什么?
在这段代码中,C到底被赋值了什么?怎么读?Ic c等于文本[I]吗?那么,文本[I]下面是什么?for循环的迭代怎么算?我真的试图理解程序的逻辑(尤其是函数),但有些部分还无法忍受。
我尽我所能做了我的研究,我真的希望我的问题能得到回答。

dgjrabp2

dgjrabp21#

Q1.代码的作用和机制是什么?

long toLong(string text) {. /* takes a text that represents a number and then transfers              the text into a number.*/
    long result = 0;  

    for (int i = 0; i < text.length(); i++) { /* for loop that iterates through every character included in a text length.*/
        result *= 10;  
        result += digitToLong(text[i]); 
    }

    return result;
}

你说得对。执行此操作是因为您从左侧逐个获取数字(最高有效数字),但需要从右侧插入。
让我们试着把它分解。

  • 第一次进入循环
  • 当前为result = 0,因此乘以10没有任何作用。
  • 然后,text [i]以字符形式在左起第一个位置得到1个数字,因为当前是i = 0
  • 所有其他输入
  • 乘以10有效地将所有数字移到左边。新数字的位置现在应该是0。
  • 由于digitTolong()只能得到一个数字,所以简单地将该数字添加到result上就等同于将其粘贴到最右边的位置。

Q2. ctext[i]在这里做什么?

我想你知道数组或向量。字符串的作用是一样的,除了这一次,它是一堆char(字符)。当您使用string[i]时,它只是从左起第i个字符,从零开始。
例如,在string str = "abcdefg"上调用str[3],基本上就是'd'。然后,将其传递给digitToLong()
最后,在字符之间执行减法。你是怎么做到的?
在ACSII代码表中(谷歌一下!),你可以看到,当你有一个字符0时,它实际上存储在内部为数字48。'1'为49,'2'为50,依此类推。
使用这个属性,减去'0'实际上会得到正确的数字值(例如,'1' - '0'实际上会得到49 - 48,它会得到1.),因此您可以在函数中看到字符减法。
希望你现在能明白。

roejwanj

roejwanj2#

int charToDigit(char c)
{
    return c - '0';
}

在这个函数中,我们将字符的ASCII转换为真实的。如果字符是'1',那么ASCII是49,我们从49中减去48'0'字符),得到1

long toLong(string strNumber)
{
    long result = 0;  

    for (int i=0; i<strNumber.length(); i++)
    {
        result *= 10;
        result += charToDigit(strNumber[i]); 
    }

    return result;
}

在这个函数中,你从第一个数字开始迭代从函数中得到的字符串,所以如果你得到"123",你就迭代'1''2'和最后一个'3'
在每次迭代中,您只需*= 10结果,将添加到结果中的数字向左移动,然后再次+=结果,并将下一个数字追加到结果中。

相关问题