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;

}


 

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

31606. ПРЕДМЕТ, ЗАДАЧІ І МЕТОДИ ПАТОЛОГІЧНОЇ ФІЗІОЛОГІЇ 78 KB
  Патологічна фізіологія це наука яка вивчає загальні закономірності виникнення розвитку і завершення хвороби. Особливість предмету патологічної фізіології полягає в тому що вона вивчає найбільш загальні закономірності виникнення і розвитку хвороби у той час як інші науки вивчають особливе спеціальне кожної хвороби. При цьому патологічна фізіологія як наука вирішує наступні задачі: 1 Встановлення сутності хвороби що таке хвороба. 2 Вивчення причин і умов виникнення хвороби чому виникає хвороба чи патологічний процес.
31607. ПУХЛИНИ 85.5 KB
  Доброякісні пухлини складаються із добре диференційованих клітин і зберігають типову структуру тієї тканини з якої виростають. Злоякісні пухлини характеризуються втратою диференціювання клітин спрощенням і атиповістю будови. Певна частина пухлин походить із клітин крові тобто є гемобластозами або із клітин сполучної тканини і є саркомами. Ендогенними називають канцерогени які утворюються в організмі з його нормальних компонентів: а канцерогенні поліциклічні ароматичні вуглеводні метилхолантрен які синтезуються із холестерину...
31608. РЕАКТИВНІСТЬ і АЛЕРГІЯ 138.5 KB
  4 За патогенезом: а алергійні реакції гуморального типу I II III і V типи реакцій; 2 алергійні реакції клітинного типу IV тип реакцій за Кумбсом і Джеллом. У патогенезі алергійних реакцій виділяють наступні стадії: 1 імунологічну 2 патохімічну 3 патофізіологічну стадію клінічних проявів. 2 Патохімічна стадія це період часу від початку взаємодії алергену з ефекторами імунної системи антитілами чи Тлімфоцитами до появи біологічно активних речовин медіаторів алергійних реакцій. 3 Патофізіологічна стадія це період...
31609. АЛЕРГІЯ. Алергійні реакції III типу за Кумбсом і Джеллом - імунокомплексні реакції 75.5 KB
  Антиген і антитіло перебувають у вільному стані не фіксовані на поверхні клітин. В результаті активації комплементу і дії продуктів які продукуються макрофагами відбувається ушкодження клітин і розвивається запалення. Алергійні реакції IV типу за Кумбсом і Джеллом гіперчутливість cповільненого типу або клітинноопосередкований тип алергії. Такими клітинами є Тхелпери1 CD41 які мають специфічні до відповідного антигену рецептори Тірецептори.
31610. РОЗЛАДИ РУХОВОЇ І ТРОФІЧНОЇ ФУНКЦІЇ НЕРВОВОЇ СИСТЕМИ 86.5 KB
  Регуляція довільних рухів поперечнопосмугованих мязів здійснюється руховим аналізатором розташованим переважно в лобовій частці кори півкуль великого мозку клітини Беца передньої центральної звивини через двохнейронний пірамідний шлях: а корковоядерний і б корковоспинномозковий. Регуляція тонусу скелетних мязів і мимовільних автоматичних рухів здійснюється екстрапірамідною системою яка складається із підкіркових ядер кінцевого мозку хвостатого сочевицеподібного ядер огорожі структур проміжного мозку таламуса...
31611. СЕРЦЕВА НЕДОСТАТНІСТЬ 87.5 KB
  Недостатність серця це патологічний стан при якому навантаження на серце перевищує його здатність виконувати роботу по переміщенню крові у кровоносному руслі та забезпечувати кровопостачання органів і тканин відповідно до їх потреб. Недостатність серця класифікують: I. У залежності від клінічного перебігу розрізняють: а гостру і б хронічну недостатність серця. За виразністю клінічних проявів виділяють: а компенсовану і б декомпенсовану недостатність серця.
31612. СЕРЦЕВА НЕДОСТАТНІСТЬ 131.5 KB
  При цьому стан кровообігу визначається: а діяльністю серця б тонусом судин і в станом крові її загальною і циркулюючою масою а також реологічними властивостями. Порушення функції серця судинного тонусу чи зміни в системі крові можуть призвести до недостатності кровообігу. Усього на сьогоднішній день відомо більш 50 факторів ризику істотна роль яких у виникненні хвороб серця і судин чітко встановлена. Недостатність серця патологічний стан обумовлений нездатністю серця забезпечити кровопостачання органів і тканин відповідно до їх...
31613. СПАДКОВІСТЬ І ПАТОЛОГІЯ 85.5 KB
  Першу групу складають власне спадкові хвороби у яких етіологічну роль відіграє зміна спадкових структур роль середовища полягає лише в модифікації проявів захворювання. У цю групу входять: генні і хромосомні хвороби. □ Друга група екогенетична спадкові хвороби обумовлені патологічною мутацією однак для їх прояву необхідний специфічний вплив середовища. Основним етіологічним фактором у їх виникненні є несприятливий вплив середовища але реалізація дії фактора залежить від індивідуальної генетично детермінованої схильності організму у...
31614. УШКОДЖЕННЯ КЛІТИНИ 80 KB
  2 У залежності від ступеня порушень внутрішньоклітинного гомеостазу розрізняють: а зворотні зникають після припинення дії ушкоджуючого фактора б незворотні ведуть до загибелі клітини. 3 В залежності від періоду життєвого циклу клітини: а мітотичне і б інтерфазне. Насильницьке виникає у разі дії на здорову клітину фізичних хімічних і біологічних факторів інтенсивність яких перевищує порогові подразнення до яких клітина адаптувалася Цитопатичне виникає внаслідок первинного порушення захиснопристосувальних...