Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
spk57
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 14
#1

Перемножение квадратных матриц с вещественными числами - C++

20.11.2014, 01:27. Просмотров 253. Ответов 4
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2014, 01:27     Перемножение квадратных матриц с вещественными числами
Посмотрите здесь:

C++ Перемножение матриц
Перемножение 2-ух матриц C++
Перемножение двух квадратных целочисленных матриц C++
C++ Перемножение матриц
C++ Перемножение матриц
Реализация арифметических операций над вещественными числами C++
C++ Перемножение матриц
Программа не работает с вещественными числами C++
C++ Перемножение матриц
Генерация массива случайными вещественными числами C++
Задать массив с целыми и вещественными числами. С++ C++
C++ Как задать одномерный массив с n вещественными числами?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6248 / 5851 / 1891
Регистрация: 18.12.2011
Сообщений: 14,992
Завершенные тесты: 1
20.11.2014, 08:58     Перемножение квадратных матриц с вещественными числами #2
Цитата Сообщение от spk57 Посмотреть сообщение
setlocale(LC_ALL, "rus");
А действительно ли atof требует запятую, а не точку для отделения дробной части?
Посмотрите, правильно ли введены массивы.

Как-то мудрено Вы их вводите.
После того, как определили размеры, перемотайте файлы на начало и читайте
C++
1
2
3
4
rewind(firstFile);
for (int i = 0; i < size1; ++i)
   for (int j = 0; j < size1; ++j)
      fscanf(firstFile,"%f",&firstMatrix[i][j]);
spk57
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 14
20.11.2014, 11:34  [ТС]     Перемножение квадратных матриц с вещественными числами #3
ZSS, про запятую Вы были правы, но все же решил реализовать полностью на с++.
Теперь работает.
Вот рабочий вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#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;
    }
 
    fstream firstFile(argv[1], ios::in);
    fstream secondFile(argv[2], ios::in);
    fstream resultFile("result.txt", ios::out);
 
    /*Определение размера матриц*/
    string testStr;
    int size1 = 0, size2 = 0;
    getline(firstFile, testStr);
    for (int i = 0; i < testStr.size(); ++i)
    {
        if (testStr[i] == ' ') size1++;
    }
    testStr.clear();
    getline(secondFile, testStr);
    for (int i = 0; i < testStr.size(); ++i)
    {
        if (testStr[i] == ' ') size2++;
    }
 
    if (size1 != size2)
    {
        cout << "Матрицы разных размеров" << endl;
        return 1;
    }
 
    /*Считывание первой матрицы*/
    //создание матрицы
    float**firstMatrix = new float*[size1];
 
    //считывание матрицы
    firstFile.seekg(0);
    for (int i = 0; i < size1; ++i)
    {
        firstMatrix[i] = new float[size1];
        for (int j = 0; j < size1; ++j)
            firstFile >> firstMatrix[i][j];
    }
 
    /*Считывание второй матрицы*/
    //создание матрицы
    float**secondMatrix = new float*[size1];
 
    //считывание матрицы
    secondFile.seekg(0);
    for (int i = 0; i < size1; ++i)
    {
        secondMatrix[i] = new float[size1];
        for (int j = 0; j < size1; ++j)
            secondFile >> secondMatrix[i][j];
    }
 
    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];
            }
            resultFile << resultMatrix[i][j] << ' ';
        }
        resultFile << endl;
    }
    firstFile.close();
    secondFile.close();
    resultFile.close();
 
    cout << "Подсчет окончен. Результат сохранен в result.txt" << endl;
    cout << "Время выполнения: " << (float)(clock() - t1) / CLOCKS_PER_SEC << endl;
 
    return 0;
}
zss
Модератор
Эксперт С++
6248 / 5851 / 1891
Регистрация: 18.12.2011
Сообщений: 14,992
Завершенные тесты: 1
20.11.2014, 11:40     Перемножение квадратных матриц с вещественными числами #4
Вы забыли перемотать файлы на начало после считывания первой строки.

C++
1
firstFile.seekg(0);
spk57
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 14
20.11.2014, 11:41  [ТС]     Перемножение квадратных матриц с вещественными числами #5
47 строчка
Yandex
Объявления
20.11.2014, 11:41     Перемножение квадратных матриц с вещественными числами
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru