| 
| 
 | Вопрос # 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. И если раскидать часы по семестрам не получается выдавалось бы сообщение????
 Приложение:Переключить в обычный режим  procedure TForm1.Button1Click(Sender: TObject);  var    a,b,c,x:integer;    chas, nedel1,nedel2,nedel3:integer;begin  a:=0;  b:=0;  c:=0;  repeat    chas:= strtoint (edit1.text);    nedel1:= strtoint (edit2.text);    nedel2:= strtoint (edit3.text);    nedel3:= strtoint (edit4.text);    x:=((nedel1*a)+(nedel2*b)+(nedel3*c));    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;  until chas=x;  label1.Caption:=inttostr (a);  label2.Caption:=inttostr (b);  label3.Caption:=inttostr (c);end;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; |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |