Форум программистов, компьютерный форум 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
28.05.2010, 17:38     Матрицы в файлах #2
А никто и не говорит о том, что это нужно делать в файле))) Надо считывать данные из файла в память, в памяти выполнять все необходимые преобразования, а дальше как по условию, либо выводить на экран, либо в тот же файл (тогда создастся иллюзия, будто всё это происходило прямо внутри файла), либо в новый файл.
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
28.05.2010, 18:08  [ТС]     Матрицы в файлах #3
Не могли бы вы показать на примере одной из задачек? с вашим исходным файлом. Я просто не знаю что и как мне записать в него даже. -(
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
28.05.2010, 19:36  [ТС]     Матрицы в файлах #5
Спасибо! теперь буду пробовать сделать первую и третью. Если что-то не будет получатся, или запутаюсь, буду надеятся на вашу помощь.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.05.2010, 19:38     Матрицы в файлах #6
Разумеется))
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
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.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.05.2010, 14:01     Матрицы в файлах #8
К сожалению, я со студией не работал... Поэтому не знаю, чего она орёт... Один выход - ждать кого-нибудь, кто работает в студии, пусть он на ошибки покажет...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.05.2010, 14:42     Матрицы в файлах #9
надо подключить
C
1
#include <stdlib.h>
а warning здесь, потому что функции а-ля fopen считаются небезопасными. надо либо пользоваться безопасными аналогами, либо отключить подобные предупреждения прописав в начале проекта до всех include
C
1
#define _CRT_SECURE_NO_DEPRECATE
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 15:07  [ТС]     Матрицы в файлах #10
#include <stdlib.h> я сразу подключил, а прописывая строчку отключения предупреждений, всё остаётся так же. Проблема не здесь, но я не могу её найти.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.05.2010, 15:10     Матрицы в файлах #11
Почему-то ругается на FILE, причём только на второе объявление (т.е. на FILE *out; )... Может попробовать объявить FILE *out; там же, где объявлен FILE *in;, т.е. до первого исполняемого оператора, а то всё-таки в чистом Си все объявления должны делаться в самом начале, до каких-либо операторов, в отличие от Си++...
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
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 минут
Пожалуста подскажите как єто сделать!
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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 минуты
По сути изменил несколько строк. Программа намного проще, чем транспонирование, хотя каркас у них безусловно один. Конечно, рациональнее сразу считать из файла нужный элемент, но мне неохота особо с этим заморачиваться, поэтому тупо читаю всю матрицу в память и уже там ищу нужный элемент.
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 20:23  [ТС]     Матрицы в файлах #14
Спасибо большое! Теперь осталась только третья задачка. Скажите пожалуйста, какой алгоритм можно использовать при перемножении матриц? (Ни разу их не перемножал и не сталкивался с этим).
Вот этот подойдёт? Если его перевести на Си
http://www.cyberforum.ru/cpp-beginners/thread53080.html
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.05.2010, 20:26     Матрицы в файлах #15
Цитата Сообщение от Bloodykeeper Посмотреть сообщение
Спасибо большое! Теперь осталась только третья задачка. Скажите пожалуйста, какой алгоритм можно использовать при перемножении матриц? (Ни разу их не перемножал и не сталкивался с этим).

Не по теме:

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


а вообще подойдет конечно...
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 23:54  [ТС]     Матрицы в файлах #16
А кто может какой-нить другой алгоритм подсказать, или функцию? А то тчо-то с той не выходит у меня....=(
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.05.2010, 23:55     Матрицы в файлах #17
Ну ведь это простой алгоритм! Не уж то нет ни малейшего желания самому попробовать написать его? Это ведь даже не программирование - это кодинг, думать особо не надо, за вас уже подумали... Если вы не поняли алгоритм - спрашивайте - объясним.
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
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
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
30.05.2010, 00:01     Матрицы в файлах #19
А вы описание алгоритма русским языком видели? Или пытаетесь понять его по чьему-то коду?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2010, 00:04     Матрицы в файлах
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
30.05.2010, 00:04  [ТС]     Матрицы в файлах #20
Не-а. Не видел. Я только вышку закончил делать, голова кругом, так что ни читать, ни что либо ещё я не пытался.... Можно ссылочку, если не трудно? Надо решить всё таки эту задачу)) Она ведь последняя за будущие 3 года. что мне задал препод)) Дальше по книжке буду учится. Курс заканчивается программирования. Хотя какой тут курс - конспект 20летней давности начитали, и разбирайтесь 6 месяцев.
Yandex
Объявления
30.05.2010, 00:04     Матрицы в файлах
Ответ Создать тему
Опции темы

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