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

Пoмoгите со строковыми типами данных - C++

Восстановить пароль Регистрация
 
deadkill
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 17
05.04.2012, 20:18     Пoмoгите со строковыми типами данных #1
Дан текст, состоящий не менее чем из пяти слов. Вывести на экран слова, которые имеют одинаковые окончания "ИЯ","ИСТ","ИКА".
С этой темой не могу разобраться, только начало написал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string.h>
using namespace std;
void main ()
{
int const n=100, kol=10;
typedef char String [n];
String s, mas [kol];
cout<<"Vvedite stroku: ";
cin.getline (s,100);
cout<<s<<endl;
int k=0;
char* token=strtok (s," ");
while (token);
{
    strcpy (mas[k++],token);
    token = strtok (NULL," ");
}
cout<<"Massiv strok:\n";
for (int i=0;i<k;i++)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
05.04.2012, 21:18     Пoмoгите со строковыми типами данных #2
Мое приветствие, deadkill
Если задача поставлена на применение методов библиотек string.h и stdlib.h, то я бы предложил такой вариант:
(Заранее извиняюсь, не профессионал, потому решено в лоб и не красиво)
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
char buffer[15];// , text[100];
char text[] = "мужия ФРУЖИЯ, оружИЯ, ВИРИКА, ПИСТ ФИСТ";
 
 
for ( int i = 0, j = 0 ; i < sizeof(text) ; ++i, ++j )
{
    if (text[i] == ' ' || text[i] == ',' || text[i] == '.' || text[i] == '\0')
    {
        buffer[j] = '\0';
        if ( (strstr (&buffer[j-3],"ИЯ") != &buffer[j]) || (strstr(&buffer[j-3],"ИКА") != &buffer[j]) || (strstr(&buffer[j-3],"ИСТ") != &buffer[j]))
        {
            if (j > 1) {
                ShowMessage(buffer);
                //std::cout<<buffer<<endl;
            }
            j=-1;
        }
    }
    else
    {
        buffer[j] = text[i];
    }
 
}
Смысл в посимвольном чтении слов и сравнивании последних трех букв с окончаниями, методом strstr
deadkill
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 17
05.04.2012, 22:30  [ТС]     Пoмoгите со строковыми типами данных #3
Программа выводит все слова, независимо от окончания с новой строки

Добавлено через 43 минуты
Можно ли дальше её доделать таким методом:
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
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
void main ()
{
    setlocale(LC_ALL,"rus");
 int const n=100, kol=10;
    typedef char String [n];
    String s, mas [kol];
    cout<<"Введите строку: ";
    cin.getline (s,100);
    cout<<s<<endl;
    int k=0;
char* token=strtok(s," ");
while (token)
{
    strtoken (mas [k++], token);
    token = strtok (NULL," ");
}
cout<<"Массив слов:/n";
for (int i=0; i<k;i++)
cout<<mas[i]<<": "<<strlen (mas[i])<<endl;
String t;
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
06.04.2012, 13:16     Пoмoгите со строковыми типами данных #4
Извиняюсь, не отладил как следует... моя ошибка.


изменения
-вынес проверку на размер буфера перед проверкой слова.
-проверка окончания. Проверяет возврат метода strstr(...) на значение NULL (Но я думал что в сулчае не нахождения окончания, матод должен был бы вернуть указатель на последний символ проверяемого слова
-"обнуление" переменной j вынесена в конец цикла на проверку слова

минусы
-проверяются слова учитывая регистр, поэтому находится будут только те что написаны с высоким регистром "ИЯ" , "ИКА", "ИСТ" ... слова с окончаниями "иЯ", "ия", "Ия", "иКа", "ика", "Ика", "икА" , "иКА", "ИКа", "ИкА", "ист", "Ист","ИСт", "иСТ", "исТ", "ИсТ" , "иСт" не будут выводиться.

теория
-делать проверку по каждому окончанию в одном if при помощи "ИЛИ" мне кажется не только не красивым, но и перебором. Могу прдложить создать отдельный массив строк с этими окончаниями и проверять возвращяемое значение методом strstr в еще одном вложенном цикле. Возможно есть аналог функции strstr, которая не обращяет внимание на регистр букв (но я такой не помню)
-интеррацияю перемнной j , не плохо было бы вытащить из цикла и вставить после [I]buffer[j] = text;, тогда не придется присваивать ей -1. Я говорил, что пишу некрасиво
-логическим окончанием слова считает " " или "," или ".". Это не всегда ведь верно, могу предложить вариант: вроде встречал метод, который проверяет символы на соответствие алфовитным буквам.


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
char buffer[15];// , text[100];
char text[] = " вот фурИЯ тахекардия это прикол, круто че?!";
 
 
for ( int i = 0, j = 0 ; i < sizeof(text) ; ++i, ++j )
{
    if (text[i] == ' ' || text[i] == ',' || text[i] == '.' || text[i] == '\0')
    {
        buffer[j] = '\0';
        if (j > 1)
        {
            if ( (strstr (&buffer[j-3],"ИЯ") != NULL) || (strstr(&buffer[j-3],"ИКА") != NULL) || (strstr(&buffer[j-3],"ИСТ") != NULL))
            {
 
                ShowMessage(buffer);
                //std::cout<<buffer<<endl;
            }
 
        }
        j=-1;
    }
    else
    {
        buffer[j] = text[i];
    }
 
}
Добавлено через 4 минуты
Цитата Сообщение от deadkill Посмотреть сообщение
с новой строки

C++
1
std::cout<<buffer<<endl;
Это из-за endl;
deadkill
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 17
12.04.2012, 00:43  [ТС]     Пoмoгите со строковыми типами данных #5
А если использовать ручной ввод слов, сразу не помещая его в массив?
И не используя функцию "setlocale(LC_ALL,"rus");"
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
17.04.2012, 15:49     Пoмoгите со строковыми типами данных #6
Цитата Сообщение от deadkill Посмотреть сообщение
А если использовать ручной ввод слов, сразу не помещая его в массив?
ты имеешь ввиду небуфферизированный ввод? (когда считывается по одному символу и сразу же записывается/обрабатывается?
...или ручной ввод. Но тут все ровно когда вводишь, должно куда-то через cin идти. Можно строку как у тебя считывать, а можно забить цикл с обычным cin >> word , который выйдет из цикла только если считается какой-нибудь определенный символ (например точка "." )



Цитата Сообщение от deadkill Посмотреть сообщение
И не используя функцию "setlocale(LC_ALL,"rus");"
Чесно говоря, у меня она вообще не работает ни с какими параметрами (".1251" "Russian" ... ) (Писал CBuilder console C++ , может надо было выбрать Cи )
Так же не помогли :
C++
1
2
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
тут может быть полезное

Получилось выводить по русски при помощи метода
C++
1
2
3
    CharToOem(const char* A, char* B);
//Записывает в созданный массив символов char В русские символы из А так,
// что выводится в консоль без кривизны
А вот вводить с помощью нее не получилось. Вернее как: При вводе печатаются иероглифы, после обработки введеного, выводится все по русски.
Yandex
Объявления
17.04.2012, 15:49     Пoмoгите со строковыми типами данных
Ответ Создать тему
Опции темы

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