|
Вопрос # 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;
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|