Advertisement
Guest User

Untitled

a guest
May 25th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.09 KB | None | 0 0
  1. #include <signal.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/time.h>
  6. #include <sys/ioctl.h>
  7. #include <unistd.h>
  8.  
  9. // dimenzije ekrana
  10. #define WIDTH 80
  11. #define HEIGHT 25
  12. #define SCRSIZE (WIDTH*HEIGHT)
  13. const int scrwidth = WIDTH;
  14. const int scrheight = HEIGHT;
  15. const int scrsize = SCRSIZE;
  16.  
  17. // deklaracije funkcija koje treba realizovati
  18. void clearscr();
  19. int gotoxy(int x, int y);
  20. void printchr(int chr);
  21. void printstr(char* str);
  22. void printnum(int num);
  23.  
  24. // memorija za emulirani ekran
  25. unsigned char screen[SCRSIZE];
  26.  
  27.  
  28. /************************************************
  29. Simulacija iscrtavanja ekrana
  30. *************************************************/
  31.  
  32. // iscrtavanje ekrana
  33. void draw_screen(int signum) {
  34. int i,j,h,w;
  35. struct winsize ws;
  36. unsigned char c;
  37.  
  38. // odredi dimenzije terminala
  39. ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);
  40. w = (ws.ws_col < WIDTH+3) ? ws.ws_col - 2 : WIDTH;
  41. h = (ws.ws_row < HEIGHT+3) ? ws.ws_row - 3 : HEIGHT;
  42.  
  43. // iscrtaj simulirani ekran, koliko može da stane na terminal
  44. system("clear");
  45. printf("╔"); for (i=0; i<w; i++) printf("═"); printf("╗");
  46. printf("\n");
  47. for (j=0; j<h; j++) {
  48. printf("║");
  49. for (i=0; i<w; i++) {
  50. c = screen[j*WIDTH+i];
  51. printf("%c", (c > 31 && c < 127) ? c : '.');
  52. }
  53. if (w==WIDTH) printf("║");
  54. printf("\n");
  55. }
  56. if (h==HEIGHT) {
  57. printf("╚"); for (i=0; i<w; i++) printf("═"); printf("╝");
  58. printf("\n");
  59. }
  60. }
  61.  
  62. // inicijalizacija tajmera
  63. void timer_setup() {
  64. static struct sigaction sa;
  65. static struct itimerval timer;
  66.  
  67. // instaliraj draw_screen kao obrađivač SIGALRM signala
  68. memset (&sa, 0, sizeof (sa));
  69. sa.sa_handler = &draw_screen;
  70. sigaction (SIGALRM, &sa, NULL);
  71.  
  72. // podesi tajmer da se aktivira nakon 50ms
  73. timer.it_value.tv_sec = 0;
  74. timer.it_value.tv_usec = 50000;
  75. // i svakih 50ms posle toga
  76. timer.it_interval.tv_sec = 0;
  77. timer.it_interval.tv_usec = 50000;
  78.  
  79. // pokretanje tajmera
  80. setitimer (ITIMER_REAL, &timer, NULL);
  81. }
  82.  
  83. // pauza u milisekundama
  84. void wait(int msec) {
  85. struct timespec req, rem;
  86. int res = 1;
  87. req.tv_sec = msec / 1000;
  88. req.tv_nsec = (msec % 1000) * 1000000L;
  89. while (res) {
  90. res = nanosleep(&req, &rem);
  91. req.tv_sec = rem.tv_sec;
  92. req.tv_nsec = rem.tv_nsec;
  93. }
  94. }
  95.  
  96. /************************************************
  97. Testiranje ispravnosti funkcija
  98. *************************************************/
  99.  
  100. // testiranje brisanja ekrana i ispisa znakova, bez kontrolnih znakova
  101. void test1() {
  102. int i;
  103. clearscr();
  104. for (i=32;i<128;i++)
  105. printchr(i);
  106. }
  107.  
  108. // testiranje brisanja ekrana i ispisa stringa, bez kontrolnih znakova
  109. void test2() {
  110. int i;
  111. clearscr();
  112. for (i=0;i<80;i++)
  113. printstr("Ana voli Milovana!!! ");
  114. }
  115.  
  116. // testiranje ispisa stringa sa kontrolnim znacima
  117. void test3() {
  118. int i,x=1,dx=1;
  119. clearscr();
  120. printstr("1\t2\t3\t4\t5\t6\t7\t8\t");
  121. while(1) {
  122. for (i=0; i<x; i++) printchr('*');
  123. printstr(" \r");
  124. x = x + dx;
  125. if ((x<1)||(x>scrwidth-3)) dx = -dx;
  126. wait(30);
  127. }
  128. }
  129.  
  130. // testiranje skrolovanja ekrana
  131. void test4() {
  132. int x=0,dx=1,i;
  133. clearscr();
  134. while(1) {
  135. printchr('\n');
  136. for (i=0; i<x; i++) printchr(' ');
  137. printchr('*');
  138. x = x + dx;
  139. if ((x<1)||(x>scrwidth-3)) dx = -dx;
  140. wait(25);
  141. }
  142. }
  143.  
  144. // testiranje gotoxy i ispisa brojeva
  145. void test5() {
  146. int x=7,y=3,dx=1,dy=1,xx=1,yy=1,tim;
  147. char buff[100];
  148. clearscr();
  149. while(1) {
  150. gotoxy(xx,yy); printchr(' ');
  151. gotoxy(x,y); printchr('*');
  152. xx = x; yy = y;
  153. x = x + dx;
  154. y = y + dy;
  155. if ((x<1)||(x>scrwidth-3)) dx = -dx;
  156. if ((y<1)||(y>scrheight-2)) dy = -dy;
  157. gotoxy(30,0);
  158. printstr("X="); printnum(x);
  159. printstr(" Y="); printnum(y);
  160. printstr(" DX="); printnum(dx);
  161. printstr(" DY="); printnum(dy);
  162. printstr(" ");
  163. wait(50);
  164. }
  165. }
  166.  
  167. // zmija
  168. int test6() {
  169. const slen = 15;
  170. int x[slen+1],y[slen+1];
  171. int smerx[4] = {1,0,-1,0};
  172. int smery[4] = {0,1,0,-1};
  173. int i,smer=0,korak=0;
  174. for (i=0; i<=slen; i++) {
  175. x[i] = 5;
  176. y[i] = 5;
  177. }
  178. clearscr();
  179. while(1) {
  180. // ispis
  181. gotoxy(x[0],y[0]);
  182. printchr(' ');
  183. for (i=1; i<slen; i++) {
  184. gotoxy(x[i],y[i]);
  185. printchr('*');
  186. }
  187. gotoxy(x[slen],y[slen]);
  188. printchr('@');
  189. gotoxy(scrwidth/2-4,0);
  190. printstr("smer: ");
  191. printnum(smer);
  192. // pomeranje koordinata
  193. for (i=0; i<slen; i++) {
  194. x[i] = x[i+1];
  195. y[i] = y[i+1];
  196. }
  197. // nova koordinata
  198. x[slen] = x[slen] + smerx[smer];
  199. y[slen] = y[slen] + smery[smer];
  200. // novi smer
  201. if (++korak > 5) {
  202. if ((x[slen] > 2) && (x[slen] < scrwidth-2) && (y[slen] > 2) && (y[slen] < scrheight-2))
  203. if ((rand() % 10) > 7) smer = (smer + 1) % 4;
  204. korak = 0;
  205. }
  206. if ((x[slen] <= 2) || (x[slen] >= scrwidth-2) || (y[slen] <= 2) || (y[slen] >= scrheight-2)) {
  207. smer = (smer + 1) % 4;
  208. korak = 0;
  209. }
  210. wait(50);
  211. }
  212. }
  213.  
  214. int main () {
  215. char c;
  216. printf("Odaberite test (izlaz je sa Ctrl+C):\n");
  217. printf("1 - brisanje ekrana i ispis znakova\n");
  218. printf("2 - brisanje ekrana i ispis stringa\n");
  219. printf("3 - ispis stringa sa kontrolnim znacima\n");
  220. printf("4 - skrolovanje ekrana\n");
  221. printf("5 - gotoxy i ispis brojeva\n");
  222. printf("6 - zmija\n");
  223. scanf("%c",&c);
  224. timer_setup();
  225. switch (c) {
  226. case '1' : test1(); break;
  227. case '2' : test2(); break;
  228. case '3' : test3(); break;
  229. case '4' : test4(); break;
  230. case '5' : test5(); break;
  231. case '6' : test6(); break;
  232. }
  233. sleep(1);
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement