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

Вывести предложение, в котором каждое слово будет задом наперед

17.09.2014, 10:20. Просмотров 2102. Ответов 14
Метки нет (Все метки)

Здравствуйте,нужна помощь в решении задачи на С++.
Вывести предложение, в котором каждое слово будет задом наперед.Нельзя пользоваться встроенными функциями для работы со строками или массивами символов.
Например:Рейсовый автобус №8 задерживается на 30 минут => йывосйеР суботва 8№ ястеавижредаз ан 03 .туним
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2014, 10:20
Ответы с готовыми решениями:

Вывести вписанное пользователем слово задом наперед
Добрый день нужно вывести,вписанное пользователем слово задом наперед в C++ помогите как можно...

Напечатать заданное слово задом наперед
Составить программу, которая печатает заданное слово задом наперед

Вывести строку задом наперед
#include <iostream> using namespace std; int main() { int len; char temp; cin>>len; ...

Вывести строку задом наперед
1)Пользователь вводит строку данных программа выводит из нее только цифры. 2)Вывести строку задам...

14
457 / 382 / 326
Регистрация: 05.11.2013
Сообщений: 1,043
Записей в блоге: 6
17.09.2014, 13:23 2
тогда можно дополнительный указатель запоминать на начало слова и встретив пробел возвращаться к началу слова... как-то так, не проверял особо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main () {
 char *s = "Abracadabra kupila sebe abyrvalg";
 char *p=s;
 printf ("\n");
 while (*s++) {
  if (*s==' ') {
   char *b=s-1;
   while (b>=p) printf ("%c",*b--);
   printf (" ");
   p=s+1;
  }
 }
 char *b=s-1; //повторить для последнего слова
 while (b>=p) printf ("%c",*b--);
 return 0;
}
правда, остается открытым вопрос, корректно ли сравнивать указатели...
0
Модератор
Эксперт С++
10150 / 8499 / 5165
Регистрация: 18.12.2011
Сообщений: 22,736
17.09.2014, 13:53 3
Цитата Сообщение от ПерС Посмотреть сообщение
корректно ли сравнивать указатели
Для обычных указателей, вполне приемлемо.
Но если начнете использовать обобщенные указатели (итераторы),
то сравнивать можно только на равенство(неравенство).
Т.е. придется писать while(b!=p)
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
17.09.2014, 14:47 4
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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
 
struct mystring
{
    mystring(const std::string &s) : data(s.rbegin(), s.rend()) {}
    std::string data;
};
 
std::ostream& operator<< (std::ostream& out, const mystring &s)
{
    out << s.data;
    return out;
}
 
int main()
{
    const std::string str = "Abracadabra kupila sebe abyrvalg";
    std::istringstream ist(str);
    std::copy((std::istream_iterator<std::string>(ist)), std::istream_iterator<std::string>(),
        std::ostream_iterator<mystring>(std::cout, " "));
}
0
Модератор
Эксперт С++
10150 / 8499 / 5165
Регистрация: 18.12.2011
Сообщений: 22,736
17.09.2014, 14:56 5
MrGluck, Объясните для непонятливых (в том числе и для меня),
почему они перевернулись?
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
17.09.2014, 17:11 6
zss, при вызове std::ostream_iterator<mystring> создаётся временный объект mystring, который инициализируется переданным ему в качестве аргумента объектом std::string. Для типа mystring я определил в конструкторе инициализацию data reverse итераторами переданной строки, data потом вывожу в перегруженном варианте оператора << , который вызывается при копировании в std::cout.
1
Модератор
Эксперт С++
10150 / 8499 / 5165
Регистрация: 18.12.2011
Сообщений: 22,736
17.09.2014, 17:33 7
А из-за чего строка разбивается на слова?
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
17.09.2014, 17:56 8
Цитата Сообщение от zss Посмотреть сообщение
А из-за чего строка разбивается на слова?
Мы инициализируем объект std::istringstream значением строки, а далее считываем с него данные, используя оператор >> (аналогично мы делаем при считывании с потока std::cin). При считывании в строку пробел воспринимается как разделитель (когда мы вводим текст с клавиатуры, происходит то же самое). Считываем до тех пор, пока поток не вернул EOF (пока не иссяк "буфер" std::istringstream). При попытке инициализации std::istream_iterator потоком с установленным флагом EOF, мы получаем объект, аналогичный (при сравнении) с пустым std::istream_iterator. Это является условием выхода с цикла внутри алгоритма copy (обычно пробегаются итератором и сравнивают с итератором конца контейнера, здесь же мы сравниваем полученный итератор с пустым).
1
Модератор
Эксперт С++
10150 / 8499 / 5165
Регистрация: 18.12.2011
Сообщений: 22,736
17.09.2014, 18:08 9
Теперь стало понятно, но вот так это наглядней
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
#include <iostream>
#include <sstream>
#include <string>
struct mystring
{
    mystring(const std::string &s) : data(s.rbegin(), s.rend()) {}
    std::string data;
};
std::ostream& operator<< (std::ostream& out, const mystring &s)
{
    out << s.data;
    return out;
}
int main()
{
    const std::string str = "Abracadabra kupila sebe abyrvalg";
    std::istringstream ist(str);
    std::string ss;
    while(ist>>ss) // читаем по словам
    {
        mystring ms(ss); // переворачиваем слово
        std::cout<<ms<<" "; // выводим слово
    }
    system("pause");
}
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
17.09.2014, 18:20 10
Тогда уж
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <sstream>
#include <string>
 
int main()
{
    const std::string str = "Abracadabra kupila sebe abyrvalg";
    std::istringstream ist(str);
    for (std::string ss; ist >> ss; std::cout << std::string(ss.rbegin(), ss.rend()) << " ");
}
0
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
17.09.2014, 18:57 11
Без STL
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 <iostream>
#include <string>
#include <string.h>
 
using namespace std;
 
//Сюда разделители слова
int is(char ch)
{
    switch (ch)
    {
        case ' ':
        case ':':
        case ',':
        case '.': return 0;break; //по аналогии если надо               
        default: return 1;
    }
}
 
int main()
{
    setlocale(LC_ALL,"");
    char *S="Abracadabra.:  kupila sebe abyrvalg";
    int count=0;
    bool iter=false;
    int beg=0;
 
    while (S[count])
    {
        if ((!count)||(!is(S[count-1])&&(is(S[count])))||(is(S[count])&&((!is(S[count+1]))||(S[count+1]==0))))
        {
            iter=!iter;
            if (iter) beg=count;
            else {
               //cout<<beg<<"  "<<count<<"\n";
               for (int i=count;i>=beg;i--) cout<<S[i];
            }
 
        } else if (!is(S[count])) cout<<S[count];
        count++;
    }
 
    return 0;
}

Не по теме:

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

0
Миниатюры
Вывести предложение, в котором каждое слово будет задом наперед  
MrGluck
17.09.2014, 20:56
  #12

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
((!count)||(!is(S[count-1])&&(is(S[count])))||(is(S[count])&&((!is(S[count+1]))||(S[count+1]==0))))
а ещё perl ругают за нечитаемость

0
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
17.09.2014, 21:37 13
Цитата Сообщение от MrGluck Посмотреть сообщение
а ещё perl ругают за нечитаемость

Не по теме:

если комментировать, хуже будет :D

Проверки на условия, первый ли символ для всей строки, является ли текущий символ не разделителем или же разделителем, если текущий символ не разделитель, то идет ли перед ним или после него разделитель или окончание строки или не идет. Потом вытаскиваются числа, обозначающие начало и конец каждого слова в предложении, по этим числам выполняется обратный цикл, с помощью которого каждое слово выводится на экран в обратном порядке. И в самом конце еще раз проверяется является ли символ символом разделителем или нет, если он является разделителем, то выводится на экран и попадает в законное место.

0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
17.09.2014, 23:49 14
daslex, я бы советовал хотя бы присвоить условия булевым переменным (в идеале с говорящим названием), далее их объединения также записывать в переменные и таким образом формировать цепочку, которую и читать и дебажить проще.
0
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
18.09.2014, 00:39 15
Ну
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
50
51
52
53
#include <iostream>
#include <string>
#include <string.h>
 
using namespace std;
 
//Сюда разделители слова
int is(char ch)
{
    switch (ch)
    {
        case ' ':
        case ':':
        case ',':
        case '.': return 0;break; //по аналогии если надо доавить разделители
        default: return 1;
    }
}
 
int main()
{
    setlocale(LC_ALL,"");
    char *S="Abracadabra.:  kupila sebe abyrvalg";
    int count=0;
    bool iter=false;  //Признак начало слова или конец слова
    bool beg_word=false; //Признак того, что это начало слова
    bool end_word=false; //Признак того, что это конец слова
    bool sep=false; //Признак того, что это разделитель
    int beg=0; //Сначала нету начала слова.
 
    while (S[count]) //Пока символ не станет равен нулю будет выполнятся цикл
    {
        if ((!is(S[count-1])&&(is(S[count])))) beg_word=true; //если перед текущим символом разделитель, а сам символ не разделитель, то это начало слова
        else beg_word=false;
 
        if (is(S[count])&&((!is(S[count+1]))||(S[count+1]==0))) end_word=true; //если текущий символ не разделитель, а за ним разделитель или нулевой символ, то значит это конец слова
        else end_word=false;
 
        if ((!count)||(beg_word)||(end_word))  //анализируем на признаки начала и конца слова, если признаки найдены, то
        {
            iter=!iter; //переключаемся как на начало или как на конец слова
            if (iter) beg=count; //если сейчас начало слова, то присваиваем в beg вхождение символа
            else
            {
               for (int i=count;i>=beg;i--) cout<<S[i]; //если не начало, то значит это конец слова, а значит обходим от него к началу слова с выводом на экран
            }
 
        } else if (!is(S[count])) cout<<S[count]; //Если признаков начала и конца слова не обнаружилось, проверяем является ли символ разделителем и если является, то выводим его на экран
        count++;
    }
 
    return 0;
}
Только кому это надо? Вам. Вам точно не надо, вы намного лучше меня сечете.
ТС? Он ведь не просит, значит ему не надо.
Мне? Мне-то ведь хорошо понятно, что я тут нахимичил. и ифы глаза мозолят. Меньше букв мне приятнее глазу. Когда кода больше чем 100 строк, там лучше удобочитаемость, а здесь (выше) кода как кот наплакал.
Судя по развитию темы больше всего был заинтересован zcc, которому это (мое) как раз тоже нафиг не надо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2014, 00:39

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

Вывести последовательность слов задом наперед
Задание: Дана строка, группу букв, разделенных пробелами (одним или больше) будем считать словами....

Вывести строку символов на экран задом наперед
Дана строка символов. Вывести её на экран задом наперед. Использовать библиотеку string.h ...

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

Вывести каждое второе слово в котором больше одной согласной
Помогите. ЗАДАНИЕ: Вывести каждое второе слово в котором больше одной согласной


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

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

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