Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Программа на Паскале Free или Turbo. Циклы (http://www.tehnari.ru/f41/t61379/)

Léon 17.12.2011 16:08

Программа на Паскале Free или Turbo. Циклы
 
Пожалуйста помогите написать на Паскале (Free или Тurbo) программу, очень нужно. Сама уже две недели в выходные пробовала программу написать, но ничего не получается, а скоро сдавать нужно. Помогите, хотя бы Задание 1!
Задание 1 (программирование циклических алгоритмов):
Требуется осуществить перевод данного целого (дробного) числа: из троичной системы в десятичную. Чтобы программа работала как для дробного, так и для целого!
Задание 2 (программирование циклических алгоритмов
(с параметром)):
Требуется определить план выпуска продукции, обеспечивающий наибольшую суммарную прибыль:На предприятии организуется побочный цех для использования отходов производства. Цех может освоить выпуск продукции двух видов: столов и книжных шкафов. На производство одного стола и шкафа затрачивается соответственно рабочего времени – С1 человеко-часов и С2 человеко-часов, древесины – D1 м3 и D2 м3, а на производство одного шкафа, кроме того -2 м стекла. Ресурсы ос¬новных материалов в месяц составляют: С человеко-часов рабочего времени, V м3 древесины и S м2 стекла. Прибыль от реализации стола составляет P1 руб., шкафа – P2 руб.

Vladimir_S 17.12.2011 18:53

Цитата:

Сообщение от 11Angelav (Сообщение 636628)
Задание 2 (программирование циклических алгоритмов (с параметром)): Требуется определить план выпуска продукции, обеспечивающий наибольшую суммарную прибыль:На предприятии организуется побочный цех для использования отходов производства. Цех может освоить выпуск продукции двух видов: столов и книжных шкафов. На производство одного стола и шкафа затрачивается соответственно рабочего времени – С1 человеко-часов и С2 человеко-часов, древесины – D1 м3 и D2 м3, а на производство одного шкафа, кроме того -2 м стекла. Ресурсы ос¬новных материалов в месяц составляют: С человеко-часов рабочего времени, V м3 древесины и S м2 стекла. Прибыль от реализации стола составляет P1 руб., шкафа – P2 руб.

С Вашего разрешения, я лучше решу задачу 2. Алгоритм:
1. Вводятся исходные данные.
2. Определяется максимально возможное количество столов по человеко-часам и древесине, а также прибыль, если делать только столы.
3. В цикле уменьшаем количество столов на 1 за проход, из оставшихся ресурсов, если такое возможно, делаем шкафы, и каждый раз считаем суммарную прибыль. Сохраняем данные только если эта прибыль превзойдёт ту, что получена на предыдущем шаге.
Программа:
Код:

Const
 S2=2.0;
Var
 C1,C2,C,C_cur,D1,D2,D,D_cur,S:Real;
 Max_t,M1,M2,N_t,N_w,P1,P2,P_cur,P,i,j:LongInt;
BEGIN
 Write('Human resource for 1 table= ');
 Readln(C1);
 Write('Human resource for 1 wardrobe= ');
 Readln(C2);
 Write('Full amount of human resources= ');
 Readln(C);
 Write('Wood for 1 table= ');
 Readln(D1);
 Write('Wood for 1 wardrobe= ');
 Readln(D2);
 Write('Full amount of wood= ');
 Readln(D);
 Write('Full amount of glass= ');
 Readln(S);
 Write('Profit from 1 table (integer)= ');
 Readln(P1);
 Write('Profit from 1 wardrobe (integer)= ');
 Readln(P2);

 {Search of maximal amount of tables}
 M1:=Trunc(C/C1);
 M2:=Trunc(D/D1);
 If M1<M2 then Max_t:=M1 else Max_t:=M2;
 P:=Max_t*P1;
 N_t:=Max_t;
 N_w:=0;
 i:=N_t;
 Repeat
  Dec(i);
  C_cur:=C-C1*i;
  D_cur:=D-D1*i;
  M1:=Trunc(C_cur/C2);
  M2:=Trunc(D_cur/D2);
  If M1<M2 then j:=M1 else j:=M2;
  While S2*j>S do Dec(j);
  P_cur:=i*P1+j*P2;
  If P_cur>P then
  begin
    N_t:=i;
    N_w:=j;
    P:=P_cur;
  end;
 Until i=0;
 Writeln;
 Writeln('Maximal profit corresponds to ',N_t,' tables and ',N_w,' wardrobes');
 Readln
End.


Léon 17.12.2011 21:58

Vladimir_S, огромное спасибо! Но не могли бы Вы помочь с Заданием 1! Очень важно. Я первый раз вообще у кого-то прошу помощи на форумах. Просто не могу сделать, и прежде чем попросить много делала, решала. Но увы. Помогите пожалуйста с задачей 1.

Vladimir_S 17.12.2011 22:07

Цитата:

Сообщение от 11Angelav (Сообщение 636857)
Vladimir_S, огромное спасибо! Но не могли бы Вы помочь с Заданием 1! Очень важно. Я первый раз вообще у кого-то прошу помощи на форумах. Просто не могу сделать, и прежде чем попросить много делала, решала. Но увы. Помогите пожалуйста с задачей 1.

Ладно, попробую завтра. Просто будь там целые числа, то перевод из троичной в десятичную системы делается "на раз", а вот с дробными...

Léon 17.12.2011 22:16

Спасибо огромное! До завтра!

Vladimir_S 18.12.2011 10:18

Цитата:

Сообщение от 11Angelav (Сообщение 636869)
Спасибо огромное! До завтра!

Вот, сотворил нечто чудовищное. Но работает:
Код:

Const
 W=['3','4','5','6','7','8','9'];
VAR
 S:String;
 b:Boolean;
 N3,N10,N3_frc_re:Real;
 N3_int,N3_frc,N3_frc0,m,dd10,dd3:LongInt;
 Sign:ShortInt;
 i,N3f_int,N3f_frc,fig:Byte;


BEGIN
 Repeat
  b:=true;
  Write('Enter the number in 3-based system: ');
  Readln(N3);
  STR(N3:0:8,S);
  for i:=1 to length(S) do
  if S[i] in W then
    begin
    Writeln('Wrong input!');
    b:=false;
    end;
 Until b;
 If N3<0 then Sign:=-1 else Sign:=1;
 N3:=Abs(N3);
 N3_int:=Trunc(N3);
 N3_frc_re:=N3-1.0*N3_int;
 m:=1;
 Repeat
  m:=m*10;
  N3_frc:=Round(N3_frc_re*m);
 Until Round(1.0*N3_frc/m*100000000)=Round(N3_frc_re*100000000);
 N10:=0;
 N3_frc0:=N3_frc;
 If N3_int>0 then
  begin
  N3f_int:=Round(Ln(N3_int)/Ln(10)); {Number of figures in integer part
                                      of 3-based number -1}
  For m:=N3f_int downto 1 do
    begin
    dd10:=1;
    for i:=1 to m do dd10:=dd10*10;
    fig:=N3_int div dd10;
    dd3:=1;
    for i:=1 to m do dd3:=dd3*3;
    N10:=N10+fig*dd3;
    N3_int:=N3_int mod dd10;
    end;
  N10:=N10+N3_int;
  end;
 If N3_frc>0 then
  begin
  N3f_frc:=Round(Ln(N3_frc)/Ln(10)); {Number of figures in fractional part
                                      of 3-based number -1}
  For m:=N3f_frc downto 0 do
    begin
    dd10:=1;
    for i:=1 to m do dd10:=dd10*10;
    fig:=N3_frc div dd10;
    dd3:=1;
    for i:=1 to N3f_frc-m+1 do dd3:=dd3*3;
    N10:=N10+1.0*fig/dd3;
    N3_frc:=N3_frc mod dd10;
    end;
  end;
 N10:=N10*Sign;
 Write('N in decimal system is ');
 If N3_frc0=0 then
  Writeln(Round(N10))
 else
  Writeln(N10:0:8);
 Readln;
END.


Léon 18.12.2011 16:35

Действительно работает! В принцепе всё понятно, кроме
Until Round(1.0*N3_frc/m*100000000)=Round(N3_frc_re*100000000);
Поясните зачем Вы домножаете на " *100000000 "?

Vladimir_S 18.12.2011 17:21

Цитата:

Сообщение от 11Angelav (Сообщение 637211)
Действительно работает! В принцепе всё понятно, кроме
Until Round(1.0*N3_frc/m*100000000)=Round(N3_frc_re*100000000);
Поясните зачем Вы домножаете на " *100000000 "?

Из параноидальности. Видите ли, я интуитивно не очень доверяю проверке на равенство вещественных (real) чисел, хотя на большинстве реализаций Паскаля эта операция вроде бы работает корректно. Тем не менее, предпочитаю на равенство проверять целые числа - так оно спокойнее. А сто миллионов - чтобы захватить разумное количество десятичных разрядов.
Если не нравится, попробуйте так:
Until 1.0*N3_frc/m=N3_frc_re;

Léon 18.12.2011 17:28

Огромное спасибо Вам за помощь! Я и не думала, что мне кто поможет.
Сейчас пойду писать отчёты (блок-схемы, псевдокоды). Я очень благодарна!
P.s. У Вас неплохой сайт, останусь здесь. И буду пробовать помогать другим! Спасибо.

Vladimir_S 18.12.2011 17:34

Цитата:

Сообщение от 11Angelav (Сообщение 637230)
И буду пробовать помогать другим!

Ох, вот это бы здорово! А то я несколько зашиваюсь: у нашего дорогого студенческого юношества манера - сладко спать весь семестр, а за несколько (это еще в лучшем случае) дней до зачетной недели просыпаться и обнаруживать, что надо сдать лабораторки за полгода, а знаний не хватает даже на задачи типа c=a+b. :D


Часовой пояс GMT +4, время: 14:42.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.