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

Матрицы в файлах - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
28.05.2010, 16:03     Матрицы в файлах #1
Добрый день! Изучаю дальше файлы, и есть парочка задач, но в них уже идёт работа с матрицей внутри файла:

Задача 1. Даны два целых числа I, J и файл вещественных чисел, содержащий элементы прямоугольной матрицы (по строкам), причем первый элемент файла содержит количество столбцов матрицы. Вывести элемент матрицы, расположенный в I-й строке и J-м столбце (строки и столбцы нумеруются от 1). Если требуемый элемент отсутствует, то вывести 0.

Задача 2. Дан файл вещественных чисел, содержащий элементы прямоугольной матрицы (по строкам), причем первый элемент файла содержит количество столбцов матрицы. Создать новый файл той же структуры, содержащий матрицу, транспонированную к исходной.

Задача 3. Даны два файла вещественных чисел с именами SA и SB, содержащие элементы прямоугольных матриц A и B (по строкам), причем первый элемент каждого файла содержит количество столбцов соответствующей матрицы. Создать файл той же структуры с именем SC, содержащий элементы произведения A•B. Если матрицы A и B нельзя перемножать, то оставить файл SC пустым.

Пожалуйста, если кто-то может, объясните хотя бы смысл задачи, и как они выглядят, просто я совершенно ничего не могу представить. Вроде бы на форуме есть и как транспонировать, в общем весь материал, а про то как сделать это в файле, и как должен выглядеть начальный файл я не знаю.

Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2010, 16:03     Матрицы в файлах
Посмотрите здесь:

C++ Редактирование строк в файлах
C++ Строки в файлах
gotoxy в файлах C++
C++ Вопрос по файлах в С++
C++ Мусор в файлах
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
30.05.2010, 00:25     Матрицы в файлах #21
http://ru.wikipedia.org/wiki/Умножение_матриц

Добавлено через 20 минут
Ну вот, от нечего делать написал... Надо, или сам попробуешь?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
30.05.2010, 00:27  [ТС]     Матрицы в файлах #22
Дайте) А завтра я разберу всё) И обязательно попробую)) мне ж ещё защиту сдавать, нельзя идти неумехой, верно? так что разобрать так или иначе прийдётся. Вопрос только времени, или сегодня, или завтра. В общем я алгоритм понял, так что попытаюсь своё сделать тоже.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
30.05.2010, 00:32     Матрицы в файлах #23
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int matrix_multiplication(double **matrix1, double **matrix2, int rows1, int cols1, int rows2, int cols2, double **result_matrix)
{
    int i, j, r;
    
    if (cols1 != rows2)
        return 1;
    
    for (i = 0; i < rows1; i++)
        for (j = 0; j < cols2; j++)
            result_matrix[i][j] = 0.0;
    
    for (i = 0; i < rows1; i++)
        for (j = 0; j < cols2; j++)
            for (r = 0; r < cols1; r++)
                result_matrix[i][j] += matrix1[i][r] * matrix2[r][j];
    
    return 0;
}
Добавлено через 56 секунд
Но это только функция))) Написание основной программы, работы с файлами и т.д. возлагаю на вас))) Ибо образцов уже предостаточно.
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
30.05.2010, 14:39  [ТС]     Матрицы в файлах #24
Ё-маё...интересненько...завтра попробуем что-то из этого сделать! Отлично!) Спасибо вам. Пошол я спать)

Добавлено через 14 часов 6 минут
Ну, попытался написать, быть может ужас, но я только учусь. Визуалка ругается на состав массивов, а так ошибок нету, пожалуйста, помогите исправить. Прикрепляю:

1)
Код программы
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
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
 
 
int matrix_multiplication(double **matrix1, double **matrix2, int rows1, int cols1, int rows2, int cols2, double **result_matrix)
{
    int i, j, r;
    
    if (cols1 != rows2)
        return 1;
    
    for (i = 0; i < rows1; i++)
        for (j = 0; j < cols2; j++)
            result_matrix[i][j] = 0.0;
    
    for (i = 0; i < rows1; i++)
        for (j = 0; j < cols2; j++)
            for (r = 0; r < cols1; r++)
                result_matrix[i][j] += matrix1[i][r] * matrix2[r][j];
    
    return 0;
}
 
int main()
{   
    
    FILE *in1;
    FILE *in2;
    FILE *out;
 
    int n = 0, m;
    int k=0, p;
    int i, j, r;
    char buff;
 
    double **matrix1;
    double **matrix2;;
    double **result_matrix;
 
    
    
 
 
    if ((in1 = fopen("in1.txt", "r")) == NULL)
        return -1;
    
    while ((buff = fgetc(in1)) != EOF)
        if (buff == '\n')
            n++;
    
    fseek(in1, 0, SEEK_SET);
    fscanf(in1, "%d", &m);
    
    
    matrix1 = (double **)malloc(n * sizeof(double *));
    
    for (i = 0; i < n; i++)
        matrix1[i] = (double *)malloc(n * sizeof(double));
    
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            fscanf(in1, "%lf", &matrix1[i][j]);
 
 
    if ((in2 = fopen("in2.txt", "r")) == NULL)
        return -1;
    
    while ((buff = fgetc(in2)) != EOF)
        if (buff == '\n')
            k++;
    
    fseek(in2, 0, SEEK_SET);
    fscanf(in2, "%d", &p);
    
    
    matrix2 = (double **)malloc(k * sizeof(double *));
    
    for (j = 0; j < k; j++)
        matrix2[j] = (double *)malloc(k * sizeof(double));
    
    for (j = 0; j < k; j++)
        for (r = 0; r < p; r++)
            fscanf(in2, "%lf", &matrix2[j][r]);
    
    matrix_multiplication(matrix1, matrix2, &n, &m, &k, &p, result_matrix);
    
    
    
    if ((out = fopen("out.txt", "w")) == NULL)
        return -1;
    
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
            fprintf(out, "%lf ", result_matrix[i][j]);
        
        fprintf(out, "\n");
    }
    
    fclose(in1);
    fclose(in2);
    fclose(out);
    
    for (i = 0; i < n; i++)
        free(matrix1[i]);
    
    free(matrix1);
 
    for (j = 0; j < k; j++)
        free(matrix2[j]);
    
    free(matrix2);
    return 0;
}


2)
Код ошибок
Код
--------------------Configuration: Text1 - Win32 Debug--------------------
Compiling...
Text1.c
P:\1AiP\Task 5\14\Text1.c(39) : error C2143: syntax error : missing ';' before 'type'
P:\1AiP\Task 5\14\Text1.c(86) : warning C4047: 'function' : 'int ' differs in levels of indirection from 'int *'
P:\1AiP\Task 5\14\Text1.c(86) : warning C4024: 'matrix_multiplication' : different types for formal and actual parameter 3
P:\1AiP\Task 5\14\Text1.c(86) : warning C4047: 'function' : 'int ' differs in levels of indirection from 'int *'
P:\1AiP\Task 5\14\Text1.c(86) : warning C4024: 'matrix_multiplication' : different types for formal and actual parameter 4
P:\1AiP\Task 5\14\Text1.c(86) : warning C4047: 'function' : 'int ' differs in levels of indirection from 'int *'
P:\1AiP\Task 5\14\Text1.c(86) : warning C4024: 'matrix_multiplication' : different types for formal and actual parameter 5
P:\1AiP\Task 5\14\Text1.c(86) : warning C4047: 'function' : 'int ' differs in levels of indirection from 'int *'
P:\1AiP\Task 5\14\Text1.c(86) : warning C4024: 'matrix_multiplication' : different types for formal and actual parameter 6
P:\1AiP\Task 5\14\Text1.c(86) : error C2065: 'result_matrix' : undeclared identifier
P:\1AiP\Task 5\14\Text1.c(86) : warning C4047: 'function' : 'double ** ' differs in levels of indirection from 'int '
P:\1AiP\Task 5\14\Text1.c(86) : warning C4024: 'matrix_multiplication' : different types for formal and actual parameter 7
P:\1AiP\Task 5\14\Text1.c(96) : error C2109: subscript requires array or pointer type
P:\1AiP\Task 5\14\Text1.c(96) : error C2109: subscript requires array or pointer type
Error executing cl.exe.

Text1.obj - 4 error(s), 10 warning(s)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
30.05.2010, 14:58     Матрицы в файлах #25
Если кратко, то вы, во-первых, должны передавать в функцию умножения матриц не адреса строк и столбцов первой и второй матриц, а значения. Т.е. надо убрать &. Во-вторых, куда вы намереваетесь записывать результат? Да, вы создали массив указателей на указатели... Т.е. double **result_matrix. Но что он собой представляет? Да просто адрес. У вас нет в памяти никакого двумерного массива, куда можно было бы поместить результат. Вы должны выделить под него память так же, как и под матрицы 1 и 2.
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
30.05.2010, 15:18  [ТС]     Матрицы в файлах #26
Спасибо, а как выделить память под результат? то есть, у нас в предыдущих матрицах, после выделения памяти читалась информация из файлов, а здесь? просто вот так, будет или по другому?
C
1
2
3
4
5
6
7
8
result_matrix = (double **)malloc(n * sizeof(double *));
    
    for (j = 0; j < n; j++)
        result_matrix[i] = (double *)malloc(n * sizeof(double));
    
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            scanf("%lf", &result_matrix[i][j]);
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
30.05.2010, 15:22     Матрицы в файлах #27
Ведь не обязательно всегда забивать массив значениями. Можно просто выделить память и оставить её пустой.

C
1
2
3
4
result_matrix = (double **)malloc(n * sizeof(double *));
    
    for (j = 0; j < n; j++)
        result_matrix[i] = (double *)malloc(p * sizeof(double));
Достаточно и этого. Только будет результрующий массив n*p, а не как вы написали, n*n

Добавлено через 47 секунд
И всё-таки result_matrix[j], а не result_matrix[i]
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
30.05.2010, 15:33  [ТС]     Матрицы в файлах #28
Вроде бы всё исправил, как вы сказали, но при запуске появляется ошибка, память не может быть read, взгляните,
что не так:
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
119
120
121
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
 
 
int matrix_multiplication(double **matrix1, double **matrix2, int rows1, int cols1, int rows2, int cols2, double **result_matrix)
{
    int i, j, r;
    
    if (cols1 != rows2)
        return 1;
    
    for (i = 0; i < rows1; i++)
        for (j = 0; j < cols2; j++)
            result_matrix[i][j] = 0.0;
    
    for (i = 0; i < rows1; i++)
        for (j = 0; j < cols2; j++)
            for (r = 0; r < cols1; r++)
                result_matrix[i][j] += matrix1[i][r] * matrix2[r][j];
    
    return 0;
}
 
int main()
{   
    
    FILE *in1;
    FILE *in2;
    FILE *out;
 
    int n = 0, m;
    int k=0, p;
    int i, j, r;
    char buff;
 
    double **matrix1;
    double **matrix2;
    double **result_matrix;
 
    
    
 
 
    if ((in1 = fopen("in1.txt", "r")) == NULL)
        return -1;
    
    while ((buff = fgetc(in1)) != EOF)
        if (buff == '\n')
            n++;
    
    fseek(in1, 0, SEEK_SET);
    fscanf(in1, "%d", &m);
    
    
    matrix1 = (double **)malloc(n * sizeof(double *));
    
    for (i = 0; i < n; i++)
        matrix1[i] = (double *)malloc(n * sizeof(double));
    
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            fscanf(in1, "%lf", &matrix1[i][j]);
 
 
    if ((in2 = fopen("in2.txt", "r")) == NULL)
        return -1;
    
    while ((buff = fgetc(in2)) != EOF)
        if (buff == '\n')
            k++;
    
    fseek(in2, 0, SEEK_SET);
    fscanf(in2, "%d", &p);
    
    
    matrix2 = (double **)malloc(k * sizeof(double *));
    
    for (j = 0; j < k; j++)
        matrix2[j] = (double *)malloc(k * sizeof(double));
    
    for (j = 0; j < k; j++)
        for (r = 0; r < p; r++)
            fscanf(in2, "%lf", &matrix2[j][r]);
 
    result_matrix = (double **)malloc(n * sizeof(double *));
    
    for (j = 0; j < n; j++)
        result_matrix[j] = (double *)malloc(p * sizeof(double));
 
    
    matrix_multiplication(matrix1, matrix2, n, m, k, p, result_matrix);
    
    
    
    if ((out = fopen("out.txt", "w")) == NULL)
        return -1;
    
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
            fprintf(out, "%lf ", result_matrix[i][j]);
        
        fprintf(out, "\n");
    }
    
    fclose(in1);
    fclose(in2);
    fclose(out);
    
    for (i = 0; i < n; i++)
        free(matrix1[i]);
    
    free(matrix1);
 
    for (j = 0; j < k; j++)
        free(matrix2[j]);
    
    free(matrix2);
    return 0;
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
30.05.2010, 15:36     Матрицы в файлах #29
59 строка... matrix1[i] = (double *)malloc(m * sizeof(double));
80 строка... matrix2[j] = (double *)malloc(p * sizeof(double));
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
30.05.2010, 15:40  [ТС]     Матрицы в файлах #30
Спасибо, но...результат странный:
Код
-6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 
-6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 
-6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 
-6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 
-6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 
-6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 
-6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000 -6277438562204192500000000000000000000000000000000000000000000000000.000000

Файл первый:
Код
4
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 0
Файл второй:
Код
8
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
3 4 5 6 7 8 0 2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2010, 15:48     Матрицы в файлах
Еще ссылки по теме:

Ошибка в двух файлах C++
fstream в файлах классов C++
C++ Реверс в файлах

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
30.05.2010, 15:48     Матрицы в файлах #31
Количество строк первой матрицы должно совпадать с количеством столбцов во второй.
Можно сделать так. Вместо простого вызова
matrix_multiplication(matrix1, matrix2, n, m, k, p, result_matrix);
сделать

C
1
2
3
4
5
6
7
8
9
10
11
if (matrix_multiplication(matrix1, matrix2, n, m, k, p, result_matrix) != 1)
{
    запись мартицы в файл
}
else
{
    запись в файл сообщения о том, что матрицы не могут быть перемножены
}
 
закрытие потоков и очистка памяти;
return 0;
Yandex
Объявления
30.05.2010, 15:48     Матрицы в файлах
Ответ Создать тему
Опции темы

Текущее время: 12:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru