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

// Напишите программу, которая берет идентификаторы 10 студентов и сохраняет их в массиве, когда они сидят на стуле. Пользователь скажет вам, сколько учеников он хочет переместить, но в итоге каждый ученик должен сидеть на соответствующем стуле круговыми движениями.
Пример ввода: 1 2 3 4 5 6 7 8 9 10
Число студентов, чтобы переехать: 4
Пример вывода: 7 8 9 10 1 2 3 4 5 6

    #include <iostream>
using namespace std;
#define SIZE 10
int main()
{
int id[SIZE], move = 0, result[SIZE];
for(int index = 0; index < SIZE; index++){
id[index] = 0;
}
for(int index = 0; index < SIZE; index++){
cout << "Enter the id of student at index " << index << ": " ;
cin >> id[index];
}
cout << "Enter number of students to move: ";
cin >> move;
while(move > 9){
cout << "Enter number of students to move between 0 to 10: ";
cin >> move;
}
switch(move){
case 1:
result[0] = id[9];
for(int index = 1; index < SIZE; index++){
result[index] = id[index-1];
}
break;
case 2:
for(int index = 0; index < 2; index++){
result[index] = id[index+8];
}
for(int index = 2; index < SIZE; index++){
result[index] = id[index-2];
}
break;
case 3:
for(int index = 0; index < 3; index++){
result[index] = id[index+7];
}
for(int index = 3; index < SIZE; index++){
result[index] = id[index-3];
}
break;
case 4:
for(int index = 0; index < 4; index++){
result[index] = id[index+6];
}
for(int index = 4; index < SIZE; index++){
result[index] = id[index-4];
}
break;
case 5:
for(int index = 0; index < 5; index++){
result[index] = id[index+5];
}
for(int index = 5; index < SIZE; index++){
result[index] = id[index-5];
}
break;
case 6:
for(int index = 0; index < 6; index++){
result[index] = id[index+4];
}
for(int index = 6; index < SIZE; index++){
result[index] = id[index-6];
}
break;
case 7:
for(int index = 0; index < 7; index++){
result[index] = id[index+3];
}
for(int index = 7; index < SIZE; index++){
result[index] = id[index-7];
}
break;
case 8:
for(int index = 0; index < 8; index++){
result[index] = id[index+2];
}
for(int index = 8; index < SIZE; index++){
result[index] = id[index-8];
}
break;
case 9:
for(int index = 0; index < 9; index++){
result[index] = id[index+1];
}
result[9] = id[0];
break;
default:
for(int index = 0; index < SIZE; index++){
result[index] = id[index];
}
}
for(int index = 0; index < SIZE; index++){
cout << result[index] << " ";
}
}

-1

Решение

Вы можете увидеть это в switch(move) у вас в основном есть:

case N:
for(int index = 0; index < N; index++){
result[index] = id[index + SIZE - N];
}
for(int index = N; index < SIZE; index++){
result[index] = id[index - N];
}

Вы можете заменить весь switch (move) { /* all the cases */ } с:

for(int index = 0; index < move; index++){
result[index] = id[index + SIZE - move];
}
for(int index = move; index < SIZE; index++){
result[index] = id[index - move];
}

В общем, вы всегда должны пытаться идентифицировать подобные шаблоны в повторяющемся коде.

1

Другие решения

Я бы предложил использовать deque, и было бы лучше разделить программу на несколько функций:

#include <deque>
#include <iostream>
using namespace std;
const int SIZE = 10;

std::deque<int> input_students()
{
deque<int> students;
for(int index = 0; index < SIZE; index++)
{
cout << "Enter the id of student at index " << index << ": ";
int v = 0;
cin >> v;
students.push_back(v);
}
return students;
}

unsigned int get_move()
{
cout << "Enter number of students to move: ";
unsigned int move = 0;
do
{
cout << "Enter number of students to move between 0 to 10: ";
cin >> move;
}while(move > 9);
return move;
}

void offset_students(deque<int> &students, unsigned int move)
{
for(auto i = 0U;i < move;i++)
{
students.push_front(students.back());
students.pop_back();
}
}

int main()
{
deque<int> students = input_students();
auto move = get_move();
offset_students(students, move);

for(auto s : students)
cout << s;
}
0

Альтернативой использованию массивов в стиле c является использование std::vector (или аналогичный контейнер) и использовать алгоритм STL std::rotate,

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
std::vector<int> ids;

int index=0;
do {
int id;
std::cout << "Enter the id of a student at index " << index++ << " (0 to quit):  ";
std::cin >> id;
if(id<1) break;
ids.push_back(id);
} while( true );

size_t move;
do {
std::cout << "Enter number of students to move [0," << ids.size() << "]: ";
std::cin >> move;
} while( move>ids.size() );

std::rotate(ids.begin(), ids.begin()+move, ids.end());

for(int id : ids) {
std::cout << id << " ";
}
std::cout << "\n";
}
0

Запишите индексы входного массива дважды.

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9

Посмотрите на результаты, которые могут привести к некоторым сдвигам, как видно из этого дублированного представления (бит между | результаты)

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
1:                   |<-               ->|
2:                 |<-               ->|
3:               |<-               ->|

Запишите соответствующие показатели в результате.
Пример смещения 3 позиций:

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
3:               |<-               ->|
Index in result:  0 1 2 3 4 5 6 7 8 9

Если вы посмотрите на это некоторое время, вы можете заметить, что каждый элемент i на входе соответствует элементу (i + move) % 10 в результате.

Таким образом, вы можете заменить весь свой switch с этим циклом:

for (int i = 0; i < SIZE; i++) {
result[(i + move) % SIZE] = id[i];
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector