1

Тема: Допоможіть з сортуванням двовимірних масивів на мові С++.

⦁    Створити двовимірний масив. Заповнити його випадковими числами в діапазоні від 0 до 9 включно. Дати користувачеві можливість ввести кількість рядків і колонок, скільки він хоче побачити. Показати масив на екран. Користувач вибирає кількість зсувів і положення (вліво, вправо, вгору, вниз). Виконати зсув масиву і показати на екран отриманий результат. Зсув циклічний.
Наприклад, якщо ми маємо наступний масив:
1 2 0 4 5 3
4 5 3 9 0 1
і користувач вибрав зсув на 2 розряди вправо, то ми отримаємо:
5 3 1 2 0 4
0 1 4 5 3 9
Організувати перевірку на:
⦁    користувач не може ввести більшу кількість рядків і колонок (які він хоче побачити), ніж загальна кількість рядків і колонок в масиві.
⦁    користувач може зробити вибір в діапазоні від 0 до 4 включно:
⦁    Вихід.
⦁    Зсув вліво.
⦁    Зсув вправо.
⦁    Зсув догори.
⦁    Зсув донизу.
⦁    при виборі зсуву вліво або вправо, користувач не може ввести кількість зсувів більше, ніж кількість колонок масиву;
⦁    при виборі зсуву догори або донизу, користувач не може ввести кількість зсувів більше, ніж кількість рядків масиву.
ВАЖЛИВО(зараз мені потрібно зсув вліво, ось мій код 1 рядок неправильно сортує а дальше все нормально)

#include <iostream>
#include <time.h>
#include <iomanip>
using namespace std;
void main() {
    int rows, cols, a = 0, cho, shift, tmp, j1 = 0;
    const int m = 100, n = 100, num = 10;
    int ar[m][n], ar1[num];
    cout << "Enter rows:";
    cin >> rows;
    cout << "Enter cols:";
    cin >> cols;
    srand(time(0));
    for (int i = 0; i < num; i++) {
        ar1[i] = a;
        a++;
    }
    a = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            ar[i][j] = rand() % num;
            a = ar[i][j];
            ar[i][j] = ar1[a];
        }
    }
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            cout << setw(5) << ar[i][j];
        }
        cout << "\n";
    }
    cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \n";
    cin >> cho;
    for (;cho > 0 && cho <= 4;) {
        if (cho == 1) {
            cout << "shift:";
            cin >> shift;
            for (int a = 0; a < rows; a++) {
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        if (a > 0) {
                            j1++;
                        }
                        if (j >= 0 && j < shift) {
                            for (int j = j1; j < cols - 1; j++) {
                                if (j1 == 0) {
                                    tmp = ar[i][j];
                                    ar[i][j] = ar[i][j + 1];
                                    ar[i][j + 1] = tmp;
                                }
                                if (j1 > 0) {
                                    tmp = ar[i][j];
                                    ar[i][j] = ar[i][j + 1];
                                    ar[i][j + 1] = tmp;
                                }
                            }
                        }
                    }
                }
            }
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    cout << setw(5) << ar[i][j];
                }
                cout << "\n";
            }
            cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \n";
            cin >> cho;
        }
    }
    system("pause");
}

2

Re: Допоможіть з сортуванням двовимірних масивів на мові С++.

for(;SMTH;) записується як while(SMTH).
Умови порівняння в діапазоні значно краще читаються, якщо користуватися тільки < та <=:

while(0<cho && cho <=4)

Якщо треба робити щось з кількох варіантів по значеннях, то ліпше використовувати switch-case.
Назви змінних краще робити зрозумілими. Якщо ми працюємо з рядоком i, то краще називати i чимось на кшталт row. Цикли по i та j роблять традиційно, але якщо у нас 4 вкладені цикли і є очевидна можливість назвати одну зі змінних циклу зрозуміло - чому б це не зробити?
Тепер - сам алгоритм. Зсув ліворуч на 1 - це:
- запам'ятовуємо початок;
- в циклі рухаємо рядок на 1 клітину ліворуч;
- перезаписуємо останній елемент запам'ятованим початком.
Зсув на shift - це цикл на shift повторень зсуву на 1.
Зсув матриці на shift - це цикл по рядках, кожен рядок зсуваємо на shift.
Всього потрійний цикл. Де ви взяли четвертий внутрішній цикл, та ще й затіненням змінної - не знаю.

Подякували: Parsifal, leofun012

3

Re: Допоможіть з сортуванням двовимірних масивів на мові С++.

вліво посунув ось код

#include <iostream>
#include <time.h>
#include <iomanip>
using namespace std;
void main() {
    int rows, cols, a = 0, cho, shift, tmp, j1 = 0;
    const int m = 100, n = 100, num = 10;
    int ar[m][n], ar1[num];
    cout << "Enter rows:";
    cin >> rows;
    cout << "Enter cols:";
    cin >> cols;
    srand(time(0));
    for (int i = 0; i < num; i++) {
        ar1[i] = a;
        a++;
    }
    a = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            ar[i][j] = rand() % num;
            a = ar[i][j];
            ar[i][j] = ar1[a];
        }
    }
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            cout << setw(5) << ar[i][j];
        }
        cout << "\n";
    }
    cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \nchoice:";
    cin >> cho;
    for (;cho > 0 && cho <= 4;) {
        if (cho == 1) {
            cout << "shift:";
            cin >> shift;
            for (int a = 0; a < rows; a++) {
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        if (i > 0) {
                            j1++;
                        }
                        if (j >= 0 && j < shift && i == 0) {
                            for (int j = j1; j < cols - 1; j++) {
                                tmp = ar[i][j];
                                ar[i][j] = ar[i][j + 1];
                                ar[i][j + 1] = tmp;
                            }
                        }
                    }
                }
            }
            j1 = 0;
            for (int a = 0; a < rows; a++) {
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        if (a > 0) {
                            j1++;
                        }
                        if (j >= 0 && j < shift && i > 0) {
                            for (int j = j1; j < cols - 1; j++) {
                                tmp = ar[i][j];
                                ar[i][j] = ar[i][j + 1];
                                ar[i][j + 1] = tmp;
                            }
                        }
                    }
                }
            }
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    cout << setw(5) << ar[i][j];
                }
                cout << "\n";
            }
            cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \nchoice:";
            cin >> cho;
        }
    }
    system("pause");
}

4 Востаннє редагувалося Parsifal (22.08.2018 14:34:52)

Re: Допоможіть з сортуванням двовимірних масивів на мові С++.

Там потрібно менюшку щоб вибирати куда сунути 1 - вліво, 2 - вправо, 3 - вгору, 4 - вниз , 0 - вийти і потім ввести на скільки посунути, 1 і 0 я уже зробив залишилось 2, 3 і 4,дякую коало,я вже на форі почав і не хотілося б переробляти на свіч але дякую на майбутьнє запамятаю.Ну важко мені з двавимірними масиви не люблю я іх.

5

Re: Допоможіть з сортуванням двовимірних масивів на мові С++.

switch - це альтернатива не for, а if.

Подякували: Parsifal1

6

Re: Допоможіть з сортуванням двовимірних масивів на мові С++.

Якщо 1 раз за меню суну то нормально працює а якщо 2 раза без виходів хочу посунути то суне змінений масив а не початковий.

#include <iostream>
#include <time.h>
#include <iomanip>
using namespace std;
void main() {
    int rows, cols, a = 0, cho, shift, tmp;
    const int m = 100, n = 100, num = 10;
    int ar[m][n], ar1[num];
    cout << "Enter rows:";
    cin >> rows;
    cout << "Enter cols:";
    cin >> cols;
    srand(time(0));
    for (int i = 0; i < num; i++) {
        ar1[i] = a;
        a++;
    }
    a = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            ar[i][j] = rand() % num;
            a = ar[i][j];
            ar[i][j] = ar1[a];
        }
    }
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            cout << setw(5) << ar[i][j];
        }
        cout << "\n";
    }
    cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \nchoice:";
    cin >> cho;
    for (;cho > 0 && cho <= 4;) {
        if (cho == 1) {
            cout << "shift:";
            cin >> shift;
            for (int f = 0; f < shift; f++) {
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols - 1; j++) {
                        tmp = ar[i][j];
                        ar[i][j] = ar[i][j + 1];
                        ar[i][j + 1] = tmp;
                    }
                }
            }
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    cout << setw(5) << ar[i][j];
                }
                cout << "\n";
            }
            cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \nchoice:";
            cin >> cho;
        }    
    if (cho == 2) {
        cout << "shift:";
        cin >> shift;
        for (int f = 0; f < shift; f++) {
            for (int i = 0; i < rows; i++) {
                for (int j = cols - 1; j > 0; j--) {
                    tmp = ar[i][j];
                    ar[i][j] = ar[i][j - 1];
                    ar[i][j - 1] = tmp;
                }
            }
        }
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                cout << setw(5) << ar[i][j];
            }
            cout << "\n";
        }
        cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \nchoice:";
        cin >> cho;
    }
}
    system("pause");
}

7

Re: Допоможіть з сортуванням двовимірних масивів на мові С++.

Все тепер добре.

#include <iostream>
#include <time.h>
#include <iomanip>
using namespace std;
void main() {
    int rows, cols, a = 0, cho, shift, tmp;
    const int m = 100, n = 100, num = 10;
    int ar[m][n], ar1[num];
    cout << "Enter rows:";
    cin >> rows;
    cout << "Enter cols:";
    cin >> cols;
    srand(time(0));
    for (int i = 0; i < num; i++) {
        ar1[i] = a;
        a++;
    }
    a = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            ar[i][j] = rand() % num;
            a = ar[i][j];
            ar[i][j] = ar1[a];
        }
    }
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            cout << setw(5) << ar[i][j];
        }
        cout << "\n";
    }
    cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \nchoice:";
    cin >> cho;
    for (;cho > 0 && cho <= 4;) {
        if (cho == 1) {
            cout << "shift:";
            cin >> shift;
            for (int f = 0; f < shift; f++) {
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols - 1; j++) {
                        tmp = ar[i][j];
                        ar[i][j] = ar[i][j + 1];
                        ar[i][j + 1] = tmp;
                    }
                }
            }
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    cout << setw(5) << ar[i][j];
                }
                cout << "\n";
            }
            cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \nchoice:";
            cin >> cho;
            for (int f = 0; f < shift; f++) {
                for (int i = 0; i < rows; i++) {
                    for (int j = cols - 1; j > 0; j--) {
                        tmp = ar[i][j];
                        ar[i][j] = ar[i][j - 1];
                        ar[i][j - 1] = tmp;
                    }
                }
            }
        }    
    if (cho == 2) {
        cout << "shift:";
        cin >> shift;
        for (int f = 0; f < shift; f++) {
            for (int i = 0; i < rows; i++) {
                for (int j = cols - 1; j > 0; j--) {
                    tmp = ar[i][j];
                    ar[i][j] = ar[i][j - 1];
                    ar[i][j - 1] = tmp;
                }
            }
        }
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                cout << setw(5) << ar[i][j];
            }
            cout << "\n";
        }
        cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \nchoice:";
        cin >> cho;
        for (int f = 0; f < shift; f++) {
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols - 1; j++) {
                    tmp = ar[i][j];
                    ar[i][j] = ar[i][j + 1];
                    ar[i][j + 1] = tmp;
                }
            }
        }
    }
}
    system("pause");
}

8 Востаннє редагувалося Parsifal (22.08.2018 16:49:11)

Re: Допоможіть з сортуванням двовимірних масивів на мові С++.

Вгору / вниз неполучається так верхній рядок опускається, перші 3 нормально а в 4 появляються такі цифри  яких нема в двовимірному масиві.

#include <iostream>
#include <time.h>
#include <iomanip>
using namespace std;
void main() {
    int rows, cols, a = 0, cho, shift, tmp;
    const int m = 100, n = 100, num = 10;
    int ar[m][n], ar1[num];
    cout << "Enter rows:";
    cin >> rows;
    cout << "Enter cols:";
    cin >> cols;
    srand(time(0));
    for (int i = 0; i < num; i++) {
        ar1[i] = a;
        a++;
    }
    a = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            ar[i][j] = rand() % num;
            a = ar[i][j];
            ar[i][j] = ar1[a];
        }
    }
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            cout << setw(5) << ar[i][j];
        }
        cout << "\n";
    }
    cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \nchoice:";
    cin >> cho;
    for (;cho > 0 && cho <= 4;) {
        if (cho == 1) {
            cout << "shift:";
            cin >> shift;
            for (int f = 0; f < shift; f++) {
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols - 1; j++) {
                        tmp = ar[i][j];
                        ar[i][j] = ar[i][j + 1];
                        ar[i][j + 1] = tmp;
                    }
                }
            }
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    cout << setw(5) << ar[i][j];
                }
                cout << "\n";
            }
            cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \nchoice:";
            cin >> cho;
            for (int f = 0; f < shift; f++) {
                for (int i = 0; i < rows; i++) {
                    for (int j = cols - 1; j > 0; j--) {
                        tmp = ar[i][j];
                        ar[i][j] = ar[i][j - 1];
                        ar[i][j - 1] = tmp;
                    }
                }
            }
        }
        if (cho == 2) {
            cout << "shift:";
            cin >> shift;
            for (int f = 0; f < shift; f++) {
                for (int i = 0; i < rows; i++) {
                    for (int j = cols - 1; j > 0; j--) {
                        tmp = ar[i][j];
                        ar[i][j] = ar[i][j - 1];
                        ar[i][j - 1] = tmp;
                    }
                }
            }
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    cout << setw(5) << ar[i][j];
                }
                cout << "\n";
            }
            cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \nchoice:";
            cin >> cho;
            for (int f = 0; f < shift; f++) {
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols - 1; j++) {
                        tmp = ar[i][j];
                        ar[i][j] = ar[i][j + 1];
                        ar[i][j + 1] = tmp;
                    }
                }
            }
        }
        if (cho == 3) {
            cout << "shift:";
            cin >> shift;
            for (int f = 0; f < shift; f++) {
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        tmp = ar[i][j];
                        ar[i][j] = ar[i - 1][j];
                        ar[i - 1][j] = tmp;
                    }
                }
            }
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    cout << setw(5) << ar[i][j];
                }
                cout << "\n";
            }
            cout << "0 - exit \n1 - shift left \n2 - shift right \n3 - shift up \n4 - shift down \nchoice:";
            cin >> cho;
        }
    }
    system("pause");
}

9

Re: Допоможіть з сортуванням двовимірних масивів на мові С++.

Parsifal написав:

появляються такі цифри  яких нема в двовимірному масиві.

Значить, ви десь вилізаєте за межі масиву. Я от навмання бачу

for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        tmp = ar[i][j];
                        ar[i][j] = ar[i - 1][j];

що ar[i-1][j] при i==0 буде десь за масивом.

Подякували: Parsifal1

10

Re: Допоможіть з сортуванням двовимірних масивів на мові С++.

Я тільки початківець навіть не знаю що означає затінення змінної.

11

Re: Допоможіть з сортуванням двовимірних масивів на мові С++.

Дякую коало, допомогло.

12

Re: Допоможіть з сортуванням двовимірних масивів на мові С++.

Перекривання імен. Власне, "затінення" тут не зовсім коректно казати, це трохи інший механізм.

{
   int x=0;
   {
      int x=1;
      cout<<x;//виведеться 1
   }
   cout<<x;//а тут знову 0
}

У вас таке саме з j відбувалося - можливо, так і слід було, але це дивно.