Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 381

/ вопрос решён /

Здравствуйте!
Помогите разобораться с программой, написал, а препад сказла что не правильно считает. и в ответ должен выводиться не один результат а за каждые 3 часа, т.е размножить получается надо.
вот задание:
Одноклеточная амёба каждые 3 часа делится на 2 клетки. Определить, сколько амёб будет через 3, 6, 9, 12, …, 24 часа.

Приложение:
  1. unit U_F_1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, ExtCtrls;
  8.  
  9. type
  10. TF_1 = class(TForm)
  11. Panel: TPanel;
  12. E_vvod_vr: TEdit;
  13. L_com: TLabel;
  14. L_vivod: TLabel;
  15. B_rez: TButton;
  16. B_clear: TButton;
  17. B_clear_2: TButton;
  18. procedure B_rezClick(Sender: TObject);
  19. procedure B_clearClick(Sender: TObject);
  20. procedure B_clear_2Click(Sender: TObject);
  21. private
  22. { Private declarations }
  23. public
  24. { Public declarations }
  25. end;
  26.  
  27. var
  28. F_1: TF_1;
  29.  
  30. implementation
  31.  
  32. {$R *.dfm}
  33.  
  34. procedure TF_1.B_clearClick(Sender: TObject);
  35. begin
  36. E_vvod_vr.Clear;
  37. end;
  38.  
  39. procedure TF_1.B_clear_2Click(Sender: TObject);
  40. begin
  41. L_vivod.Caption:='';
  42. end;
  43.  
  44. procedure TF_1.B_rezClick(Sender: TObject);
  45. var
  46. vr,a, n:integer;
  47. begin
  48. vr:=StrToInt(E_vvod_vr.Text);
  49. a:=0;
  50. n:=1;
  51. while a<vr do
  52. begin
  53. n:=n*2;
  54. a:=a+3;
  55. end;
  56.  
  57. end;
  58.  
  59. end.
  60.  


Силиванов Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Силиванов (статус: Посетитель)
Вопрос отправлен: 6 июня 2011, 22:24
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Мережников Андрей

Здравствуйте, Силиванов!
отсчет времени надо начинать не с 0 (a:=0), а с 3 (a:=3). Для вывода можно использовать Memo и вывод осуществлять в цикле.
Как это примерно выглядит смотрите в приложении.

Приложение:
  1. <code>
  2. memo1.clear;
  3. a:=3;
  4. n:=1;
  5.  
  6. while a<=vr
  7. do begin
  8. n:=n*2;
  9.  
  10. inc(a,3);
  11. end;
  12. </code>


Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 7 июня 2011, 05:46
Оценка за ответ: 5

Комментарий к оценке: спасибо, всё помогло

Ответ #2. Отвечает эксперт: ierihon1

Здравствуйте, Силиванов!
Ошибки то на самом деле нет, просто переменная числа амёб была объявлена изначально как Integer а преобразуется в строку как вещественное число. А у вещественных чисел есть такая неприятная особенность если число большое они его преобразают к стандатрному виду числа то есть число 16777216 будет выглядеть вот так - 1,67772e7. Ну а раз твоему преподу это не нравится то перепиши строку:

 
label1.Caption:='Количество амёб '+#13+FloatToStrF(n,fffixed,6,0);
вот так:
label1.Caption:=label1.Caption + 'Количество амёб '+#13+IntToStr(n)+#13;
ну и чтобы выводились все результаты нужно жту строку включить в цикл и тогда вся процедура будет выглядеть вот так:
procedure TF_1.B_rezClick(Sender: TObject);
var
vr,a, n:integer;
begin
vr:=StrToInt(E_vvod_vr.Text);
a:=0;
n:=1;
while a<vr do
begin
n:=n*2;
a:=a+3;
L_vivod.Caption:=L_vivod.Caption + 'Количество амёб '+#13+IntToStr(n)+#13;
end;
//label1.Caption:='Количество амёб '+#13+FloatToStrF(n,fffixed,6,0);
end;

Ответ отправил: ierihon1 (статус: 1-ый класс)
Время отправки: 7 июня 2011, 09:52


Мини-форум вопроса

Всего сообщений: 16; последнее сообщение — 8 июня 2011, 17:29; участников в обсуждении: 5.
ierihon1

ierihon1 (статус: 1-ый класс), 6 июня 2011, 22:38 [#1]:

по оформлению есть какие нибудь определённые требования?
Силиванов

Силиванов (статус: Посетитель), 6 июня 2011, 22:39 [#2]:

нет
ierihon1

ierihon1 (статус: 1-ый класс), 6 июня 2011, 22:40 [#3]:

а время вводится конечное через эдит?
Силиванов

Силиванов (статус: Посетитель), 6 июня 2011, 22:41 [#4]:

нет, Lable
ierihon1

ierihon1 (статус: 1-ый класс), 6 июня 2011, 22:46 [#5]:

ну ладно фиг с ним с этим оформлением, у меня весь код в одной процедуре вышел, если будут вопросы как это переоформить говори сразу:
procedure TForm2.Button1Click(Sender: TObject);
var i:integer;
    Ameba:integer;
begin
listbox1.Clear;
ameba:=1;
for i := 1 to StrToInt(Edit1.Text) do
begin
  if i mod 3 = 0 then
  begin
    Ameba:=Ameba*2;
    case IntToStr(ameba)[Length(IntToStr(ameba))] of
    '1'     :listbox1.Items.Add('Через '+IntToStr(i)+ ' ч. будет '+IntToStr(Ameba)+' амёба');
    '2'..'4':listbox1.Items.Add('Через '+IntToStr(i)+ ' ч. будет '+IntToStr(Ameba)+' амёбы');
    else     listbox1.Items.Add('Через '+IntToStr(i)+ ' ч. будет '+IntToStr(Ameba)+' амёб');
    end;
  end;
end;
end;
в едит вводишь количесвто часов у меня стояло по умолчанию 24 часа на листбоксе отображается каждые три часа жизни амёбы на новой строчке.
bugmenot

bugmenot (статус: 3-ий класс), 6 июня 2011, 23:11 [#6]:

это ж геометрическая прогрессия, не?
виконання програми розпочинається з того самого мiсця, де призупинилося.

ierihon1

ierihon1 (статус: 1-ый класс), 6 июня 2011, 23:18 [#7]:

Ну вообще то да..)
bugmenot

bugmenot (статус: 3-ий класс), 7 июня 2011, 01:39 [#8]:

Цитата (ierihon1):

Ну вообще то да..)

то был риторический вопрос, с намёком
виконання програми розпочинається з того самого мiсця, де призупинилося.

Силиванов

Силиванов (статус: Посетитель), 7 июня 2011, 09:00 [#9]:

дак у меня то где ошибка? и как исправить?
ierihon1

ierihon1 (статус: 1-ый класс), 7 июня 2011, 09:18 [#10]:

Ну ша посмотрим
min@y™

min@y™ (статус: Доктор наук), 7 июня 2011, 10:06 [#11]:

У меня вот так получилось:
var
  Count: Cardinal;
  Hours: Byte;
 
begin
  Count:= 1;
  Hours:= 0;
 
  repeat
    Count:= Count shl 1;
    Inc(Hours, 3);
    WriteLn(' Hours: ', Hours: 3, ', Count: ', Count: 9);
  until Hours >= 24;
 
  ReadLn;
end.
Консоль:
 Hours:   3, Count:         2
 Hours:   6, Count:         4
 Hours:   9, Count:         8
 Hours:  12, Count:        16
 Hours:  15, Count:        32
 Hours:  18, Count:        64
 Hours:  21, Count:       128
 Hours:  24, Count:       256
Отсюда формула вычисления количества несчастных одноклеточных: X = 2T div 3, где T - время в часах.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 7 июня 2011, 10:11 [#12]:

именно эту формулу я использовал в своей первой процедуре) только с VCL)
min@y™

min@y™ (статус: Доктор наук), 7 июня 2011, 10:11 [#13]:

А через неделю они вылезут из чашки Петри и сожрут продукты в холодильнике. :)
 Hours:   3, Count:                 2
 Hours:   6, Count:                 4
 Hours:   9, Count:                 8
 Hours:  12, Count:                16
 Hours:  15, Count:                32
 Hours:  18, Count:                64
 Hours:  21, Count:               128
 Hours:  24, Count:               256
 Hours:  27, Count:               512
 Hours:  30, Count:              1024
 Hours:  33, Count:              2048
 Hours:  36, Count:              4096
 Hours:  39, Count:              8192
 Hours:  42, Count:             16384
 Hours:  45, Count:             32768
 Hours:  48, Count:             65536
 Hours:  51, Count:            131072
 Hours:  54, Count:            262144
 Hours:  57, Count:            524288
 Hours:  60, Count:           1048576
 Hours:  63, Count:           2097152
 Hours:  66, Count:           4194304
 Hours:  69, Count:           8388608
 Hours:  72, Count:          16777216
 Hours:  75, Count:          33554432
 Hours:  78, Count:          67108864
 Hours:  81, Count:         134217728
 Hours:  84, Count:         268435456
 Hours:  87, Count:         536870912
 Hours:  90, Count:        1073741824
 Hours:  93, Count:        2147483648
 Hours:  96, Count:        4294967296
 Hours:  99, Count:        8589934592
 Hours: 102, Count:       17179869184
 Hours: 105, Count:       34359738368
 Hours: 108, Count:       68719476736
 Hours: 111, Count:      137438953472
 Hours: 114, Count:      274877906944
 Hours: 117, Count:      549755813888
 Hours: 120, Count:     1099511627776
 Hours: 123, Count:     2199023255552
 Hours: 126, Count:     4398046511104
 Hours: 129, Count:     8796093022208
 Hours: 132, Count:    17592186044416
 Hours: 135, Count:    35184372088832
 Hours: 138, Count:    70368744177664
 Hours: 141, Count:   140737488355328
 Hours: 144, Count:   281474976710656
 Hours: 147, Count:   562949953421312
 Hours: 150, Count:  1125899906842624
 Hours: 153, Count:  2251799813685248
 Hours: 156, Count:  4503599627370496
 Hours: 159, Count:  9007199254740992
 Hours: 162, Count: 18014398509481984
 Hours: 165, Count: 36028797018963968
 Hours: 168, Count: 72057594037927936
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 7 июня 2011, 17:11 [#14]:

Цитата (ierihon1):

Ошибки то на самом деле нет

Ошибка-то на самом деле была и она указана в моем ответе - начинать деление следует не с 0, а с 3 часов. Поскольку первое деление происходит через три часа.
ierihon1

ierihon1 (статус: 1-ый класс), 8 июня 2011, 10:00 [#15]:

Мережников Андрей: да я это чуть позже заметил приношу свои извинения)

8 июня 2011, 16:38: Статус вопроса изменён на решённый (изменил автор вопроса — Силиванов)

Мережников Андрей

Мережников Андрей (статус: Абитуриент), 8 июня 2011, 17:29 [#16]:

to ierihon1 - я никого ни в чем не обвинял - к чему извинения? :-)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:29
Выполнено за 0.05 сек.