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;

}


 

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

32929. Русская философия XVIII века 14.57 KB
  Ломоносов и А. Михаил Васильевич Ломоносов 1711 1765 свое место в истории русской философии определил прежде всего тем что заложил основы материалистической традиции. Согласно этому закону в основе мироздания лежат мельчайшие частицы которые Ломоносов вслед за Лейбницем назвал монадами. Однако в отличие от последнего Ломоносов говорит не о духовных а о материальных монадах и материальных атомах.
32930. Основная специфика философского знания 12.54 KB
  Основная специфика философского знания заключается в его двойственности так как оно: имеет очень много общего с научным знанием предметметоды логикопонятийный аппарат; однако не является научным знанием в чистом виде. Предмет философии шире предмета исследования любой отдельной науки философия обобщает интегрирует иные науки но не поглощает их не включает в себя все научное знание не стоит над ним.; носит предельно общий теоретический характер; содержит базовые основополагающие идеи и понятия которые лежат в основе иных...