Как переместить слово в круговое движение в строке? - PullRequest
0 голосов
/ 05 мая 2018

У меня есть строка, содержащая X слов (между каждым словом есть пробел). Я должен перемещать слова круговыми движениями влево в соответствии с числом, которое вставляет пользователь. Например:

"hi my name is aviv and"

пользователь ввел 2. "name is aviv and hi my" Я ищу законность, которая повторяется, но я не могу найти.

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

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

Мой вывод - "name is avivhi my" Что касается функции: Когда он получает строку без пробелов, он прекрасно работает.

Это мой код:

int main()
{
    char str[] = "hi my name is aviv";
    char str2[] = "hi my name is aviv";
    int CountSpace = 0, CountWord = 0;
    int Size = 18, flag = 0;
    int MoveLeft, Index = 0;
    for (int i = 0; str[i] != '\0'; i++)
    {
        if (str[i] == ' ')
        {
            CountSpace++;
        }

    }

    CountWord = CountSpace + 1;//Understand how many words there are in a string.
    cin >> MoveLeft;

    if (MoveLeft >= CountWord)//
    {
        MoveLeft = (MoveLeft - ((MoveLeft / CountWord) * CountWord));//the size of movment;//To reduce the amount of moves if there is such a possibility
    }

    for (int i = Size - 1; i >= 0; i--)
    {
        if (str[i] == ' ')
        {
            flag++;
        }
        if (flag == MoveLeft)
        {
            Index = Size - 1 - (i + 1);//That's the amount of characters I have to move

            break;
        }
    }

    MoveLeft = Index;
    //This code belongs to the function that accepts a string and the amount to move the characters
    for (int i = 0; i < Size; i++)
    {
        if (i + MoveLeft < Size)
        {
            str[i] = str2[i + MoveLeft];
        }
        else
        {
            str[i] = str2[(i + MoveLeft) - Size];
        }
    }
    cout << "Move Left: " << MoveLeft << endl << str << endl << str2 << endl;
    return 0;
}

Ответы [ 4 ]

0 голосов
/ 05 мая 2018

Если вы можете использовать std::rotate() из <algorithm>, это очень легко сделать. Разобрать слова с помощью std::stringstream и сохранить до std::vector. Затем примените shif непосредственно к вектору.

Пример вывода: https://www.ideone.com/rSPhPR

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <sstream>

int main()
{
  std::vector<std::string> vec;
  std::string str = "hi my name is aviv and";
  std::string word;
  std::stringstream sstr(str);

  while(std::getline(sstr, word,' '))
    vec.emplace_back(word);

  int shift;
  std::cout << "Enter the Shift: "; 
  std::cin >> shift;

  std::rotate(vec.begin(), vec.begin() + shift, vec.end());
  for(const auto& it: vec)
    std::cout << it << " ";
  return 0;
}
0 голосов
/ 05 мая 2018

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

#include <iostream>
#include<string>
using namespace std;

int main() {
  string a[10000];
  int counter = 0;
  string b = "hi my name is aviv and";
  string temp = "";
  int userNum = 2;
  for(int i=0;i<b.length() ; i++){
    if(b[i]!=' '){
      temp+=b[i];
    }
    else if(b[i]==' ' && temp.length()){
      a[counter]= temp;
      temp = "";
      counter++;
    }
  }

  if(temp.length()){
    a[counter] = temp;
  }

  for(int i=userNum;i<=counter+userNum;i++){
    cout<<a[i%(counter+1)]<<endl;
  }
}
0 голосов
/ 05 мая 2018

Вот фрагмент:

#include <iostream>
#include <string>
#include <sstream>        
using namespace std;    
#define MaxWords 10

int main()
{
    stringstream ss;
    ss.str("hi my name is aviv and");

    string str[MaxWords];
    int i;
    for (i =0; std::getline(ss, str[i],' ');i++ )
    {
        cout << str[i] << " ";
    }

    int n;
    cout << "\nEnter pos to split : ";
    cin >> n;

    for (int j = n; j <= i; j++)
    {
        cout << str[j] << " ";
    }

    for (int j = 0; j < n; j++)
    {
        cout << str[j] << " ";
    }

    cout << endl;
    return 0;
}

Выход:

enter image description here

0 голосов
/ 05 мая 2018

Вот подсказка:

vector<string> words = Your_Code_To_Split_Input_Into_Words();
int count = words.size();
int shift = Your_Code_To_Read_Users_Input();

// print the sentence with the rotation specified by shift
for (int i = 0; i < count; i++)
{
    int shifted_index = (i + shift) % count;  // modulo math implements circular rotation
    string spacing = (i == 0) ? "" : " ";     // add a space before each word, except first word
    cout << spacing << words[shifted_index];
}
cout << endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...