Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2021, 02:52   #11
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Код:
#include <iostream>
#include <string.h>

using namespace std;

struct List
{
    char word[30];
    List *pred, *next;
};

List* Init()
{
    List *p, *r, *beg = nullptr;
    cout << "INPUT LIST" << endl;

    beg = new List;
    beg->pred = nullptr;
    beg->next = nullptr;
    p = beg;

    while (cin >> p->word)
    {
        if (strchr(p->word, '.') != NULL)
            break;
        r = new List;
        p->next = r;
        r->pred = p;
        r->next = nullptr;
        p = r;
    }

    return beg;
}

int print_list(List *beg)
{
    int n = 0;
    if (beg == nullptr)
    {
        cout << "The list is empty\n";
        return n;
    }
    List *p = beg;
    while (p)
    {
        cout << p->word << endl;
        n++;
        p = p->next;
    }
    return n;
}

int count_words(List *beg, char forb_ch)
{
    int count = 0;
    List* p = beg;
    while (p) {
        if (strchr(p->word, forb_ch) == NULL)
            count++;
        p = p->next;
    }
    return count;
}

int main()
{
    List *beg = nullptr, *tmp;
    int i;
    do
    {
        cout << "1. Make list" << endl
             << "2. Print list" << endl
             << "3. Count of words without forbidden symbol" << endl
             << "4. Exit" << endl;
        cin >> i;
        switch (i)
        {
        case 1:
        {
            beg = Init();
            break;
        }
        case 2:
        {
            cout << "Count of words = " << print_list(beg) << endl;
            break;
        }
        case 3:
            char ch;
            cout << "Forbidden symbol" << endl;
            cin >> ch;
            cout << "Count of words without forbidden symbol = " << count_words(beg, ch) << endl;
            break;
        case 4:
            // exit
            break;
        default:
            cout << "Wrong choice" << endl;
        }
    } while (i != 4);
    while (beg)
    {
        tmp = beg;
        beg = beg->next;
        delete tmp;
    }
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 01.06.2021, 08:08   #12
nonameii3ii
Пользователь
 
Регистрация: 16.04.2021
Сообщений: 73
По умолчанию

BDA, Можете пожалуйста,рассписать что к чему
nonameii3ii вне форума Ответить с цитированием
Старый 01.06.2021, 19:38   #13
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

А что именно непонятно? Функция count_words чуть-чуть отличается от вашей print_list. Init тоже совсем чуть-чуть отличается.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 01.06.2021, 21:09   #14
nonameii3ii
Пользователь
 
Регистрация: 16.04.2021
Сообщений: 73
По умолчанию

BDA, Как все это по чу-чуть ,и ничего не понятно,пожалуйста распишите ,если вам не тяжело
конечно
nonameii3ii вне форума Ответить с цитированием
Старый 02.06.2021, 00:35   #15
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Раньше в Init посимвольно считывался ввод, заполнялся список, пока не встретится точка. А теперь считывается "слово" целиком (до пробельных символов). А с помощью strchr проверяется, нет ли в последнем считанном слове точки. Если есть, то дальше список не растет, а если нет - то создается новый элемент списка, подвешивается в конец и на следующей итерации цикла в него будет считано слово.
По поводу подсчета слов (count_words). Сначала запрашивается запрещенный символ и передается в функцию вместе с головой списка. А внутри функции проходимся по всем элементам списка и проверяем с помощью той же strchr, что в слове нет этого символа, и если нет, то увеличиваем счетчик.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 02.06.2021, 10:24   #16
nonameii3ii
Пользователь
 
Регистрация: 16.04.2021
Сообщений: 73
По умолчанию

BDA,,а что тут?
while (beg)
{
tmp = beg;
beg = beg->next;
delete tmp;
}
nonameii3ii вне форума Ответить с цитированием
Старый 02.06.2021, 19:36   #17
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Это удаление списка перед выходом из программы. Хотя сейчас понял, что возможна утечка памяти, если несколько раз выбрать меню создания списка.
Код:
#include <iostream>
#include <string.h>

using namespace std;

struct List
{
    char word[30];
    List *pred, *next;
};

List* Init()
{
    List *p, *r, *beg = nullptr;
    cout << "INPUT LIST" << endl;

    beg = new List;
    beg->pred = nullptr;
    beg->next = nullptr;
    p = beg;

    while (cin >> p->word)
    {
        if (strchr(p->word, '.') != NULL)
            break;
        r = new List;
        p->next = r;
        r->pred = p;
        r->next = nullptr;
        p = r;
    }

    return beg;
}

int print_list(List *beg)
{
    int n = 0;
    if (beg == nullptr)
    {
        cout << "The list is empty\n";
        return n;
    }
    List *p = beg;
    while (p)
    {
        cout << p->word << endl;
        n++;
        p = p->next;
    }
    return n;
}

int count_words(List *beg, char forb_ch)
{
    int count = 0;
    List* p = beg;
    while (p) {
        if (strchr(p->word, forb_ch) == NULL)
            count++;
        p = p->next;
    }
    return count;
}

void del_list(List *beg)
{
    List* tmp;
    while (beg)
    {
        tmp = beg;
        beg = beg->next;
        delete tmp;
    }
}

int main()
{
    List *beg = nullptr, *tmp;
    int i;
    do
    {
        cout << "1. Make list" << endl
             << "2. Print list" << endl
             << "3. Count of words without forbidden symbol" << endl
             << "4. Exit" << endl;
        cin >> i;
        switch (i)
        {
        case 1:
        {
            del_list(beg);
            beg = Init();
            break;
        }
        case 2:
        {
            cout << "Count of words = " << print_list(beg) << endl;
            break;
        }
        case 3:
            char ch;
            cout << "Forbidden symbol" << endl;
            cin >> ch;
            cout << "Count of words without forbidden symbol = " << count_words(beg, ch) << endl;
            break;
        case 4:
            // exit
            break;
        default:
            cout << "Wrong choice" << endl;
        }
    } while (i != 4);
    del_list(beg);
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задачи по паскалю: в строке, состоящей из слов подсчитать количество слов на заданный символ; нарисовать пирамидку Sasha_KS Паскаль, Turbo Pascal, PascalABC.NET 1 18.03.2014 22:00
Посчитать количество слов в кольцевом списке из элементов типа String, начинающихся на тот же символ, что и следующее слово. azalia Паскаль, Turbo Pascal, PascalABC.NET 7 13.01.2014 13:26
С++ 2)Посчитать количество слов, не содержащих цифр. mmf_Valya Помощь студентам 4 07.12.2012 21:24
подсчитать количество слов, в которые входит символ "е" Zhasik Паскаль, Turbo Pascal, PascalABC.NET 3 27.12.2010 10:29
Найти количество слов, содержащих цифры to-ot Фриланс 11 16.04.2010 17:56