Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2015, 17:53   #1
Погос
Новичок
Джуниор
 
Регистрация: 26.01.2015
Сообщений: 1
По умолчанию Матрица. Найти в каждой строке max среди отрицательных, min среди положительных

Привет. Помогите пожалуйста. У меня такая проблема.
Надо сделать прогу в 2 класса (1 - открытие и закрытие файла, 2 - работа с матрицей)
Код:
#include <iostream>
#include <locale.h>
#include <fstream>

using namespace std;

void FileOpen(fstream &f, char *fname, ios_base::openmode mode);
void FileRead(fstream &f, int &N, int &M, int **&a);
void CountDataMax(int N, int M, int **&a, int *&arMax);
void CountDataMin(int N, int M, int **&a, int *&arMin);
void FileClose(fstream &f);
void FileOut(fstream &f, int N, int M, int **a, int *arMin, int *arMax);
void FilePrint(fstream &f, int N, int M, int **a);
void FileDelete(int **a, int *arMin, int *arMax);

int main()
{
	setlocale(LC_ALL, "rus");
	fstream fin, fout;
	FileOpen(fin, "in.txt", ios::in);
	int N;
	int M;
	int **a;
	FileRead(fin, N, M, a);
	int *arMin;
	arMin = new int[N];
	int *arMax;
	arMax = new int[N];
	FileClose(fin);
	CountDataMax(N, M, a, arMax);
	CountDataMin(N, M, a, arMin);
	FileOpen(fout, "out.txt", ios::out);
	FileOut(fout, N, M, a, arMin, arMax);
	FileClose(fout);
	FileDelete(a, arMin, arMax);
	return 0;
}

void FileOpen(fstream &f, char *fname, ios_base::openmode mode)
{
	f.open(fname, mode);
	if (!f)
	{
		cout << "Ошибка 1: Файла " << fname << " нет на диске" << endl;
		system("pause");
		exit(1);
	}
}

void FileRead(fstream &f, int &N, int &M, int **&a)
{
	f >> ws;
	f.ignore(4, '=');
	f>> N;
	if (N <= 0 || !f)
	{
		cout << "Ошибка 2: Ошибка ввода строк матрицы";
		system("pause");
		exit(2);
	}
	f >> ws;
	f.ignore(4, '=');
	f >> M;
	if (M <= 0 || !f)
	{
		cout << "Ошибка 3: Ошибка ввода столбцов матрицы";
		system("pause");
		exit(3);
	}
	a = new int *[N];
	for (int i = 0; i < N; i++)
	{
		a[i] = new int[M];
	}
	f >> ws;
	for (int i = 0; i<N; i++)
	{
		for (int j = 0; j<M; j++)
		{
			f >> a[i][j];
			if (!f)
			{
				cout << "Ошибка 4: Ошибка ввода элементов";
				system("pause");
				exit(4);
			}
		}
	}
}

void FileClose(fstream &f)
{
	f.close();
}

void CountDataMax(int N, int M, int **&a, int *&arMax)
{
	bool f;
	int max;
	for (int i = 0; i < N; i++)
	{
		f = false;
		for (int j = 0; j < M; j++)
		{
			if (a[i][j] < 0)
			{
				if (!f)
				{
					max = a[i][j];
					f = true;
				}
				else
				{
					if (a[i][j] > max) max = a[i][j];
				}
			}
		}
		if (f)
		{
			arMax[i] = max;
		}
		else
		{
			arMax[i] = 0;
		}
	}
}

void CountDataMin(int N, int M, int **&a, int *&arMin)
{
	bool f;
	int min;
	for (int i = 0; i < N; i++)
	{
		f = false;
		for (int j = 0; j < M; j++)
		{
			if (a[i][j] > 0)
			{
				if (!f)
				{
					min = a[i][j];
					f = true;
				}
				else
				{
					if (a[i][j] < min) min = a[i][j];
				}
			}
		}
		if (f)
		{
			arMin[i] = min;
		}
		else
		{
			arMin[i] = 0;
		}
	}
}

void FileOut(fstream &f, int N, int M, int **a, int *arMin, int *arMax)
{
	f << "Составить программу нахождения максимального элемента среди отрицательных " << endl;
	f << "и минимального элемента среди положительных для каждой строки матрицы.";
	f << endl << endl << "Данная матрица a[" << N << "х" << M << "]:" << endl;
	FilePrint(f, N, M, a);
	f << endl;
	f << "Решение задачи: " << endl;
	for (int i = 0; i<N; i++)
	{
			if (arMin[i] == 0)   f << "Минимальный положительный элемент " << i + 1 << " строки отсутствует" << endl;
			else f << "Минимальный положительный элемент " << i + 1 << " строки: " << arMin[i] << endl;
			if (arMax[i] == 0) f << "Максимальный отрицательный элемент " << i + 1 << " строки отсутствует" << endl;
			else f << "Максимальный отрицательный элемент " << i + 1 << " строки:" << arMax[i] << endl;
			f << endl;
	}

}

void FileDelete(int **a, int *arMin, int *arMax)
{
		delete[]a;
		delete[]arMin;
		delete[]arMax;
}

void FilePrint(fstream &f, int N, int M, int **a)
{
	for (int i = 0; i<N; i++)
	{
		for (int j = 0; j<M; j++)
		{
			f << a[i][j] << "\t";
		}
		f << endl;
	}
}

Последний раз редактировалось Stilet; 26.01.2015 в 19:22.
Погос вне форума Ответить с цитированием
Старый 28.01.2015, 00:39   #2
abit
Пользователь
 
Регистрация: 21.10.2014
Сообщений: 43
По умолчанию

отвечу, только потому что никто не ответил более...
судя по всему код пишется в C++ (классы, io/fstream), тогда зачем все эти пляски типа int **a, new или хуже того
Цитата:
delete[]a;
delete[]arMin;
delete[]arMax;
это уже моветон давно... C++ вплоть до C+11 избавлялся активно от new/delete
конкретно в этом примере втыкате в контейнер std::vector, например...

теперь к сути вопроса:
с виду всё просто, только начните,
шаг 1:
в описательной части
функции FileOpen/FileRead и т.д. вносите методами в один класс "для файлов", все остальные функции в другой класс "для матриц", потом в каждый класс внесите переменные которыми он пользуется, как его поле, скажем для класса файлов это fstream fin, fout;

шаг 2:
отделив поля и методы разбиваете их по public/private, формулируем что есть доступно пользователю, что скрыто и сразу описываем им конструкторы и деструкторы, например:
FileOpen очевидно нужно в конструктор, FileClose же в деструктор

шаг 3:
в implementation-часть (она же реализация) добавляете имя класса приблизительно так
void MyClassA::FileOpen(fstream &f, char *fname, ios_base:penmode mode)
abit вне форума Ответить с цитированием
Старый 28.01.2015, 06:43   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Код:
void CountDataMin(int N, int M, int **&a, int *&arMin)
Зачем в int **&a амперсанд если массив и так передаётся в виде ссылок. Амперсанд нужен если мы передаём в функцию статическую переменную для того, что-бы иметь возможность изменить её изнутри функции. Например:
Код:
int a = 10;
void MyFunction(&a)
{
  a = 100;
}
Тот-же результат мы получим если сделаем так:
Код:
int *a = 10;
void MyFunction(a)
{
  a = 100;
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать стек, найти min среди положительных, max среди отрицательных и поменять их местами (на C/C++) (ответ нужен сегодня) PHEDOR Помощь студентам 4 04.06.2014 16:18
Найти минимальный элемент среди элементов, находящихся в строках, в которых положительных элементов меньше, чем отрицательных. Kirillgr Помощь студентам 19 03.02.2014 01:50
Матрица. Найти минимальный среди положительных, находящихся над главной диагональю, и поменять его с максимальным среди отрицатель Mayers Паскаль, Turbo Pascal, PascalABC.NET 0 15.05.2012 22:25
Найти max,min среди нечетных Korvax Помощь студентам 1 24.04.2012 15:26
массиве X(N) найти максимальный элемент среди положительных элементов массива и минимальный среди отрицательных элементов. sorok Общие вопросы C/C++ 2 20.03.2012 12:18