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

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

Основы программирования 2.0 Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее...

Условие задачи 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;
}

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

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


Как стать программистом 2.0 Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...
Помощь в технических вопросах Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

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