почему функция возвращает мне неправильный номер? - PullRequest
0 голосов
/ 22 марта 2020

Напишите и протестируйте свои собственные функции в программе:

  1. int function1 (const char * string1, const char * string2) сравнивает две строки лексикографически, возвращая 0, если строки идентичны, -1, если строка1 раньше, чем строка2, +1, если строка строка1 позже, например, function1 ("cca" , "abcd") -> 1, function1 ("abcde", "b") -> -1
  2. int function2 (const char * string), возвращая количество уникальных цифр, появляющихся в строке, например, function2 ("ab512af6kc1") -> 3.

    int main() {
        cout << cmp("abc","a") << endl;
    }
    int cmp(const char* string1, const char* string2) {
    
        for(int i = 0; i < len(string1); i++) {
    
            if (i == len(string1)) {
                return 0;
            } else if (string1 > string2) {
                return 1;
            } else if (string1 < string2) {
                return -1;
            }
        }
    }
    

Он возвращает мне -1, но должен 1, потому что "ab c" в словаре позже, чем "a".

Как насчет второго упражнения? Я не знаю, с чего начать.

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Живой образец обоих упражнений

Для Упражнение 1 , я считаю, что цель состоит в том, чтобы сделать функцию, аналогичную strcmp() так что важен не размер, а лексикографический порядок, поэтому вам нужно сравнить каждый символ, например, cmp("abcd", "abce") должно быть -1, а cmp("abce", "abcd") или cmp("abe", "ab") должно быть 1:

int cmp(const char* string1, const char* string2) {

    do{
       if(*string1 > *string2){  //because of ASCII codes you can compare characters like this
           return 1;
       }
       if(*string1 < *string2){
           return -1;
       }      
    } while(*string1++ && *string2++); //while none of the chars is null

    return 0;  //reached if no different chars were found so the strings are equal
}

Для Упражнения 2 вы можете извлечь цифры в другой контейнер, отсортировать и сравнить их:

int function2 (const char * str){

    vector<int> digits; //dynamic container since the digit count is unknown at first
    int count = 0;

    for(size_t i = 0; i < strlen(str); i++)  //extract digits from string
        if(str[i] >= '0' && str[i] <= '9')
             digits.push_back(str[i] - '0'); //add to digit container

    sort(digits.begin(), digits.end()); //sort digit vector

    for(size_t i = 0; i < digits.size() - 1; i++){ //compare digits and count if no repeat
        if(digits[i] != digits[i + 1] && digits[i + 1] != digits[i + 2]){
            count++;
        }
    }
    return count;
}

Библиотеки

#include <cstring>
#include <vector>
#include <algorithm>
0 голосов
/ 22 марта 2020

Как я написал в комментариях, вы должны go вернуться и перечитать свою книгу на С ++. string1 и string2 являются указателями, и вы не должны сравнивать их здесь.

Вот рабочее решение для проблемы 1:

#include <cstring>
#include <iostream>

int cmp(const char* string1, const char* string2) {
    int n1 = std::strlen(string1);
    int n2 = std::strlen(string2);
    int i=0;
    while (i<n1 && i<n2)
    {
        if (string1[i] < string2[i]) return -1;
        else if (string1[i] > string2[i]) return 1;
        else i++;
    }
    if (n1 == n2) return 0;
    if (i == n1) return -1;
    return 1;
}

int main()
{
    std::cout << cmp("a","abc") << std::endl;
    return 0;
}

Для второй проблемы вы можете go об этом, сохраняя количество символов, используя хэш-карту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...