Как работает цикл?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Кирилл1212
Сообщения: 6
Зарегистрирован: 11 ноя 2017, 02:15

23 дек 2017, 10:49

как работает цикл почему min начинается 999999?
for (i=0; i<m; i++)
{
min=999999;
max=0;
for (j=0; j<n; j++)
{
if (a[j]<min) {min=a[j]; l=j;}
if (a[j]>max) {max=a[j]; r=j;}
}
a[l] = max;
a[r] = min;
}



#include <stdlib.h>
#include <time.h>
#include <stdio.h>

void main()
{
const long m=3, n=3;
long a[m][n], i, j, min, max, x, l, r;
srand(time(0));
//формируем и выводим матрицу
for (i=0; i<m; i++)
{
printf("\n\n");
for (j=0; j<n; j++)
{
a[j]=25+rand()%56;
printf("%d\t",a[j]);
}
}
//ищем min и max, меняем местами
for (i = 0; i < n; i++)

min = 0;
max = 0;
for (i=0; i<m; i++)
{
min=999999;
max=0;
for (j=0; j<n; j++)
{
if (a[j]<min) {min=a[j]; l=j;}
if (a[i][j]>max) {max=a[i][j]; r=j;}
}
a[i][l] = max;
a[i][r] = min;
}
printf("\n\n");
//выводим то что получилось
for (i=0; i<m; i++)
{
printf("\n\n");
for (j=0; j<n; j++)
{
printf("%d\t",a[i][j]);
}
}
printf("\n\n");
}
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

24 дек 2017, 00:37

Потому, что написавший плохо разбирается в алгоритмах. Если все элементы будут больше 999999 (а теоретически это возможно), то алгоритм даст сбой.

На самом деле в качестве инициализирующего значения для min нужно выбрать максимально возможное положительное значение для типа long. Фактически, это число 0x7FFFFFFF, однако могут быть варианты в зависимости от разрядности компилятора. Для того, чтобы не задумываться о таких низких деталях реализации, правильным будет использовать хедер limits, который содержит великолепный темплейтный помощник numeric_limits. Например, самое большое число для long можно получить с помощью следующего выражения.

Код: Выделить всё

numeric_limits<long>::max
P.S. На практике не опускаются даже до этого хоть и правильного, но тем не менее несколько мудреного варианта. Наиболее простым выходом является присваивание и min и max первого элемента массива.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить