program sanya; uses crt,graph; const n=640; {chislo otschetov ishodnoi funkcii} Xmin=100; {razmery rabochei zoni ekrana} Ymin=25; Xmax=640; Ymax=420; sc4=Ymax div 4; meny=5; {chislo punktov menu} st:array [0..meny] of string [10]= ('MENU','signal','shum','filtr','ochistit','exit'); type koo=record {zapis koordinat} x,y:integer; end; func=array[0..n-1]of koo; var a,b,c,d:func; i,xm,ym:integer; m:real; f:file of koo; s:string; p:pointer; ch:char; pa,pb,pc:boolean; {$I grinit} {-------------procedura risovaniya menu--------------------} procedure Menu; var s:integer; begin SetFillStyle(1,4); {zadaetsya cvet zalivki} Bar(10,10,90,30); {risuetsya pryamougolnik i zalivaetsya tekushim cvetom} s:=ImageSize(10,10,90,30); {peremennoi s prisvaevaetsya znachenie razmera bufera, neobhodimoe dlya hranenia trebuemoi chasti ekrana} GetMem(p,s); {sozd dinamich peremennaiya s i prisvaivaet znachenie adresa per. p} GetImage(10,10,90,30,p^); {kopiruetsya bitovii obraz ukazannoi oblasti grafich. ekrana v pamyat} SetFillStyle(1,11); {zadaetsya cvet zalivki} SetColor(0); Bar(10,10,90,30); OutTextXY(28,14,st[0]); SetFillStyle(1,14); Setcolor(1); for i:=1 to meny do begin Bar(10,i*30+10,90,i*30+30); OutTextXY(14,i*30+14,st[i]); end; {cycl risovaniya pryamougolnikov punktov menu, v kotorie vstavlyautsya sootvetstvuyshie nazvaniya punktov (mnu)} PutImage(10,10,p^,XorPut); {vivoditsya na ekran sohranennoe v pamyati izobrazhenie} end; {--------------procedura ochistki ekrana-----------------------------} procedure ClrScreen; begin SetFillStyle(1,18); {zadaetsya cvet zalivki} Bar(Xmin-3,0,Xmax,20); {risuetsya pryamougolnik i zalivaetsya tekushim cvetom} SetColor(1); {zadaetsya cvet pera} OutTextXY(Xmin+185,5,'OBRABOTCHIK SIGNALOV'); SetFillStyle(1,15); {zadaetsya cvet zalivki} Bar(Xmin-3,Ymin,Xmax,Ymax+25); SetLineStyle(0,0,2); SetColor(7); pa:=false; pb:=false; pc:=false; Rectangle(Xmin,Ymin,Xmax-3,Ymin+sc4-3); Rectangle(Xmin,Ymin+sc4,Xmax-3,Ymin+2*sc4-3); Rectangle(Xmin,Ymin+2*sc4,Xmax-3,Ymin+3*sc4-3); Rectangle(Xmin,Ymin+3*sc4,Xmax-3,Ymin+4*sc4-3); {stroyatsya 4 pryamougolnika} SetFillStyle(1,18); Bar(Xmin-3,Ymin+4*sc4+5,Xmax,Ymax+53); end; {-----------------procedura otobrazheniya funkcii na ekrane-------------} procedure Draw(var d:func; k,col:integer); var c:func; i,max,min:integer; begin c:=d; min:=c[0].y; max:=c[0].y; for i:=1 to n-1 do with c[i] do begin if y>max then max:=y; if y0 then {8,to esli dlina stroke ne =0,to vipol-sya sled-i.sost. oper-r,on udal.posl. symvol} begin s[0]:=chr(ord(s[0])-1); {dlina strok um-sa na 1 symvol} dec(i,8); {smeshenie nazad posle nazhatia BS} SetFillStyle(1,18); { zadaetsya cvet zal.} Bar(Xmin-3+i,Ymin+4*sc4+5,Xmax,Ymax+53); { risuetsya pryamougolnik i zalivaetsya tekushim cvetom } end; else begin OutTextXY(Xmin-3+i,Ymin+4*sc4+10,ch); s:=s+ch; inc(i,8);{ smeshenie vpered posle nazhatia symv} end; end; until ch=#27; b:=a; Val(s,z,i);{v z pishetsya 4islov. Zna4. symv. s} if z>5 then z:=5; if z<0 then z:=0; str(z,s); {v s pish-sa symv. Zna4. per.z} z:=z*10; if i<>0 then begin pb:=false; SetFillStyle(1,18);{ zadaetsya cvet zal} Bar(Xmin-3,Ymin+4*sc4+5,Xmax,Ymax+53); { risuetsya pryamougolnik i zalivaetsya tekushim cvetom } exit;{vihod iz proceduri} end; for i:=0 to n-1 do with a[i] do b[i].y:=y+(random(z)-z div 2);{cycl,na zvuk nakl-sya shum zad-oi intensivnosti po formule: y+(random(z)-z div 2)} Draw(b,1,0);{vipol. procedura otobrazheniya funkcii na ekrane } pb:=true; SetColor(1);{ zadaetsya cvet pera } OutTextXY(470,sc4+Ymin+5,'Signal s shumom Z='+s); end; {---proc-ra filtracii zvuk.Signalov usrednyaushim filtrom----} procedure Filtr; var i,j,z,sum:integer; begin if not pb then exit; if pc then begin SetFillStyle(1,15);{cvet zal. } Bar(Xmin+1,Ymin+3+2*sc4,Xmax-4,Ymin+3*sc4-4); Bar(Xmin+1,Ymin+3+3*sc4,Xmax-4,Ymin+4*sc4-4); end; SetFillStyle(1,18); { cvet zal } Bar(Xmin-3,Ymin+4*sc4+5,Xmax,Ymax+53); SetColor(1); OutTextXY(Xmin,Ymin+4*sc4+10, 'Ukazhite razmer okna sglazhivaniya L 1..20:'); while KeyPressed do ch:=ReadKey; i:=360;{smeshenie dialogovogo okna} s:=''; SetColor(1); repeat {cycl,vvod-sya razmer okna sglazhivaniya} ch:=readkey; case ch of #13: break;{esli kod scanirovaniy nazhatoi klavi 13,to cycl prerivaetsya} #8: if ord(s[0])<>0 {esli kod scanir nazhatoi klavi 8,to ,esli dlina str. S ne=0,vip-sya sost. Op-r, on udalyaet poslednii symvol} then begin s[0]:=chr(ord(s[0])-1); dec(i,8); SetFillStyle(1,18); Bar(Xmin-3+i,Ymin+4*sc4+5,Xmax,Ymax+53); end; else begin OutTextXY(Xmin-3+i,Ymin+4*sc4+10,ch); s:=s+ch; inc(i,8); end; end; until ch=#27; c:=b; Val(s,z,i); if z>20 then z:=20; if z<=0 then z:=1; str(z,s); if i<>0 then begin SetFillStyle(1,18); Bar(Xmin-3,Ymin+4*sc4+5,Xmax,Ymax+53); exit; end; for i:=0 to n-1-z do with b[i] do {cycl,nah-sya koord-ti otfiltrovannogo signala} begin sum:=0; for j:=i to i+z-1 do sum:=sum+b[j].y;{nah-sya summa zna4.koord.otfiltrovannogo signala } c[i+z div 2].y:=round(sum/z);{nah-sya koord. Otfiltrov.signala} end; Draw(c,2,2);{vip-sya procedura otobrazhenia func. Na ekrane} SetColor(2); pc:=true; d:=c; OutTextXY(330,2*sc4+Ymin+5,'Otfiltrovannii signal s oknom L='+s); for i:=0 to n-1 do with d[i] do y:=round(27+sc4*3+sc4/2+(a[i].y-c[i].y)); {cycl, nah-sya koord-ti signala rassoglasovaniya} SetColor(12); DrawPoly(n,d); OutTextXY(450,3*sc4+Ymin+5,'Signal rassoglasovaniya'); end; {---------------------GOLOVNAYA PROGRAMMA-----------------------------} begin GrInit;{VKLU4. graf. Regima} Menu; ClrScreen; Randomize; i:=0; repeat if KeyPressed then begin ch:=readkey; if ch=#0 then ch:=readkey; case ch of #72: begin PutImage(10,i*30+10,p^,XorPut); dec(i); if i<0 then i:=meny; PutImage(10,i*30+10,p^,XorPut); end;{peredvigaensya vverh po menu ili perehodim k poslednei klavishe esli i<0} #80: begin PutImage(10,i*30+10,p^,XorPut); inc(i); if i>meny then i:=0; PutImage(10,i*30+10,p^,XorPut); end;{peredvigaensya vniz po menu ili perehodim k pervoi klavishe esli i>meny} #13: case i of {13, esli i=} 1: begin signal; end; 2: begin Shum; end; 3: begin Filtr; end; 4: begin ClrScreen; end; 5: begin CloseGraph; exit; end; end; end; end; until ch=#27; CloseGraph; end.