Uses Graph,Crt;
Const
 Path = '';
 Xpol = 25;
 YPol = 25;
 PieX = 200;
 PieY = 200;
 Radius = 100;
Type TypeVal = record
  num : Integer;
  per : Real;
end;
Var
  num_of_elem,type_of_diag : byte;
  values : array [1..15] of TypeVal;
  Summa : Integer;
{---------=====================================---------------}
Procedure GetValues;
var
 i:Byte;
begin
  ClrScr;
  Summa := 0;
  Num_of_elem := 0;
  for i := 1 to 15 do values[i].num := 0;
  WriteLn('Вводите элементы (не более 15), конец ввода - 0');
  i := 0;
  repeat
    inc(i);
    ReadLn(values[i].num);
  until (i > 14) or (values[i].num = 0);
  WriteLn('Введите тип диаграмы(1-один график, 0-много графиков)');
  ReadLn(type_of_diag);
  for i := 1 to 15 do if values[i].num <> 0 then inc(num_of_elem);
  if type_of_diag = 1 then
    For i := 1 to num_of_elem do Summa := Summa + values[i].num
  else
   for i := 1 to num_of_elem do
     if values[i].num > summa then summa := values[i].num;
  For i := 1 to num_of_elem do values[i].per := values[i].num / Summa;

end;{GetValues}
{-----------------------------------------}
Procedure InitT;
var
  Gd, Gm: Integer;
  i : byte;
begin
  Gd := Detect;
  InitGraph(Gd, Gm,Path);
  if GraphResult <> grOk then
    WriteLn(GraphErrorMsg(GraphResult))
  else
   begin
    Rectangle(GetMaxX div 10,GetMaxY div 10,9*(GetMaxX div 10),9*(GetMaxY div 10));
    SetViewPort(GetMaxX div 10+1,GetMaxY div 10+1,9*(GetMaxX div 10)-1,9*(GetMaxY div 10)-1,ClipOn);
    SetWriteMode(XorPut);
   end;
end;{InitT}
{---------------------------------------}
Procedure Chart2;
var
 num : string;
 i : byte;
begin
 for i := 1 to num_of_elem do
  begin
   SetFillStyle(solidfill,i);
   Bar3D(i*30,350,i*30+20,350 - round(330*values[i].per),5,true);
   Str(values[i].num,num);
   SetTextJustify(CenterText,TopText);
   OutTextXY(i*30+10,360,num)
  end;
 SetTextJustify(LeftText,TopText);
end{chart2};
{---------------------------------------}
Procedure Chart;
var
 String1,s2 : string;
 i : byte;
 LastVal,LastArc : Integer;
begin
  for i := 1 to num_of_elem do
    begin
      Str(values[i].num,string1);
      str(round(values[i].per*100),s2);
      string1 := concat('Число ',string1,'(',s2,'%)');
      SetFillStyle(SolidFill,i);
      Bar(330,((387 div 2) - (Num_of_elem * 10)-20)+i*20,380,((387 div 2) - (Num_of_elem * 10)-20)+i*20+15);
      OutTextXY(390,((380 div 2) - (Num_of_elem * 10)-15)+i*20,string1);
     end;
  LastVal := Ypol;
  LastArc := 0;
  for i := 1 to num_of_elem do
   begin
    SetFillStyle(SolidFill,i);
    if i = 1 then
     begin
      Bar3d(Xpol,LastVal,Xpol+40,round(LastVal+Values[i].per*330),10,true);
      PieSlice(PieX,PieY,LastArc,round(Lastarc+Values[i].per*360),Radius);
     end
    else if i = num_of_elem then
     begin
      Bar3d(Xpol,LastVal,Xpol+40,round(LastVal+Values[i].per*330),10,false);
      PieSlice(PieX,PieY,LastArc,360,Radius);
     end
    else
     begin
      Bar3d(Xpol,LastVal,Xpol+40,round(LastVal+Values[i].per*330),10,false);
      PieSlice(PieX,PieY,Lastarc,round(Lastarc+Values[i].per*360),Radius);
     end;
   LastVal := round(LastVal+Values[i].per*330);
   LastArc := round(LastArc+Values[i].per*360);
   end;
   Circle(PieX,PieY,Radius);
end; {Chart}
{-=====================================-}
Begin
  GetValues;
  InitT;
  if type_of_diag = 1 then Chart else chart2;
  Readln;
  CloseGraph;
End.