Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 14.05.2020
Сообщений: 42
1

Ввод размера и элементов матрица из файла

23.05.2020, 19:43. Показов 187. Ответов 3

Здравствуйте. Не могу доделать задачу в силу своей неопытности, прошу, пожалуйста, помогите. Необходимо ввести из файла matrix.txt размер и элементы матрицы. Как это можно реализовать? Ниже представлен сам код и пример файла matrix.txt:


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
#include<iostream>
using namespace std;
 
int find(int);
int uni(int, int);
 
int i, j, k, a, b, u, v, n, ne = 1;
int min, mincost = 0, cost[9][9], parent[9];
 
int main()
{
        setlocale(LC_ALL, "Rus"); 
        cout << "6. Построение оптимального каркаса методом Крускала\n";
//  cout << "Введите число вершин графа( <= 9): ";
//      cin >> n;
//      cout << "Введите элементы матрицы смежности(длины ребер между вершинами графа) " << n << " x " << n << ": \n";
 
       for (i = 1; i <= n; i++)
       {
           for(j = 1; j <= n; j++)
           {
               cin >> cost[i][j];
               if(cost[i][j] == 0)
                   cost[i][j] = 999;
           }
       }
 
       printf("Наименьшая длина: \n");
        
        while(ne < n){
            int min = 999;
            for(i = 1; i <= n; i++){
                for(j = 1; j <= n; j++){
                    if(cost[i][j] < min){
                        min = cost[i][j];
                        a = u = i;
                        b = v = j;
                    }
                }
            }
           u = find(u);
           v = find(v);
           if(uni(u, v)){
               cout << ne++ << " ребро (" << a << ", " << b << ") = " << min << endl;
               mincost += min;
           }
           cost[a][b] = 999;
       }
       cout << "\nМинимальная длина оптимального каркаса = " << mincost << endl;
       return 0;
}
 
int find(int i){
        while(parent[i])
        i = parent[i];
        return i;
}
 
int uni(int i,int j){
        if(i != j){
            parent[j] = i;
           return 1;
       }
       return 0;
}
matrix.txt

4
0 1 2 3
0 0 0 0
0 4 0 5
0 1 0 0
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2020, 19:43
Ответы с готовыми решениями:

Ввод элементов из файла в матрицу заданного размера
Госпади снова этот фортран. Помогите. суть такая. Необходимо образовать матрицу М(2,3) (2...

Дана матрица размера M*N. Найти мкасимальный среди минимальных элементов элементов ее строк
Дана матрица размера M*N. Найти мкасимальный среди минимальных элементов элементов ее строк. Код...

Дана матрица размера M x N в каждой ее строке найти количество элементов меньших среднего арифметического всех элементов этой строки
Помогите пожалуйста :)

Дана матрица размера M х N. В каждой ее строке найти количество элементов, меньших среднего арифметического всех элементов этой строки
Помогите пожалуйста записать задачу в языке программирования Java. var a:array of integer;...

3
5929 / 4025 / 2335
Регистрация: 18.12.2017
Сообщений: 12,597
23.05.2020, 20:14 2
C++
1
2
3
4
5
6
7
ifstream in("matrix.txt"); // открыли файл для чтения
 
in >> n; // прочитали n
 
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
in >> a[i][j]; // прочитали значения в массив
также нужно добавить проверку на успешное открытие файла

Добавлено через 10 минут
в Вашем коде ошибка:
Цитата Сообщение от newmersedez Посмотреть сообщение
for (i = 1; i <= n; i++)
       {
           for(j = 1; j <= n; j++)
индексация в С++ начинается с нуля
1
0 / 0 / 0
Регистрация: 14.05.2020
Сообщений: 42
23.05.2020, 21:29  [ТС] 3
Спасибо за помощь, ввод организован и работает, но появился баг, которого не было до этого. При данной матрице смежности из файла ответ будет 11, а у меня выводит 9(Сама задача приведена картинкой в статье Википедии: https://ru.wikipedia.org/wiki/... 0%BB%D0%B0). Вот код, файл matrix.txt, как до этого выглядел вывод, и как он выглядит сейчас. Что не так с моим кодом?
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
#include<iostream>
#include<fstream>
using namespace std;
 
int find(int);
int uni(int, int);
 
int i, j, a, b, u, v, n, ne = 1;
int min, mincost = 0, parent[12];
 
int main()
{
    setlocale(LC_ALL, "Rus"); 
    cout << "6. Построение оптимального каркаса методом Крускала\n";
    
    ifstream in("matrix.txt"); 
    in >> n;
    int cost[n][n];
    int parent[n];
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            in >> cost[i][j];
            if(cost[i][j] == 0){
                cost[i][j] = 999;
            }
        }
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cout << cost[i][j] << " ";
        }
        cout << endl;
    }
    
    cout << "Наименьшая длина: \n";
    while(ne < n){
        int min = 999;
        for(i = 0; i < n; i++){
            for(j = 0; j < n; j++){
                if(cost[i][j] < min){
                    min = cost[i][j];
                    a = u = i;
                    b = v = j;
                }
            }
        }
        u = find(u);
        v = find(v);
        if(uni(u, v)){
            cout << ne++ << " ребро (" << a << ", " << b << ") = " << min << endl;
            mincost += min;
        }
        cost[a][b] = 999;
    }
    cout << "\nМинимальная длина оптимального каркаса = " << mincost << endl;
    return 0;
}
 
int find(int i){
        while(parent[i])
        i = parent[i];
        return i;
}
 
int uni(int i,int j){
        if(i != j){
            parent[j] = i;
           return 1;
       }
       return 0;
}
matrix.txt
5
0 3 0 0 1
3 0 5 0 4
0 5 0 2 6
0 0 2 0 7
0 4 6 7 0

Вывод правильный:

6. Построение оптимального каркаса методом Крускала
999 3 999 999 1
3 999 5 999 4
999 5 999 2 6
999 999 2 999 7
999 4 6 7 999
Наименьшая длина:
1 ребро (0, 4) = 1
2 ребро (2, 3) = 2
3 ребро (0, 1) = 3
4 ребро (1, 0) = 3

Минимальная длина оптимального каркаса = 9

--------------------------------
Process exited after 0.1237 seconds with return value 0
Для продолжения нажмите любую клавишу . . .

Вывод неправильный:

Построение оптимального каркаса методом Крускала
999 3 999 999 1
3 999 5 999 4
999 5 999 2 6
999 999 2 999 7
999 4 6 7 999
Наименьшая длина:
1 ребро (0, 4) = 1
2 ребро (2, 3) = 2
3 ребро (0, 1) = 3
4 ребро (1, 0) = 3

Минимальная длина оптимального каркаса = 9

--------------------------------
Process exited after 0.1237 seconds with return value 0
Для продолжения нажмите любую клавишу . . .
0
5929 / 4025 / 2335
Регистрация: 18.12.2017
Сообщений: 12,597
23.05.2020, 23:41 4
Цитата Сообщение от newmersedez Посмотреть сообщение
появился баг, которого не было до этого
использование статических массивов, если размер не задан заранее - не по стандарту С++. переходите на динамические массивы.
Цитата Сообщение от newmersedez Посмотреть сообщение
При данной матрице смежности из файла ответ будет 11, а у меня выводит 9
значит ошибка в коде - на результаты вычислений откуда вводятся данные - с клавиатуры или из файла значение не имеет

Добавлено через 3 минуты
это для кого сообщалось
Цитата Сообщение от Yetty Посмотреть сообщение
нужно добавить проверку на успешное открытие файла
уберите в строке 9
Цитата Сообщение от newmersedez Посмотреть сообщение
parent[12]
переменные лучше не объявлять глобально - перенесите объявление в main
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2020, 23:41

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Дана матрица размера MxN. В каждой ее строке найти кол-во элементов, меньших среднего арифметического всех элементов этой строки
Дана матрица размера MxN.В каждой ее строке найти кол-во элементов, меньших среднего...

Дана действительная матрица размера N на M элементов
Дана действительная матрица размера N на M элементов: а11|а12|а13|...|а1m а21|а22|а23|...|а2m...

Как сделать ввод матрицы из файла без указания размера
Я сделал ввод матрицы из файла с указанием ее размера(массива),а как сделать ввод матрицы из файла...

Дана матрица размера 5 x 9. Найти суммы элементов
Дана матрица размера 5 x 9. Найти суммы элементов всех ее четных1|нечетных2 строк3|столбцов4....

Матрица, вывод и ввод данных из текстового файла
Дан двумерный массив размера N*M (вводятся пользователем). Заполнить массив случайными числами и...

Матрица, ручной ввод элементов
Ещё раз здравствуйте. Встала такая проблема, не получается переделать рандомное заполнение матрицы...


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

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

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