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

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

помогите накодить штуку( [D7]


Страницы:   1 2 3

Григорий ©   (2011-06-01 21:36:00) 

Составить программную реализацию следующей игры: вдоль доски расположены лунки и в каждой .лунке лежит шар черного или белого цвета. Одним ходом разрешается менять местами два любых шара. Добиться того, чтобы сначала шли белые шары, а за ними - черные. Количество лунок вводится с клавиатуры, расположение шаров задается с помощью датчика случайных чисел.


Юрий Зотов   (2011-06-02 13:35:00) [21]

> Очень злой   (02.06.11 13:15) [23]

Ваш алгоритм был понятен, разъяснения лишние. Но есть ключевые слова: "и идем дальше пока не встретимся".

Это и есть тот самый repeat, который уже был разобран в [17]. Как ни крути - все равно цикл в цикле получается. Плюс потери на накладные расходы в двух внутренних циклах вместо одного.


Очень злой   (2011-06-02 13:15:00) [22]


> Юрий Зотов ©   (02.06.11 12:50) [21]
>
> > одной итерации достаточно
>
> В принципе, да. Алгоритм простой - идем по циклу и, если
> встретили белый шар, то делаем ему remove и insert в начало
> массива, а если черный - то remove и insert в конец. Но:
>
>
> 1. Эти remove и insert, возможно, тоже потребуют циклов
> для переупорядочивания шаров.
>
> 2. В условии сказано, что шары можно менять местами, но
> не сказано, что их можно перемещать.


Хм...
Первый идет от начала пока не встретит черный шар
Второй идет от конца пока не встретит белый шар
Если первый еще не встретился со вторым то меняем эти 2 шара местами и идем дальше пока не встретимся.
ничего не перемещается. просто меняются местами...

Пример:
123456789
000110110

Первый идет от 1 до 4. (ибо на 4- черный шар)
второй от 9 до 9, т.е. стоит (на  9 белый шар.)
меняем местами 4 и 9

123456789
000010111

Далее первый идет  с 4 до 5 (на 5 черный шар)
Второй идет от 9 до 6 (на 6 белый шар)
Меняем местами 5 и 6

123456789
000001111

Первый идет дальше и второй тоже... Встретились друг с другом - конец...


Anatoly Podgoretsky   (2011-06-02 12:52:00) [23]

> oldman  (02.06.2011 12:08:16)  [16]

Вот вообще без проходов

procedure I;
  for i=1 to 10 do ... ;
  for i=28 to 44 do ... ;
  for i=1 to 76 do ... ;
  for i=5 to 17 do ... ;
end;


I;


Юрий Зотов   (2011-06-02 12:50:00) [24]

> одной итерации достаточно

В принципе, да. Алгоритм простой - идем по циклу и, если встретили белый шар, то делаем ему remove и insert в начало массива, а если черный - то remove и insert в конец. Но:

1. Эти remove и insert, возможно, тоже потребуют циклов для переупорядочивания шаров.

2. В условии сказано, что шары можно менять местами, но не сказано, что их можно перемещать.


Anatoly Podgoretsky   (2011-06-02 12:48:00) [25]

> Юрий Зотов  (02.06.2011 11:44:13)  [13]

Если поделить на три, то один


Anatoly Podgoretsky   (2011-06-02 12:47:00) [26]

> TUser  (02.06.2011 11:31:10)  [10]

Если накодит штуку баксов, то хватит любому предподавателю.


Очень злой   (2011-06-02 12:20:00) [27]


> oldman ©   (02.06.11 12:08) [16]


Хорошо, цикл while A[Lo] do Inc(Lo);

меняем на

if A[Lo] then
   begin
       inc(Lo);
       continue;
   end;


аналогично поступаем и со вторым циклом. и получаем единственный цикл...
Но не думаю что это рационально...

А вообще это одна итерация из алгоритма быстрой сортировки... ибо так как шары только белые и черные, следовательно одной итерации достаточно...


Юрий Зотов   (2011-06-02 12:16:00) [28]


> Очень злой   (02.06.11 11:52) [15]
> в принципе-то проход можно сказать один...

Так можно было бы сказать, если бы не было repeat. А поскольку repeat все же есть, то этот один проход повторяется - поэтому все равно получаем вложенный цикл. Причем, поскольку этот вложенный цикл реализован не одним, а двумя while, то теряем на лишних накладных расходах.

Хотя и мой код тоже не оптимален, с этим согласен. Смутно помню, что в нормальной реализации пузырька внутренний цикл делается неполным - но написал так, как проще. Поскольку и писалось все это "на скорую руку", и вспоминать правильную реализацию было просто лень.


oldman   (2011-06-02 12:08:00) [29]


> Очень злой   (02.06.11 11:52) [15]
> > Цикл repeat, внутри которого 2 цикла while - это один
> проход?
> Ну переменная - то одна...


for i=1 to 10 do ... ;
for i=28 to 44 do ... ;
for i=1 to 76 do ... ;
for i=5 to 17 do ... ;

но переменная-то одна...


Очень злой   (2011-06-02 11:52:00) [30]


> Цикл repeat, внутри которого 2 цикла while - это один проход?


Ну переменная - то одна... Вернее две, одна от начала, другая с конца пока не встретятся.. так что в принциппе-то проход можно сказать один...


Юрий Зотов   (2011-06-02 11:51:00) [31]


> Ega23 ©   (02.06.11 11:41) [12]

У нас было хуже. Персоналок тогда еще не было, а больших машин на всех студентов не напасешься - поэтому зачетные программы писались на бумаге, которую препод и проверял. Фишка в том, что нет ни компилятора, ни дебаггера, поэтому влепить ошибку очень легко, а препод ее заметит практически наверняка.


Юрий Зотов   (2011-06-02 11:44:00) [32]


> Очень злой   (02.06.11 11:36) [11]
> Зачем? Можно же одним проходом...

Цикл repeat, внутри которого 2 цикла while - это один проход?


Ega23   (2011-06-02 11:41:00) [33]


> зависит от препода, увы


Ну во времена мое учёбы такое фиг бы прокатило. Сдача программы происходила следующим образом:
1. Принёс исходник.
2. Скомпилил на месте.
3. Преподаватель потыркался в плане дураказащиты (если написано: "Введите целое число", то вводилась абракадабра).
4. Преподаватель проверил работоспособность программы.
5. Преподаватель смотрел код.
6. Если возникали какие-то вопросы или подозрения - просил код объяснить.

Иногда, для работ посложнее (курсовых, например) допускалось принести ноутбук и на нём продемонстрировать. Но это касалось уже всяких дополнительных примочек, например СУЬЛ используется какая-нибудь, которой в комп.классе тупо нет, или у меня на D5 всё написано, а в классе D4 стоит.


Очень злой   (2011-06-02 11:36:00) [34]


> Пузырьковая сортировка?


Зачем? Можно же одним проходом...

A: array of boolean;
// белые = true, черные = false;
...
   Lo := Low(A);
   Hi := High(A);
   repeat
     while A[Lo] do Inc(Lo);
     while not A[Hi] do Dec(Hi);
     if Lo <= Hi then
     begin
       Меняем местами A[Lo] и A[Hi];
       Inc(Lo);
       Dec(Hi);
     end;
   until Lo > Hi;
...


TUser   (2011-06-02 11:31:00) [35]


> Ega23 ©   (02.06.11 08:23) [8]

зависит от препода, увы


Григорий   (2011-06-02 09:18:00) [36]

спасибо :)


Ega23   (2011-06-02 08:23:00) [37]


> Чет, Юрч, быстро ты сдался :)


Да не сдался он, эту работу не примут, если ТС код объяснить не сможет. А он не сможет, если не сядет и не разберётся досконально.


Anatoly Podgoretsky   (2011-06-02 07:27:00) [38]

> Rouse_  (02.06.2011 00:06:04)  [4]

Да, стараются все поделить.


Германн   (2011-06-02 01:13:00) [39]


> Rouse_ ©   (02.06.11 00:06) [4]
>
> ЗЫ: ох чую ща самая она - пора вопросов, подошла со стороны
> студентов :)

Она самая.
Зато дочка уже принесла домой пять или шесть "конфетных вознаграждений" за сделанные ею курсовые по информатике, поскольку VBA приемлемо освоила она одна из всей группы. Похоже теперь уже мне придется к ней обращаться за помощью, если что. :)


Юрий Зотов   (2011-06-02 00:14:00) [40]

> Rouse_ ©   (02.06.11 00:06) [4]
Готовая была. Пусть разбирается.


Страницы:   1 2 3

Наверх

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