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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
#1

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

28.05.2010, 16:03. Просмотров 1823. Ответов 30
Метки нет (Все метки)

Добрый день! Изучаю дальше файлы, и есть парочка задач, но в них уже идёт работа с матрицей внутри файла:

Задача 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++
Здравствуйте. Такой вопрос. Как мне из файла считывать каждую 3 строку, преобразовывать ее в тип int и запоминать. Заранее известно, что...

gotoxy в файлах - C++
Подскажите вот на экране можно gotoxy переместить курсор куда захочешь, а в файлах так можно, если можно то как???? Файлах .txt

Мусор в файлах - C++
В файлы попадает какой-то мусор, в чём ошибка? #include <iostream.h> #include <fstream.h> #include <string.h> #include...

Реверс в файлах - C++
Дан файл целых чисел. Создать новый файл, содержащий те же элементы, что и исходный файл, но в обратном порядке (Сделать реверс). ...

Изменения в файлах - C++
Я тут решил поиграться с бинарными файлами, и наткнулся на проблему: запуская программу через Visual Studio (2017) в файле не остаётся...

Вопрос по файлах в С++ - C++
Возник вопрос по файлах. Эсть масив float B={0}; заполнений елементами, необходимо значения перенести в файл, которий потом...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 23:54  [ТС] #16
А кто может какой-нить другой алгоритм подсказать, или функцию? А то тчо-то с той не выходит у меня....=(
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.05.2010, 23:55 #17
Ну ведь это простой алгоритм! Не уж то нет ни малейшего желания самому попробовать написать его? Это ведь даже не программирование - это кодинг, думать особо не надо, за вас уже подумали... Если вы не поняли алгоритм - спрашивайте - объясним.
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
30.05.2010, 00:00  [ТС] #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 else if (c == STRINGS-1)
                        cout << '\x5c';
                  else
                        cout << '\x7c';
 
                  for (int d = 0; d < COLUMNS; d++)
                        cout << " " << MATRIX[c][d];
                  
                  if (c == 0) 
                        cout << " " << '\x5c';
                  else if (c == STRINGS-1)
                        cout << " " << '\x2f';
                  else
                        cout << " " << '\x7c';
Это не понятно. И как оно на Си- тоже не понятно. Быть может всё просто и я туплю...ну, не знаю.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
30.05.2010, 00:01 #19
А вы описание алгоритма русским языком видели? Или пытаетесь понять его по чьему-то коду?
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
30.05.2010, 00:04  [ТС] #20
Не-а. Не видел. Я только вышку закончил делать, голова кругом, так что ни читать, ни что либо ещё я не пытался.... Можно ссылочку, если не трудно? Надо решить всё таки эту задачу)) Она ведь последняя за будущие 3 года. что мне задал препод)) Дальше по книжке буду учится. Курс заканчивается программирования. Хотя какой тут курс - конспект 20летней давности начитали, и разбирайтесь 6 месяцев.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
30.05.2010, 00:25 #21
http://ru.wikipedia.org/wiki/Умножение_матриц

Добавлено через 20 минут
Ну вот, от нечего делать написал... Надо, или сам попробуешь?
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
30.05.2010, 00:27  [ТС] #22
Дайте) А завтра я разберу всё) И обязательно попробую)) мне ж ещё защиту сдавать, нельзя идти неумехой, верно? так что разобрать так или иначе прийдётся. Вопрос только времени, или сегодня, или завтра. В общем я алгоритм понял, так что попытаюсь своё сделать тоже.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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!
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
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
30.05.2010, 14:58 #25
Если кратко, то вы, во-первых, должны передавать в функцию умножения матриц не адреса строк и столбцов первой и второй матриц, а значения. Т.е. надо убрать &. Во-вторых, куда вы намереваетесь записывать результат? Да, вы создали массив указателей на указатели... Т.е. double **result_matrix. Но что он собой представляет? Да просто адрес. У вас нет в памяти никакого двумерного массива, куда можно было бы поместить результат. Вы должны выделить под него память так же, как и под матрицы 1 и 2.
Bloodykeeper
This party getting crazy!
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
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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!
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
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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!
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:40
Привет! Вот еще темы с ответами:

Задача по файлах - C++
Створіть текстовий файл, що містить номери рейсів літаків і дні тижня, в які виконуються дані рейси (числа від 1 до 7). Напишіть програму,...

Редактирование строк в файлах - C++
Доброго вечера! Помогите пожалуйста написать программу, со строками, и как можно примитивнее (Предпочтительней на Си, с элементами С++)....

Ошибка в двух файлах - C++
Доброго времени суток Возникла довольно-таки странная проблема: Создаю консольное приложение, и в нем 2 файла (main.cpp и...

О стандартных заголовочных файлах - C++
Не знаю в какую категорию отнести данное нубство, но все же: Часто использую некоторые возможности/функции для которых не делал...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.05.2010, 15:40
Ответ Создать тему
Опции темы

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