Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 23.12.2010, 11:27   #1 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию Поправить прогу с графическим режимом

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

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

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
Хелен вне форума   Ответить с цитированием

Старый 23.12.2010, 11:27
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Скорее всего в схожих темах вы найдете много полезной информации

Проблема со спящим режимом
Помогите поправить код
Проблема со спящим режимом
Поправить программу. Иначе отчислят.
Проблемы со спящим режимом.

Старый 24.12.2010, 23:17   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Хелен, а как насчет того, чтобы сформулировать задачу, которую решает программа? Или полагаете, что нам ужас до чего интересно восстанавливать задание по листингу?
Vladimir_S вне форума   Ответить с цитированием
Старый 24.12.2010, 23:38   #3 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию

Извиняюсь.. как-то не подумала.


Написать задачу, которая выводит на экран трехмерную столбиковую диаграмму, представляющую максимальную и среднюю норму прибыли при реализации различных сортов шоколада. Исходные данные сформировать в текстовом файле самостоятельно.
Хелен вне форума   Ответить с цитированием
Старый 25.12.2010, 19:19   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Хелен Посмотреть сообщение
Программа правильная, но преподаватель не приняла, потому что она не универсальная. Изменяя количество строк в файле, нужно самостоятельно вносить изменения в код, а необходимо чтобы программа сама прогоняла файл и изменялась сама.
Хелен, Ваша преподавательница абсолютно права. Действительно, какой смысл вносить информацию в файл и её же жестко "забивать" в программу в виде констант? И дело не в процедурах, а в том, что вся информация должна быть ТОЛЬКО в файле, а дело программы - считывать и отрабатывать любые изменения данных, внесенных в файл.
В общем, отладил я Вашу программу. Теперь она может "переваривать" до 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
Попробуйте, не изменяя структуры файла, поварьировать число сортов и посмотрите, что будет.
Vladimir_S вне форума   Ответить с цитированием
Старый 25.12.2010, 22:53   #5 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию

Большое спасибо!! Буду учится на своих ошибках.
Хелен вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.