На экране нарисовать несколько произвольных закрашенных фигур - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Добрый вечер! Возникла пара вопросов при работе с нетипизированными файлами в Turbo Pascal 7.0 (а также и в 7.1). На всякий случай опишу условие задачи: на экране нужно нарисовать несколько произвольных закрашенных фигур; информацию (коордианаты, цвет, количество вершин и пр.) о данных фигурах записать в нетипизированный файл. Каждая запись файла имеет фиксированный размер. Сохранить файл на диске. Восстановить содержимое экрана из файла.

Код программы:

Листинг программы
  1. program lab11;
  2. uses
  3. graph, crt;
  4. const
  5. w=10;
  6. q=30;
  7. d=7;
  8. fn = 'd:\progra~1\tp7\bin\lab11';
  9. type
  10. ind = 1..w;
  11. var
  12. m, n, c, z, s, x, y, x1, y1: integer; {dlya poligonov}
  13. i, j, k: integer; {schetchiki}
  14. gd, gm: integer; {ustanovka ekrana}
  15. f: file;
  16. buf: array[ind] of integer;
  17. procedure puttobuf(var a: integer); {pomeshenie v bufer}
  18. begin
  19. if k < w then
  20. buf[k] := a
  21. else
  22. begin
  23. blockwrite(f, buf, 1);
  24. k:=1;
  25. buf[k] := a;
  26. inc(k);
  27. end;
  28. end;
  29. procedure getfrombuf;
  30. begin
  31. blockread(f, buf, 1);
  32. k := 1;
  33. end;
  34. begin
  35. gd := detect;
  36. initgraph(gd, gm, '');
  37. assign(f, fn);
  38. reset(f, q);
  39. randomize;
  40. setbkcolor(15); {cvet fona belij}
  41. k := 1;
  42. m := random(w)+1; {opredelyaem kol-vo poligonov}
  43. {cycle drawing of polygons}
  44. for i := 1 to m do
  45. begin
  46. n := random(d)+3; puttobuf(n); {kol-vo vershin}
  47. c := random(15); puttobuf(c); {cvet pera}
  48. z := random(15); puttobuf(z); {cvet zalivki}
  49. s := random(13); puttobuf(s); {stil' zalivki}
  50. {nizhe opredelyaem vershiny}
  51. {i risuem polygon}
  52. setcolor(c);
  53. x1 := random (456)+5; puttobuf(x1);
  54. y1 := random (456)+5; puttobuf(y1);
  55. moveto(x1,y1);
  56. for j := 1 to n do
  57. begin
  58. x := random (456)+5; puttobuf(x);
  59. y := random (456)+5; puttobuf(y);
  60. lineto(x,y);
  61. end;
  62. lineto(x1,y1);
  63. end;
  64. {sbros hvosta, ochistka, etc}
  65. blockwrite(f, buf, 1);
  66. close(f);
  67. delay(2500);
  68. cleardevice;
  69. reset(f, q);
  70. k := 1;
  71. {vosstanaflivaem iz faila}
  72. for i := 1 to m do
  73. begin
  74. getfrombuf; n := buf[k];
  75. getfrombuf; c := buf[k];
  76. getfrombuf; z := buf[k];
  77. getfrombuf; s := buf[k];
  78. getfrombuf; x1 := buf[k];
  79. getfrombuf; y1 := buf[k];
  80. moveto(x1,y1);
  81. for j := 1 to n do
  82. begin
  83. getfrombuf; x := buf[k];
  84. getfrombuf; y := buf[k];
  85. lineto(x,y);
  86. end;
  87. lineto(x1,y1);
  88. end;
  89. delay(3500);
  90. closegraph;
  91. end.
На строке, которая находится в

процедуре

getfrombuf

Листинг программы
  1. blockread(f, buf, 1)
выдает ошибку disk read error. Эта ошибка говорит о том, что я пытаюсь прочитать что-то после конца файла. Так происходит в среде TurboPascal 7.0; к слову, в среде TurboPascal 7.1 вообще пишет BGI Error: Graphics not initialized (use InitGraph), хотя InitGraph я использую. В связи с ошибкой, хотелось бы узнать ответы на несколько ответов: 1)команде reset(f, q) передаются два параметра. Как я понял, параметр q передает размер записи. Это значит, что каждый элемент будет иметь размер равный q, или это означает, что максимальный размер файла равен q? 2)как корректно использовать такие процедуры, как BlockRead и BlockWrite? Если я правильно понял, то численный параметр, передаваемый в процедуру означает количество элементов записи/чтения? И что насчет того, что я передаю также на запись/чтение целый массив? За вопросы, простите, но информация в интернете однотипна и не очень легка для моего восприятия, поэтому и прошу помочь. Заранее спасибо!

Решение задачи: «На экране нарисовать несколько произвольных закрашенных фигур»

textual
Листинг программы
  1. var p:array[1.20] of pointtype;
  2.      n:byte;
  3. .................................
  4. n:=5;
  5. p[1].x:=
  6. p[1].y:=
  7. p[2].x:=
  8. p[2].y:=    
  9. ..............
  10. p[n+1]:=p[1];
  11. setfillstyle(1,14);//1-сплошная заливка
  12. fillpoly(n+1,p);
  13. ..................

Объяснение кода листинга программы

  1. Создаётся переменная типа array[1.20] of pointtype, которая представляет собой массив из 20 точек.
  2. Задаётся переменная n типа byte, которая представляет собой количество точек в массиве.
  3. Значение переменной n присваивается 5.
  4. Для каждой точки в массиве (от 1 до n) присваиваются значения x и y.
  5. Значение переменной n увеличивается на 1 и присваивается значение n+1.
  6. Значение переменной n присваивается первому элементу массива.
  7. Массив точек заполняется значениями из первого элемента массива.
  8. Устанавливается стиль заполнения полигонов (в данном случае - сплошная заливка).
  9. Заполняется полигон, используя массив точек.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы