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

Void main ()

{

int i, Na, Nb;

float *A, *B;

float s1,s2;

clrscr();

printf("Na = ");

scanf("%d", &Na);// вводим к-во элементов массива А

A = new float[Na]; // выделяем место в оперативной памяти для // массива А

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

{ printf("A[%d]=", i );

scanf("%f", A+i); // вводим элементы массива А

}

s1 = Sum (A, Na);

printf("s1= %7.2f\n",s1);

printf("**************\n");

printf("Nb = ");// вводим к-во элементов массива B

scanf("%d",&Nb);

B = new float [Nb];// выделяем место в оперативной памяти для // массива B

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

{ printf("B[%d] =", i );

scanf("%f", B+i); // вводим элементы массива B

}

printf("**************\n");

s2 = Sum (B, Nb);

printf("s2 = %7.2f \n",s2);

getch();

}

Обратите внимание на операторы ввода элементов массивов А иВ (scanf("%f", A+i);иscanf("%f", B+i);). В них:A+iэто адресi–го элемента массиваА (эквивалентная запись -&A[i]). Аналогично для выраженияB+i. Вспомните свойства указателей! А теперь, когда мы справились с обработкой функцией одномерных массивов, попытаемся составить функцию обработки для двумерного массива. Вернемся к задаче-2 из раздела “массивы”. Напомним постановку задачи:

Дано: Матрица вещественных чиселZ[N][M],N= 4,M= 3Определить:

Составим программу решения этой задачи, введя функцию обработки двумерного массива. Но сначала нам нужно решить, как можно передать двумерный массив функции, если формальный параметр может быть только указателем на простой тип или на одномерный массив. Простой тип мы использовали при передаче одномерного массива. Давайте представим себе, что у нас имеется указатель на массив из Мэлементов типаfloat. Вспомним, как можно описать такой указатель? Очевидно, это можно сделать таким образом:float (* p) [M], гдеp и есть тот самый указатель. Программа решения поставленной задачи представлена ниже:

#include<stdio.h>

#include<conio.h>

#define N 4

#define M 3

Void Sumstmatr ( float (*mz)[m], float *mx, int n1, int m1); //прототип функции Sumstmatr

Void main ()

{ float Z[N][M], X[M];

int i,j;

clrscr();

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

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

{ printf("Z[%d][%d] = ", i,j);

scanf("%f",&Z[i][j]);

}

Sumstmatr(Z,X,N,M); //вызов функции Sumstmatr

// Z – адрес нулевого элемента нулевой строки массива Z // Х – адрес нулевого элемента массива Х

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

{

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

printf("%7.2f ", Z[i][j]);

printf("\n");

}

printf("***********\n");

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

printf("%7.2f ",X[j]);

getch();

}

//заголовок функции Sumstmatr

Void Sumstmatr (float (*mz)[m], float *mx, int n1, int m1)

// float (*mz)[M] – указатель на массив из М элементов типа // float

{//начало тела функции Sumstmatr

int i,j;

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

{mx[j]=0;

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

mx[j]+=mz[i][j];

}

}// конец тела функции Sumstmatr

Отметим, что правила языка Си позволяют при описании формальных параметров вместо выражения float (*mz)[M] писать выражениеfloat mz[][M]. Эти выражения эквивалентны и в каждом описанmzуказатель на массив изМэлементов типаfloat. Соответствующий фактический параметрZ воспринимается транслятором как адрес нулевого элемента одномерного массива элементов типаfloat [M], а выражениеmz[i][j] реализует обращение к элементуZ[i][j]. Остальные элементы программы очевидны.

Следует отметить, что не всегда требуется передача всего двумерного массива. Для примера рассмотрим такую задачу:

Дано: Матрица вещественных чиселZ[N][M],N= 4,M= 3Определить:

Программа решения этой задачи представлена ниже:

#include<stdio.h>

#include<conio.h>

#define N 4

#define M 3

float Smatr ( float *mz, int m1); //прототип функции Smatr

Соседние файлы в папке attachments_05-09-2012_18-55-54