• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Поправить прогу с графическим режимом

Хелен

Sparkling
Регистрация
28 Сен 2010
Сообщения
98
Реакции
2
Баллы
0
Поправить прогу с графическим режимом

Написала программу выводящую трёхмерную диаграмму, данные считываются из файла, созданного мной. Программа правильная, но преподаватель не приняла, потому что она не универсальная. Изменяя количество строк в файле, нужно самостоятельно вносить изменения в код, а необходимо чтобы программа сама прогоняла файл и изменялась сама.
Я думаю, Программу нужно оформить в виде процедуры, но не знаю как точно. помогите пожалуйста.

Код:
Текст программы.

program treug;
 uses Graph,crt;
const god:array[1..6] of string=('Milk(max)','Milr(cred)','white(max)','white(cred)','black(max)',
                                 'black(cred)');
      cen:array[1..6] of real=(200,180,200,100,200,50);
var 
GrDrv:integer;        {Графический драйвер}
GrMode:integer;     {Графический режим}
GrErr:integer;          {Графическая ошибка}
    f:text;
    s:string;
    i,j,gd,gm,x0,y0,w:integer;
    mx,h:real;
    k:char;
    begin
      gd:=0;
      w:=25;               {ширина столбцов}
      x0:=50;              {левый край диагоаммы}
      y0:=420;            {нижний край}
      mx:=cen[1];
      clrscr;
      assign(f,'G:\tabl2.txt');
      reset(f);
      writeln('             TABLICA  SHOKOLADA');
      writeln;
      while not eof(f) do
      begin
      readln(f,s);
      writeln(s);
      end;
      close(f);
      writeln;
      writeln('please double press ENTER to continue...');
      K:=readkey;
      if(readkey=#13)
      then
      begin
      initgraph(gd,gm,'');
      for i:=1 to 6 do
    if cen[i]>mx then mx:=cen[i];           {находим максимум}
     h:=(y0-40)/mx;                                 {масштаб по вертикали}
     for i:=1 to 6 do
begin
  setcolor(i+1);{цвет}
  Setfillstyle(i+1,i+1);                           {стиль заполнения}

  {рисуем параллелепипеды с заданной шириной, шагом 
    и высотой соответственно значению цен} 

  Bar3d(x0+4*w*(i-1),y0-round(cen[i]*h),x0+w*(4*i-2),y0,15,topon);
  outtextXY(x0+4*w*(i-1),y0+20,god[i]);           {выводим по низу наименования}
  str(cen[i]:5:2,s);{преобразуем цены в строку}
  outtextXY(x0+4*w*(i-1)+w,y0-round(cen[i]*h)-20,s);    {выводим цену выше столбика}
 end;
 readln
end
else
writeln('error, restart application.');
end.

Текст файла.

200 180 milk
200 100 white
200 50 black
 
Хелен, а как насчет того, чтобы сформулировать задачу, которую решает программа? Или полагаете, что нам ужас до чего интересно восстанавливать задание по листингу?
 
Извиняюсь.. как-то не подумала.


Написать задачу, которая выводит на экран трехмерную столбиковую диаграмму, представляющую максимальную и среднюю норму прибыли при реализации различных сортов шоколада. Исходные данные сформировать в текстовом файле самостоятельно.
 
Программа правильная, но преподаватель не приняла, потому что она не универсальная. Изменяя количество строк в файле, нужно самостоятельно вносить изменения в код, а необходимо чтобы программа сама прогоняла файл и изменялась сама.
Хелен, Ваша преподавательница абсолютно права. Действительно, какой смысл вносить информацию в файл и её же жестко "забивать" в программу в виде констант? И дело не в процедурах, а в том, что вся информация должна быть ТОЛЬКО в файле, а дело программы - считывать и отрабатывать любые изменения данных, внесенных в файл.
В общем, отладил я Вашу программу. Теперь она может "переваривать" до 6 сортов шоколада. Изменен вывод текстовой информации - он сделан вертикальным, иначе легенды столбиков начнут при увеличении количества сортов налезать друг на друга. Вот:
Код:
program treug;
uses Graph,crt;
Const
 N_sorts_max=6;
var
 GrDrv:integer;        {Графический драйвер}
 GrMode:integer;     {Графический режим}
 GrErr:integer;          {Графическая ошибка}
 f:text;
 N_sorts:Byte;
 name:array[1..N_sorts_max] of string;
 cen_max,cen_cred:array[1..N_sorts_max] of Word;
 s:string;
 i,j,gd,gm,x0,y0,w:integer;
 mx,h:real;
 k:char;
begin
 gd:=0;
 clrscr;
 assign(f,'G:\tabl2.txt');
 reset(f);
 writeln('             TABLICA  SHOKOLADA');
 writeln;
 N_sorts:=0;
 while not eof(f) do
  begin
   Inc(N_sorts);
   readln(f,name[N_sorts]);
   writeln(name[N_sorts]);
   readln(f,cen_max[N_sorts]);
   readln(f,cen_cred[N_sorts]);
  end;
 close(f);
 w:=75 div N_sorts;               {ширина столбцов}
 x0:=50;              {левый край диаграммы}
 y0:=420;            {нижний край}
 mx:=cen_max[1];
 writeln;
 writeln('please double press ENTER to continue...');
 K:=readkey;
 if(readkey=#13) then
  begin
   initgraph(gd,gm,'');
   for i:=1 to N_sorts do
    if cen_max[i]>mx then mx:=cen_max[i];           {находим максимум}
   h:=(y0-40)/mx;                                    {масштаб по вертикали}
   SetTextStyle(DefaultFont,VertDir,1);
   SetTextJustify(RightText,BottomText);
   for i:=1 to N_sorts do
    begin
     setcolor(i+1);{цвет}
     Setfillstyle(i+1,i+1);                           {стиль заполнения}

  {рисуем параллелепипеды с заданной шириной, шагом
    и высотой соответственно значению цен}

     Bar3d(x0+8*w*(i-1),y0-round(cen_max[i]*h),x0+w*(8*i-6),y0,15,topon);
     str(cen_max[i],s);{преобразуем цены в строку}
     outtextXY(x0+8*w*(i-1)-2,y0,name[i]+'_max '+s);    {выводим}
     Bar3d(x0+4*w*(2*i-1),y0-round(cen_cred[i]*h),x0+w*(8*i-2),y0,15,topon);
     str(cen_cred[i],s);{преобразуем цены в строку}
     outtextXY(x0+4*w*(2*i-1)-2,y0,name[i]+'_cred '+s);    {выводим }
    end;
   readln;
  end
 else
  writeln('error, restart application.');
end.
Структура файла данных:
Код:
Milk
200
180
White
200
100
Black
200
50 
Rose
180
70
Blue
220
100
Попробуйте, не изменяя структуры файла, поварьировать число сортов и посмотрите, что будет.
 
Большое спасибо!! Буду учится на своих ошибках.
 
Назад
Сверху