4308

Двумерные массивы

Контрольная

Информатика, кибернетика и программирование

Двумерные массивы Язык С позволяет использовать массивы любой размерности, но наиболее часто встречаются двумерные массивы. Двумерным называется массив, элементы которого являются сами массивами. Двумерный массив можно представить как таблицу, имеющ...

Русский

2012-11-16

63.5 KB

9 чел.

Двумерные массивы

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

Двумерный массив можно представить как таблицу, имеющие столбцы и строки. Такой массив следует объявлять с двумя индексами, один из которых определяет количество строк, а второй количество столбцов таблицы. Например массив, объявленный как:

           int table [3] [4] ;

можно представить в виде таблицы 1. Этот массив имеет три строки и  четыре столбца. Для доступа к элементу массива следует указать два индекса. Первый индекс элемента двумерного массива представляет собой номер строки, а второй – номер столбца. Для массива table  индекс  номера строки принимает значения 0,1,2, а индекс номера столбца – значения 0,1,2,3.

                                                                       Таблица 1. Массив table [3] [4].

table [0] [0]

table [0] [1]

table [0] [2]

table [0] [3]

table [1] [0]

table [1] [1]

table [1] [2]

table [1] [3]

table [2] [0]

table [2] [1]

table [2] [2]

table [2] [3]

количество байт памяти, которое необходимо для размещения массива, вычисляется по формуле:

 Количество  байт =  размер типа данных * количество строк  * количество столбцов.

Под массив  table [3] [4] требуется           2*3*4 = 24 байта памяти.

В памяти двумерный массив занимает непрерывную область и  располагается  по строкам, как одномерный.  Например массив table [3][4] располагается в памяти так, как показано на рис.1.

table [0][0] …table [0][3]  table [1][0… table [1][3]    table [2][0… table [2][3

           первая  строка             вторая  строка                   третья  строка

         Рис.1. Размещение двумерного массива table [3][4] в памяти.

Инициализация  двумерных массивов.

Для инициализации двумерного массива следует при объявлении массива в фигурных скобках записать список констант, значения которых присваиваются элементам массива.

Например, массив table [3][4] может быть инициализирован так:

int table [3][4] = {

                             {5 ,8 ,9 ,7},

                             {3, 6, 4, 7},

                             {6, 2, 1, 0}

                           };

Массив table будет заполнен так:

5

8

9

7

3

6

4

7

6

2

1

0

Если констант в списке будет указано меньше, чем элементов массиве, то оставшиеся значения элементов массива не определены. Например, при инициализации массива table следующим образом:

int table [3][4] = {

                             {5 ,8 },

                             {3, 6, 4, 7},

                             {6, 1, 0}

                           };

Массив table будет заполнен так:

5

8

3

6

4

7

6

1

0

В пустых клеточках значения элементов массива не определены.

Пример 1. Пусть в маленькой гостинице имеется 10 комнат. Известны номера комнат: 102,107,109,112,115,116,123,125,127,130 и вместимость каждой комнаты соответственно: 12,43,23,12,20,15,16,23,12,15. Рассмотрим задачу поиска и вывода списка комнат, вместимость которых составляет не меньше значения, вводимого с клавиатуры.

#include <stdio.h>

//объявление двумерного массива room. Значения элементов  первой строки массива

//представляют собой номера комнат,

//а значения элементов второй строки – вместимость комнат


           
int room[2][10]= {
     {102,107,109,112,115,116,123,125,127,130},

     {12,43,23,12,20,15,16,23,12,15}

                     };

 void main (void)

 {

int i,j, flag=0,num;

//вывод вместимости всех комнат гостиницы

  puts("Вместимость всех комнат гостиницы:");

    for( j=0; j<10; j++)

      printf("Комната #%d рассчитана на %d мест\n",room[0][j],room[1][j]);

  puts("Введите минимальное необходимое количество мест");

  scanf("%d",&num);

// поиск списка комнат с заданной вместимостью

  for(j=0; j<10; j++)

    if(room[1][j]>=num)

      {flag=1;

  printf("Комната #%d рассчитана на %d мест\n",room[0][j],room[1][j]);

  }

  if(flag==0)

  puts("Комнат с таким количеством мест нет");

  }

Пример 2. По введенным числу, месяцу и  году  определить порядковый номер дня в году.  Например, если ввести 10  - это число, 4 – это месяц, 2001 – это год, то программа должна вывести:

В 2001 году это день имеет номер 100.

Для решения этой задачи используется двумерный массив, имеющий две строки и 13 элементов в каждой строке. В первую строку занесены значения количества дней в каждом месяце не високосного года, а во вторую  - то же для високосного года. В строке 13 элементов, а на 12, т.к. месяцы года нумеруются, начиная с первого, а индексы элементов массива начинаются с нуля.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

 void main(void)

 {

 clrscr();

   int year,month,day,i,k;

//объявление и инициализация массива

   int tab_days[2][13]={

   {0,31,28,31,30,31,30,31,31,30,31,30,31},

   {0,31,29,31,30,31,30,31,31,30,31,30,31}

   };

    puts("Введите число, месяц и год");

    scanf("%d %d %d",&day,&month,&year);

    // определим, високосный ли год

    k=year%4==0 && year%100 !=0 || year%400 ==0;

     if(k==1)

puts("Год високосный" );

else

puts("Год  не високосный" );

// контроль правильности ввода месяца

     if(month<1 || month >12)

     {

     puts("Неверно введен месяц");

     exit(-1); //завершение работы программы при ошибке

     }

// контроль правильности ввода числа

if(day <1 || day >tab_days[k][month])

     {

 puts("Неверно введен день");

     exit(-1);

     }

// цикл по номеру месяца

     for(i=1; i<month; i++)

      day+=  tab_days[k][i];

    printf("В %d году этот день имеет номер %d\n",year, day);

    getch();

    }

Присваивание значений элементам массива

Значения элементам массива могут быть присвоены в процессе работы программы. Для этого следует организовать вложенные циклы, управляющие переменные которых позволяют индексировать строки и столбцы двумерного массива.

Пример 3. Заполнение двумерного массива случайными числами


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

int main(void)

{

 int i,j;

 int num[3][4];  //выделена память под двумерный массив

   clrscr();

  randomize();

//внешний цикл  индексирует строки

  for(i=0; i<3; i++) //индекс строки изменяется от 0 до 2

// внутренний цикл индексирует столбцы

  for(j=0; j<4; j++) //  индекс столбцаи изменяется от 0 до 3

  num[i][j] = rand(); //присваиваивание элементу матрицы случайного числа

 printf("Полученная матрица\n\n");

// вывод матрицы по строкам

 for(i=0; i<3; i++) {

   for(j=0; j<4; j++)

     printf("%6d ", num[i][j]);

   printf("\n");

 }

  getch();

 return 0;

}

Пример 4.

Если необходимо, чтобы при обявлении элементы  массив были инициализированы нулевыми значениями, массив может быть объявлен как статический.

//Сформировать матрицу A(10,10) следующего вида:
           //          1 0 0 ...0

//          2 1 0 ...0

//          3 2 1 ...0

//          . . . . ..

//          . . . . ..

//          10 9 8 ...1

//

#include <stdio.h>

#include <conio.h>

#define N 10

 void main(void)

 {

   static int a[N][N];  //Статический массив инициализируется  нулями

   int i,j;

   clrscr();

   for(i=0;i<N; i++)

    for(j=0; j<N; j++)

if(i>=j)

 a[i][j]=i-j+1;  //условие попадания под гл. диагональ

//вывод полученного массива

     for(i=0;i<N; i++)

     { for(j=0; j<N; j++)

 printf("%3d",a[i][j]);

 putchar('\n');

      }

   getch();

      }

Ввод элементов двумерного массива в диалоговом режиме

Пример 5.


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
 int i,j;
 int num[3][4];  //выделена память под двумерный массив


   clrscr();

  randomize();

  for(i=0; i<3; i++) //индекс строки изменяется от 0 до 2

  for(j=0; j<4; j++) //  индекс столбцаи изменяется от 0 до 3

  {

     printf("Введите элемент num[%d][%d]\n",i,j);

    scanf("%d",&num[i][j]);

    }

 printf("Полученная матрица\n\n");

// вывод матрицы по строкам

 for(i=0; i<3; i++)

{

   for(j=0; j<4; j++)

     printf("%6d ", num[i][j]);

   printf("\n");

 }

  getch();

 return 0;

}

МАССИВЫ СТРОК

Массив строк можно организовать так же, как массив данных любого типа. Массив строк будет являться массивом массивов символов. Определяя массив строк также, как и при определении массива другого типа, следует использовать два индекса. Например, определение

char name [10] [20];

задает 10 строковых переменных name длиной не более 19 символов в каждой.

Строки можно вводить и выводить, используя только один цикл, повторяющийся по одному разу на каждую строку массива, как показано в примере 1.

Пример 1. Ввод-вывод массива строк.

#include <stdio.h>

 void main (void

{

 char name[10] [20];

int index;

// ввод строк

// цикл по индексу строки

for(index=0; index <10; index++)

{

printf(“Введите строку №%d  “,index);

gets(name[index];

printf(“ \n”);

}

// вывод строк

// цикл по индексу строки

for(index=0; index <10; index++)

{

puts(name[index];

}

}

Если требуется задавать строки путем ввода значений отдельных символов, следует использовать вложенные циклы. Так, если  необходимо ввести строки, составляющие массив char name[10][20], то следует организовать внешний цикл, который должен повторяться 10 раз, по одному на каждую строку и внутренний цикл, который должен иметь 19 повторов для ввода значений одной строки. В примере 1 показана программа, в которой вводятся 10 имен в массив, а затем все эти 10 строк с помощью цикла for выводятся на экран.

Пример 2.

#include <stdio.h>

  void main (void)

  {

    char name[10][20],letter;

    int index1, index2;

//цикл по номеру строку

    for (index1 = 0; index1 < 10; index1++)

    {

     index2=0;

     puts("Введите имя, для завершения нажмите Enter\n");

        do

        {

          letter=getchar(); //символ вводится в переменную letter

     //значение символа присваивается элементу двумерного массива

    //   name[index1][index2]

   // первый индекс – номер строки внутри массива

   // второй индекс – позиция символа внутри строки

           name[index1][index2] = letter;

           index2++;

           }while (letter !='\n' && index2 <19);

             name[index1][index2]='\0'; // дописываем нулевой байт в конец строки

             putchar('\n');

          }

// вывод строк массива на экран – цикл организован по индексам строк

    for (index1 = 0; index1 < 10; index1++)

//вывод строки целиком за один раз

    puts( name[index1]);

     putchar('\n');

     }

Пример 3 Программа- простейший текстовый редактор. Позволяет вводить до 100 сирок, длина каждой строки – не более 254 символов. Ввод строк прекращается при вводе пустой строки, то есть при нажатии клавиши Enter.

#include <stdio.h>
         #define MAX 100
          #define LEN 255

char text[MAX][LEN];

int main(void)

{

  int t, i, j;

//ввод строки целиком за один раз

 for(t=0; t<MAX; t++)

{

 //вывод номера строки

   printf("%d: ", t);

//ввод строки

   gets(text[t]);

//ввод прекращается, если первым символом  строки

//оказывется нулевой байт- признак конца строки

   if(!text[t][0]) break;

 }

 /*посимвольный  вывод массива строк на экран  */

//внешнтй цикл по номеру строки

 for(i=0; i<t; i++)

 {

//внутренний цикл по номеру столбца

   for(j=0; text[i][j]; j++)

 printf("%c", text[i][j]);

   printf("%c", '\n');

 }

 return 0;

}


 

А также другие работы, которые могут Вас заинтересовать

13354. Газове зварювання металів 1.45 MB
  Лабораторна робота № 4 Газове зварювання металів Мета роботи: ознайомитися з основними відомостями про газове зварювання металів вибрати режими зварювання отримати зварне з'єднання та перевірити його якість. Обладнання інструменти і матеріали: спецодяг зварюваль...
13355. Токарні верстати ,загальний вигляд, основні вузли та блоки 1.03 MB
  1.Токарні верстати загальний вигляд основні вузли та блоки. Верстати токарної групи застосовують для обробки заготовок які обертаються головний рух різання інструментом що здійснює неперервний рух подачі. Тут основним різальним інструментом є різець; використ
13356. Загальний вигляд свердлильних та розточувальних верстатів, основні вузли та блоки 366.5 KB
  1.Загальний вигляд свердлильних та розточувальних верстатів основні вузли та блоки. Свердлильні верстати Свердлильні верстати служать для обробки отворів інструментом який виконує одночасно головний обертальний рух різання і поступальний рух подачі. Розрізн...
13357. Фрезерні верстати 617.5 KB
  Фрезерування високопродуктивний і поширений спосіб обробки поверхонь заготовки за допомогою різального інструмента фрези з багатьма вістрями. Під час обробки фреза обертається виконуючи головний рух різання а заготовка пересувається прямолінійно виконуючи ру
13358. Визначення чисел твердості металів на приладі ТК-2 (типу Роквелла) 2.6 MB
  Лабораторна робота №8 Визначення чисел твердості металів на приладі ТК2 типу Роквелла Мета роботи: Ознайомитися з основними методами вимірювання твердості металів та сплавів ознайомитися з будовою і принципом роботи приладу ТК2 для випробування металів на тве
13359. Виробництво виливків в піщано-глиняних формах 335.95 KB
  Лабораторна робота № 2 Виробництво виливків в піщаноглиняних формах Мета роботи вивчити технологію отримання виливків в піщаноглиняних формах casting mould отримати навички формовки заливки форм вибивки литва аналізу браку сфери застосування литва виготовленого...
13360. Ознайомлення з програмою моделювання електричних та електронних кіл Electronics Workbench 4.0 32 KB
  Лабораторна робота № 5 Тема: Ознайомлення з програмою моделювання електричних та електронних кіл Electronics Workbench 4.0 Мета: Вивчити структуру та основні можливості програми схемотехнічного моделювання Electronics Workbench 4.0. Отримати практичні навички проведення експериме...
13361. Аналіз лінійного кола періодичного несинусоїдального струму 411.5 KB
  Лабораторна робота № 7 Тема: Аналіз лінійного кола періодичного несинусоїдального струму Мета: Вивчити методику комплексного дослідження однофазного електричного кола періодичного негармонічного струму з допомогою програми схемотехнічного моделювання Electroni...
13362. Аналіз перехідних режимів в лінійних електричних колах 571 KB
  Лабораторна робота № 8 Тема: Аналіз перехідних режимів в лінійних електричних колах Мета: Вивчити методику комплексного дослідження перехідних режимів електричних кіл для визначення впливу різних факторів на вигляд та характеристики процесів з допомогою програ...