Сравнение символов в строках с использованием указателей на массивы - PullRequest
0 голосов
/ 03 мая 2020

Я работаю над заданием для завершения функции bool isEven(char* s, char* v). Назначение функции - подсчитать вхождение определенных букв, указанных (обозначенных v) в строку (обозначенных s). s и v являются указателями на массивы, содержащие символы.

Функция возвращает true, если число экземпляров букв из v, найденных в s, является четным. Например, учитывая строку "once upon a time" и строку букв для подсчета, например, гласные, "aeiou", он вернет false, потому что есть 7 гласных (гласные были только примером, это может быть любая случайная строка письма).

У меня есть переменная count для подсчета случаев, когда любая буква в v встречается в s. Когда я запускаю свою программу, мой счет всегда возвращается как 0. Что я делаю неправильно? Может кто-нибудь сказать мне, как исправить мой код, чтобы исправить это?

Я пробовал это также с вложенными циклами while и получил то же самое.

bool isEven(char* s, char* v) {
    int count = 0;
    // iterate through de-referenced strings
    for (int i = 0; *(s+i) != '\0'; i++) {
        for (int j = 0; *(v+j) != '\0'; j++) {
            if (*(s+i) == *(v+j)) {
                count++;
            }
        }
    }

    // check count output
    std::cout << count;

    if (count % 2 == 0) {
        return true;
    }
    else {
        return false;
    }
}

Ответы [ 4 ]

0 голосов
/ 03 мая 2020

Два уровня l oop - это раствор O (M * N). Поскольку существует не более 256 возможных символов, обычно наиболее оптимальный способ - использовать массив из 256 целых чисел для подсчета вхождения каждого символа, а затем go по символам в v и суммирования вхождения этих символов.

Для этого решения требуется только go над s и v один раз, сложность O (M + N). Разница в производительности значительна, когда ввод s очень большой (например, книги Гарри Поттера).

bool isEven(char* s, char* v) {
    int counts[256];  // counter for each possible letters.
    for (int i = 0; i < 256; ++i) counts[i] = 0;
    char* p = s;
    while (*p) ++counts[static_cast<uint8_t>(*p++)];  // count occurrence of each letter.
    p = v;
    int count = 0;
    while (*p) count += counts[static_cast<uint8_t>(*p++)];  // accumulate total occurrence
    return (count % 2 == 0);
}
0 голосов
/ 03 мая 2020

Это была проблема с моим компилятором, а не с кодом, когда я исправил! = В своих циклах for, поэтому код здесь и выше верен. Спасибо всем, кто нашел время, чтобы попытаться помочь!

bool isEven(char* s, char* v) {
    int count = 0;
    // iterate through de-referenced strings
    for (int i = 0; *(s+i) != '\0'; i++) {
        for (int j = 0; *(v+j) != '\0'; j++) {
            if (*(s+i) == *(v+j)) {
                count++;
            }
        }
    }
    //check count 
    std::cout << count << '\n';

    if (count % 2 == 0) {
        return true;
    }
    else {
        return false;
    }
}
0 голосов
/ 03 мая 2020

Программа отлично работает с некоторыми незначительными модификациями типов, чтобы избежать предупреждений.

PS: я пробовал с последней версией g cc (9.3), и ниже ссылка на живой пример: https://gcc.godbolt.org/z/WWHecV

0 голосов
/ 03 мая 2020

Следующий код работает для меня и, вероятно, ответ для вас:

#include <iostream>

bool isEven(char[], char[]);

int main(void)
{
    bool flag = isEven("Hello Worldo", "aeiou");

    if (flag)
        std::cout << "Even" << std::endl;
    else
        std::cout << "Not even." << std::endl;
}

bool isEven(char toCheck[], char from[])
{
    int count = 0;

    for (int i = 0; toCheck[i] != '\0'; i++)
    {
        for (int j = 0; from[j] != '\0'; j++)
        {
            if (toCheck[i] == from[j])
            {
                count++;
            }
        }
    }
    std::cout << count << std::endl;

    return (count % 2 == 0) ? true : false;
}

Выход

4
Even

Символ в массиве строка Hello Worldo будет отображаться 4 с Even, если в toCheck найдены гласные или любой введенный символ from, он будет считать и определять, делится ли это на 2. Если нет, то возвращает false (не даже), в противном случае true (даже).

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