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

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Задача на массив (http://www.tehnari.ru/f41/t94582/)

Vladimir_S 19.02.2014 10:19

Цитата:

Сообщение от Тетрадь (Сообщение 1006318)
Спасибо, вы использовали процедуру файл? просто мы еще не изучили, и такую задачу не примут

Сочувствую. Ну так распишите присвоение значений полей записей с консоли либо в явном виде. А лучше скажите преподавателю, что самостоятельно освоили файловые операции. И освойте.
Впрочем, подозреваю, что препод Вам всё равно не поверит, а потому - вот вариант (редкостно тупой) без файла:
Код:

Type
 Prod=Record
      N:Byte;
      Num,Prime,Price,Work:Integer;
      Productivity_Local:Real;
      End;

Var
 Prd:Array[1..20] of Prod;
 Bad:Set of Byte;
 Productivity_Initial,Min,Max,Productivity_Current:Real;
 i,Im,k:Integer;

Function Productivity:Real;
var
 j:Integer;
 Sum,Sum_Work:Real;
begin
 Sum:=0;
 Sum_Work:=0;
 for j:=1 to 20 do
  with Prd[j] do
  If Not(N in Bad) then
    begin
    Sum:=Sum+(Price-Prime)*Num;
    Sum_Work:=Sum_Work+Work;
    end;
 Productivity:=Sum/Sum_Work;
end;

Begin
 Bad:=[];
 Prd[ 1].N:= 1; Prd[ 1].Num:=  30; Prd[ 1].Prime:= 120; Prd[ 1].Price:=190; Prd[ 1].Work:=  5;
 Prd[ 2].N:= 2; Prd[ 2].Num:= 110; Prd[ 2].Prime:= 333; Prd[ 2].Price:=578; Prd[ 2].Work:= 25;
 Prd[ 3].N:= 3; Prd[ 3].Num:=  65; Prd[ 3].Prime:=  99; Prd[ 3].Price:=181; Prd[ 3].Work:= 12;
 Prd[ 4].N:= 4; Prd[ 4].Num:= 770; Prd[ 4].Prime:=  6; Prd[ 4].Price:= 14; Prd[ 4].Work:= 10;
 Prd[ 5].N:= 5; Prd[ 5].Num:= 490; Prd[ 5].Prime:= 146; Prd[ 5].Price:=239; Prd[ 5].Work:= 58;
 Prd[ 6].N:= 6; Prd[ 6].Num:= 200; Prd[ 6].Prime:=  33; Prd[ 6].Price:= 57; Prd[ 6].Work:= 37;
 Prd[ 7].N:= 7; Prd[ 7].Num:=  44; Prd[ 7].Prime:=  56; Prd[ 7].Price:= 79; Prd[ 7].Work:= 95;
 Prd[ 8].N:= 8; Prd[ 8].Num:= 410; Prd[ 8].Prime:=  11; Prd[ 8].Price:= 17; Prd[ 8].Work:= 28;
 Prd[ 9].N:= 9; Prd[ 9].Num:= 690; Prd[ 9].Prime:=  7; Prd[ 9].Price:= 12; Prd[ 9].Work:= 55;
 Prd[10].N:=10; Prd[10].Num:= 990; Prd[10].Prime:= 281; Prd[10].Price:=346; Prd[10].Work:= 48;
 Prd[11].N:=11; Prd[11].Num:=  3; Prd[11].Prime:=  4; Prd[11].Price:=  7; Prd[11].Work:= 98;
 Prd[12].N:=12; Prd[12].Num:=  77; Prd[12].Prime:=  19; Prd[12].Price:= 25; Prd[12].Work:= 45;
 Prd[13].N:=13; Prd[13].Num:=  50; Prd[13].Prime:= 267; Prd[13].Price:=321; Prd[13].Work:= 62;
 Prd[14].N:=14; Prd[14].Num:= 550; Prd[14].Prime:=  17; Prd[14].Price:= 29; Prd[14].Work:= 22;
 Prd[15].N:=15; Prd[15].Num:=  8; Prd[15].Prime:= 270; Prd[15].Price:=320; Prd[15].Work:= 45;
 Prd[16].N:=16; Prd[16].Num:=  14; Prd[16].Prime:=  68; Prd[16].Price:= 93; Prd[16].Work:= 72;
 Prd[17].N:=17; Prd[17].Num:= 340; Prd[17].Prime:=  10; Prd[17].Price:= 28; Prd[17].Work:=  5;
 Prd[18].N:=18; Prd[18].Num:= 870; Prd[18].Prime:=  2; Prd[18].Price:=  4; Prd[18].Work:= 11;
 Prd[19].N:=19; Prd[19].Num:=  20; Prd[19].Prime:=  65; Prd[19].Price:= 83; Prd[19].Work:= 17;
 Prd[20].N:=20; Prd[20].Num:= 390; Prd[20].Prime:=  7; Prd[20].Price:= 10; Prd[20].Work:= 50;
 For i:=1 to 20 do
  with Prd[i] do
  Productivity_Local:=(Price-Prime)*Num/Work;
 Productivity_Initial:=Productivity;
 Max:=Prd[1].Productivity_Local;
 For i:=2 to 20 do
  If Prd[i].Productivity_Local>Max then Max:=Prd[i].Productivity_Local;
 k:=0;
 Repeat
  Inc(k);
  Min:=Max;
  For i:=1 to 20 do
  If Not(i in Bad) and (Prd[i].Productivity_Local<Min) then
    begin
    Min:=Prd[i].Productivity_Local;
    Im:=i;
    end;
  Bad:=Bad+[Im];
  Productivity_Current:=Productivity;
 Until (Productivity_Current>=Productivity_Initial*2) or (k=20);
 Write('The plant must refuse from the positions:');
 For i:=1 to 20 do
  if i in Bad then Write(i:3);
 Writeln;
 Writeln('Inial productivity: ',Productivity_Initial:0:3);
 Writeln('Final productivity: ',Productivity_Current:0:3);
 Readln;
End.

Интересно, что будет следующим номером программы? "Мы множества не проходили!"?

Тетрадь 19.02.2014 16:41

:tehnari_ru_942:, только записи или массив

Vladimir_S 19.02.2014 16:50

Цитата:

Сообщение от Тетрадь (Сообщение 1006429)
:tehnari_ru_942:, только записи или массив

То есть я правильно угадал - множества тоже низззззззззя? А тип boolean можно?

Тетрадь 19.02.2014 17:02

можно boolean

Vladimir_S 19.02.2014 17:26

Цитата:

Сообщение от Тетрадь (Сообщение 1006437)
можно boolean

И на том спасибо. В общем, была программка компактная и прозрачная, стала разлапистая, тупая и непонятная. Но работает. Сами захотели.
Код:

Type
 Prod=Record
      N:Byte;
      Num,Prime,Price,Work:Integer;
      Productivity_Local:Real;
      End;

Var
 Prd:Array[1..20] of Prod;
 Bad:Array[1..20] of Byte;
 Productivity_Initial,Min,Max,Productivity_Current:Real;
 i,m,Im,k:Integer;
 b:boolean;

Function Productivity:Real;
var
 j,p:Integer;
 Sum,Sum_Work:Real;
 b1:boolean;
begin
 Sum:=0;
 Sum_Work:=0;
 for j:=1 to 20 do
  begin
  b1:=true;
  for p:=1 to 20 do
    if j=Bad[p] then b1:=false;
  If b1 then
    with Prd[j] do
    begin
      Sum:=Sum+(Price-Prime)*Num;
      Sum_Work:=Sum_Work+Work;
    end;
  end;
 Productivity:=Sum/Sum_Work;
end;

Begin
 for m:=1 to 20 do Bad[m]:=0;
 Prd[ 1].N:= 1; Prd[ 1].Num:=  30; Prd[ 1].Prime:= 120; Prd[ 1].Price:=190; Prd[ 1].Work:=  5;
 Prd[ 2].N:= 2; Prd[ 2].Num:= 110; Prd[ 2].Prime:= 333; Prd[ 2].Price:=578; Prd[ 2].Work:= 25;
 Prd[ 3].N:= 3; Prd[ 3].Num:=  65; Prd[ 3].Prime:=  99; Prd[ 3].Price:=181; Prd[ 3].Work:= 12;
 Prd[ 4].N:= 4; Prd[ 4].Num:= 770; Prd[ 4].Prime:=  6; Prd[ 4].Price:= 14; Prd[ 4].Work:= 10;
 Prd[ 5].N:= 5; Prd[ 5].Num:= 490; Prd[ 5].Prime:= 146; Prd[ 5].Price:=239; Prd[ 5].Work:= 58;
 Prd[ 6].N:= 6; Prd[ 6].Num:= 200; Prd[ 6].Prime:=  33; Prd[ 6].Price:= 57; Prd[ 6].Work:= 37;
 Prd[ 7].N:= 7; Prd[ 7].Num:=  44; Prd[ 7].Prime:=  56; Prd[ 7].Price:= 79; Prd[ 7].Work:= 95;
 Prd[ 8].N:= 8; Prd[ 8].Num:= 410; Prd[ 8].Prime:=  11; Prd[ 8].Price:= 17; Prd[ 8].Work:= 28;
 Prd[ 9].N:= 9; Prd[ 9].Num:= 690; Prd[ 9].Prime:=  7; Prd[ 9].Price:= 12; Prd[ 9].Work:= 55;
 Prd[10].N:=10; Prd[10].Num:= 990; Prd[10].Prime:= 281; Prd[10].Price:=346; Prd[10].Work:= 48;
 Prd[11].N:=11; Prd[11].Num:=  3; Prd[11].Prime:=  4; Prd[11].Price:=  7; Prd[11].Work:= 98;
 Prd[12].N:=12; Prd[12].Num:=  77; Prd[12].Prime:=  19; Prd[12].Price:= 25; Prd[12].Work:= 45;
 Prd[13].N:=13; Prd[13].Num:=  50; Prd[13].Prime:= 267; Prd[13].Price:=321; Prd[13].Work:= 62;
 Prd[14].N:=14; Prd[14].Num:= 550; Prd[14].Prime:=  17; Prd[14].Price:= 29; Prd[14].Work:= 22;
 Prd[15].N:=15; Prd[15].Num:=  8; Prd[15].Prime:= 270; Prd[15].Price:=320; Prd[15].Work:= 45;
 Prd[16].N:=16; Prd[16].Num:=  14; Prd[16].Prime:=  68; Prd[16].Price:= 93; Prd[16].Work:= 72;
 Prd[17].N:=17; Prd[17].Num:= 340; Prd[17].Prime:=  10; Prd[17].Price:= 28; Prd[17].Work:=  5;
 Prd[18].N:=18; Prd[18].Num:= 870; Prd[18].Prime:=  2; Prd[18].Price:=  4; Prd[18].Work:= 11;
 Prd[19].N:=19; Prd[19].Num:=  20; Prd[19].Prime:=  65; Prd[19].Price:= 83; Prd[19].Work:= 17;
 Prd[20].N:=20; Prd[20].Num:= 390; Prd[20].Prime:=  7; Prd[20].Price:= 10; Prd[20].Work:= 50;
 For i:=1 to 20 do
  with Prd[i] do
  Productivity_Local:=(Price-Prime)*Num/Work;
 Productivity_Initial:=Productivity;
 Max:=Prd[1].Productivity_Local;
 For i:=2 to 20 do
  If Prd[i].Productivity_Local>Max then Max:=Prd[i].Productivity_Local;
 k:=0;
 Repeat
  Inc(k);
  Min:=Max;
  For i:=1 to 20 do
  begin
    b:=true;
    for m:=1 to 20 do
    if i=Bad[m] then b:=false;
    If b and (Prd[i].Productivity_Local<Min) then
    begin
    Min:=Prd[i].Productivity_Local;
    Im:=i;
    end;
  end;
  m:=0;
  Repeat Inc(m) Until (Bad[m]=0) or (m=20);
  If Bad[m]=0 then Bad[m]:=Im;
  Productivity_Current:=Productivity;
 Until (Productivity_Current>=Productivity_Initial*2) or (k=20);
 Write('The plant must refuse from the positions:');
 For i:=1 to k do Write(Bad[i]:3);
 Writeln;
 Writeln('Inial productivity: ',Productivity_Initial:0:3);
 Writeln('Final productivity: ',Productivity_Current:0:3);
 Readln;
End.


Тетрадь 19.02.2014 18:12

tehno006Спасибо


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

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