This party getting crazy!
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
1

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

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

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

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

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

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

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

Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2010, 16:03
Ответы с готовыми решениями:

Даны две квадратные матрицы 5х5 и 6х6 в текстовых файлах. Трансформировать их в другие матрицы
Уважаемые участники форума. Напишите, пожалуйста, программу. Даны две квадратные матрицы 5х5 и...

Начальные данные матрицы разместить во внешних файлах
вот задача: Дана квадратичная матрица А розмерности 4х4. Ввестиелементы матрици А и посчитать...

Даны матрицы Y (5,3) , Z(5,3) , W (5,4) которые находятся в файлах f1, f2 и f3соответственно
Даны матрицы Y (5,3) , Z(5,3) , W (5,4) которые находятся в файлах f1, f2 и f3 соответственно. •...

Есть 2 файла. В файлах числа, найти самое большое число в обоих файлах
С++ Есть два файла В обоих файлах записаны слова Найти самое большое число в обоих файлах

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

Не по теме:

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


а вообще подойдет конечно...
0
This party getting crazy!
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 23:54  [ТС] 16
А кто может какой-нить другой алгоритм подсказать, или функцию? А то тчо-то с той не выходит у меня....=(
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
29.05.2010, 23:55 17
Ну ведь это простой алгоритм! Не уж то нет ни малейшего желания самому попробовать написать его? Это ведь даже не программирование - это кодинг, думать особо не надо, за вас уже подумали... Если вы не поняли алгоритм - спрашивайте - объясним.
0
This party getting crazy!
78 / 64 / 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';
Это не понятно. И как оно на Си- тоже не понятно. Быть может всё просто и я туплю...ну, не знаю.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
30.05.2010, 00:01 19
А вы описание алгоритма русским языком видели? Или пытаетесь понять его по чьему-то коду?
0
This party getting crazy!
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
30.05.2010, 00:04  [ТС] 20
Не-а. Не видел. Я только вышку закончил делать, голова кругом, так что ни читать, ни что либо ещё я не пытался.... Можно ссылочку, если не трудно? Надо решить всё таки эту задачу)) Она ведь последняя за будущие 3 года. что мне задал препод)) Дальше по книжке буду учится. Курс заканчивается программирования. Хотя какой тут курс - конспект 20летней давности начитали, и разбирайтесь 6 месяцев.
0
30.05.2010, 00:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2010, 00:04
Помогаю со студенческими работами здесь

Какая СУБД хранит данные в файлах с расширением .dat и индексы в файлах .k01, k02 и т.д.?
Какая СУБД хранит данные в файлах с расширением .dat и индексы в файлах .k01, k02 и т.д.? Есть ли...

Идея БД на файлах
Если идея создать базу данных на файлах, работа с которой будет осуществляться с использованием...

Строки в файлах
Здравствуйте. Такой вопрос. Как мне из файла считывать каждую 3 строку, преобразовывать ее в тип...

Значки в файлах
Мне нужно, чтобы рядом со всеми файлами в списках этой программы отображался соответствующий значок


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru