Форум программистов, компьютерный форум CyberForum.ru

Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки. - C++

Восстановить пароль Регистрация
 
skpbtz
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 14
24.01.2014, 02:20     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки. #1
Помогите разобраться с задачей по практике, что только не пробовал, программа упорно отказывается работать. Алгоритм достаточно прост и понятен, но как его реализовать я не до конца понимаю.
В общем, задача звучит так: Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки.
Использовал функцию strtok, нашёл последнее слово, записал его, а вот как сравнивать буквы в остальных словах с последним, я никак понять не могу, пробовал многое, в любом случае выдавало ошибки при компиляции, в основном с несовместимостью типов данных.
Вот мой код, Visual Studio C++ 2008, если где сильно и глупо накосячил прошу сильно не ругать, знаний маловато пока.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cctype>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    char str[100];
    int i,j,k;
    cout<<"Введите предложение (на английском языке): \n";
    gets(str);
    cout<<"\n\n";
    cout<<str;
    cout<<"\n\n";
 
    char * pch = strtok(str," ,.-");
    char * wrd;
 
    while (pch!=NULL)
    {
        cout<<pch<<"\n";
        wrd=pch;
        pch=strtok(NULL," ,.-");
    }
 
    cout<<"\n";
    cout<<wrd;            //последнее слово строки
 
    cout<<"\n\n";
    system("pause");
}
Вот небольшой кусочек. Пытался сделать переменную, в которую записывал бы текущее слово в строке для сравнения, для начала, попытался хотя бы вывести слово, но, видимо то ли с циклом напутал что то, то ли опять же что-то с типами, в общем.

C++
1
2
3
4
5
6
7
8
9
10
    while (pch!=NULL)
    {
        wrd2=pch;
        while (wrd2!=NULL)
        {
            cout<<wrd2<<"  ";
        }
        
        pch=strtok(NULL," ,.-");
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2014, 02:20     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки.
Посмотрите здесь:

Найти все гласные буквы в словах C++
все не повторяющиеся буквы в словах C++
C++ Дано слово. Удалить из него все повторяющиеся буквы, оставив их первые вхождения, то есть в слове должны остаться только различные буквы.
C++ Большие согласные буквы сделать маленькими
Записать в массив буквы, которых нет в слове monarchy C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
24.01.2014, 03:13     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки. #2
Я те лучше полностью прогу рабочую скину:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <regex>
#include <string>
using namespace::std;
 
int main()
{
    string s="HELLOW bb ddddd dddd adfasd";
    smatch sm;
    string last="";
    string result="";
 
//  cout <<"Enter a string...\n";
//  getline(cin,s);
 
    cout <<"s= "<<s<<endl;
    if(regex_search(s,sm,regex("(\\w+)\\s*\\S\\s*$")))
        last=sm[1].str();
    else
        return 1;
 
    while(regex_search(s,sm,regex("\\w+")))
    {
        try
        {
            for(int i=0;i<last.size();i++)
                for(int j=0;j<sm[0].str().size();j++)
                    if(tolower(last[i])==tolower(sm[0].str()[j]))
                        throw(1);
        }
        catch(...)
        {
            result+=sm.prefix().str();
            result+=sm[0].str();
            s=sm.suffix().str();
            continue;
        }
 
        result+=sm.prefix().str();
        for(int i=0;i<sm[0].str().size();i++)
            result+=toupper(sm[0].str()[i]);
        s=sm.suffix().str();
    }
    result+=s;
 
    cout <<"result= "<<result<<endl;
 
    return 0;
}
skpbtz
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 14
24.01.2014, 13:25  [ТС]     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки. #3
Цитата Сообщение от ninja2 Посмотреть сообщение
Я те лучше полностью прогу рабочую скину:
Спасибо за вариант, но, мне необходимо было использовать strtok, да и преподаватель удивился бы, используй я те функции, которые были в вашем коде, один только #include <regex> вызывал бы большое сомнение в том, что делал сам и понимаю, как работает)

В общем, я тут дописал сегодня на парах, вот кусок кода, циклы, с помощью которых сравниваю буквы в словах с буквами в последнем слове, ну и вывод потом этих слов, меняя регистр на нижний где надо, но, к сожалению, не работает, и не могу до конца понять как пользоваться функцией tolower()!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    pch = strtok(str2," ,.-");
 
    while (pch!=NULL)
    {
        wrd2=pch;
        for (i=0;i<=strlen(wrd2);i++)
        {
            for (j=0;j<=strlen(wrd);j++)
            {
                if (wrd2[i]==wrd[j])
                    goto x;
            }
        }
        if (i==strlen(wrd2))
        {
            cout<<tolower(wrd2);
            goto y;
    }   
x:      cout<<wrd2<<"  ";
y:      pch=strtok(NULL ," ,.-");
        
    }
Я попытался пойти напрямую, использовав goto, то есть, как только какая-то из букв совпадает, то мы выходим из цикла сразу к вывода слова, без его изменения, и переходим к следующему слову, в случае, если цикл, в котором мы проверяем буквы текущего слова, доходит до конца, то мы меняем регистр буквы на маленький и переходим к следующему слову, алгоритм вроде прост и доложен работать, но, видимо, что-то в коде не так.
Подскажите что не так и как сделать правильно, а то уже третий или четвёртый день мучаюсь с ней, практика заканчивается через неделю, а лабораторных ещё прилично длеать.
Ev[G]eN
Эксперт С++
 Аватар для Ev[G]eN
5093 / 1531 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
24.01.2014, 15:05     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки. #4
Цитата Сообщение от skpbtz Посмотреть сообщение
Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки.
как вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <string>
 
int main()
{
    const char *delimeters = " ,.-";
    const size_t maximalStringLength = 256;
 
    char string[maximalStringLength];
    std::cout << "Input the string: " << std::endl;
    gets(string);
 
    char *stringCopy = new char[strlen(string) + 1];
    strcpy(stringCopy, string);
 
    char *lastWord = nullptr;
    char *ptrLastWord = strtok(stringCopy, delimeters);
    while (ptrLastWord) {
        lastWord = ptrLastWord;
        ptrLastWord = strtok(nullptr, delimeters);
    }
    std::cout << "Last word in the string: ";
    puts(lastWord);
 
    std::cout << std::endl << "Result words: " << std::endl;
    char *currentWord = strtok(string, delimeters);
    while (currentWord) {
        size_t counter = 0;
        for (size_t i = 0; i < strlen(currentWord); i++) {
            for (size_t j = 0; j < strlen(lastWord); j++) {
                counter += currentWord[i] == lastWord[j];
            }
        }
        if (!counter) {
            for (size_t i = 0; i < strlen(currentWord); i++) {
                currentWord[i] = tolower(currentWord[i]);
            }
        }
        std::cout << currentWord << ' ';
        currentWord = strtok(nullptr, delimeters);
    }
    std::cout << std::endl;
 
    std::system("pause");
    return 0;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.01.2014, 15:25     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки. #5
Цитата Сообщение от Ev[G]eN Посмотреть сообщение
for (size_t i = 0; i < strlen(currentWord); i++) {
Кто Вас научил так писать?
Для работы с сишными строками надо
C++
1
#include <сstring>
или
C++
1
#include <string.h>
а не
C++
1
#include <string>
, который для std::string
skpbtz
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 14
24.01.2014, 15:34  [ТС]     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки. #6
Цитата Сообщение от Ev[G]eN Посмотреть сообщение
как вариант:
Огромное спасибо, всё работает, с алгоритмом разобрался, всё понятно. Единственное, что изменил: nullptr заменил на NULL, потому что программа отказывалась запускаться и выдавала ошибку.
Ещё раз, спасибо.

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
Кто Вас научил так писать?
Для работы с сишными строками надо
C++
1
#include <сstring>
или
C++
1
#include <string.h>
а не
C++
1
#include <string>
, который для std::string
Я писал с примеров с разных сайтов, в основном CppStudio.
Спасибо Вам, буду знать на будущее.
Ev[G]eN
Эксперт С++
 Аватар для Ev[G]eN
5093 / 1531 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
24.01.2014, 15:36     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки. #7
Tulosba, по поводу string и cstring. изначально хотел реализовать при помощи std::string. потом решил пожалеть автора, но изменить заголовочник забыл.
skpbtz
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 14
24.01.2014, 15:41  [ТС]     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки. #8
Ev[G]eN, Не подскажете, а как сделать сравнение букв, не зависимо от регистра? а то программа делает буквы маленькими даже, если буква есть, но она не в том регистре, не критично конечно, но, из интереса хотелось бы узнать.
Ev[G]eN
Эксперт С++
 Аватар для Ev[G]eN
5093 / 1531 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
24.01.2014, 16:22     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки. #9
skpbtz, сравнивать их переведя в один регистр, например в моем коде
Цитата Сообщение от Ev[G]eN Посмотреть сообщение
C++
1
counter += currentWord[i] == lastWord[j];
сделать
C++
1
counter += tolower(currentWord[i]) == tolower(lastWord[j]);
или toupper(). роли не играет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2014, 18:33     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки.
Еще ссылки по теме:

C++ Строковые типы данных (заменить все прописные (большие) буквы латинского алфавита строчными (маленькими))
C++ Строки. В каждом чётном по порядку слове удалить все нечётные буквы, а в каждом нечётном слове удалить все чётные буквы.
Файловый ввод/вывод. Во всех словах строки переставить все входящие буквы «а» в начало слова, а буквы «я» – в конец C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
skpbtz
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 14
24.01.2014, 18:33  [ТС]     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки. #10
Ev[G]eN, как всё просто оказалось.
Спасибо Вам за помощь.
Yandex
Объявления
24.01.2014, 18:33     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки.
Ответ Создать тему
Опции темы

Текущее время: 22:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru