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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 5 329

/ вопрос открыт /

Здравствуйте!Подскажите как реализовать вот такую штуку:
я расчитываю кол-во часов, которое нужно провести в семестрах, по предметам.у меня на фотрме есть 4 эдита и 1 кнопка. в эдит1 вводится какое- то общее кол-во часов ( например 150), в эдиты 2,3,4 вводятся кол-во недель, которое есть в семестрах ( к примеру 1сем-19 нед, 2сем-19 нед, 3сем-18 нед). в каждый семестр я должен ввести количество часов кратное кол-ву недель, то есть все сводится к вот такому виду: 150= 19*a+19*b+18*c. программа должна выдать результаты а=3,b=3,c=2.вот такой код у меня получился.

Но есть проблема в том что если вводятся числа больше 150 ( напр 169), то программа вешается и зависает. так вот можно ли как то это исправить и добавить сюда массив, от 1 до 7(больше не надо), откуда программа брала бы переменные a,b,c. И если раскидать часы по семестрам не получается выдавалось бы сообщение????

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. a,b,c,x:integer;
  4. chas, nedel1,nedel2,nedel3:integer;
  5. begin
  6. a:=0;
  7. b:=0;
  8. c:=0;
  9. repeat
  10. chas:= strtoint (edit1.text);
  11. nedel1:= strtoint (edit2.text);
  12. nedel2:= strtoint (edit3.text);
  13. nedel3:= strtoint (edit4.text);
  14. x:=((nedel1*a)+(nedel2*b)+(nedel3*c));
  15. if chas<>((nedel1*a)+(nedel2*b)+(nedel3*c)) then
  16. a:=a+1;
  17. if chas<>((nedel1*a)+(nedel2*b)+(nedel3*c)) then
  18. b:=b+1;
  19. if chas<>((nedel1*a)+(nedel2*b)+(nedel3*c)) then
  20. c:=c+1;
  21. until chas=x;
  22. label1.Caption:=inttostr (a);
  23. label2.Caption:=inttostr (b);
  24. label3.Caption:=inttostr (c);
  25. end;
  26. end.


Анучин Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Анучин (статус: Посетитель)
Вопрос отправлен: 27 мая 2011, 16:59
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 6; последнее сообщение — 29 мая 2011, 18:47; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 27 мая 2011, 17:08 [#1]:

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

Анучин (статус: Посетитель), 27 мая 2011, 17:13 [#2]:

Вадим К: ну вот по этому я и хочу что бы, числа брались только из массива, как только перебор достиг 7, значит осуществить растановку часов невозможно
Кириченко Сергей

Кириченко Сергей (статус: 1-ый класс), 28 мая 2011, 12:43 [#3]:

Анучин:
Вот так должно работать (написал в браузере могут быть ошибки)

 procedure TForm1.Button1Click(Sender: TObject);
  var
    a,b,c,x,i:integer;
    chas, nedel1,nedel2,nedel3:integer;
    isGood: boolean;
begin  
  a:=0;
  b:=0;
  c:=0;
   chas:= strtoint (edit1.text);
    nedel1:= strtoint (edit2.text);
    nedel2:= strtoint (edit3.text);
    nedel3:= strtoint (edit4.text);
   isGood:=false;
// for i:=0 to chas по любому завершится 
 for i:=0 to chas do
  begin
    x:=((nedel1*a)+(nedel2*b)+(nedel3*c));  
// Если chas =0 уравнение справедливо
    if x = chas then 
       begin
         isGood = true;
         break;
       end;
    if chas<>((nedel1*a)+(nedel2*b)+(nedel3*c)) then
      a:=a+1;
    if chas<>((nedel1*a)+(nedel2*b)+(nedel3*c)) then
      b:=b+1;
    if chas<>((nedel1*a)+(nedel2*b)+(nedel3*c)) then
      c:=c+1;
  end;
 if isGood then
  begin
    label1.Caption:=inttostr (a);
    label2.Caption:=inttostr (b);
    label3.Caption:=inttostr (c);
  end
 else 
  // Здесь вывод сообщения о том что осуществить растановку часов невозможно
end;
end.
Анучин

Анучин (статус: Посетитель), 28 мая 2011, 13:14 [#4]:

Кириченко Сергей: да код работает, запускается, но все равно не расчитывает значения больше 150. к примеру ввожу 207, тогда получается 207=19*a+19*b+18*c, программа должна выдать 4,5,2 , а выводится сообщение что расстановка не возможна:(
Анучин

Анучин (статус: Посетитель), 28 мая 2011, 16:08 [#5]:

может еще что нибудь подскажите??????
Анучин

Анучин (статус: Посетитель), 29 мая 2011, 18:47 [#6]:

и вот еще какая проблема, дело в том что разбивкадолжна быть примерно одинаковой, то есть программа не должна забрасывать максимально большое кол-во часов в 1 семест и остатки в остальные. пробовал делать вот так,только то же не выходит:

procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c,x:integer;
chas, nedel1,nedel2,nedel3:integer;
begin
chas:= strtoint (edit1.text);
nedel1:= strtoint (edit2.text);
nedel2:= strtoint (edit3.text);
nedel3:= strtoint (edit4.text);
for a:=0 to chas div nedel1 do
    for b:=0 to (chas -a* nedel1) div nedel2 do
        for c:=0 to (chas -a* nedel1-b* nedel2) div nedel3 do
begin
x:= (a*nedel1)+(b* nedel2)+(c*nedel3);
if x=chas then
 begin
  label1.Caption:=inttostr (a);
  label2.Caption:=inttostr (b);
  label3.Caption:=inttostr (c);
 
end;
end;
 
end;

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

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