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

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

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

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

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

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

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

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

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

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

Спасибо!
0
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}; заполнений елементами, необходимо значения перенести в файл, которий потом...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.05.2010, 17:38 #2
А никто и не говорит о том, что это нужно делать в файле))) Надо считывать данные из файла в память, в памяти выполнять все необходимые преобразования, а дальше как по условию, либо выводить на экран, либо в тот же файл (тогда создастся иллюзия, будто всё это происходило прямо внутри файла), либо в новый файл.
0
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
28.05.2010, 18:08  [ТС] #3
Не могли бы вы показать на примере одной из задачек? с вашим исходным файлом. Я просто не знаю что и как мне записать в него даже. -(
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.05.2010, 19:23 #4
Задача 2

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
#include <stdio.h>
 
void transpose(double **mas, int *rows, int *cols)
{
    double temp;
    int i, j;
    
    for (i = 0; i < *rows; i++)
        for (j = 0; j < *cols; j++)
        {
            temp = mas[i][j];
            mas[i][j] = mas[j][i];
            mas[j][i] = temp;
        }
    
    *rows = *rows + *cols;
    *cols = *rows - *cols;
    *rows = *rows - *cols;
}
 
int main()
{
    double **mas;
    char buff;
    int n = 0, m;
    int res;
    int i, j;
    
    FILE *in;
    
    if ((in = fopen("in.txt", "r")) == NULL)
        return -1;
    
    while ((buff = fgetc(in)) != EOF)
        if (buff == '\n')
            n++;
    
    fseek(in, 0, SEEK_SET);
    fscanf(in, "%d", &m);
    
    res = (m > n) ? m : n;
    
    mas = (double **)malloc(res * sizeof(double *));
    
    for (i = 0; i < res; i++)
        mas[i] = (double *)malloc(res * sizeof(double));
    
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            fscanf(in, "%lf", &mas[i][j]);
    
    transpose(mas, &n, &m);
    
    FILE *out;
    
    if ((out = fopen("out.txt", "w")) == NULL)
        return -1;
    
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
            fprintf(out, "%lf ", mas[i][j]);
        
        fprintf(out, "\n");
    }
    
    fclose(in);
    fclose(out);
    
    for (i = 0; i < res; i++)
        free(mas[i]);
    
    free(mas);
    
    return 0;
}
Входной файл

Код
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
Выходной файл

Код
1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 
2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 
3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 9.000000 
4.000000 5.000000 6.000000 7.000000 8.000000 9.000000 0.000000
2
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
28.05.2010, 19:36  [ТС] #5
Спасибо! теперь буду пробовать сделать первую и третью. Если что-то не будет получатся, или запутаюсь, буду надеятся на вашу помощь.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.05.2010, 19:38 #6
Разумеется))
0
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 13:55  [ТС] #7
Помогите пожалуйста, пытаюсь скомпилировать и появляются вот такие ошибки:
Код
P:\1AiP\Task 5\13\Text1.c(55) : error C2275: 'FILE' : illegal use of this type as an expression
        d:\program files\microsoft visual studio\vc98\include\stdio.h(156) : see declaration of 'FILE'
P:\1AiP\Task 5\13\Text1.c(55) : error C2065: 'out' : undeclared identifier
P:\1AiP\Task 5\13\Text1.c(57) : warning C4047: '=' : 'int ' differs in levels of indirection from 'struct _iobuf *'
P:\1AiP\Task 5\13\Text1.c(57) : warning C4047: '==' : 'int ' differs in levels of indirection from 'void *'
P:\1AiP\Task 5\13\Text1.c(63) : warning C4047: 'function' : 'struct _iobuf *' differs in levels of indirection from 'int '
P:\1AiP\Task 5\13\Text1.c(63) : warning C4024: 'fprintf' : different types for formal and actual parameter 1
P:\1AiP\Task 5\13\Text1.c(65) : warning C4047: 'function' : 'struct _iobuf *' differs in levels of indirection from 'int '
P:\1AiP\Task 5\13\Text1.c(65) : warning C4024: 'fprintf' : different types for formal and actual parameter 1
P:\1AiP\Task 5\13\Text1.c(69) : warning C4047: 'function' : 'struct _iobuf *' differs in levels of indirection from 'int '
P:\1AiP\Task 5\13\Text1.c(69) : warning C4024: 'fclose' : different types for formal and actual parameter 1
Error executing cl.exe.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.05.2010, 14:01 #8
К сожалению, я со студией не работал... Поэтому не знаю, чего она орёт... Один выход - ждать кого-нибудь, кто работает в студии, пусть он на ошибки покажет...
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
29.05.2010, 14:42 #9
надо подключить
C
1
#include <stdlib.h>
а warning здесь, потому что функции а-ля fopen считаются небезопасными. надо либо пользоваться безопасными аналогами, либо отключить подобные предупреждения прописав в начале проекта до всех include
C
1
#define _CRT_SECURE_NO_DEPRECATE
0
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 15:07  [ТС] #10
#include <stdlib.h> я сразу подключил, а прописывая строчку отключения предупреждений, всё остаётся так же. Проблема не здесь, но я не могу её найти.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.05.2010, 15:10 #11
Почему-то ругается на FILE, причём только на второе объявление (т.е. на FILE *out; )... Может попробовать объявить FILE *out; там же, где объявлен FILE *in;, т.е. до первого исполняемого оператора, а то всё-таки в чистом Си все объявления должны делаться в самом начале, до каких-либо операторов, в отличие от Си++...
1
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 20:04  [ТС] #12
всё заработало)) Спасибо)

Помогите ещё пожалуйста со второй. У меня есть функция поиска элемента в матрице, но я не знаю как её использовать, и как сосканить номера столбов и строк для поиска.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int elem(FILE *file, int i, int j)
{
   int buf, k;
 
   fseek(file, 0, SEEK_SET);
   clearerr(file);
   fscanf(file, "%i", buf);
   if (buf < j)
      return 0;  /* заданный столбец превышает количество
                    столбцов объявленных в файле*/
   for (k = 0; k < i*j; k++)
   {
      if (fscanf(file, "%i", buf) == EOF)
         return 0; /* конец файла, а нужного числа так и не нашли*/
      else if (k == (i*(j-1)+j-1))
         return buf;
   }
}
Добавлено через 4 часа 46 минут
Пожалуста подскажите как єто сделать!
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.05.2010, 20:16 #13
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
#include <stdio.h>
 
int main()
{
    double **mas;
    char buff;
    int n = 0, m;
    int I, J;
    int i, j;
    
    FILE *in;
    
    if ((in = fopen("in.txt", "r")) == NULL)
        return -1;
    
    while ((buff = fgetc(in)) != EOF)
        if (buff == '\n')
            n++;
    
    fseek(in, 0, SEEK_SET);
    fscanf(in, "%d", &m);
    
    mas = (double **)malloc(n * sizeof(double *));
    
    for (i = 0; i < n; i++)
        mas[i] = (double *)malloc(m * sizeof(double));
    
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            fscanf(in, "%lf", &mas[i][j]);
    
    fclose(in);
    
    printf("Input I: ");
    scanf("%d", &I);
    
    printf("Input J: ");
    scanf("%d", &J);
    
    if (I > n || J > m)
        printf("NULL\n");
    else
        printf("%lf\n", mas[I - 1][J - 1]);
    
    for (i = 0; i < n; i++)
        free(mas[i]);
    
    free(mas);
    
    getch();
    return 0;
}
Добавлено через 2 минуты
По сути изменил несколько строк. Программа намного проще, чем транспонирование, хотя каркас у них безусловно один. Конечно, рациональнее сразу считать из файла нужный элемент, но мне неохота особо с этим заморачиваться, поэтому тупо читаю всю матрицу в память и уже там ищу нужный элемент.
1
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 20:23  [ТС] #14
Спасибо большое! Теперь осталась только третья задачка. Скажите пожалуйста, какой алгоритм можно использовать при перемножении матриц? (Ни разу их не перемножал и не сталкивался с этим).
Вот этот подойдёт? Если его перевести на Си
http://www.cyberforum.ru/cpp-beginners/thread53080.html
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
29.05.2010, 20:26 #15
Цитата Сообщение от Bloodykeeper Посмотреть сообщение
Спасибо большое! Теперь осталась только третья задачка. Скажите пожалуйста, какой алгоритм можно использовать при перемножении матриц? (Ни разу их не перемножал и не сталкивался с этим).

Не по теме:

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


а вообще подойдет конечно...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2010, 20:26
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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