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

Потенциально неинициализированная локальная переменная-указатель (Ошибка C4703) - Как исправить?

23.12.2018, 13:10. Показов 2577. Ответов 7

Здравствуйте, как можно исправить вот эти ошибки:
Ошибка C4703 используется потенциально неинициализированная локальная переменная-указатель "KMatrix"
Ошибка C4703 используется потенциально неинициализированная локальная переменная-указатель "KnArray" ?

Вот код:
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <fstream>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus");
    short int change = 1;
    while (change != 0)
    {
        int **KMatrix, **KnArray;
        int n = 0, size;
        cout << "\n--------------------------------------------------\n";
        cout << " Меню:" << endl;
        cout << "  1 - Ввод разреженного массива из файла;" << endl;
        cout << "  2 - Преобразование разреженного массива в массив по схеме Кнута;" << endl;
        cout << "  3 - Вывод рязреженного массива на экран;" << endl;
        cout << "  4 - Вывод массива по схеме Кнута на экран;" << endl;
        cout << "  5 - Получение значения элемента по номеру строки и номеру столбца;" << endl;
        cout << "  6 - Определение максимального значения среди ненулевых элементов в указанном столбце;" << endl;
        cout << "  0 - Выход из программы.";
        cout << "\n--------------------------------------------------\n";
        cout << " Ввод: "; cin >> change;
        switch (change)
        {
        case 1:
        {
            ifstream Matrix("C:\\Users\\1\\Desktop\\ТОГУ\\УИТС (аб)-71\\2 курс\\III симестр\\СТАЛ программы\\MatrKnut\\RazMatr.txt");
            if (Matrix.is_open())
            {
                cout << "\n  Не удалось открыть файл!\n";
                change = 0;
            }
            else
            {
                Matrix >> size;
                KMatrix = new int*[size];
                for (int i = 0; i < size; i++)
                {
                    KMatrix[i] = new int[size];
                    for (int j = 0; j < size; j++)
                    {
                        Matrix >> KMatrix[i][j];
                        if (KMatrix[i][j] != 0)
                            n++;
                        if (Matrix.eof())
                            break;
                    }
                }
            }
            Matrix.close();
            break;
        }
        case 2:
        {
            int k = 0;
            KnArray = new int*[n];
            for (int i = 0; i < n; i++)
            {
                KnArray[i] = new int[3];
                for (int j = 0; j < 3; j++)
                {
                    if (KMatrix[i][j] != 0)
                    {
                        KnArray[k][0] = i;
                        KnArray[k][1] = j;
                        KnArray[k][3] = KMatrix[i][j];
                        k++;
                    }
                }
            }
            break;
        }
        case 3:
        {
            cout << "\n Разреженный массив:" << endl;
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                    cout << KMatrix[i][j] << "\t";
                cout << endl;
            }
            cout << endl;
            break;
        }
        case 4:
        {
            cout << "\n Массив:" << endl;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < 3; j++)
                    cout << i << "\t" << j << "\t" << KnArray[i][j] << endl;
            cout << endl;
            break;
        }
        case 5:
        {
            int i, j;
            cout << " Ввод данных:" << endl;
            cout << "  Введите номер строки: "; cin >> i;
            cout << "  Введите номер столбца: "; cin >> j;
            cout << endl << " Значение элемента, хранящиегося по адресу [" << i << "][" << j << "]: " << KnArray[i][j];
            cout << endl;
            break;
        }
        case 6:
        {
            int j, max = 0;
            cout << " Введите номер столбца: "; cin >> j;
            for (int i = 0; i < n; i++)
            {
                if (KnArray[i][j] != 0)
                    if (KnArray[i][j] > max)
                        max = KnArray[i][j];
            }
            cout << " Максимальное значение среди ненулевых элементов: " << max << endl;
        }
        case 0:
            break;
        default:
        {
            cout << "\n Неверный выбор! Попробуйте ещё раз!";
            break;
        }
    }
        for (int i = 0; i < size; i++)
            delete[] KMatrix[i];
        delete[] KMatrix;
        for (int i = 0; i < n; i++)
            delete[] KnArray[i];
        delete[] KnArray;
    }
    cout << "\n Время работы программы = " << clock() / 1000.0 << " сек.\n";  //вывод времени работы программы
    system("pause");
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

Исправить ошибку: "C4703: используется потенциально неинициализированная локальная переменная-указатель"
Вообщем выдает одну ошибку в функции добавления в 76 строке, а именно &quot;Ошибка 1 error C4703:...

Error C4703: используется потенциально неинициализированная локальная переменная-указатель
// prog8.cpp: определяет точку входа для консольного приложения. #include &lt;stdio.h&gt; #include...

Ошибка C4703 используется потенциально неинициализированная локальная переменная-указатель "A"
Помогите не могу понять, что не так то, уже многое перепробовал #include &quot;stdafx.h&quot; #include...

Error C4703: используется потенциально неинициализированная локальная переменная-указатель "pel"
#include &quot;vector.h&quot; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;locale.h&gt; int main() {...

7
Мозгоправ
1724 / 1020 / 466
Регистрация: 01.10.2018
Сообщений: 2,129
Записей в блоге: 2
23.12.2018, 13:32 2
Лучший ответ Сообщение было отмечено MysteriousLord как решение

Решение

В строке 13
C++
1
int **KMatrix = nullptr, **KnArray = nullptr;
В тех case'ах, где НЕ создаётся, но используется матрица, поставить проверку указателя на nullptr с выводом диагностического сообщения, если матрица ещё не создана.

В тех case'ах, где создаётся матрица, поставить проверку указателя на nullptr: если матрица уже существует, сначала надо уничтожить старую матрицу, а потом создавать новую.
1
Модератор
Эксперт С++
10647 / 8830 / 5337
Регистрация: 18.12.2011
Сообщений: 23,633
23.12.2018, 13:37 3
Цитата Сообщение от MysteriousLord Посмотреть сообщение
KnArray = new int*[n];
n проверяйте на нуль.
Цитата Сообщение от MysteriousLord Посмотреть сообщение
for (int j = 0; j < 3; j++)
cout << i << "\t" << j << "\t" << KnArray[i][j] << endl;
C++
1
2
//for (int j = 0; j < 3; j++)
cout << KnArray[i][0]<< "\t" << KnArray[i][1]<< "\t" << KnArray[i][2] << endl;
Цитата Сообщение от MysteriousLord Посмотреть сообщение
KnArray[k][3] = KMatrix[i][j];
C++
1
KnArray[k][2] = KMatrix[i][j];
1
6 / 6 / 0
Регистрация: 16.06.2018
Сообщений: 22
23.12.2018, 18:58  [ТС] 4
Спасибо, но я сделал только это:
Цитата Сообщение от L0M Посмотреть сообщение
В строке 13
C++Выделить код1
int **KMatrix = nullptr, **KnArray = nullptr;
Программа запустилась. Как сделать это я не понимаю:
Цитата Сообщение от L0M Посмотреть сообщение
В тех case'ах, где НЕ создаётся, но используется матрица, поставить проверку указателя на nullptr с выводом диагностического сообщения, если матрица ещё не создана.
В тех case'ах, где создаётся матрица, поставить проверку указателя на nullptr: если матрица уже существует, сначала надо уничтожить старую матрицу, а потом создавать новую.
И ещё у меня ошибка выскакивает при попытке вывести на экран массив(на скрине), я так понимаю это либо из файла неправильно вводит в массив, либо это связано с тем, что вы мне написали. Файл я прикрепил.
Вот изменённый код:
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <fstream>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus");
    int n = 0, size = 0;
    short int change = 1;
    while (change != 0)
    {
        int **KMatrix = nullptr, **KnArray = nullptr;
        cout << "\n--------------------------------------------------\n";
        cout << " Меню:" << endl;
        cout << "  1 - Ввод разреженного массива из файла;" << endl;
        cout << "  2 - Преобразование разреженного массива в массив по схеме Кнута;" << endl;
        cout << "  3 - Вывод рязреженного массива на экран;" << endl;
        cout << "  4 - Вывод массива по схеме Кнута на экран;" << endl;
        cout << "  5 - Получение значения элемента по номеру строки и номеру столбца;" << endl;
        cout << "  6 - Определение максимального значения среди ненулевых элементов в указанном столбце;" << endl;
        cout << "  0 - Выход из программы.";
        cout << "\n--------------------------------------------------\n";
        cout << " Ввод: "; cin >> change;
        cout << endl;
        switch (change)
        {
        case 1:
        {
            ifstream Matrix("C:\\Users\\1\\Desktop\\ТОГУ\\УИТС (аб)-71\\2 курс\\III симестр\\СТАЛ программы\\MatrKnut\\RazMatr.txt");
            if (!Matrix.is_open())
            {
                cout << "\n  Не удалось открыть файл!\n";
                change = 0;
            }
            else
            {
                Matrix >> size;
                KMatrix = new int*[size];
                for (int i = 0; i < size; i++)
                {
                    KMatrix[i] = new int[size];
                    for (int j = 0; j < size; j++)
                    {
                        Matrix >> KMatrix[i][j];
                        if (KMatrix[i][j] != 0)
                            n++;
                        if (Matrix.eof())
                            break;
                    }
                }
            }
            Matrix.close();
            if (KMatrix != nullptr)
            {
                cout << endl;
                cout << " Ввод массива из файла был успешно произведен!" << endl;
                cout << " Размер разреженного массива: " << size << "x" << size << "." << endl;
                cout << endl;
            }
            else
                cout << endl << " Не удалось произвести ввод разреженного массива из файла!" << endl << endl;
            break;
        }
        case 2:
        {
            int k = 0;
            if (n != 0)
            {
                KnArray = new int*[n];
                for (int i = 0; i < n; i++)
                {
                    KnArray[i] = new int[3];
                    for (int j = 0; j < 3; j++)
                    {
                        if (KMatrix[i][j] != 0)
                        {
                            KnArray[k][0] = i;
                            KnArray[k][1] = j;
                            KnArray[k][2] = KMatrix[i][j];
                            k++;
                        }
                    }
                }
                if (KnArray != nullptr)
                {
                    cout << endl;
                    cout << " Рязреженный массив успешно удалось преобразовать в массив по схеме Кнута!";
                    cout << endl << " Размер массива: " << n << "x3.";
                    cout << endl;
                }
                else
                    cout << " Не удалось преобразовать массив!" << endl;
            }
            else
                cout << endl << " Количество ненулевых элементов равно 0, массив не удасться преобразовать." << endl << endl;
            break;
        }
        case 3:
        {
            if (size != 0)
            {
                cout << "\n Разреженный массив:" << endl;
                for (int i = 0; i < size; i++)
                {
                    for (int j = 0; j < size; j++)
                        cout << KMatrix[i][j] << "\t";
                    cout << endl;
                }
                cout << endl;
            }
            else
                cout << endl << " Размер массива равен 0!" << endl << endl;
            break;
        }
        case 4:
        {
            cout << "\n Массив:" << endl;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < 3; j++)
                    cout << KnArray[i][0] << "\t" << KnArray[i][1] << "\t" << KnArray[i][2] << endl;
            cout << endl;
            break;
        }
        case 5:
        {
            int i, j;
            cout << " Ввод данных:" << endl;
            cout << "  Введите номер строки: "; cin >> i;
            cout << "  Введите номер столбца: "; cin >> j;
            cout << endl << " Значение элемента, хранящиегося по адресу [" << i << "][" << j << "]: " << KnArray[i][j];
            cout << endl;
            break;
        }
        case 6:
        {
            int j, max = 0;
            cout << " Введите номер столбца: "; cin >> j;
            for (int i = 0; i < n; i++)
            {
                if (KnArray[i][j] != 0)
                    if (KnArray[i][j] > max)
                        max = KnArray[i][j];
            }
            cout << " Максимальное значение среди ненулевых элементов: " << max << endl;
        }
        case 0:
            break;
        default:
        {
            cout << "\n Неверный выбор! Попробуйте ещё раз!";
            break;
        }
        }
        if (KMatrix != nullptr && KnArray != nullptr)
        {
            for (int i = 0; i < size; i++)
                delete[] KMatrix[i];
            delete[] KMatrix;
            for (int i = 0; i < n; i++)
                delete[] KnArray[i];
            delete[] KnArray;
        }
        else
        {
            delete[] KMatrix;
            delete[] KnArray;
        }
    }
    cout << "\n Время работы программы = " << clock() / 1000.0 << " сек.\n";  //вывод времени работы программы
    system("pause");
    return 0;
}
0
Миниатюры
Потенциально неинициализированная локальная переменная-указатель (Ошибка C4703) - Как исправить?  
Вложения
Тип файла: txt RazMatr.txt (56 байт, 3 просмотров)
Мозгоправ
1724 / 1020 / 466
Регистрация: 01.10.2018
Сообщений: 2,129
Записей в блоге: 2
23.12.2018, 22:44 5
Лучший ответ Сообщение было отмечено MysteriousLord как решение

Решение

Вы много напутали и по мелочи, и не по мелочи. Я там поправил.
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <fstream>
using namespace std;
 
void killMatrix(int ***mx, int size) {
    if (*mx == nullptr || size <= 0)
        return;
    for (int i = 0; i < size; ++i)
        delete[](*mx)[i];
    delete[](*mx);
    *mx = nullptr;
}
 
int main() {
    setlocale(LC_ALL, "rus");
    int size_Knuth = 0, size = 0;
    short int change = 1;
    int **KMatrix = nullptr, **KnArray = nullptr;
 
    do {
        cout <<
            "\n--------------------------------------------------\n"
            " Меню:\n"
            "  1 - Ввод разреженного массива из файла;\n"
            "  2 - Преобразование разреженного массива в массив по схеме Кнута;\n"
            "  3 - Вывод разреженного массива на экран;\n"
            "  4 - Вывод массива по схеме Кнута на экран;\n"
            "  5 - Получение значения элемента по номеру строки и номеру столбца;\n"
            "  6 - Определение максимального значения среди ненулевых элементов в указанном столбце;\n"
            "  0 - Выход из программы.\n"
            "--------------------------------------------------\n"
            " Ввод: ";
        cin >> change;
 
        cout << endl;
        switch (change) {
        case 1:     // Ввод разреженного массива из файла
        {
            killMatrix(&KMatrix, size);
            ifstream Matrix("RazMatr.txt");
            if (!Matrix.is_open()) {
                cout << "\n  Не удалось открыть файл!\n";
                change = 0;
            }
            else {
                Matrix >> size;
                killMatrix(&KnArray, size_Knuth);       // массив по Кнуту будет неактуален для новых данных
                size_Knuth = 0;
                KMatrix = new int*[size];
                for (int i = 0; i < size; i++) {
                    KMatrix[i] = new int[size];
                    for (int j = 0; j < size; j++) {
                        Matrix >> KMatrix[i][j];
                        if (KMatrix[i][j] != 0)
                            size_Knuth++;
                        if (Matrix.eof())
                            KMatrix[i][j] = 0;      // если eof, то инициализировать нулями!
                    }
                }
            }
            Matrix.close();
            if (KMatrix != nullptr) {
                cout << endl;
                cout << " Ввод массива из файла был успешно произведен!" << endl;
                cout << " Размер разреженного массива: " << size << "x" << size << "." << endl;
                cout << endl;
            }
            else
                cout << endl << " Не удалось произвести ввод разреженного массива из файла!" << endl << endl;
            break;
        }
        case 2:     // Преобразование разреженного массива в массив по схеме Кнута
        {
            if (KMatrix == nullptr) {
                cout << endl << " Разреженный массив не создан!" << endl << endl;
                break;
            }
 
            killMatrix(&KnArray, size_Knuth);
            if (size_Knuth > 0) {
                KnArray = new int*[size_Knuth];
                for (int i = 0; i < size_Knuth; i++)
                    KnArray[i] = new int[3];
 
                int k = 0;
                for (int i = 0; i < size; ++i)
                    for (int j = 0; j < size; ++j)
                        if (KMatrix[i][j] != 0) {
                            KnArray[k][0] = i;
                            KnArray[k][1] = j;
                            KnArray[k][2] = KMatrix[i][j];
                            k++;
                        }
                if (KnArray != nullptr) {
                    cout << endl;
                    cout << " Разреженный массив успешно удалось преобразовать в массив по схеме Кнута!";
                    cout << endl << " Размер массива: " << size_Knuth << "x3.";
                    cout << endl;
                }
                else
                    cout << " Не удалось преобразовать массив!" << endl;
            }
            else
                cout << endl << " Количество ненулевых элементов равно 0, массив не удастся преобразовать." << endl << endl;
            break;
        }
        case 3:     // Вывод разреженного массива на экран
        {
            if (KMatrix == nullptr) {
                cout << endl << " Разреженный массив не создан!" << endl << endl;
                break;
            }
            if (size != 0) {
                cout << "\n Разреженный массив:" << endl;
                for (int i = 0; i < size; i++) {
                    for (int j = 0; j < size; j++)
                        cout << KMatrix[i][j] << "\t";
                    cout << endl;
                }
                cout << endl;
            }
            else
                cout << endl << " Размер массива равен 0!" << endl << endl;
            break;
        }
        case 4:     // Вывод массива по схеме Кнута на экран
        {
            if (KnArray == nullptr) {
                cout << endl << " Массив по схеме Кнута не создан!" << endl << endl;
                break;
            }
            cout << "\n Массив:" << endl;
            for (int i = 0; i < size_Knuth; i++)
                cout << KnArray[i][0] << "\t" << KnArray[i][1] << "\t" << KnArray[i][2] << endl;
            cout << endl;
            break;
        }
        case 5:     // Получение значения элемента по номеру строки и номеру столбца
        {
            if (KnArray == nullptr) {
                cout << endl << " Массив по схеме Кнута не создан!" << endl << endl;
                break;
            }
            int i, j;
            cout << " Ввод данных:" << endl;
            cout << "  Введите номер строки: "; cin >> i;
            cout << "  Введите номер столбца: "; cin >> j;
            cout << endl << " Значение элемента, хранящиегося по адресу [" << i << "][" << j << "]: " << KnArray[i][j];
            cout << endl;
            break;
        }
        case 6:     // Определение максимального значения среди ненулевых элементов в указанном столбце
        {
            if (KnArray == nullptr) {
                cout << endl << " Массив по схеме Кнута не создан!" << endl << endl;
                break;
            }
            int j, max = 0;
            cout << " Введите номер столбца: "; cin >> j;
            for (int i = 0; i < size_Knuth; i++) {
                if (KnArray[i][1] == j)
                    if (KnArray[i][2] > max)
                        max = KnArray[i][2];
            }
            cout << " Максимальное значение среди ненулевых элементов: " << max << endl;
        }
        case 0:     // нах!
            break;
        default:
            cout << "\n Неверный выбор! Попробуйте ещё раз!";
            break;
        }
    } while (change != 0);
 
    killMatrix(&KMatrix, size);
    killMatrix(&KnArray, size_Knuth);
 
    cout << "\n Время работы программы = " << clock() / 1000.0 << " сек.\n";  //вывод времени работы программы
    system("pause");
    return 0;
}
Остались большие сомнения по поводу п.5 в меню. Мне кажется, что имелось ввиду вывести значение элемента по номеру строки и номеру столбца разреженной матрицы, пользуясь матрицей Кнута. Иначе как-то совсем примитивно просто. Но трогать не стал.

Добавлено через 42 минуты
А вообще, в плане самосовершенствования, было бы интереснее сделать класс SparseMatrix (разреженная матрица). Внешний интерфейс сделать по типу обычной матрицы (причём не обязательно квадратной), а под капотом - массив по схеме Кнута. Реализация, на самом деле, может быть достаточно простая: вектор структур. В структуре хранить координаты значения и само значение. Использование вектора избавляет от ручного выделения/освобождения памяти внутри класса.
1
6 / 6 / 0
Регистрация: 16.06.2018
Сообщений: 22
25.12.2018, 13:22  [ТС] 6
Спасибо большое очень).

Я одновременно делаю 2 проги по лабам, поэтому у меня может быть бред).
Цитата Сообщение от L0M Посмотреть сообщение
Вы много напутали и по мелочи, и не по мелочи. Я там поправил.
Я тоже думал, какую матрицу использовать, но решил, что всё же матрицу по схеме Кнута, но если надо было другую, то можно просто добавить, не меняя исходник, проверку на номера строк и столбцов, типа если такого номера строки/столбца нет в матрице Кнута, то выводить 0.
Цитата Сообщение от L0M Посмотреть сообщение
Остались большие сомнения по поводу п.5 в меню. Мне кажется, что имелось ввиду вывести значение элемента по номеру строки и номеру столбца разреженной матрицы, пользуясь матрицей Кнута. Иначе как-то совсем примитивно просто. Но трогать не стал.
Будет время - попробую, спасибо).
Цитата Сообщение от L0M Посмотреть сообщение
А вообще, в плане самосовершенствования, было бы интереснее сделать класс SparseMatrix (разреженная матрица). Внешний интерфейс сделать по типу обычной матрицы (причём не обязательно квадратной), а под капотом - массив по схеме Кнута. Реализация, на самом деле, может быть достаточно простая: вектор структур. В структуре хранить координаты значения и само значение. Использование вектора избавляет от ручного выделения/освобождения памяти внутри класса.
0
6 / 6 / 0
Регистрация: 16.06.2018
Сообщений: 22
26.12.2018, 06:18  [ТС] 7
Извините, что так вышло, но вы были правы)).
Цитата Сообщение от L0M Посмотреть сообщение
Остались большие сомнения по поводу п.5 в меню. Мне кажется, что имелось ввиду вывести значение элемента по номеру строки и номеру столбца разреженной матрицы, пользуясь матрицей Кнута. Иначе как-то совсем примитивно просто. Но трогать не стал.
И даже больше, в общем, вот код:
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <fstream>
using namespace std;
 
void DeleteMatrix(int ***matrix, int size)
{
    if (*matrix == nullptr || size <= 0)
        return;
    for (int i = 0; i < size; ++i)
        delete[](*matrix)[i];
    delete[](*matrix);
    *matrix = nullptr;
}
int main()
{
    setlocale(LC_ALL, "rus");
    int KnSize = 0, size = 0, number = 0;
    int **KnArray = nullptr;
    short int change = 1;
    do
    {
        cout << "\n--------------------------------------------------\n";
        cout << " Меню:" << endl;
        cout << "  1 - Ввод массива по схеме Кнута из файла;" << endl;
        cout << "  2 - Вывод массива по схеме Кнута на экран;" << endl;
        cout << "  3 - Вывод полной матрицы на экран;" << endl;
        cout << "  4 - Получение значения элемента по номеру строки и номеру столбца;" << endl;
        cout << "  5 - Определение максимального значения среди ненулевых элементов в указанном столбце;" << endl;
        cout << "  0 - Выход из программы.";
        cout << "\n--------------------------------------------------\n";
        cout << " Ввод: "; cin >> change;
        cout << endl;
        switch (change)
        {
        case 1:                                                  //Ввод массива по схеме Кнута из файла
        {
            ifstream Matrix("C:\\Users\\1\\Desktop\\ТОГУ\\УИТС (аб)-71\\2 курс\\III симестр\\СТАЛ программы\\MatrKnut\\RazMatr.txt");
            if (!Matrix.is_open())
            {
                cout << "\n  Не удалось открыть файл!\n";
                change = 0;
            }
            else
            {
                Matrix >> size;
                DeleteMatrix(&KnArray, KnSize);                    //массив по схеме Кнута будет неактуален для новых данных
                KnSize = 0;
                for (int i = 0; i < size; i++)
                    for (int j = 0; j < size; j++)
                    {
                        Matrix >> number;
                        if (number != 0)
                            KnSize++;
                    }
            }
            if (KnSize > 0)
            {
                KnArray = new int*[KnSize];
                for (int i = 0; i < KnSize; i++)
                    KnArray[i] = new int[3];
                int k = 0;
                if (KnSize != 0)
                {
                    Matrix.seekg(2, ios::beg);
                    for (int i = 0; i < size; i++)
                        for (int j = 0; j < size; j++)
                        {
                            Matrix >> number;
                            if (number != 0)
                            {
                                KnArray[k][0] = i;
                                KnArray[k][1] = j;
                                KnArray[k][2] = number;
                                k++;
                            }
                        }
                    number = 0;
                }
                if (KnArray != nullptr)
                {
                    cout << endl;
                    cout << " Ввод массива по схеме Кнута окончен успешно!";
                    cout << endl << " Размер массива: " << KnSize << "x3.";
                    cout << endl;
                }
                else
                    cout << " Не удалось ввести массив!" << endl;
            }
            else
                cout << endl << " Количество ненулевых элементов равно 0, массив не удасться создать." << endl << endl;
            Matrix.close();
            break;
        }
        case 2:                                                  //Вывод массива по схеме Кнута на экран
        {
            if (KnArray == nullptr)
            {
                cout << endl << " Массив по схеме Кнута не создан!" << endl << endl;
                break;
            }
            cout << "\n Массив:" << endl;
            for (int i = 0; i < KnSize; i++)
                cout << KnArray[i][0] << "\t" << KnArray[i][1] << "\t" << KnArray[i][2] << endl;
            cout << endl;
            break;
        }
        case 3:                                                  //Вывод полной матрицы на экран
        {
            if (KnArray == nullptr)
            {
                cout << endl << " Массив по схеме Кнута не создан!" << endl << endl;
                break;
            }
            cout << "\n Массив:" << endl;
 
            break;
        }
        case 4:                                                  //Получение значения элемента по номеру строки и номеру столбца
        {
            if (KnArray == nullptr)
            {
                cout << endl << " Массив по схеме Кнута не создан!" << endl << endl;
                break;
            }
            int i = 0, j = 0;
            cout << " Ввод данных:" << endl;
            cout << "  Введите номер строки: "; cin >> i;
            if (i > (KnSize - 1))
            {
                while (!(i < (KnSize)))
                {
                    cout << "\n  Такой строки нет в массиве! Попробуйте ещё раз." << endl;
                    cout << "  Введите номер строки: "; cin >> i;
                }
            }
            cout << "  Введите номер столбца: "; cin >> j;
            if (j > size)
            {
                while (!(j < size))
                {
                    cout << "\n  Такого столбца нет в массиве! Попробуйте ещё раз." << endl;
                    cout << "  Введите номер столбца: "; cin >> j;
                }
            }
            cout << endl << " Значение элемента, хранящиегося по адресу [" << i << "][" << j << "]: " << KnArray[i - 1][j - 1];
            cout << endl;
            break;
        }
        case 5:                                                  //Определение максимального значения среди ненулевых элементов в указанном столбце
        {
            if (KnArray == nullptr)
            {
                cout << endl << " Массив по схеме Кнута не создан!" << endl << endl;
                break;
            }
            int j = 0, max = 0;
            cout << "  Введите номер столбца: "; cin >> j;
            if (j > size)
            {
                while (!(j < size))
                {
                    cout << "\n  Такого столбца нет в массиве! Попробуйте ещё раз." << endl;
                    cout << "  Введите номер столбца: "; cin >> j;
                }
            }
            j -= 1;
            for (int i = 0; i < KnSize; i++)
            {
                if (KnArray[i][j] != 0)
                    if (KnArray[i][j] > max)
                        max = KnArray[i][j];
            }
            cout << " Максимальное значение среди ненулевых элементов: " << max << endl;
        }
        case 0:                                                  //Выход из программы
            break;
        default:
        {
            cout << "\n Неверный выбор! Попробуйте ещё раз!";
            break;
        }
        }
    } while (change != 0);
    DeleteMatrix(&KnArray, KnSize);
    cout << "\n Время работы программы = " << clock() / 1000.0 << " сек.\n";  //вывод времени работы программы
    system("pause");
    return 0;
}
Надо вывести полною матрицу с нулями на основе полученного массива по схеме Кнута, и на его же основе выполнить пп. 4 и 5 - поиск и определение. У меня уже нет идей, как это сделать. Я пробовал, но у меня тока выводилась матрица размером KnSize*KnSize, состоящая полностью из 0.
0
Мозгоправ
1724 / 1020 / 466
Регистрация: 01.10.2018
Сообщений: 2,129
Записей в блоге: 2
27.12.2018, 00:35 8
В общем, я предполагал такой разворот событий. И я вам прозрачно намекал, что лучше было бы оформить кнутовскую матрицу в виде класса. Вы оставили это "на потом", и тут же завязли в деталях реализации этой самой матрицы.
А всего-то надо было написать 70 строк кода.
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <ctime>
#include <fstream>
#include <vector>
#include <algorithm>
#include <stdexcept>
 
using namespace std;
 
// ----- KnuthMatrix ----------------------------------------------------------
 
template <typename T>
class KnuthMatrix {
    struct Item {
        size_t row, col;
        T val;
        Item(size_t r, size_t c, const T &v) : row(r), col(c), val(v) {}
    };
    class ItemComparator {
        size_t row, col;
    public:
        ItemComparator(size_t r, size_t c) : row(r), col(c) {}
        bool operator () (const Item &a) {
            return row == a.row && col == a.col;
        }
    };
    typedef vector<Item> KVec;
public:
    KnuthMatrix() : orig_rows(0), orig_cols(0) {}
    KnuthMatrix(size_t rows, size_t cols) {
        resize(rows, cols);
    }
    KnuthMatrix(const KnuthMatrix &km) {
        kvec = km.kvec;
        orig_rows = km.orig_rows;
        orig_cols = km.orig_cols;
    }
    KnuthMatrix& operator = (const KnuthMatrix &km) {
        kvec = km.kvec;
        orig_rows = km.orig_rows;
        orig_cols = km.orig_cols;
        return *this;
    }
    T get(size_t row, size_t col) const {
        if (row >= orig_rows || col >= orig_cols)
            throw range_error("KnuthMatrix: invalid index");
        auto it = find_if(kvec.begin(), kvec.end(), ItemComparator(row, col));
        if (it == kvec.end())
            return T(0);
        return it->val;
    }
    void set(size_t row, size_t col, const T &v) {
        if (row >= orig_rows || col >= orig_cols)
            throw range_error("KnuthMatrix: invalid index");
        if (v == T(0))
            return;
        auto it = find_if(kvec.begin(), kvec.end(), ItemComparator(row, col));
        if (it == kvec.end())
            kvec.emplace_back(row, col, v);
        else
            it->val = v;
    }
    void clear() {
        kvec.clear();
    }
    bool isEmpty() const {
        return kvec.empty();
    }
    size_t size() const {
        return kvec.size();
    }
    size_t rows() const { return orig_rows; }
    size_t cols() const { return orig_cols; }
    void resize(size_t rows, size_t cols) {
        orig_rows = rows;
        orig_cols = cols;
        clear();
    }
    void dump(ostream &os) const {
        os <<
            "Оригинальная матрица содержит:\n"
            "    строк:               " << setw(4) << orig_rows << "\n"
            "    столбцов:            " << setw(4) << orig_cols << "\n"
            "    всего элементов:     " << setw(4) << orig_rows * orig_cols << "\n"
            "    ненулевых элементов: " << setw(4) << size() << "\n"
            "\n";
        os <<
            "+---------+---------+--------------+\n"
            "|  Строка | Столбец |     Значение |\n"
            "+---------+---------+--------------+\n";
        for (const auto &i : kvec)
            os << setw(10) << i.row << setw(10) << i.col << setw(14) << i.val << endl;
        os << endl;
    }
protected:
    size_t orig_rows, orig_cols;
    KVec kvec;
};
 
// ----------------------------------------------------------------------------
 
bool menuInput(KnuthMatrix<int> &km) {
    ifstream Matrix("RazMatr.txt");
    if (!Matrix.is_open())
        return false;
 
    size_t size;
    int number;
 
    Matrix >> size;
    km.resize(size, size);      // квадратная матрица
 
    for (size_t i = 0; i < size; i++)
        for (size_t j = 0; j < size; j++) {
            if ((Matrix >> number).bad()) {
                // ошибка чтения ((
                Matrix.close();
                km.resize(0, 0);
                return false;
            }
            km.set(i, j, number);
        }
    Matrix.close();
    return true;
}
 
void menuPrint(const KnuthMatrix<int> &km) {
    for (size_t i = 0; i < km.rows(); ++i) {
        for (size_t j = 0; j < km.cols(); ++j)
            cout << setw(4) << km.get(i, j);
        cout << endl;
    }
}
 
void menuElement(const KnuthMatrix<int> &km) {
    size_t i = 0, j = 0;
    bool illegal_input;
    cout << " Ввод данных:" << endl;
    do {
        illegal_input = false;
        cout << "  Введите номер строки: "; cin >> i;
        if (i >= km.rows()) {
            cout << "\n  Такой строки нет в массиве! Попробуйте ещё раз." << endl;
            illegal_input = true;
        }
    } while (illegal_input);
 
    do {
        illegal_input = false;
        cout << "  Введите номер столбца: "; cin >> j;
        if (j >= km.cols()) {
            cout << "\n  Такого столбца нет в массиве! Попробуйте ещё раз." << endl;
            illegal_input = true;
        }
    } while (illegal_input);
 
    cout << endl << " Значение элемента, хранящиегося по адресу [" << i << "][" << j << "]: " << km.get(i, j) << endl;
}
 
void menuMaxInColumn(const KnuthMatrix<int> &km) {
    size_t i = 0, j = 0;
    bool illegal_input;
    cout << " Ввод данных:" << endl;
    do {
        illegal_input = false;
        cout << "  Введите номер столбца: "; cin >> j;
        if (j >= km.cols()) {
            cout << "\n  Такого столбца нет в массиве! Попробуйте ещё раз." << endl;
            illegal_input = true;
        }
    } while (illegal_input);
 
 
    int max_value = km.get(0, j);
    for (size_t i = 1; i < km.rows(); ++i) {
        if (km.get(i, j) > max_value)
            max_value = km.get(i, j);
    }
    cout << " Максимальное значение в столбце: " << max_value << endl;
}
 
const char noKnuth[] = "\n Массив по схеме Кнута не создан!\n";
 
int main() {
    setlocale(LC_ALL, "rus");
 
    KnuthMatrix<int> km;
 
    short int change = 1;
    do {
        cout <<
            "\n--------------------------------------------------\n"
            " Меню:\n"
            "  1 - Ввод разреженного массива из файла;\n"
            "  2 - Вывод массива по схеме Кнута на экран;\n"
            "  3 - Вывод полной матрицы на экран;\n"
            "  4 - Получение значения элемента по номеру строки и номеру столбца;\n"
            "  5 - Определение максимального значения среди ненулевых элементов в указанном столбце;\n"
            "  0 - Выход из программы.\n"
            "--------------------------------------------------\n"
            " Ввод: ";
        cin >> change;
        cout << endl;
        switch (change) {
        case 1:                                                  //Ввод массива по схеме Кнута из файла
            if (menuInput(km)) {
                cout << 
                    "\n Ввод массива по схеме Кнута окончен успешно!\n"
                    " Размер массива по схеме Кнута: " << km.size() << " элементов" << endl;
            }
            else {
                change = 0;
                cout << " Не удалось ввести массив!" << endl;
            }
            break;
        case 2:                                                  //Вывод массива по схеме Кнута на экран
            if (km.isEmpty())
                cout << noKnuth << endl;
            else
                km.dump(cout);
            break;
        case 3:                                                  //Вывод полной матрицы на экран
            if (km.isEmpty())
                cout << noKnuth << endl;
            else
                menuPrint(km);
            break;
        case 4:                                                  //Получение значения элемента по номеру строки и номеру столбца
            if (km.isEmpty())
                cout << noKnuth << endl;
            else
                menuElement(km);
            break;
        case 5:                                                  //Определение максимального значения среди ненулевых элементов в указанном столбце
            if (km.isEmpty())
                cout << noKnuth << endl;
            else
                menuMaxInColumn(km);
            break;
        case 0:                                                  //Выход из программы
            break;
        default:
            cout << "\n Неверный выбор! Попробуйте ещё раз!";
            break;
        }
    } while (change != 0);
    cout << "\n Время работы программы = " << clock() / 1000.0 << " сек.\n";  //вывод времени работы программы
    system("pause");
    return 0;
}
Реализация разреженной матрицы по схеме Кнута не идеальная, но в учебных целях вполне потянет.
Шаблон сделан только с целью (потенциальной) использовать этот же код для других числовых типов.
И функцию main() я растащил на отдельные функции - мне так было проще ориентироваться в исходнике.
Если вы положете файл RazMatr.txt рядом с исходниками программы, то не придётся хардкодить такой длинный абсолютный путь к файлу данных.

Добавлено через 20 минут
PS. И слова "симестр" в русском языке нибывает ((
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2018, 00:35

Выдает ошибку C4703: используется потенциально неинициализированная локальная переменная-указатель "a"
Выдает ошибку C4703: используется потенциально неинициализированная локальная переменная-указатель...

Используется потенциально неинициализированная локальная переменная-указатель
// ex4.cpp: определяет точку входа для консольного приложения. // ...

Ошибка: Используется потенциально неинициализированная локальная переменная
Ошибка: Используется потенциально неинициализированная локальная переменная prev - 48 строчка,...

"Используется потенциально неинициализированная локальная переменная - указатель"
Доброго времени суток! Возникла проблема в программе, на 68 строке пишет, что &quot;используется...

Использована неинициализированная локальная переменная. Не пойму, как исправить
У меня есть структура typedef struct { char *processor, *plata; float chastota; int...

Неинициализированная локальная переменная - исправить ошибку
не могу устранить ошибку &quot;использована неинициализированная локальная переменная a&quot; #include...


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

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

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