Согласие на обработку персональных данных.

15.12.2018
Новая задача Как преобразовать байт в килобайт.

05.12.2018
Новые видео и статья Параграфы и выравнивание текста в HTML.

01.12.2018
Новый выпуск журнала Автоматизация и программирование.

26.11.2018
Новые видео и статья Функция Concat.

25.11.2018
Новые видео и статья Справка в Lazarus.



Раздел: Задачи / Простейшие /

Как переставить столбцы в массиве

Условие задачи 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]; не должен выполняться.

Решение задачи 0.0 на Паскале
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.

Решение задачи 0.0 на С++
#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;
}

ПРИМЕЧАНИЕ
Если вам что-то непонятно в коде на С++, то советую изучить книгу
Основы С++.

Как переставить столбцы в массиве


Основы C++ Основы C++

C++ - это один из самых популярных языков программирования. Не важно, на каком языке программируете лично вы. Но, если вы хотя бы в общих чертах не знаете С++, то это большой пробел в вашем образовании, который надо восполнить как можно быстрее... Подробнее...
Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика