Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
attachments_05-09-2012_18-55-54 / ТРЕНИНГ УМЕНИЙ.doc
Скачиваний:
10
Добавлен:
09.04.2015
Размер:
118.78 Кб
Скачать

7.Пример выполнения упражнения тренинга на умение 7 Задание

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

  1. Выполним математическую постановку задачи, решаемой функцией: Дано: вещественная матрица Х(N,M) Определить:Y(i) = max X[i][j] – min X[i][j] j j Nmax[i] = ind {j | X[i][j] = max X[i][j]} j Nmin [i] = ind {j | X[i][j] = min X[i][j]} j i = 1,..N; j = 1,..M.

  2. Разработаем алгоритм обработки строки массива: Вход Z- объект, соответствующий строке массива Maxz = Z[0] Minz =Z[0] jmax = 0 jmin =0 цикл по j от 1 до M-1 Если Z[j] > Maxz то Maxz = Z[j] jmax = jконец-еслиЕсли Z[j] < Minz то Minz = Z[j] jmin = j конец – если конец-цикла по j передать во внешний массив jmax, jmin Вернуть MaxzMinz Выход В этом алгоритме объектZ должен соответствовать обрабатываемой строке матрицы (т. е. должен быть равен адресу строки). Ну, а что значит «передать во внешний массив jmax, jmin»? Такая передача возможна, если функции будет известен адрес соответствующих элементов массива, а передача адреса возможна с помощью указателей, что мы и учтем на следующем этапе.

  3. Дадим функции имя, определим список формальных параметров и тип возвращаемого значения, определим параметры, заменяемые «по значению» и «по наименованию»: Имя функции – DNmaxNmin Формальные параметры: Zуказатель на поле типа float, параметр, заменяемый “по наименованию”; ptr1 - указатель на поле типа int, параметр, заменяемый “по наименованию” и предназначенный для передачи в вызывающую программу jmax; ptr2 - указатель на поле типа int, параметр, заменяемый “по наименованию” и предназначенный для передачи в вызывающую программу jmin;N – параметр, заменяемый «по значению» (количество элементов в сроке матрицы). Функция должна возвращать разницу двух переменных типаfloat (MaxzMinz), т. е. тип возвращаемого значения – float.

  4. Напишем текст функции: float DNmaxNmin ( float *Z, int * ptr1, int * ptr2, int N) { int j, jmax, jmin; float Maxz, Minz;Maxz = Minz = Z[0];jmax = jmin= 0; for ( j =1; j < N-1;j++) { if (Z[j] > Maxz) { Maxz = Z[j]; jmax = j; } if (Z[j] < Minz) { Minz = Z[j]; jmin = j; } } * ptr1 = jmax;//передача во внешний массив Nmax * ptr2 = jmin;// передача во внешний массив Nmin return MaxzMinz; // возвращаем в точку вызова MaxzMinz }

  5. Напишем программу, обеспечивающую ввод исходных данных, обращение к функции и выдачу результатов: float DNmaxNmin ( float *Z, int * ptr1, int * ptr2, int N); # define n 3 # define m 4 void main ( ) { float X[n][m]; float Y[n]; int Nmax[n], Nmin[m];int i,j; clrscr(); printf (“Введите исходную матрицу\n”); for (i= 0; i < n; i++) for (j= 0; j < n; j++) { printf ( “X[%d][%d] = ”, i, j); scanf (“%f”, &X[i][j]); } for (i= 0; i < n; i++) Y[i] = DNmaxNmin ( X[i], &Nmax[i], &Nmin[i], m ); // здесь X[i] – это адрес i – ой строки матрицы X, т. е. &X[i][0] printf (“Введенная матрица\n”); for (i= 0; i < n; i++) { for (j= 0; j < n; j++) printf ( “%f ”, X[i][j] ); printf (“\n”); } printf (“Результат выполнения функции \n”); for (i= 0; i < n; i++) printf ( “Y[%d] = %6.2f Nmax[%d] = %d, Nmin[%d] = %d \n”, i, Y[i], i, Nmax[i], i, Nmin[i]); getch( ); }

  6. Оформим окончательно программу: # include <conio.h> # include <stdio.h> float DNmaxNmin ( float *Z, int * ptr1, int * ptr2, int N); # define n 3 # define m 4 void main ( ) { float X[n][m]; float Y[n]; int Nmax[n], Nmin[m];int i,j; clrscr(); printf (“Введите исходную матрицу\n”); for (i= 0; i < n; i++) for (j= 0; j < m; j++) { printf ( “X[%d][%d] = ”, i, j); scanf (“%f”, &X[i][j]); } for (i= 0; i < n; i++) Y[i] = DNmaxNmin ( X[i], &Nmax[i], &Nmin[i], m ); // здесь X[i] – это адрес i – ой строки матрицы X, т. е. &X[i][0] printf (“Введенная матрица\n”); for (i= 0; i < n; i++) { for (j= 0; j < m; j++) printf ( “%f ”, X[i][j] ); printf (“\n”); } printf (“Результат выполнения функции \n”); for (i= 0; i < n; i++) printf ( “Y[%d] = %6.2f Nmax[%d] = %d, Nmin[%d] = %d \n”, i, Y[i], i, Nmax[i], i, Nmin[i]); getch( ); } float DNmaxNmin ( float *Z, int * ptr1, int * ptr2, int N) //заголовок функции DNmaxNmin { int j, jmax, jmin; float Maxz, Minz;Maxz = Minz = Z[0];jmax = jmin= 0; for ( j =1; j < N-1;j++) { if (Z[j] > Maxz) { Maxz = Z[j]; jmax = j; } if (Z[j] < Minz) { Minz = Z[j]; jmin = j; } } * ptr1 = jmax;//передача во внешний массив jmax * ptr2 = jmin;// передача во внешний массив jmin return MaxzMinz; // возвращаем в точку вызова MaxzMinz }

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