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;

}


 

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

48681. Исследование характеристик линейных электрических цепей 2.58 MB
  Задание к курсовой работе Нормирование параметров и переменных цепи Определение передаточной функции цепи Hs Расчет частотных характеристик цепи Hj Определение переходной h1t и импульсной ht характеристик Вычисление реакции цепи при воздействии одиночного импульса на входе Определение спектральных характеристик одиночного импульса воздействия Вычисление спектра реакции при одиночном импульсе на входе Определение спектра периодического входного сигнала Приближенный расчет реакции при...
48682. Численное моделирование и анализ переходных процессов в электрической цепи 576 KB
  В начальный момент времени ключ находится в положении При этом цепь разомкнута, напряжение на конденсаторе и ток в катушке равны нулю (U = 0, I = 0). Происходит первое переключение ключа (ключ мгновенно переводится в положение 2). При этом происходит заряд конденсатора, меняются значения U и I.
48684. Основы теории цепей 379 KB
  Содержание расчетно-пояснительной записки: таблица исходных данных; электрическая схема фильтра системы уравнений цепи; комплексная функция передачи; карта полюсов и нулей; АЧХ и ФЧХ и импульсные характеристики. С помощью метода узловых напряжений составляется система уравнения цепи в математической и скалярной форме.
48685. Проектирование электрической сети для электроснабжения потребителей целлюлозно-бумажной промышленности 1.33 MB
  В условиях эксплуатации баланс мощности составляется на каждый час суток(диспетчерский график нагрузки), и на каждый месяц следующего квартала. При проектировании электрической сети баланс мощности составляется для определения суммарного необходимого ввода мощности на электростанциях и обмена потоками мощностей с энергосистемой.
48686. Организация пассажирского движения 988.5 KB
  Для каждой категории поездов необходимо установить число и продолжительность стоянок по техническим надобностям смены локомотивов и локомотивных бригад технического осмотра составов снабжения топливом водой а также для посадки и высадки пассажиров или погрузки выгрузки багажа и почты. Общим условием рациональной технологии обработки всех поездов является выполнение вспомогательных и подготовительных операций до их прибытия на станцию на основе предварительной информации о наличии свободных мест количестве багажа и почты...
48688. Исследование и анализ линейных динамических цепей 423.5 KB
  Полоса частот, в которой ослабление мало, называется полосой пропускания. Полоса частот, в которой ослабление велико, называется полосой непропускания (задерживания). Между этими полосами находится переходная область.
48689. Расчет радиовысотомера (РВ) с диапазоном измеряемых высот от Нmin до Нmax при удельной ЭПР отражающей поверхности не менее - 20 дБ 668.5 KB
  Расчет параметров сигнала. Принять что высота настройки УПФ следящей системы 25кГц коэффициент шума приемника 20 дБ потери энергии сигнала в высокочастотном тракте не превышают LΣ а при обработке ζΣ.04 м Ширина диаграммы направленности: φ=15 град Потери энергии сигнала в высокочастотном тракте: LΣ≤16 дБ Потери при обработке: Σ≤17 дБ Максимальная скорость изменения высоты: Vн mx=2 м с Удельная ЭПР отражающей поверхности: S≥20 дБ КПД антенны: ηа=0. При непрерывном сигнале обязательно применение в РВ...