Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Fetch13
0 / 0 / 1
Регистрация: 22.01.2015
Сообщений: 37
#1

Сдвиг слов влево

23.03.2015, 13:07. Просмотров 883. Ответов 8
Метки нет (Все метки)

В переменной a есть строка из 5 слов. Как в цикле сделать сдвиг каждого слова влево и вывести каждый измененный результат?

Например исходная строка: арбуз банан апельсин огурец помидор.
должно получится 4 варианта пошагово:

банан апельсин огурец помидор арбуз
апельсин огурец помидор арбуз банан
огурец помидор арбуз банан апельсин
помидор арбуз банан апельсин огурец

важно чтобы исходная строка была не в массиве, а в переменной. где хранятся полученные строки - не важно
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2015, 13:07
Ответы с готовыми решениями:

Где и когда уместно применять операции << (сдвиг влево) и >> (сдвиг вправо)?
Кто может привести пример , когда нужно использовать операции: 1) &lt;&lt; сдвиг...

Сдвиг влево
Напишите программу, которая циклически сдвигает элементы массива влево (0-й...

Логический сдвиг влево
unsigned __int64 number = 239176053778592; ClongNumber c(number);...

Циклический сдвиг влево
Помогите написать программу которая будет осуществлять циклический сдвиг влево...

Сдвиг символа влево
Помогите осуществить сдвиг символа (буквы) из циклического алфавита на n влево....

8
LaHaH
20 / 20 / 26
Регистрация: 17.03.2015
Сообщений: 119
Завершенные тесты: 2
23.03.2015, 13:11 #2
Цитата Сообщение от Fetch13 Посмотреть сообщение
важно чтобы исходная строка была не в массиве, а в переменной
Насколько я знаю- все строки в С++ есть массивы.
Можно по-точнее с этим пунктом.
0
Fetch13
0 / 0 / 1
Регистрация: 22.01.2015
Сообщений: 37
23.03.2015, 13:14  [ТС] #3
Цитата Сообщение от LaHaH Посмотреть сообщение
Насколько я знаю- все строки в С++ есть массивы.
Можно по-точнее с этим пунктом.
не то написал. в строке хранится. вот так:
char string[] = "арбуз банан апельсин огурец помидор";

с языком тоже не важно, можно чтобы строка была на кириллице так
char string[] = "arbuz banan apelsin ogurec pomidor";
0
kylroma
Одессит
204 / 75 / 37
Регистрация: 30.12.2013
Сообщений: 278
Записей в блоге: 1
Завершенные тесты: 2
23.03.2015, 14:33 #4
Лучший ответ Сообщение было отмечено Fetch13 как решение

Решение

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
#include <iostream>
#include <string.h>
 
using namespace std;
 
void fun(char  ch[], int n)
{
    char temp[10] = {' '};
    int i = 0;// индекс
    int k = 0;// индекс
    while(ch[i] != ' ') // записываю первое слово во временную переменную
    {
        temp[i+1] = ch[i]; //так как temp[0] равен пробелу ' ', то данные начинаю запсывать с 1-го индекса
        ++i;
    }
   // temp[i+1] = {0};
 
    for(int j=0; j<strlen(ch); ++j)
    {
        ch[j] = ch[j+strlen(temp)];//переношу остальные слова влево
        if(j >= strlen(ch)-i-1) //если все слова, что были справа перенес, то добавляю слово, которое хранится во временной переменной
        {
          ch[j] = temp[k];
          ++k;
        }
    }
    cout << ch << endl;
    --n;
    if(n>0)
        fun(ch, n); //рекурсивно вызываю функцию, пока все слова не будут переставлены
}
 
int main()
{
    char str[] = "arbuz banan apelsin ogurec pomidor";
    int n = 0;
    int i = 0;
    while(str[i] != '\0') //считаю сколько слов в массиве, считаю по колличествам пробелов
    {
        if(str[i] == ' ')
            ++n;
        ++i;
    }
    fun(str, n); // передаю в функцию массив слов и количество слов
 
    return 0;
}
0
LaHaH
20 / 20 / 26
Регистрация: 17.03.2015
Сообщений: 119
Завершенные тесты: 2
23.03.2015, 14:37 #5
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
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
using namespace std;
 
void WordShift(char* str,int size)
{
    int word=0;
    while (str[word++]!=' ') ;
    char *temp=new char[word];
    strncpy(temp,str,word);
    int i=0;
    int a=sizeof(temp);
    while (str[i]!='\0')
    {
        str[i]=str[i+word];
        i++;
    }
    str[size-word-1]=' ';
    int j=0;
    for (int i = size-word; i < size; i++)
    {
        str[i]=temp[j];
        j++;
    }
    str[size-1]='\0';
 
    delete[] temp;
 
}
 
 
void main()
{
    setlocale(LC_ALL, "Russian");
    char string[] = "аа бб сс дд ее";
    WordShift(string,sizeof(string));
    cout<<string<<endl;
    WordShift(string,sizeof(string));
    cout<<string<<endl;
    WordShift(string,sizeof(string));
    cout<<string<<endl;
    WordShift(string,sizeof(string));
    cout<<string<<endl;
    WordShift(string,sizeof(string));
    cout<<string<<endl;
}
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
23.03.2015, 15:38 #6
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
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <string>
#include <vector>
#include <iterator>
 
int main(void)
{
    setlocale(0, "rus");
 
    char str[] = "арбуз банан апельсин огурец помидор";
    std::vector<std::string> words;
 
    char * begin = str;
    char * curr = begin;
    char * end = str + strlen(str);
    while (curr != end)
    {
        curr = std::find(begin, end, ' ');
        words.push_back(std::string(begin, curr));
        if (curr != end)
        {
            ++curr;
            begin = curr;
        }
    }
 
    std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, " "));
    std::cout << "\n\n";
    for (unsigned int i = 0; i < words.size(); ++i)
    {
        std::rotate(words.begin(), words.begin() + 1, words.end());
        std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, " "));
        std::cout << "\n\n";
    }
 
    system("pause");
    return 0;
}
0
Fetch13
0 / 0 / 1
Регистрация: 22.01.2015
Сообщений: 37
23.03.2015, 15:45  [ТС] #7
Всем спасибо
0
LaHaH
20 / 20 / 26
Регистрация: 17.03.2015
Сообщений: 119
Завершенные тесты: 2
23.03.2015, 17:54 #8
Цитата Сообщение от John Prick Посмотреть сообщение
C++
1
std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, " "));
Вы не могли бы пояснить этот момент. Если я не хочу никуда выводить результат, что вместо
C++
1
std::ostream_iterator<std::string>(std::cout, " ")
надо написать?
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
24.03.2015, 09:54 #9
Цитата Сообщение от LaHaH Посмотреть сообщение
Если я не хочу никуда выводить результат
Ну что значит никуда не выводить? Если вам не нужен результат, то просто уберите эту строчку (всю, вместе с std::copy).
Если надо сохранить результат в другой контейнер:
C++
1
2
3
std::vector<std::string> result_words;
// ...
std::copy(words.begin(), words.end(), std::back_inserter(result_words));
Если в файл сохранить надо:
C++
1
2
3
std::ofstream output_file;
// ...
std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(output_file, " "));
Ну и так далее...
1
24.03.2015, 09:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2015, 09:54

Функция: циклический сдвиг элементов массива влево
нужен код программы, которая сдвигает элементы массива на 1 влево, тоесть было...

Многократный сдвиг массива влево
У меня есть массив , к примеру : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18...

Побитовый сдвиг влево и вправо
Что выполнится быстрее - сдвиг влево или сдвиг вправо? И как замерить время...


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

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

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