Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KL_PrJAVU230200.doc
Скачиваний:
23
Добавлен:
17.03.2015
Размер:
702.46 Кб
Скачать

Многомерные массивы на примере двумерных

тип имя_массива_[размер по 1 индексу] [размер по второму индексу]….[размер по n индексу].

int mas1 [2][3];

2 - количество строк, 3 - количество столбцов. В памяти многомерные массивы располагаются так, что быстрей всего меняется самый первый индекс. => Двумерный массив располагается построчно.

a [0] [0], a [0] [1], a [0] [2]

a [1][0], a [1] [1], a [1] [2]

Двумерный массив может быть объявлен с инициализацией.

int mas1 [2] [3] = {

{1,2,3}, // элементы 1-ой строки матрицы

{4,5,6} // элементы 2-ой строки матрицы

};

или

int mas [2] [3] = {1,2,3,4,5,6};

Обращение к элементам матрицы осуществляется с указателем индекса строки и индекса столбца. (индексация начинается с нуля).

mas1 [0] [0] – строка – 0

столбец – 0

mas1 [1] [2] – строка – 1

столбец – 2

Динамическое выделение памяти под двумерный массив.

Massiv 2*3

1. Способ.

int **p;

Выделяем память под массив адресов строк:

  1. p=new int**[2];

  2. Выделение памяти динамически под каждую строку двумерного массива.

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

*(p+i) = new int[3];

Обращение к элементам матрицы

*(p+i) – адрес начала i – строки.

*(p+i)+j – адрес элемента массива с индексами i,j.

*(*(p+i)+j) – значение элемента массива с индексами i,j.

2. Способ (более простой) (выделение памяти динамически).

Будем рассматривать двумерный массив как одномерный с определенным количеством элементов.

Пусть массив 2*3

p=new int[2*3];

Зная индекс элемента i,j вычислим смещение от первого элемента массива с индексами [0] [0] до элементов массива с индексами i,j.

Смешение = количество элементов в полных строках + смещение по неполной строке.

Смещение = i*m (количество столбцов) +j

p + i * m + j – адрес элемента массива с индексами i,j.

*( p + i * m + j) - значение элемента массива с индексами i,j.

Организация перебора элементов массива в матрице.

1. Способ (перебор построчно)

a00 a01 a02 a03

a10 a11 a12 a13

a20 a21 a22 a23

int a [3] [4];

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

{ // начало i – строки

for (j=0;j<4;j++)

a [1] [j] = 0;

// конец i – строки

}

2. Способ (перебор матрицы по столбцам)

a00 a01 a02 a03

a10 a11 a12 a13

a20 a21 a22 a23

int a [3] [4];

for (j=0;j=4;j++)

{ // начало j – столбца

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

a [i] [j] = 0;

// конец j – столбца

}

Задача 1.

Дан массив. Память выделить статически. Ввести с клавиатуры и вывести на экран.

Вычислить произведение не нулевых элементов матрицы.

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

int main(void) {

const int N=3;

const int M=4;

int A[N][M], proiz=1;

for (int i=0; i<N; i++) {

for (int j=0; j<M; j++) {

cout << "Enter" << i << j;

cin >> A[i][j];

}

}

for (i=0; i<N; i++) {

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

cout << A[i][j];

if (A[i][j]!=0) {

proiz *= A[i][j];

}

}

cout << endl;

return 0;

}

Функции языка С++

Любая нетривиальная задача требует разбиения ее на несколько логически завершенных частей, каждая из которых реализуется определенной функцией. Выполнение программы начинается с функции main, а она в свою очередь вызывает другие функции.

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

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

Каждая из функций состоит из заголовка и тела функции. Каждая функций может находится в определенном файле, или все функции в одном файле, в любом порядке, но при этом каждая функция пишется от начала до конца.

Заголовок функции – это директивы препроцессора и имя функции. Если все функции помещены в одном файле, директивы препроцессора пишутся в самом начале файла один раз. Имя функции включает в себя тип функции, название функции и в круглых скобках параметры вместе с их типом, разделенные запятой.

Тип функции определяется типом результата функции, передаваемого через оператор return. Если функция не передает результат, тип функции void. Если тип функции не указан, то по умолчанию она типа int.

Параметры функции – это переменные, содержащие исходные данные, без которых нельзя вычислить результат.

Тело функции пишется аналогично телу main. После { скобки описывается внутренние переменные функций, необходимые для вычисление результата и для реализации алгоритма функции. Затем следуют операторы, реализующие алгоритм. Оператор return обычно завершает функцию. Хотя он может быть написан в любом месте функции в составе условного оператора.

Return; //при этом тип функции void.

Return res; //при этом тип функции как у переменной res

return a*b;

return 1; //если результат выражен const.

Сама по себе функция не выполняется, необходимо, чтобы в теле другой функции, обычно main, появился оператор вызова этой функции. При написании оператора вызова функции пишутся аргументы функции в том же порядке, количества, что и параметры.

Аргументы функции – это конкретные значения исходных данных, передаваемых параметрам в процессе выполнения функции. Функции, кроме типа void, могут вызываться внутри выражения.

Прототип функции пишется до вызова функции обычно перед именем вызывающей функции, и содержит тип функции, название функции и в круглых скобках список типов параметров. Завершается ;

Если тип аргумента в операторе вызова функции не соответствует прототипу, он автоматически (если это возможно) приводятся к нужному типу и функция вызывается правильно; в противном случае возникает ошибка компиляции.

Итак, при написании функции необходимо:

  • Объявить функцию или написать прототип.

  • Определить функцию (написать имя и тело).

  • В нужном месте программы организовать вызов функции.

ПРАВИЛА (основные принципы построения функции):

  1. Каждая функция реализует одну подзадачу.

  2. Исходные данные всегда передаются через параметры. Исключаются диалоги на ввод данных.

  3. Результат всегда передается из функции с помощью оператора return или через параметры.

  4. Функция не должна содержать констант, кроме общепринятых. Присутствие const объясняется нехваткой параметра.

Написать программу с функцией вычисляющей площадь произвольного треугольника по формуле Герона.

1. Название функции: Streug

2. Исходные данные:

а) сторона a => double a;

б) сторона b => double b;

в) сторона c => double c;

3. Тип результата функции: площадь => double

#include <math.h>

double Streug(double a,double b,double c)

{

double s, p;

p = (a+b+c)/2;

s = sqrt(p*(p-a)*(p-b)*(p-c));

return s;

}

Помещаем функцию в отдельный файл (streug.cpp).

Затем необходимо создать заголовочный файл streug.h. В этот файл помещаем:

#ifndef STREUG_H

#define STREUG_H

double Streug(double a,double b,double c);

#endif

Создаем файл main.cpp, содержащий решение всей программы:

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include “streug.h”

int main (void)

{

double A,B,C,S; // имена аргументов не должны совпадать с именами параметров, хотя и могут

cout << «\nВведите стороны»;

cin >> A >> B >> C;

cout << «\n\nРезультат»;

S=Streug(A,B,C); // функцию можно вызвать и другим способом – S=Streug(5.0,3.5,7);

cout << “\Ns=” << S << endl;

return;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]