Не читается первая строка массива и выдает ошибку 139
При вводе массива 2x2 цикл проверяет только нижнюю строку.
Пример ввода:
Input n, m:
2 2
Input a[2][2]:
1 2
3 4
Choose a number:
1
There is no such element
А при вводе массива 3x3 программа заканчивается досрочно с ошибкой code 139.
Input n, m:
3 3
Input a[3][3]:
1 2 3
4 5 6
7 8 9
Вот программа:
#include <iostream>
#include <conio.h>
using namespace std;
int main() {
int n, m, i, j, b, k;
float a[n][m];
cout << "Input n, m:\n";
cin >> n >> m;
cout << "Input a[" << n << "][" << m << "]:\n";
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
cin >> a[i][j];
}
}
cout << "Choose a number:\n";
cin >> b;
k = -1;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (a[i][j] == b) {
k = j;
break;
}
}
}
if (k >= 0)
cout << "Number of a column with a number: " << j << "\n";
else
cout << "There is no such element" << endl;
getch();
}
Ответы (1 шт):
У вас явное непомнимание как работает программа.
int n, m, i, j, b, k;
float a[n][m];
В этом блоке объявляются переменные. Но при этом они не иницализируются. Т.е. в переменных n и m может быть любой мусор. Т.е. по сути может быть 0, а может и любое другое число.
А дальше вы на основании этих переменных определяете массив. Который так же может быть любого размера.
Когда дальше пользователь вводит значение переменных n и m то это не значит, что массив a становится именно такого размера. Для него в данном случае ничего не меняется.
А дальше вы пишите, по сути, непонятно куда. И непонятно откуда читаете данные. В общем-то очень странно, что у вас программа не падает еще на уровне записи значений в массив.
Что можно сделать, и как исправить программу:
Путь правильный, но возможно будет не очень простой для начинащего. Не объявлять массив в начале программы, а объявить указатель. И потом после ввода значений n и m выделять нужное количество памяти и работать с массивов по указателю. После завершения работы не забыть очистить память.
Путь не очень правильный, но простой. Изначально объявить массив какого-то фиксированного размера. Например 10 на 10.
float a[10][10];
Ограничить ввод значений n и m этой верхней границей. Т.е. меньше 10. Таким образом вы будете использовать выделенную память. Хоть и ее фрагмент.
И еще. В циклах у вас в обоих случаях указанно, что цикл до n
Хотя видимо имелось в виду, что должно быть
for (i=0; i<n; i++){
for (j=0; j<m; j++){