Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 4
1

Оставить в слове первые вхождения каждой буквы

24.07.2012, 14:32. Просмотров 3042. Ответов 8
Метки нет (Все метки)

Доброго время суток.
Задача на языке C++.
Дана последовательность слов. Напечатать все слова, предварительно преобразовав каждое из них по следующему правилу: оставить в слове первые вхождения каждой буквы.
Не могу разобраться, как можно написать программу, чтобы в каждом слове, оставляло только первые вхождения каждой буквы.
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
#include<windows.h>
#include<iostream.h>
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
    SetConsoleOutputCP(1251);
    char text[1000],p,r[]=" ,._-!?\"';:()";
    char T[][33] = 
 {
 {'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я'},
 {'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я'}
 };
    int i,q,j;
    char d,sLen;
    cout<<"Введите строку:"<<endl;
    /*gets(s);
    d=strlen(s);
    p=s[1];
    for(i=2;i<d;i++)
        if(strrchr(s[i],p)==0)
            p=s[i]+p;*/
    while(gets(text)!=NULL)
 {
 sLen = strlen(text);
 for(i = 1; i < (sLen-1); i++){
 
 if(text[i-1]=='.'){
 for(i = 1; i < (sLen-1); i++){
 
{
for(j = 0; j < 33; j++) for(i = 0; i < 2; i++)
if(text[i] == T[i][j]) ;}}
 cout<<text<<endl;
 if(q==1) printf("%s\n", text);
 
    cout<<p<<endl;
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.07.2012, 14:32
Ответы с готовыми решениями:

Оставить в слове только первые вхождения каждой буквы
Задав с клавиатуры последовательность символов, реализовать обработку ее.Исходные данные задать...

Текстовые файлы: оставить в каждом слове только первые вхождения каждой буквы
Здравствуйте, прошу помочь с заданием по программированию. Задание на программирование: используя...

Напечатать все слова, предварительно оставить в слове только первые вхождения каждой буквы
8.Составить программу для розвязання задачи. Дана последовательность, содержащая от 1 до 30 слов, в...

Оставить в словах только первые вхождения каждой буквы.
Всем Hello! Помогите с решением друзья, буду очень благодарен))) Строки: 1) Оставить в словах...

8
Заблокирован
Автор FAQ
24.07.2012, 15:23 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 <string>
#include <sstream>
#include <iostream>
using namespace std;
 
//Ôóíêöèÿ âîçâðàòèò ñëîâî ëèøü ñ 1-êðàòíûì âõîæäåíèåì áóêâ
char * getFirstAlphas(char * word);
 
int main()
{
    system("chcp 1251");//Ïðîñòàÿ ðóññèôèêàöèÿ
    char text[1024] = {0};//Áóôôåð äëÿ ââîäèìîãî òåêñòà
    char word[32]   = {0};//Áóôôåð äëÿ ââîäèìîãî ñëîâà
    stringstream ss;//Ñòðèíãïîòîê (òàêîé æå ïîòîê ââîäà êàê ifstream
    //òîëüê î÷åðïàåò îí äàííûå íå èç ôàéëà à ñ íàøåé ñòðîêè)
    cout<<"Ââåäèòå òåêñò :\n";
    cin.getline(text,1023);//Ââîäèì òåêñò ñ ïðîáåëàìè
    ss.str(text);//Çàïèõèâàåì íàø òåêñò â ïîòîê
    while(ss>>word)//×åðïàåì ïî ñëîâó èç ïîòîêà
        cout<<getFirstAlphas(word)<<" ";//è ïå÷àòàåì óæå ïðåîáðàçîâàííûå ñëîâà
    cout<<endl;
    system("pause");//Ñòîï-òî÷êà
    return 0;
}
 
char * getFirstAlphas(char * word)
{
    char * sub= NULL;//Óêàçàòåëü íà ïîäñòðîêó 
    char symbol=0;
    for(int i = 0; word[i] != '\0'; i++)
    {
        //Èùåì 1-å âõîæäåíèå ñèìâîëà â ñëîâî
        sub = strchr(word, (symbol = word[i]));
        //Ïîèñê ïîñëåäóþùèõ âõîæäåíèé óêàçàííîãî ñèìâîëà â ñòðîêó
        while((sub = strchr(word + i + 1, symbol)))
        {
            //Åñëè ïîâîòðíûå âõîæäåíèÿ åñòü
            //ïðîñòî âûòèðàåì èõ èç ñòðîêè 
 
            //Ïðîâåðÿåì íå áûë ëè ñèìâîë ïîñëåäíèì â ñòðîêå
            if(sub + 1)
                strcpy(&word[i], &word[i + 1]);
            else//Åñëè ñèìâîë âñ¸ æå áûë ïîñëåäíèì
            //îáðåçàåì ñòðîêó
                word[i] = '\0';
        }
    }
    return word;//Âîçâðàùàåì ïðåîáðàçîâàííîå ñëîâî
}
0
Миниатюры
Оставить в слове первые вхождения каждой буквы  
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 4
24.07.2012, 15:35  [ТС] 3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вот более менее простое решение на плюсах
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 <string>
#include <sstream>
#include <iostream>
using namespace std;
 
//Ôóíêöèÿ âîçâðàòèò ñëîâî ëèøü ñ 1-êðàòíûì âõîæäåíèåì áóêâ
char * getFirstAlphas(char * word);
 
int main()
{
    system("chcp 1251");//Ïðîñòàÿ ðóññèôèêàöèÿ
    char text[1024] = {0};//Áóôôåð äëÿ ââîäèìîãî òåêñòà
    char word[32]   = {0};//Áóôôåð äëÿ ââîäèìîãî ñëîâà
    stringstream ss;//Ñòðèíãïîòîê (òàêîé æå ïîòîê ââîäà êàê ifstream
    //òîëüê î÷åðïàåò îí äàííûå íå èç ôàéëà à ñ íàøåé ñòðîêè)
    cout<<"Ââåäèòå òåêñò :\n";
    cin.getline(text,1023);//Ââîäèì òåêñò ñ ïðîáåëàìè
    ss.str(text);//Çàïèõèâàåì íàø òåêñò â ïîòîê
    while(ss>>word)//×åðïàåì ïî ñëîâó èç ïîòîêà
        cout<<getFirstAlphas(word)<<" ";//è ïå÷àòàåì óæå ïðåîáðàçîâàííûå ñëîâà
    cout<<endl;
    system("pause");//Ñòîï-òî÷êà
    return 0;
}
 
char * getFirstAlphas(char * word)
{
    char * sub= NULL;//Óêàçàòåëü íà ïîäñòðîêó 
    char symbol=0;
    for(int i = 0; word[i] != '\0'; i++)
    {
        //Èùåì 1-å âõîæäåíèå ñèìâîëà â ñëîâî
        sub = strchr(word, (symbol = word[i]));
        //Ïîèñê ïîñëåäóþùèõ âõîæäåíèé óêàçàííîãî ñèìâîëà â ñòðîêó
        while((sub = strchr(word + i + 1, symbol)))
        {
            //Åñëè ïîâîòðíûå âõîæäåíèÿ åñòü
            //ïðîñòî âûòèðàåì èõ èç ñòðîêè 
 
            //Ïðîâåðÿåì íå áûë ëè ñèìâîë ïîñëåäíèì â ñòðîêå
            if(sub + 1)
                strcpy(&word[i], &word[i + 1]);
            else//Åñëè ñèìâîë âñ¸ æå áûë ïîñëåäíèì
            //îáðåçàåì ñòðîêó
                word[i] = '\0';
        }
    }
    return word;//Âîçâðàùàåì ïðåîáðàçîâàííîå ñëîâî
}
Программа работает, но не до конца правильно. Попробовал ввести своё предложение, вывод оказался не верным
0
Миниатюры
Оставить в слове первые вхождения каждой буквы  
Заблокирован
Автор FAQ
24.07.2012, 15:39 4
Тоже самое что и выше только с использованием std::string. Сразу скажу что это вариант мне более по душе
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
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
 
//Ôóíêöèÿ âîçâðàòèò ñëîâî ëèøü ñ 1-êðàòíûì âõîæäåíèåì áóêâ
string getFirstAlphas(string word);
 
int main()
{
    system("chcp 1251");//Ïðîñòàÿ ðóññèôèêàöèÿ
    string text;//Áóôôåð äëÿ ââîäèìîãî òåêñòà
    string word;//Áóôôåð äëÿ ââîäèìîãî ñëîâà
    stringstream ss;//Ñòðèíãïîòîê (òàêîé æå ïîòîê ââîäà êàê ifstream
    //òîëüê î÷åðïàåò îí äàííûå íå èç ôàéëà à ñ íàøåé ñòðîêè)
    cout<<"Ââåäèòå òåêñò :\n";
    getline(cin,text);//Ââîäèì òåêñò ñ ïðîáåëàìè
    ss.str(text);//Çàïèõèâàåì íàø òåêñò â ïîòîê
    while(ss>>word)//×åðïàåì ïî ñëîâó èç ïîòîêà
        cout<<getFirstAlphas(word)<<" ";//è ïå÷àòàåì óæå ïðåîáðàçîâàííûå ñëîâà
    cout<<endl;
    system("pause");//Ñòîï-òî÷êà
    return 0;
}
 
string getFirstAlphas(string word)
{
    int i, j;
    for(i = 0    ; i < word.length(); i++)
    {
        //Ïîèñê ïîñëåäóþùèõ âõîæäåíèé óêàçàííîãî ñèìâîëà â ñòðîêó
        for(j = i + 1; j < word.length(); j++)
        {
            //Åñëè ïîâîòðíûå âõîæäåíèÿ åñòü
            //ïðîñòî âûòèðàåì èõ èç ñòðîêè 
            if(word[i] == word[j])
            {
                word.erase(j - 1, 1);
                j = j - 1;
            }
        }
    }
    return word;//Âîçâðàùàåì ïðåîáðàçîâàííîå ñëîâî
}
0
Миниатюры
Оставить в слове первые вхождения каждой буквы  
Заблокирован
Автор FAQ
24.07.2012, 15:44 5
Отработка здесь http://codepad.org/qtuC4h57
Цитата Сообщение от danwich Посмотреть сообщение
Программа работает, но не до конца правильно. Попробовал ввести своё предложение, вывод оказался не верным
- сейчас погляжу...
1
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 4
24.07.2012, 19:40  [ТС] 6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Отработка здесь http://codepad.org/qtuC4h57
- сейчас погляжу...
И всё-таки программа работает почему-то не верно. Если вводить строку, как вводите её вы, то программа делает всё верно. Однако если вводить строку просто со словами, что-то вроде "remember" и подобное, то программа выводит уже не верно.

Добавлено через 3 часа 33 минуты
-=ЮрА=-, спасибо большое, что помог с кодом) В одном месте изменил значение, и программа начала работать)
0
Заблокирован
Автор FAQ
24.07.2012, 20:43 7
danwich, касательно 1-го моего вариант кода, да в нём кое-что было не так(всё потому что я пытаясь сделать код предельно понятным, кое-что заменил на глаз от и тестировал сжато) Поэтому вот код из поста 2 - он должен быть таким и никак иначе(настаиваю как автор)Изменения каснулись лишь адресации в char * getFirstAlphas(char * word)
(на скрине отработка программы для злобной саламандры которая позавтракала бедолагой страусом=))
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 <string>
#include <sstream>
#include <iostream>
using namespace std;
 
//Функция возвратит слово лишь с 1-кратным вхождением букв
char * getFirstAlphas(char * word);
 
int main()
{
    system("chcp 1251");//Простая руссификация
    char text[1024] = {0};//Буффер для вводимого текста
    char word[32]   = {0};//Буффер для вводимого слова
    stringstream ss;//Стрингпоток (такой же поток ввода как ifstream
    //тольк очерпает он данные не из файла а с нашей строки)
    cout<<"Введите текст :\n";
    cin.getline(text,1023);//Вводим текст с пробелами
    ss.str(text);//Запихиваем наш текст в поток
    while(ss>>word)//Черпаем по слову из потока
        cout<<getFirstAlphas(word)<<" ";//и печатаем уже преобразованные слова
    cout<<endl;
    system("pause");//Стоп-точка
    return 0;
}
 
char * getFirstAlphas(char * word)
{
    char * sub= NULL;//Указатель на подстроку 
    char symbol=0;
    for(int i = 0; word[i] != '\0'; i++)
    {
        //Ищем 1-е вхождение символа в слово
        sub = strchr(word, (symbol = word[i]));
        //Поиск последующих вхождений указанного символа в строку
        while((sub = strchr(sub + 1, symbol)))
        {
            //Если повотрные вхождения есть
            //просто вытираем их из строки 
 
            //Проверяем не был ли символ последним в строке
            if(sub + 1)
                strcpy(sub, sub + 1);
            else//Если символ всё же был последним
            //обрезаем строку
                *sub = '\0';
        }
    }
    return word;//Возвращаем преобразованное слово
}
0
Миниатюры
Оставить в слове первые вхождения каждой буквы  
1312 / 974 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
24.07.2012, 22:18 8
Можно решить вот так
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
#include <iostream> 
using namespace std;
int main() 
{ 
    char buffer[500]; 
    char* ptr;  
    char temp;
    unsigned int i, j; 
    int count = 0; // счётчик совпадений
 
    cout << "Inter a string " << endl; 
    cin.getline(buffer, 500);  // считываем строку
 
    ptr = strtok(buffer," ,.-"); // разделяет на слова
 
    while(ptr) 
    {
        for ( i = 0; i < strlen(ptr); i++) 
        {  
            temp = ptr[i]; // временному присваиваем символ
 
            for ( j = 0; j < i; j++) // сравниваем с предыдущеми символами
                 if(temp == ptr[j]) 
                    count++; // в случае совпадения увеличиваем счётчик
     
            if(count == 0) 
                cout << temp;  
 
            count = 0; // сбрасываем на 0
        }  
        cout << " ";
        ptr = strtok(NULL, " ,.-"); 
    } 
}
1
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 4
24.07.2012, 23:13  [ТС] 9
Цитата Сообщение от David Sylva Посмотреть сообщение
Можно решить вот так
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
#include <iostream> 
using namespace std;
int main() 
{ 
    char buffer[500]; 
    char* ptr;  
    char temp;
    unsigned int i, j; 
    int count = 0; // счётчик совпадений
 
    cout << "Inter a string " << endl; 
    cin.getline(buffer, 500);  // считываем строку
 
    ptr = strtok(buffer," ,.-"); // разделяет на слова
 
    while(ptr) 
    {
        for ( i = 0; i < strlen(ptr); i++) 
        {  
            temp = ptr[i]; // временному присваиваем символ
 
            for ( j = 0; j < i; j++) // сравниваем с предыдущеми символами
                 if(temp == ptr[j]) 
                    count++; // в случае совпадения увеличиваем счётчик
     
            if(count == 0) 
                cout << temp;  
 
            count = 0; // сбрасываем на 0
        }  
        cout << " ";
        ptr = strtok(NULL, " ,.-"); 
    } 
}
David Sylva, спасибо, этот код для меня даже более понятен, он вроде бы даже и проще.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.07.2012, 23:13

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Оставить в словах только первые вхождения каждой буквы
Дана строка, содержащая последовательность слов, разделенных пробелами. Произвести со строкой...

Оставить только первые вхождения каждой цифры, остальные вхождения заменить нулями
Размер длинного числа – 4 байта. Ввод-вывод в шестнадцатеричной СС. Использовать побитовые...

Оставить в числе только первые вхождения каждой цифры
23) Дано длинное целое неотрицательное число, шестнадцатеричное представление которого не...

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


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

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

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