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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2019, 20:49   #1
Pavel2019
Новичок
Джуниор
 
Регистрация: 14.12.2019
Сообщений: 1
По умолчанию Вместо заданных чисел массива число -107374176

Добрый день, такая проблема, при выводе в массив , появляется число -107374176, а если выводить числа через fout , то все как нужно. Помогите разобраться
Код:
#include <iostream>
#include <fstream>
#include <iomanip>
#include<conio.h>
#include<windows.h>
using namespace std;
const int m = 5, n = 6;
ifstream fin;
ofstream fout;
char c[6][256];
int main()
{
	fin.open("D:\ish.txt");
	if (!fin) { cout << "Ошибка при открытии файла данных"; exit(0); }
	fout.open("D:\pes.txt");
	if (!fout) { cout << "Ошибка при открытии файла результатов"; exit(0); }
	float a[m][n];
	float b[3][m*2];
	int i, j;
	void vvod(float a[m][n]);
	void p(float a[m][n]);
	void obr(float a[m][n], float b[3][m*2]);
	vvod(a);
	p(a);
	obr(a, b);
	fout << "\n\n\nNew array:";
	for (i = 0; i < 3; i++)
	{
		fout << '\n';
		for (j = 0; j <m*2; j++)
			fout << setw(12) << b[i][j];

	}
	fout.close();
}

void vvod(float a[m][n])
{
	int i, j;
	for (i = 0; i < 6; i++)
	{
		fin.getline(c[i], 182, '\n');
		if (i < 4) fout << c[i] << endl;
	}
	for (i = 0; i < m; i++)
		for (j = 0; j < n; j++)
			fin >> *(*(a + i) + j);
	fin.close();
}
void p(float a[m][n])
{
	int i, j;
	for (i = 0; i < m; i++)
	{
		fout << '|';
		for (j = 0; j < n; j++)
			switch (j)
			{
			case 0: case 1: case 3:case 4:
				fout.unsetf(ios::scientific);
				fout.width(10);
				fout.setf(ios::left | ios::fixed);
				fout.precision(5);
				fout << a[i][j] << '|';
				break;
			case 2:
				fout.width(10);
				fout.unsetf(ios::fixed);
				fout.setf(ios::scientific);
				fout.precision(3);
				fout << a[i][j] << '|';
				break;
			case 5:
				fout.width(8);
				fout.precision(4);
				fout << a[i][j] << "|\n";
				break;
			}
		if (i == m - 1) fout << c[5] << endl;
		else fout << c[4] << endl;
	}
}
void obr(float a[m][n], float b[3][m * 2])
{
	int i, j, ifr, jfr, isc, jsc;
	double temp;
	float fr, sc;
	float tmp;
	for (i = 0; i < m; i++) {
		fr = a[i][0];
		sc = a[i][0];
		if (fr >= sc) {
			tmp = fr;
			fr = sc;
			sc = tmp;
		}
		for (j = 2; j < n; j++)
			if (a[i][j] <= fr) {
				sc = fr;
				fr = a[i][j];
				ifr = i;
				jfr = j;
				b[0][i] = fr;
				b[1][i] = ifr + 1;
				b[2][i] = jfr + 1;
			}
			else if (a[i][j] <= sc) {
				sc = a[i][j];
				isc = i;
				jsc = j;
				b[0][i] = sc;
				b[1][i] = isc + 1;
				b[2][i] = jsc + 1;
			}
		fout << fr << " " << sc << endl;
	}
	float sum = 0, pr = 1;
	for (i = 0; i < 2 * m; i++)
		if (b[0][i] < 0)
			pr *= b[0][i];
		else
			sum += b[0][i];
	fout << "Произведение отрицательных элементов: " << pr << endl << "Сумма положительных элементов: " << sum << endl;
fout << endl << "=================Old array after change:================" << endl << endl;
p(a);
}
Вот новый массив:
New array:
-0.0010 14.8500 -436.0000 0.0012 -5.4400 -107374176.0000-107374176.0000-107374176.0000-107374176.0000-107374176.0000
1.0000 2.0000 3.0000 4.0000 5.0000 -107374176.0000-107374176.0000-107374176.0000-107374176.0000-107374176.0000
5.0000 6.0000 5.0000 6.0000 5.0000 -107374176.0000-107374176.0000-107374176.0000-107374176.0000-107374176.0000

Последний раз редактировалось Pavel2019; 14.12.2019 в 20:51.
Pavel2019 вне форума Ответить с цитированием
Старый 19.12.2019, 10:45   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Большие отрицательные числа - это неинициализированные элементы массива. Откуда они? - у тебя очень запутанный код. Убери все эти "магические числа".

3, 6, 2 - замени их на выражения над константами n и m.

Дальше, функция obr принимает у тебя принимает массив A размером 5 на 6
И возвращает массив B размером 3 на 10.

Внутри функции присваивание значений элементам массива B происходит только тут:
Код:
b[0][i] = ...
b[1][i] = ...
b[2][i] = ...
при этом переменная i в цикле меняется в диапазоне [0, 5]. Значит, элементы "правой половины" матрицы не инициализированы и хранят мусор (вот он и выводит тебе какие-то странные числа).

Но проблема не только в этом. Вся программа целиком исключителньо плохо и запутанно написано. Если ты запутался даже в такой простой задаче - то как ты собираешься в таком стиле писать что-то более сложное?
rrrFer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделить из заданных точек вершины квадрата, содержащего максимальное число заданных точек Kef1r C# (си шарп) 8 12.01.2017 16:00
Среди заданных чисел найти отрицательные и вывести на экран модули этих чисел reapple Общие вопросы Delphi 4 20.04.2015 11:47
Из заданных чисел рандомно выбрать одно число FleXik Общие вопросы Delphi 11 15.10.2013 03:43
Для заданных чисел m и n вычислить число сочетаний katyawapka Паскаль, Turbo Pascal, PascalABC.NET 1 16.06.2013 19:54
вычисление суммы чисел, кратных 3 из последовательности, состоящей из 10 чисел, заранее заданных Белка Помощь студентам 3 27.10.2007 11:53