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

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

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

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

24.01.2014, 02:20. Просмотров 511. Ответов 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," ,.-");
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2014, 02:20     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки.
Посмотрите здесь:

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Эксперт С++
5096 / 1534 / 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
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Эксперт С++
5096 / 1534 / 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
Эксперт С++
5096 / 1534 / 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++
не могли бы вы помочь???буду очень благодарна! &quot;заменит все малые буквы в русских словах одноименными большими&quot;

В текстовом файле заменить все строки, начинающиеся с буквы ‘f’ на строки, начинающиеся с буквы ‘a’ - 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     Сделать маленькими все буквы в тех словах, в которых нет ни одной буквы, встречающейся в последнем слове строки.
Ответ Создать тему
Опции темы

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