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;

}


 

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

74859. Народная свадебная поэзия (состав и отношение к обрядам) 74.95 KB
  Свадебный приговор ритуальная речь участников свадьбы; основные носители –сторона жениха; смеховая стилистика Свадебные лирические песни исполняют девушки или женщины хор –поигрицы; взгляд на свадьбу со стороны; сюжетность; повествование от 3 л. Свадебные величальные песни исполняют девушки или женщины –поигрицы –в составе ритуала опевания; хвалебный характер; идеальный мир Свадебные корильные песни исполняют...
74860. Фольклорная гипербола как поэтический приём 81.63 KB
  В зависимости от специфики жанра гипербола преувеличивая что-либо выполняет разные функции. жанры календарного обрядового фольклора величальные корильные песни заклинательные песни гипербола тоже выполняет магическую функцию. В подобной функции гипербола выступает и в жатвенных песнях где заклинается богатый урожай: В поле копами копнами На гумне стогами.
74861. Тема солдатчины и военной службы в фольклоре 99.82 KB
  Точка зрения раскрытия темы: Раскрытие темы со стороны родственников людей не связанных напрямую с военной службой причитания сказки новеллистические баллады Раскрытие темы со стороны солдат причитания солдатские песни исторические песни анекдоты пословицы поговорки сказки новеллистические Предмет изображения произведений данного тематического круга: Тяготы военной службы причитания солдатские песни пословицы поговорки баллады Бытовые ситуации отдельные сцены солдатской жизни анекдоты пословицы и...
74862. Исследование Проппа «Исторические корни волшебной сказки» 66.32 KB
  Волшебная сказка древнее феодализма создавалась на основе докапиталистических форм и социальной жизни нужно сравнивать с исторической действительностью прошлого важно определить при каком социальном строе создавались отдельные мотивы и вся сказка. Сказка как явление надстроечного характера Часто предпосылки выступают продуктом эпохи. Сказка не соответствует той форме производства при которой она существует. Сказка и социальные институты прошлого.
74863. ПРОБЛЕМЫ ИСТОРИЧЕСКОГО ИЗУЧЕНИЯ ФОЛЬКЛОРА В РАБОТАХ ПРОППА РУССКИЙ ГЕРОИЧЕСКИЙ ЭПОС И РЫБАКОВА ДРЕВНЯЯ РУСЬ. СКАЗАНИЯ. БЫЛИНЫ. ЛЕТОПИСИ 49.27 KB
  Проппа Русский героический эпос – первая и остающаяся до сих пор единственной монография посвящённая русским былинам. Автором рассмотрены все многообразные сюжеты так что возможно использовать книгу в качестве справочника по эпосу. Народ вкладывает в эпос свои стремления содержание песен настраивает его на высокий моральный уровень.
74864. Частушки (происхождение, темы, поэтика) 61.23 KB
  Частушка является самым распространенным жанром песенной поэзии. Частушка очень ярко и быстро откликалась на самые разнообразные темы современности. Частушка представляет собой одновременно и памятник далекого прошлого и громкий голос современности. Одна и та же частушка может существовать десятилетиями подвергаясь мелким крупным изменениям.
74865. Роды и виды детского фольклора 57.99 KB
  Пестушка как явление игрового фольклора. Практическая функция. Потешка (“Ладушки”, “Сорока” и др.) и ее развитые игровые и словесные формы. Прибаутки как явление словесного творчества. Их структурные формы как маленьких сказочек в стихах. Особый вид прибауток-перевертыши. Нарочитое смещение в прибаутках реальных связей и отношений как педагогическое свойство и средство комического.
74866. Исторические песни о событиях 16-17 веков 111.49 KB
  Исторические песни как эпический жанр очень близки к былинам но все же отличны от былин по содержанию форме. Термин исторические песни является не народным он введен исследователями фольклора. Чаще всего люди не занимающиеся фольклористикой не выделяют исторические песни как особый жанр называют наравне с былинами старинастаринка.
74867. Духовные стихи и песни (темы, образы, сюжеты, стиль) 109.26 KB
  Основа Духовных стихов –книжные повести церковного происхождения источник –Священное Писание. Функции Духовных стихов Назидательная Дидактическая Форма исполнения: песенная этим отличается от легенды. Духовные стихи в отношении формы и стиля делятся на Лирические Эпические более древние Общим для лирических эпических и лироэпических стихов является их несомненная зависимость от книжных источников...