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

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

Тетрадь 14.02.2014 14:59

Задача на массив
 
Завод выпускает 20 наименований продукции. Про каждый вид продукции известно: сколько единиц этой продукции выпускает завод, себестоимость и отпускная цена единицы продукции, сколько человек занято на выпуске этой продукции. От каких видов продукции завод должен отказаться, чтобы общая производительность труда повысилась вдвое? ({производительность труда} = {доход от продажи продукции} / {количество человек, принимающих участие в ее производстве}).

Тема двумерных массивы. Нужно написать эту программу с подпрограммами.
Помогите в написании данной программы. Сам не справлюсь

Тетрадь 16.02.2014 09:52

Можете пожалуйста объяснить спаму задачу, последовательность действий, что сначала нужно найти, а что потом?

Debianer 16.02.2014 10:25

Отпускная цена минут себестоимость. Результат умножить на кол-во единиц.
Далее, вычисляем производительность для каждого наименования: Делим получившееся выше на кол-во человек. И создаем массив: наименование и производительность.
Затем высчитываем общую производительность - суммируем производительность всех наименований и делим на 20.
Ну а дальше, думаю, уже понятно :)

Vladimir_S 16.02.2014 10:45

Цитата:

Сообщение от Тетрадь (Сообщение 1004251)
Нужно написать эту программу

Абсолютно невозможно! Наши штатные телепаты в отпуске, а без них определить язык программирования, тайну которого Вы, очевидно, поклялись не выдавать даже под пыткой, мы не можем.
Цитата:

Сообщение от Debianer (Сообщение 1005009)
Отпускная цена минут себестоимость. Результат умножить на кол-во единиц. Далее, вычисляем производительность для каждого наименования: Делим получившееся выше на кол-во человек. И создаем массив: наименование и производительность. Затем высчитываем общую производительность - суммируем производительность всех наименований и делим на 20. Ну а дальше, думаю, уже понятно

Да, в свете вышесказанного - это максимум того, чем мы можем помочь.

Тетрадь 16.02.2014 12:46

Извините:tehnari_ru_942: Pascal abc

Vladimir_S 16.02.2014 16:46

Могу поковыряться, но при условии, что Вы придумаете все входные данные (наименования, себестоимости и т.д.) и выложите в любом виде.

Тетрадь 17.02.2014 19:10

Задачу можно в в виде записей делать. Наименование не нужно, просто 20 деталей, себестоимость и т.д можно взять любые числа.

Vladimir_S 17.02.2014 19:22

Цитата:

Сообщение от Тетрадь (Сообщение 1005658)
Задачу можно в в виде записей делать. Наименование не нужно, просто 20 деталей, себестоимость и т.д можно взять любые числа.

Вообще-то с подобными задачами я посылаю... сюда. Но в Вашей меня заинтересовал алгоритм удвоения суммарной производительности. Ладно, займусь.

Vladimir_S 17.02.2014 21:02

Вложений: 1
Ну вот, получИте:
Код:

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;
 f:Text;
 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:=[];
 Assign(f,'D:\Data.txt');
 Reset(f);
 For i:=1 to 20 do
  with Prd[i] do
  begin
    Readln(f, N,Num,Prime,Price,Work);
    Productivity_Local:=(Price-Prime)*Num/Work;
  end;
 Close(f);
 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.

Несколько пояснений:
1. Исходные данные помещены в файл по имени Data.txt (прилагается). У меня он расположен на диске D, так что поправьте путь в программе, если надо. Колонки: порядковый номер, количество изделий (напр. в год), себестоимость, цена, количество рабочих.
2. Программа писалась и отлаживалась в НОРМАЛЬНОМ Паскале (Free). За глюки этого богомерзкого АВС не отвечаю!
3. Вкратце - алгоритм. В каждой записи вычисляется "локальная" производительность, как доход/кол-во рабочих. При каждом прохождении цикла отсева находится номер записи с минимальным значением "локальной" производительности, этот номер вносится в "черный список" и из нового расчета общей производительности исключается.

Тетрадь 19.02.2014 09:50

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

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, время: 09:18.

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