л.р по информатике / лр3
.docxЛабораторная работа №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();
}
Тестирование:
-
При вводе с клавиатуры:
Содержимое файла 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
-
При вводе из файла:
Содержимое файла 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
-
При двух минимальных значениях:
-
При всех одинаковых значениях
Вывод: язык программирования C++ предоставляет широкие возможности использования функций. Благодаря этому можно писать программы различной степени сложности.