Бумер Опубликовано 28 марта, 2007 Жалоба Поделиться Опубликовано 28 марта, 2007 Не знаю в чем баг - по идее все должно быть отлично! #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 уже не учавствует в теле цикла! Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 9 апреля, 2007 Жалоба Поделиться Опубликовано 9 апреля, 2007 Бумер: Пробовал тип 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 после замены типа выводимой переменной заменить и там спецификацию вывода. Работа программы правильно на одном или нескольких примерах ничего не доказывает. Тринадцатый удар часов не просто лишний, он порождает сомнения в верности каждого из предыдущих двенадцати ударов . Много раз тестировал - все отлично и только в одном случае... А на самом деле все отлично обычно только в простейших случаях. Уже числа больше 4 вывели программу за предел допустимого. Ссылка на комментарий Поделиться на другие сайты Поделиться
Форматцевт Опубликовано 10 апреля, 2007 Жалоба Поделиться Опубликовано 10 апреля, 2007 Бумер: в дополнении поста Тролль скажу любая программа должна изначально проверятся на граничных условиях, а уж потом в серединных. В ГУ максимальное число ошибок, то for или if не так работают, конечно если ты хочешь получить устойчивый программный код. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 10 апреля, 2007 Жалоба Поделиться Опубликовано 10 апреля, 2007 (изменено) Бумер: Добавлю еще: Да и вообще инкремент же постфиксный, т.е. значение 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]; Изменено 11 апреля, 2007 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти