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

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

24.07.2012, 14:32. Показов 5798. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.07.2012, 14:32
Ответы с готовыми решениями:

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

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

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

8
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
24.07.2012, 15:23
Вот более менее простое решение на плюсах
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  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вот более менее простое решение на плюсах
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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
24.07.2012, 15:39
Тоже самое что и выше только с использованием 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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
24.07.2012, 15:44
Отработка здесь http://codepad.org/qtuC4h57
Цитата Сообщение от danwich Посмотреть сообщение
Программа работает, но не до конца правильно. Попробовал ввести своё предложение, вывод оказался не верным
- сейчас погляжу...
1
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 4
24.07.2012, 19:40  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Отработка здесь http://codepad.org/qtuC4h57
- сейчас погляжу...
И всё-таки программа работает почему-то не верно. Если вводить строку, как вводите её вы, то программа делает всё верно. Однако если вводить строку просто со словами, что-то вроде "remember" и подобное, то программа выводит уже не верно.

Добавлено через 3 часа 33 минуты
-=ЮрА=-, спасибо большое, что помог с кодом) В одном месте изменил значение, и программа начала работать)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
24.07.2012, 20:43
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
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
24.07.2012, 22:18
Можно решить вот так
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  [ТС]
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.07.2012, 23:13
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru