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

Лабораторная работа №3

студентки группы ИТ-12

Коршак Кристины Сергеевны

Выполнение:_________ Защита:___________

ОБРАБОТКА ДВУМЕРНЫХ МАССИВОВ. ФАЙЛОВЫЙ ВВОД-ВЫВОД. ПРИМЕНЕНИЕ ИТЕРАТИВНЫХ И РЕКУРСИВНЫХ ФУНКЦИЙ

Цель работы: ознакомиться с организацией двумерных массивов в языке С/С++; приобрести практические навыки в выводе данных во внешние файлы; ознакомиться с организацией передачи параметров в функции по ссылке; получить навыки описания рекурсивных функций.

СОДЕРЖАНИЕ РАБОТЫ

Выбрать алгоритм, составить его блок-схему и программу для решения выбранного варианта задания. Программа должна по выбору пользователя осуществлять ввод исходной матрицы с клавиатуры или из файла. Для этого программа должна содержать две соответствующие функции, указатель на одну из которых необходимо передавать в функцию для вычисления элементов массива Х. Данная функция должна вызывать через указатель одну из функций ввода элементов матрицы, производить вычисление элементов массива X в соответствии с заданием и возвращать указатель на этот массив. Кроме того, программа должна содержать функцию для вывода на экран и в файл исходной матрицы и результирующего массива, а также рекурсивную функцию определения в соответствии с заданием величины Y.

В программе не должно быть глобальных переменных.

Постановка задачи: Дана матрица А(5Х5). Определить массив Х из 5 элементов, каждый из которых равен среднему арифметическому наибольшего и наименьшего из элементов соответствующего столбца матрицы. Определить величину Y, как сумму элементов, расположенных перед наименьшим элементом массива X.

ХОД РАБОТЫ

Подпрограммы

Блок-схема основной программы:

Текст программы:

#include "stdafx.h"

#include <stdio.h>

#include <conio.h>

#include <locale.h>

# define N 5

int mas_x(int (*A)[N], int *x,void (*p)(int [][N]))

{

int max,min,i,j=0;

p(A);

while (j<N)

{min=A[0][j];

max=A[0][j];

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

{if (A[i][j]>min)

{if (A[i][j]>max) max=A[i][j];}

else {min=A[i][j];}

}

x[j]=(int)(max+min)/2;

j++;

}

return *x;

}

////////////////////////////////////////

int recursY(const int x[], const bool isSumm=false, int *Summ=NULL, int *Min=NULL, int *currEl=NULL)

{

if (Summ)

{

if (isSumm)

{

if (*currEl<*Min)

{

(*Summ)+=x[*currEl];

(*currEl)++;

recursY(x, true, Summ, Min, currEl);

}

}

else

{

if (*currEl<N)

{

if (x[*currEl]<x[*Min]) *Min=*currEl;

(*currEl)++;

recursY(x, false, Summ, Min, currEl);

}

}

}

else

{

int MinEl=0, curr=1, SummEl=0;

recursY(x, false, &SummEl, &MinEl, &curr);

curr=0;

recursY(x, true, &SummEl, &MinEl, &curr);

return SummEl;

}

return 0;

}

//////////////////////////////////////

void Input_mass(int A[N][N])

{printf("введите %d", N*N);

printf(" элементов массива: \n");

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

for(int j=0; j<N; j++)

{printf("%i%i\n",i+1,j+1);

scanf("%i", &A[i][j]);}

}

////////////////////////////////////////

void Input_mass_file(int A[][N])

{

int i, j;

char fname[50];

printf("Введите имя входного файла: ");

scanf("%s", fname);

FILE *fp;

fp=fopen(fname, "r");

while (!fp)

{

printf("Ошибка открытия файла. Введите имя файла заново: ");

scanf("%s", fname);

fp=fopen(fname, "r");

}

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

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

fscanf(fp, "%d", &A[i][j]);

fclose(fp);

}

//////////////////////////////

void Output(const int A[][N], int *x,int y)

{

char fname[50];

printf("Введите имя выходного файла: ");

scanf("%s", fname);

FILE *fp;

fp=fopen(fname, "w");

int i, j;

printf("Матрица A:\n");

fprintf(fp, "Матрица A:\n");

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

{

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

{

printf("%5d",A[i][j]);

fprintf(fp, "%5d",A[i][j]);

}

printf("\n");

fprintf(fp, "\n");

}

printf("Массив X:");

fprintf(fp, "Массив X:");

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

{

printf("%5d", x[i]);

fprintf(fp, "%5d", x[i]);

}

printf("\nY=%i",y);

fprintf(fp, "\nY=%i",y);

fclose(fp);

}

///////////////////////////////////

int main()

{ int c,A[N][N],x[N];

void (*p)(int [][N]);

setlocale(LC_CTYPE,"");

do

{

printf("Ввод матрицы:\n1 - с клавиатуры\n2 - \

из файла\n");

scanf("%d",&c);

}

while (c!=1 && c!=2);

switch (c)

{

case 1: p=&Input_mass;

break;

case 2: p=&Input_mass_file;

}

mas_x(A,x,p);

Output(A,x,recursY(x));

getch();

}

Тестирование:

  1. При вводе с клавиатуры:

Содержимое файла out.txt:

Матрица A:

1 3 5 6 5

-1 -5 0 7 8

4 7 6 1 2

9 0 6 3 8

9 1 3 4 56

Массив X: 4 1 3 4 29

Y=4

  1. При вводе из файла:

Содержимое файла in.txt:

0 2 5 7 1

0 4 8 1 9

0 8 11 2 3

0 3 7 1 8

0 0 6 5 29

Содержимое файла out.txt:

Матрица A:

0 2 5 7 1

0 4 8 1 9

0 8 11 2 3

0 3 7 1 8

0 0 6 5 29

Массив X: 0 4 8 4 15

Y=0

  1. При двух минимальных значениях:

  1. При всех одинаковых значениях

Вывод: язык программирования C++ предоставляет широкие возможности использования функций. Благодаря этому можно писать программы различной степени сложности.

13

Соседние файлы в папке л.р по информатике