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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2014, 01:25   #1
SPKe
Пользователь
 
Регистрация: 29.09.2009
Сообщений: 10
По умолчанию Перемножение квадратных матриц с вещественными числами

Что-то никак не могу найти ошибку:

Код:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

using namespace std;

int main(int argc, char *argv[])
{
	setlocale(LC_ALL, "rus");
	if (argc < 3)
	{
		cout << "Не заданы параметры" << endl;
		return 1;
	}

	FILE *firstFile, *secondFile, *resultFile;
	firstFile = fopen(argv[1], "r");
	secondFile = fopen(argv[2], "r");
	resultFile = fopen("result.txt", "w");

	/*Определение размера матриц*/
	char testStr[100000];
	int size1 = 0, size2 = 0;
	fgets(testStr, 100000, firstFile);
	for (int i = 0; i < strlen(testStr); i++)
	{
		if (testStr[i] == ' ') size1++;
	}
	fgets(testStr, 100000, secondFile);
	for (int i = 0; i < strlen(testStr); i++)
	{
		if (testStr[i] == ' ') size2++;
	}

	if (size1 != size2)
	{
		cout << "Матрицы разных размеров" << endl;
		return 1;
	}

	/*Считывание первой матрицы*/
	//создание матрицы
	float**firstMatrix = new float*[size1];

	//считывание матрицы
	const char separator[] = " ";
	char *ptr = NULL;
	char str[100000];
	for (int i = 0; i < size1; ++i)
	{
		fgets(str, 100000, firstFile);
		firstMatrix[i] = new float[size1];
		ptr = strtok(str, separator);
		for (int j = 0; j < size1; j++)
		{
			if (ptr == NULL)
				continue;
			firstMatrix[i][j] = atof(ptr);
			ptr = strtok(NULL, separator);
		}
	}

	/*Считывание второй матрицы*/
	//создание матрицы
	float**secondMatrix = new float*[size1];

	//считывание матрицы
	ptr = nullptr;
	for (int i = 0; i < size1; ++i)
	{
		fgets(str, 100000, secondFile);
		secondMatrix[i] = new float[size1];
		ptr = strtok(str, separator);
		for (int j = 0; j < size1; j++)
		{
			if (ptr == NULL)
				continue;
			secondMatrix[i][j] = atof(ptr);
			ptr = strtok(NULL, separator);
		}
	}


	cout << "Матрицы считаны" << endl;

	//результурующая матрицы
	float **resultMatrix = new float*[size1];
	for (int i = 0; i < size1; ++i)
		resultMatrix[i] = new float[size1];


	/*Перемножение матриц и вывод результата в файл*/
	cout << "Перемножаю матрицы" << endl;
	clock_t t1 = clock();

	for (int i = 0; i < size1; i++)
	{
		for (int j = 0; j < size1; j++)
		{
			resultMatrix[i][j] = 0;
			for (int k = 0; k < size1; k++)
			{
				resultMatrix[i][j] += firstMatrix[i][k] * secondMatrix[k][j];
			}
			fprintf(resultFile, "%1.2f ", resultMatrix[i][j]);
		}
		fprintf(resultFile, "\n");
	}
	fclose(firstFile);
	fclose(secondFile);
	fclose(resultFile);

	cout << "Подсчет окончен. Результат сохранен в result.txt" << endl;
	cout << "Время выполнения: " << (float)(clock() - t1) / CLOCKS_PER_SEC << endl;

	return 0;
Матрица 1:
0,3 0,2 3,9 0,0 4,6 8,0 9,7 3,5 2,3 6,0
9,2 1,8 4,6 9,5 9,9 7,3 6,8 9,9 3,0 4,6
5,4 4,0 7,0 8,5 7,5 5,4 1,6 5,2 2,8 0,7
0,6 0,4 2,8 4,0 2,3 6,8 3,4 3,3 7,3 4,0
9,7 1,8 9,1 6,5 7,9 8,4 0,3 2,7 9,5 8,5
7,6 8,7 1,7 1,4 3,3 4,6 0,1 9,3 3,0 5,0
8,2 1,8 9,9 9,9 8,0 6,7 1,8 6,9 3,4 1,2
4,8 2,4 3,7 2,0 1,5 8,3 9,9 7,2 9,3 8,9
1,9 4,7 4,9 7,3 3,7 4,7 0,6 1,0 3,2 1,4
6,1 7,4 3,5 2,1 4,4 2,6 3,7 7,8 6,7 2,6

Матрица 2:
5,8 8,5 5,0 9,3 5,4 9,9 7,3 0,7 7,6 1,5
7,8 6,7 5,9 7,1 1,7 0,8 2,2 4,8 8,4 4,9
1,0 7,2 4,6 2,9 8,1 1,4 1,3 2,7 6,9 7,3
8,6 8,0 7,9 8,1 2,3 2,1 1,3 3,8 1,2 6,0
6,7 6,2 2,0 5,4 5,3 5,3 3,8 4,2 1,2 5,9
0,7 3,6 8,6 1,1 0,2 1,7 4,6 4,1 1,1 6,2
4,0 0,5 5,6 0,7 4,1 5,3 1,7 1,3 8,3 7,1
0,2 7,3 4,8 9,6 2,6 1,9 9,6 4,0 0,6 1,5
3,5 1,6 7,9 8,7 0,3 9,9 0,0 0,1 2,2 0,8
7,5 4,6 7,2 4,8 1,4 6,3 9,6 0,7 8,5 7,5

Результат (явно не то):
305,91 -1985369216,00 -1985369088,00 -1985369088,00 -1985369344,00 -1985369216,00 -1985369216,00 -1985369344,00 -1985369216,00 -1985369216,00
234,89 -302121216,00 -302121152,00 -302121216,00 -302121312,00 -302121248,00 -302121280,00 -302121280,00 -302121248,00 -302121184,00
181,75 -1726408192,00 -1726408192,00 -1726408192,00 -1726408192,00 -1726408192,00 -1726408192,00 -1726408192,00 -1726408192,00 -1726408192,00
382,91 -3668617472,00 -3668617472,00 -3668617472,00 -3668617472,00 -3668617472,00 -3668617472,00 -3668617472,00 -3668617472,00 -3668617472,00
205,26 -2158010112,00 -2158010112,00 -2158010112,00 -2158010368,00 -2158010112,00 -2158010368,00 -2158010368,00 -2158010112,00 -2158010112,00
SPKe вне форума Ответить с цитированием
Старый 21.11.2014, 17:18   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

В файлах лишние пробелы в конце строки (это причина неправильного подсчета)
На ошибку я вышел, так как
if (ptr == NULL)
continue;
является нелогичным
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перемножение квадратных матриц bin11 Помощь студентам 1 19.05.2012 17:47
перемножение не квадратных матриц F1remaster Общие вопросы C/C++ 1 18.05.2012 00:21
Перемножение двух введенных с клавиатуры квадратных матриц 4 порядка Alex Miheev Microsoft Office Excel 3 16.04.2012 19:34
операции с вещественными числами на ассемблере. Fredy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 28.01.2008 15:43
работа с вещественными числами Soule Паскаль, Turbo Pascal, PascalABC.NET 1 12.10.2007 09:33