Раздел: Задачи / Простейшие /
Как переставить столбцы в массиве
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее... |
Условие задачи 0.0
Задача 0.0
Составьте программу циклической перестановки столбцов двумерного массива К, при которой первый столбец становиться последним, а i-й столбец становится i-1-м (сдвиг столбцов массива влево на 1).
На практике необходимость перестановки столбцов в двумерном массиве возникает не так уж и часто. Однако задачи по программированию, где необходимо выполнить это действие, можно найти во многих учебниках. Поэтому многие преподаватели их используют и задают студентам. А новички (или просто ленивые ученики) очень часто не могут решить подобную задачу самостоятельно.
В любом случае начинающим программистам будет полезно поупражняться в умении решать задачи с массивами и разобраться с тем, как поменять местами столбцы массива. Что я и предлагаю сегодня сделать. Попытайтесь сначала решить задачу самостоятельно, а уж потом смотрите мои решения на Паскале и С++.
Итак, понятно, что для перестановки столбцов массива в нашем случае надо каким-то образом перебрать эти столбцы и поочерёдно сдвинуть.
Сложность заключается в том, что у обычного массива нет каких либо способов перебора только строк или только столбцов. Поэтому нам придётся перебирать всю матрицу (таблицу) двумерного массива в цикле, запоминать значения столбца и сдвигать их. Как это сделать - всегда найдётся несколько способов. Но мы рассмотрим только один:
for j := 1 to NJ do for i := 1 to NI do begin if i = 1 then //Если это первый столбец X := K[j, i]; if i = NI then //Если это последний столбец K[j, NI] := X else //Если это НЕ последний столбец K[j, i] := K[j, i+1]; end;
Итак, здесь мы перебираем в цикле все элементы массива. Первый цикл перебирает строки, второй - столбцы.
Здесь надо заметить, что разделение двумерного массива на строки и столбцы является весьма условным. По сути двумерный массив - это таблица (матрица) из нескольких ячеек. И где у этой таблицы столбцы, а где строки - зависит от того, как её повернуть.
То же касается и двумерного массива - где у него строки, а где столбцы - зависит от того, как его вывести на экран.
Но мы будем считать, что массив К у нас объявлен так:
K : array[Строки, Столбцы] of byte; //2-мерный массив
То есть в нашем цикле мы сначала перебираем строки, а во вложенном цикле при просмотре каждой строки “пробегаемся” по столбцам.
Тогда при переборе столбцов текущей строки мы проверяем индекс элемента (номер столбца).
Если это первый столбец, то мы запоминаем его значение в переменную Х.
Если это последний столбце, то мы записываем в него значение переменной Х (то есть значение из первого столбца данной строки).
Если это не первый и не последний столбец, то мы в текущий столбец записываем значение из следующего столбца, и таким образом сдвигаем столбцы массива влево.
ВНИМАНИЕ!
Обратите внимание на код K[j, i] := K[j, i+1];
Когда i = NI
, то этот код будет пытаться получить значение
несуществующего элемента массива. Современные компиляторы не обращают на
это внимание (это зависит от настроек). Однако вообще-то так делать
не следует, и в настоящей программе надо будет обработать эту ситуацию,
то есть если i = NI
, то код K[j, i] := K[j, i+1];
не должен выполняться.
program mas; //**************************************************************** // КОНСТАНТЫ //**************************************************************** const NJ = 4; //Количество строк в массиве NI = 8; //Количество столбцов в массиве //**************************************************************** // ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ //**************************************************************** var i, j : byte; //Индексы X : byte; //Для 1-го столбца K : array[1..NJ, 1..NI] of byte; //2-мерный массив //**************************************************************** // ПОДПРОГРАММЫ //**************************************************************** //**************************************************************** // Вывод массива на экран в виде столбцов //**************************************************************** procedure MasToScreen; begin for j := 1 to NJ do for i := 1 to NI do if i = NI then WriteLn(K[j, i]:3) else Write(K[j, i]:3); WriteLn; end; //**************************************************************** // ОСНОВНАЯ ПРОГРАММА //**************************************************************** begin //Заполнить массив числами for j := 1 to NJ do for i := 1 to NI do K[j, i] := j * 10 + i; //Вывести массив на экран MasToScreen; //Переставляем столбцы for j := 1 to NJ do for i := 1 to NI do begin if i = 1 then //Если это первый столбец X := K[j, i]; if i = NI then //Если это последний столбец K[j, NI] := X else //Если это НЕ последний столбец K[j, i] := K[j, i+1]; end; //Вывести массив на экран MasToScreen; WriteLn(#10#13'The end. Press ENTER...'); ReadLn; end.
#include <cstdlib> #include <iostream> #include <iomanip> //!!! Подключить этот файл using namespace std; //**************************************************************** // КОНСТАНТЫ //**************************************************************** const int NJ = 4; //Количество строк в массиве const int NI = 8; //Количество столбцов в массиве //**************************************************************** // ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ //**************************************************************** int X; //Для 1-го столбца int K[NJ][NI]; //2-мерный массив //**************************************************************** // ПОДПРОГРАММЫ //**************************************************************** //**************************************************************** // Вывод массива на экран в виде столбцов //**************************************************************** void MasToScreen() { for (int j = 0; j < NJ; j++) for (int i = 0; i < NI; i++) if ((NI-1) == i) cout << setw(3) << K[j][i] << endl; else cout << setw(3) << K[j][i]; cout << endl; } //**************************************************************** // ОСНОВНАЯ ПРОГРАММА //**************************************************************** int main(int argc, char *argv[]) { //Заполнить массив числами for (int j = 0; j < NJ; j++) for (int i = 0; i < NI; i++) K[j][i] = (j + 1) * 10 + (i + 1); //Вывести массив на экран MasToScreen(); //Переставляем столбцы for (int j = 0; j < NJ; j++) for (int i = 0; i < NI; i++) { if (0 == i) X = K[j][i]; if ((NI-1) == i) K[j][NI-1] = X; else K[j][i] = K[j][i+1]; } //Вывести массив на экран MasToScreen(); system("PAUSE"); return EXIT_SUCCESS; }
ПРИМЕЧАНИЕ
Если вам что-то непонятно в коде на С++, то советую изучить книгу
Основы С++.
Вступить в группу "Основы программирования"
Подписаться на канал в РУТУБ Подписаться на Дзен-канал Подписаться на рассылки по программированию |
Как стать программистом 2.0
Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее... |
Помощь в технических вопросах
Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее... |