Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Работа с двумерными массивами


Рекомендуемые сообщения

Не знаю в чем баг - по идее все должно быть отлично!

#include <stdio.h>#define N 5void main(){long int matr[N][N]; int j=0,i=0;  FILE *f;printf("Vvedite matricu 5x5\n");for (i=0;i<N;i++) for (j=0;j<N;j++)  scanf("%d",&matr[i][j]);int proizv=1;for (i=0;i<N;i++) for (j=0;j<N;j++)  {if ((i+j)>4)//t.k. u elementow matr, raspoloshennih nize pobochn. diagonali bolshe 4 proizv=proizv*(matr[i][j]);  }f=fopen("C:/Output.txt","w");fprintf(f,"Ishodnaja matrica:");for (i=0;i<N;i++){ fprintf(f,"\n"); for (j=0;j<N;j++)  fprintf(f,"%5d",matr[i][j]);}fprintf(f,"\n");fprintf(f,"Proizvedenie treugolnoi matrici: %d",proizv);printf("Ishodnaja matrica:\n");for (i=0;i<N;i++){ printf("\n"); for (j=0;j<N;j++)  printf("%5d",matr[i][j]); }printf("\n");printf("%d\n",proizv);}

Много раз тестировал - все отлично и только в одном случае, при исходных данных:

1 2 3 4 1

5 2 6 5 1

5 2 5 1 5

6 5 4 5 2

5 4 5 2 5

программа выдает почемуто ОТРИЦАТЕЛЬНЫй результат, т.е. число с минусом! Пробовал тип int заменить на unsigned long int - думал мало диапазона, но не тут то было все осталось как есть. Крутил ручной прокруткой - не нашел баг. ПОлучается, что компилятор обращается к элементам [0][5], хотя по тексту (коду) должен только к [0][4] обращаться. Почему происходит выход за пределы массива? Почему тогда такой же выход не происходит при вводе и при выводе? Да и вообще инкремент же постфиксный, т.е. значение i=5 уже не учавствует в теле цикла!

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Бумер:

Пробовал тип int заменить на unsigned long int - думал мало диапазона, но не тут то было все осталось как есть.
А почему бы не прямо посчитать - мало диапазона или нет? Благо твой пример в уме считается: 5*2*2*5 * 5*5*4 *4*1*1 = 100 * 100 *4 = 40000

А теперь, какое максимальное целое число в Turbo C?

Вообще для представления произведения элементов матрицы при более-менее реальных величинах элементов нужны не целые числа, а хотя бы действительные. Но ладно, возьмем для простейших тестовых примеров long int. Тогда очень странно получается: элементы матрицы у тебя long int, а их произведение, которое их самих куда больше, должно влезть в тип int.

И заметь еще одну вещь: матрица у тебя типа long int, а вводишь и, особенно важно, выводишь ее элементы ты как имеющие тип int. То есть при вводе-выводе используется вообще половина записи числа. Еще везенье твоих тестов в том, что там отрицательных чисел не было, знаки как раз находятся в отбрасываемых частях чисел. А минус у тебя получался потому, что одна из цифр числа при переполнении разрядной сетки у тебя начинала играть роль знака числа.

Не забудь, кстати, при выводе произведения в printf после замены типа выводимой переменной заменить и там спецификацию вывода.

Работа программы правильно на одном или нескольких примерах ничего не доказывает. Тринадцатый удар часов не просто лишний, он порождает сомнения в верности каждого из предыдущих двенадцати ударов :blink: .

Много раз тестировал - все отлично и только в одном случае...
А на самом деле все отлично обычно только в простейших случаях. Уже числа больше 4 вывели программу за предел допустимого.
Ссылка на комментарий
Поделиться на другие сайты

Бумер: в дополнении поста Тролль скажу любая программа должна изначально проверятся на граничных условиях, а уж потом в серединных. В ГУ максимальное число ошибок, то for или if не так работают, конечно если ты хочешь получить устойчивый программный код.

Ссылка на комментарий
Поделиться на другие сайты

Бумер:

Добавлю еще:

Да и вообще инкремент же постфиксный, т.е. значение i=5 уже не учавствует в теле цикла!
В цикле по правилам его выполнения абсолютно неважно, постфиксный или префиксный. Можешь заменить i++ на ++i, ничего не изменится.

int j=0,i=0;

И зачем при объявлении переменных циклов в начале программы присваивать им начальные значения?

И если уж используешь для порядка матрицы константу N=5, так и используй ее в тексте всей программы, а не переходи временами на задание конкретных чисел, у тебя в переборе используется число 4, а фактически это должно быть N-1

Да и перебор несколько странный: зачем перебирать всю матрицу и отбирать из нее элементы в правой ее части, если можно прямо перебрать только нужные элементы?

То есть вместо

for (i=0;i<N;i++)

for (j=0;j<N;j++)

{

if ((i+j)>4)//t.k. u elementow matr, raspoloshennih nize pobochn. diagonali bolshe 4

proizv=proizv*(matr[j]);

}

лучше было бы сделать так

for (i=0;i<N;i++) for (j=N-i;j<N;j++) proizv*=matr[j];

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...