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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
skpbtz
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 14
#1

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

24.01.2014, 02:20. Просмотров 560. Ответов 9
Метки нет (Все метки)

Помогите разобраться с задачей по практике, что только не пробовал, программа упорно отказывается работать. Алгоритм достаточно прост и понятен, но как его реализовать я не до конца понимаю.
В общем, задача звучит так: Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки.
Использовал функцию 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," ,.-");
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2014, 02:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки. (C++):

Файловый ввод/вывод. Во всех словах строки переставить все входящие буквы «а» в начало слова, а буквы «я» – в конец - C++
Здравствуйте! Помогите, пожалуйста, составить программу, которая считывает из текстового файла input.txt строку символов S.Во всех словах...

Строки. В каждом чётном по порядку слове удалить все нечётные буквы, а в каждом нечётном слове удалить все чётные буквы. - C++
8.4.1. Помогите, пожалуйста, решить задачу в С++. Дана строка символов, состоящая из русских слов, разделённых пробелами. В...

Записать в массив буквы, которых нет в слове monarchy - C++
имеется два массива arr_1={'m','o','n','a','r','c','h','y'}; arr_2={'A',...'Z'}; как записать в третий массив arr_3 буквы алфавита...

Большие согласные буквы сделать маленькими - C++
Вводится несколько строк. Большие согласные буквы нужно сделать маленькими. Помогите пожалуйста, очень нужно! Добавлено через 10 часов...

Дано слово. Удалить из него все повторяющиеся буквы, оставив их первые вхождения, то есть в слове должны остаться только различные буквы. - C++
Дано слово. Удалить из него все повторяющиеся буквы, оставив их первые вхождения, то есть в слове должны остаться только различные буквы....

Строковые типы данных (заменить все прописные (большие) буквы латинского алфавита строчными (маленькими)) - C++
Ввести с клавиатуры строку и заменить все прописные (большие) буквы латинского алфавита строчными (маленькими). Язык С++ (дано Edit1 и...

9
ninja2
814 / 188 / 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;
}
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, то есть, как только какая-то из букв совпадает, то мы выходим из цикла сразу к вывода слова, без его изменения, и переходим к следующему слову, в случае, если цикл, в котором мы проверяем буквы текущего слова, доходит до конца, то мы меняем регистр буквы на маленький и переходим к следующему слову, алгоритм вроде прост и доложен работать, но, видимо, что-то в коде не так.
Подскажите что не так и как сделать правильно, а то уже третий или четвёртый день мучаюсь с ней, практика заканчивается через неделю, а лабораторных ещё прилично длеать.
0
Ev[G]eN
iOS/Android Developer
Эксперт С++
5115 / 1553 / 384
Регистрация: 23.01.2011
Сообщений: 3,177
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;
}
1
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
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
1
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.
Спасибо Вам, буду знать на будущее.
0
Ev[G]eN
iOS/Android Developer
Эксперт С++
5115 / 1553 / 384
Регистрация: 23.01.2011
Сообщений: 3,177
24.01.2014, 15:36 #7
Tulosba, по поводу string и cstring. изначально хотел реализовать при помощи std::string. потом решил пожалеть автора, но изменить заголовочник забыл.
0
skpbtz
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 14
24.01.2014, 15:41  [ТС] #8
Ev[G]eN, Не подскажете, а как сделать сравнение букв, не зависимо от регистра? а то программа делает буквы маленькими даже, если буква есть, но она не в том регистре, не критично конечно, но, из интереса хотелось бы узнать.
0
Ev[G]eN
iOS/Android Developer
Эксперт С++
5115 / 1553 / 384
Регистрация: 23.01.2011
Сообщений: 3,177
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(). роли не играет
1
skpbtz
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 14
24.01.2014, 18:33  [ТС] #10
Ev[G]eN, как всё просто оказалось.
Спасибо Вам за помощь.
0
24.01.2014, 18:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2014, 18:33
Привет! Вот еще темы с ответами:

все не повторяющиеся буквы в словах - C++
Всем привет=)) подскажите как записать условие, что бы он выводил все не повторяющиеся буквы в словах???

Найти все гласные буквы в словах - C++
дано натурально число n ,и символы S1,S2,S3....группа символов ,которые разделены пробелами и не имеют в середине себя пробелов будем...

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

Вывести буквы в словах строки задом-наперед - C++
я немного переделал под себя прогу которую сделали чтобы было понятно, у меня она потеряла смысл ,помогите разобраться? Вот я...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru