Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Задача на сортировку.


Pascal96 ©   (2009-11-17 18:06:00) 

Это опять я.

Вроде бы всё правильно по уму, а результат не верный.


Задание:

Имеется рост Отца и 3-х его сыновей.
Нужно найти "номер" сына, который МИНИМАЛЬНО выше отца.



Var
 i: byte;
 N: array [0..3] of byte;
begin
 Writeln('Рост отца      >: '); Readln(N[0]);
 Writeln('Рост 1-го сына >: '); Readln(N[1]);
 Writeln('Рост 2-го сына >: '); Readln(N[2]);
 Writeln('Рост 3-го сына >: '); Readln(N[3]);

 For i:= 1 to 3 do
   If (N[i] - N[0] > 0) then Break;

 Writeln('Ответ: ', i,'-й сын.');
 Readln;
End.


@!!ex   (2009-11-18 12:21:00) [1]

по спецификации значение итератора после выхода из цикла for неопределенно. Это значит, что его использовать НЕЛЬЗЯ.


GOD   (2009-11-18 12:17:00) [2]

а вот так еще лучше

procedure TForm2.Button1Click(Sender: TObject);
const
 arr_height: array [0..3] of Integer = (30, 10, 30, 40);
var
 I: Integer;
 P: TPoint;
begin
 P := Point(0, MaxInt);
 for I := 1 to High(arr_height) do
   if ((arr_height[I] - arr_height[0]) > 0) and (P.Y > arr_height[I]) then
     P := Point(I, arr_height[I]);
 if P.X <> 0 then
   ShowMessageFmt('Сын %d минимально выше отца', [P.X]);
end;


Pascal96   (2009-11-18 12:14:00) [3]

О спасибо.
Я был на верном пути.
Мне не в лом учиться!!!

P.S. GOD вот ты точно мосК. )))))))))))))))


GOD   (2009-11-18 11:59:00) [4]

Лови:


procedure TForm2.Button1Click(Sender: TObject);
const
 arr_height: array [0..3] of Integer = (176, 153, 188, 194);
var
 I, Old: Integer;
 P: TPoint;
begin
 P := Point(0, MaxInt);
 for I := 1 to High(arr_height) do
   if (arr_height[I] - arr_height[0]) > 0 then begin
     Old := P.Y;
     P.Y := Min(P.Y, arr_height[I]);
     if P.Y <> Old then P.X := I;
   end;
 if P.X <> 0 then
   ShowMessageFmt('Сын %d минимально выше отца', [P.X]);
end;


clickmaker   (2009-11-18 11:04:00) [5]

> Он по-ходу хочет готовый код :-)

Writeln('Pascal96 хочет готовый код, а никто не дает. Поэтому вводите рост сыновей строго по возрастанию, иначе мега-алгоритм выдаст неверный результат.');
Writeln('Рост отца      >: '); Readln(N[0]);
...


Pascal96   (2009-11-18 03:44:00) [6]

Удалено модератором
Примечание: Offtopic


Juice   (2009-11-18 00:24:00) [7]

Он по-ходу хочет готовый код :-)


Омлет   (2009-11-17 21:33:00) [8]

> P.S. Задача лёгкая, а чО-то не могу не как сообразить, её
> правильного и ПРОСТОГО решения.

Нужно найти минимальную положительную разницу в росте сыновей и отца. Че тут трудного?


Омлет   (2009-11-17 21:31:00) [9]

Я фигею, как можно заблудиться в четырех числах? Какая сортировка, нафик она нужна?
Детский сад.


oldman   (2009-11-17 20:54:00) [10]


> Задача на сортировку.


Ну так и сортируй. Рост сыновей. Любым способом.
А вот потом просто.

А в коде [0] сортировкой не пахнет. И в [8] тоже.
Не сдашь ты зачет\лабу\курсовик\иличетамутебя


oldman   (2009-11-17 20:46:00) [11]

Блин 2.
Забыл, что ты про рост.
В первых вариантах было про возраст.

Действительно - МосК.


Pascal96   (2009-11-17 20:43:00) [12]


> :))))))))))))))))))))))))))
> <Цитата>


МосК. )))))))


oldman   (2009-11-17 20:35:00) [13]

Блин.
а - возраст отца
b[c] - массив возрастов сыновей в любом порядке

i:=b[1]-a
for j=2 to c do  
 if i=<0 then i:=b[j]-a
 else (if (b[j]-a)<i) and ((b[j]-a)>0) then i=j;

В i будет результат.

Если i<0 then ОтецМладшеВсехСыновей
:))))))))))))))))))))))))))


Pascal96   (2009-11-17 20:21:00) [14]

Алгоритм у меня не правильный:
Если будет так:

Отец     - 30,
1-й сын - 60,     1 - элемент массива.
2-й сын - 50,     2 - элемент массива.
3-й сын - 40.     3 - элемент массива.

То выйдет, что подходит 1-й сын. (А правильно 3-й).

P.S. Задача лёгкая, а чО-то не могу не как сообразить, её правильного и ПРОСТОГО решения.


oldman   (2009-11-17 19:40:00) [15]


> Возраст 2-го сына МИНУС возраст отца, получается положительное
> число
> - выходим из цикл.
>
> В переменной i должно быть значение - 2 (Т.к. Второй сын)
>
> А в программе почему-то выдаёт 3-го сына!!!


Видимо, при выходе из цикла счетчик таки увеличивается.
Попробуй Writeln('Ответ: ', i,'-й сын.'); вставить внутрь цикла перед Break
:)


Pascal96   (2009-11-17 18:19:00) [16]

2)
Отец     - 30,
1-й сын - 10,     1 - элемент массива.
2-й сын - 30,     2 - элемент массива.
3-й сын - 40.     3 - элемент массива.

Начитается цикл.
Возраст 1-го сына МИНУС возраст отца, получается отрицательное число
- запускаем след. иттерацию.
Возраст 2-го сына МИНУС возраст отца, получается положительное число
- выходим из цикл.

В переменной i должно быть значение - 2 (Т.к. Второй сын)

А в программе почему-то выдаёт 3-го сына!!!


Pascal96   (2009-11-17 18:18:00) [17]


> для того, чтобы условие в [0] работало, нужно сначала отсортировать
> сыновей по росту


Давай-те разберём по подробнее след. примеры.
(Для простоты взята семью лилипутов ))
1)
Отец     - 10,
1-й сын - 20,     1 - элемент массива.
2-й сын - 30,     2 - элемент массива.
3-й сын - 40.     3 - элемент массива.

Начитается цикл.
Возраст 1-го сына МИНУС возраст отца, получается положительное
число. Выходим из цикла.
В переменной i должно быть значение - 1 (Т.к. первый сын)

А в программе почему-то выдаёт 2-го сына!!!


clickmaker   (2009-11-17 18:13:00) [18]

> [2] Pascal96   (17.11.09 18:11)

для того, чтобы условие в [0] работало, нужно сначала отсортировать сыновей по росту


Pascal96   (2009-11-17 18:11:00) [19]

Например:
Рост отца - 180.
1-го сына - 100.
2-го сына - 200.
3-го сына - 210.

Ответ: 2. (2-й сын выше Отца на чуть-чуть)


clickmaker   (2009-11-17 18:08:00) [20]

> Вроде бы всё правильно по уму

не-а
условие не то


Наверх

Титульная страница Поиск, карта сайта Написать письмо