Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб по С и C++.doc
Скачиваний:
216
Добавлен:
25.03.2015
Размер:
1.34 Mб
Скачать

Контрольные вопросы

  1. Укажите типы массивов, применяемых в языке С.

  2. Формы (способы) работы с элементами массива.

  3. Как описываются строки в языке С?

  4. Чем отличаются функции scanf()иgets(),printf()иputs()?

Лабораторная работа №4 Многомерные массивы, динамическое распределение памяти

Цель работы:

Изучить работу с многомерными массивами, освоить возможности динамического размещения данных.

Краткие теоретические сведения

Кроме одномерных массивов возможна работа с многомерными массивами. Объявление многомерного массива:

<тип><имя>[<размер 1 >][<размер 2 >]…[<размер N>]={{список начальных значений}, {список начальных значений},…};

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

Например, элементы двухмерного массива b[2][1] размещаются в памяти в следующем порядке:

b[0][0], b[0][1], b[1][0], b[1][1], b[2][0], b[2][1].

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

int a[3][4] = {{0,1,2,0},{9,-2,0,0},{-7,1,6,8}};

Если в какой-то группе {…} отсутствует значение, то соответствующему элементу присваивается 0. Предыдущий оператор будет эквивалентен следующему определению:

int a[3][4] = {{0,1,2},{9,-2},{-7,1,6,8}};

Пример программы

Создать двумерный массив целых чисел NxM(NиMне более 50), используя функциюrandи вывести на экран в форме матрицы,N,Mввести с клавиатуры:

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#define rnd (rand()/ 32768.0) // rand - генератор случайных чисел от 0 до int, rnd – от 0 до 1

void main(void)

{ int i,j,n,m,a[50][50];

puts(“\n Input n, m:”); scanf(“%d %d”,&n,&m);

printf(“\n Array a \n”);

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

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

a[i][j]=rnd*10-5; // диапазон от –5 до 5

printf(“%d%c“, a[i][j], (j= =m-1)?’\n’:’ ‘);

}

getch();

}

Массивы указателей

В языке С/C++ можно использовать массивы указателей, элементы которых содержат, как правило, указатели на строковые данные. Объявляется такой массив например так: char *m[5]. Здесь массив m[5] – массив, который может содержать пять адресов данных типа char.

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

В качестве примера приведена программа, формирующая массив указателей с одновременной инициализацией его элементов. Программа распечатывает номер строки, ее адрес и значение.

#include <stdio.h>

#include <conio.h>

void main(void)

{

int i,k;

char *m[]={"Winter","Spring","Summer","Automn"};

k=sizeof(m)/sizeof(*m);

printf("\n Количество строк = %d",k);

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

printf("\n Номер - %d; Адрес - %p; Строка: %s", i+1, m[i], m[i]);

getch();

}

В результате получим:

Количество строк = 4

Номер - 1; Адрес - 0042007C; Строка: Winter

Номер - 2; Адрес - 00420074; Строка: Spring

Номер - 3; Адрес - 0042006C; Строка: Summer

Номер - 4; Адрес - 00420064; Строка: Automn

Конкретные значения адресов зависят от ряда причин: архитектура компьютера, тип и размер оперативной памяти и т.д.