Текст програми selector.cpp

#include <iostream.h>

#include <conio.h>

#include <graphics.h>

#include <math.h>

//вибір типу мультиплексора

void sub_intro()

{

setcolor(3);

settextstyle(0,HORIZ_DIR,2);

outtextxy(90,100,"ПРИНЦИП РОБОТИ МУЛЬТИПЛЕКСОРА");

settextstyle(1,HORIZ_DIR,0);

setcolor(5);

outtextxy(210,150,"ВИБЕРІТЬ ТИП МУЛЬТИПЛЕКСОРА:");

setcolor(15);

settextstyle(0,HORIZ_DIR,2);

outtextxy(300,200,"4-1");

outtextxy(300,240,"8-1");

outtextxy(300,280,"16-1");

setcolor(1);

settextstyle(1,HORIZ_DIR,0);

outtextxy(460,400,"курсова робота");

outtextxy(460,420,"студента групи 1 ІС-05");

outtextxy(460,440,"Ткачука Андрія");

settextstyle(0,HORIZ_DIR,2);

}

//вибір мультиплексора, повернення значення кількості адресних входів

int intro()

{

int n,i,key;

i=0;

n=i+2;// n-кількість адресних входів

sub_intro();

setcolor(4);

outtextxy(280,200,">");

while(!kbhit())

{

  key=getch();if(key==13) goto next;//вихід із функції

  key=getch();

  //управління клавішами курсора

  switch(key)

    {

    case 72:cleardevice();

    i--;

    if(i<0) i=2;

    n=i+2;

    sub_intro();

    setcolor(4);

    outtextxy(280,200+i*40,">");

    break;

    case 80:cleardevice();

    i++;

    if(i>2)i=0;

    n=i+2;

    sub_intro();

    setcolor(4);

    outtextxy(280,200+i*40,">");

    break;

    }

}

next:cleardevice();

settextstyle(1,HORIZ_DIR,0);

return(n);

}

//виведення підказки користування клавішами

void instr(int x0,int y0,int n)

{

int x,y,zm;

if(n==4){x=x0+450;y=y0;zm=20;}

else {x=x0;y=y0;}

outtextxy(x,y,"КЛАВІШІ:");

if(n!=4)outtextxy(x,y+20,"ENTER – вибір мультиплексора ");

else

{

  outtextxy(x,y+20,"ENTER -");

  outtextxy(x,y+40,"вибір мультиплексора");

}

  outtextxy(x,y+40+zm,"UP - вверх");

  outtextxy(x,y+60+zm,"DOWN - вниз");

  outtextxy(x,y+80+zm,"ESC - вихід");

}

//функція креслення таблиці істинності

void table(int x,int y,int n)//x,y-координати верхнього лівого кута

{                                //n-кількість адресних входів

int i,L0=100/n;

setcolor(7);

for(i=0;i<pow(2,n)+3;i++)

line(x,y+i*L0,x+(n+2)*L0,y+i*L0);

for(i=0;i<(n+3);i++)

line(x+i*L0,y,x+i*L0,y+(pow(2,n)+2)*L0);

}

//функція заповнення таблиці істинності

void fill(int x,int y, int n)

{

int i,j,k,t,g,L0=100/n;

for(i=0;i<n;i++)

switch(i)

  {

     case 0:outtextxy(x+L0/3+i*L0,y+L0/2,"A0");

    outtextxy(x+L0/3+i*L0,y+1.5*L0,"*");break;

     case 1:outtextxy(x+L0/3+i*L0,y+L0/2,"A1");

    outtextxy(x+L0/3+i*L0,y+1.5*L0,"*");break;

     case 2:outtextxy(x+L0/3+i*L0,y+L0/2,"A2");

    outtextxy(x+L0/3+i*L0,y+1.5*L0,"*");break;

     case 3:outtextxy(x+L0/3+i*L0,y+L0/2,"A3");

    outtextxy(x+L0/3+i*L0,y+1.5*L0,"*");break;

  }

switch(n)

  {

     case 2:outtextxy(x+L0/3+2*L0,y+L0/2,"E");

    outtextxy(x+L0/3+2*L0,y+1.5*L0,"0");

    outtextxy(x+L0/3+3*L0,y+L0/2,"Q");

    outtextxy(x+L0/3+3*L0,y+1.5*L0,"0");break;

     case 3:outtextxy(x+L0/3+3*L0,y+L0/2,"E");

    outtextxy(x+L0/3+3*L0,y+1.5*L0,"0");

    outtextxy(x+L0/3+4*L0,y+L0/2,"Q");

    outtextxy(x+L0/3+4*L0,y+1.5*L0,"0");break;

     case 4:outtextxy(x+L0/3+4*L0,y+L0/2,"E");

    outtextxy(x+L0/3+4*L0,y+1.5*L0,"0");

    outtextxy(x+L0/3+5*L0,y+L0/2,"Q");

    outtextxy(x+L0/3+5*L0,y+1.5*L0,"0");break;

  }

t=2;

switch(n)//заповнення таблиці кодовими комбінаціями

  {

     case 2://для мультиплексора з 2-ма адресними входами

    for(i=0;i<2;i++)

    for(j=0;j<2;j++)

    {

      switch(i)

              {

              case 0:outtextxy(x+L0/3,y+t*L0+L0/2,"0");break;

              case 1:outtextxy(x+L0/3,y+t*L0+L0/2,"1");

              }

      switch(j)

              {

              case 0:outtextxy(x+L0/3+L0,y+t*L0+L0/2,"0");break;

              case 1:outtextxy(x+L0/3+L0,y+t*L0+L0/2,"1");

              }

      outtextxy(x+L0/3+2*L0,y+t*L0+L0/2,"1");

      t++;

    }

    break;

     case 3://з 3-ма адр. входами

    for(i=0;i<2;i++)

    for(j=0;j<2;j++)

    for(k=0;k<2;k++)

    {

      switch(i)

              {

              case 0:outtextxy(x+L0/3,y+t*L0+L0/2,"0");break;

              case 1:outtextxy(x+L0/3,y+t*L0+L0/2,"1");

              }

      switch(j)

              {

              case 0:outtextxy(x+L0/3+L0,y+t*L0+L0/2,"0");break;

              case 1:outtextxy(x+L0/3+L0,y+t*L0+L0/2,"1");

              }

      switch(k)

              {

              case 0:outtextxy(x+L0/3+2*L0,y+t*L0+L0/2,"0");break;

              case 1:outtextxy(x+L0/3+2*L0,y+t*L0+L0/2,"1");

              }

      outtextxy(x+L0/3+3*L0,y+t*L0+L0/2,"1");

      t++;

    }

    break;

     case 4: //з 4-ма адр. входами

    for(i=0;i<2;i++)

    for(j=0;j<2;j++)

    for(k=0;k<2;k++)

    for(g=0;g<2;g++)

    {

      switch(i)

              {

              case 0:outtextxy(x+L0/3,y+t*L0+L0/2,"0");break;

              case 1:outtextxy(x+L0/3,y+t*L0+L0/2,"1");

              }

      switch(j)

              {

              case 0:outtextxy(x+L0/3+L0,y+t*L0+L0/2,"0");break;

              case 1:outtextxy(x+L0/3+L0,y+t*L0+L0/2,"1");

              }

      switch(k)

              {

              case 0:outtextxy(x+L0/3+2*L0,y+t*L0+L0/2,"0");break;

              case 1:outtextxy(x+L0/3+2*L0,y+t*L0+L0/2,"1");

              }

      switch(g)

              {

              case 0:outtextxy(x+L0/3+3*L0,y+t*L0+L0/2,"0");break;

              case 1:outtextxy(x+L0/3+3*L0,y+t*L0+L0/2,"1");

              }

      outtextxy(x+L0/3+4*L0,y+t*L0+L0/2,"1");

      t++;

    }

  }

for(i=2;i<(pow(2,n)+2);i++)

    switch(i)

     {

    case 2:outtextxy(x+L0/4+(n+1)*L0,y+i*L0+L0/2,"D0");break;

    case 3:outtextxy(x+L0/4+(n+1)*L0,y+i*L0+L0/2,"D1");break;

    case 4:outtextxy(x+L0/4+(n+1)*L0,y+i*L0+L0/2,"D2");break;

    case 5:outtextxy(x+L0/4+(n+1)*L0,y+i*L0+L0/2,"D3");break;

    case 6:outtextxy(x+L0/4+(n+1)*L0,y+i*L0+L0/2,"D4");break;

    case 7:outtextxy(x+L0/4+(n+1)*L0,y+i*L0+L0/2,"D5");break;

    case 8:outtextxy(x+L0/4+(n+1)*L0,y+i*L0+L0/2,"D6");break;

    case 9:outtextxy(x+L0/4+(n+1)*L0,y+i*L0+L0/2,"D7");break;

    case 10:outtextxy(x+L0/4+(n+1)*L0,y+i*L0+L0/2,"D8");break;

    case 11:outtextxy(x+L0/4+(n+1)*L0,y+i*L0+L0/2,"D9");break;

    case 12:outtextxy(x+L0/10+(n+1)*L0,y+i*L0+L0/2,"D10");break;

    case 13:outtextxy(x+L0/10+(n+1)*L0,y+i*L0+L0/2,"D11");break;

    case 14:outtextxy(x+L0/10+(n+1)*L0,y+i*L0+L0/2,"D12");break;

    case 15:outtextxy(x+L0/10+(n+1)*L0,y+i*L0+L0/2,"D13");break;

    case 16:outtextxy(x+L0/10+(n+1)*L0,y+i*L0+L0/2,"D14");break;

    case 17:outtextxy(x+L0/10+(n+1)*L0,y+i*L0+L0/2,"D15");break;

     }

}

//креслення мультиплексора

void mult(int x,int y,int n)//x,y-координати верхнього лівого кута

{                               //кіль-сть адресних входів

int i,w=90/n,L0=80/n;

setcolor(7);

line(x,y,x,y+L0*(3+n+pow(2,n)));

line(x+w,y,x+w,y+L0*(3+n+pow(2,n)));

line(x+5*w,y,x+5*w,y+L0*(3+n+pow(2,n)));

line(x+6*w,y,x+6*w,y+L0*(3+n+pow(2,n)));

line(x,y,x+6*w,y);

line(x,y+L0*(3+n+pow(2,n)),x+6*w,y+L0*(3+n+pow(2,n))); line(x,y+L0*(1+pow(2,n)),x+w,y+L0*(1+pow(2,n)));

line(x,y+L0*(2+n+pow(2,n)),x+w,y+L0*(2+n+pow(2,n)));

outtextxy(x+L0/2,y+L0/3,"D");

outtextxy(x+L0/2,y+(1+pow(2,n))*L0+L0/3,"A");

outtextxy(x+L0/2,y+(2+n+pow(2,n))*L0+L0/3,"E");

line(x-w,y+(2+n+pow(2,n))*L0+L0/2,x,y+(2+n+pow(2,n))*L0+L0/2);

outtextxy(x+5*w+L0/2,y+L0*(3+n+pow(2,n))/2,"Q");

line(x+6*w,y+L0*(3+n+pow(2,n))/2,x+7*w,y+L0*(3+n+pow(2,n))/2);

for(i=0;i<n;i++)

//креслення та нумерація адресних входів

switch(i)

  {

     case 0:outtextxy(x+L0/2,y+(1+pow(2,n))*L0+L0+L0/3,"0");

    line(x-w,y+(1+pow(2,n))*L0+L0+L0/2,x,y+(1+pow(2,n))*L0+L0+L0/2);

    break;

     case 1:outtextxy(x+L0/2,y+(1+pow(2,n))*L0+2*L0+L0/3,"1");

    line(x-w,y+(1+pow(2,n))*L0+2*L0+L0/2,x,y+(1+pow(2,n))*L0+2*L0+L0/2);

    break;

     case 2:outtextxy(x+L0/2,y+(1+pow(2,n))*L0+3*L0+L0/3,"2");

    line(x-w,y+(1+pow(2,n))*L0+3*L0+L0/2,x,y+(1+pow(2,n))*L0+3*L0+L0/2);

    break;

     case 3:outtextxy(x+L0/2,y+(1+pow(2,n))*L0+4*L0+L0/3,"3");

    line(x-w,y+(1+pow(2,n))*L0+4*L0+L0/2,x,y+(1+pow(2,n))*L0+4*L0+L0/2);

    break;

  }

for(i=0;i<pow(2,n);i++)

//нумерація інформаційних входів

switch(i)

  {

     case 0:outtextxy(x+L0/2,y+L0/3+L0,"0");

    line(x-w,y+L0/2+L0,x,y+L0/2+L0);break;

     case 1:outtextxy(x+L0/2,y+L0/3+2*L0,"1");

    line(x-w,y+L0/2+2*L0,x,y+L0/2+2*L0);break;

     case 2:outtextxy(x+L0/2,y+L0/3+3*L0,"2");

    line(x-w,y+L0/2+3*L0,x,y+L0/2+3*L0);break;

     case 3:outtextxy(x+L0/2,y+L0/3+4*L0,"3");

    line(x-w,y+L0/2+4*L0,x,y+L0/2+4*L0);break;

     case 4:outtextxy(x+L0/2,y+L0/3+5*L0,"4");

    line(x-w,y+L0/2+5*L0,x,y+L0/2+5*L0);break;

     case 5:outtextxy(x+L0/2,y+L0/3+6*L0,"5");

    line(x-w,y+L0/2+6*L0,x,y+L0/2+6*L0);break;

     case 6:outtextxy(x+L0/2,y+L0/3+7*L0,"6");

    line(x-w,y+L0/2+7*L0,x,y+L0/2+7*L0);break;

     case 7:outtextxy(x+L0/2,y+L0/3+8*L0,"7");

    line(x-w,y+L0/2+8*L0,x,y+L0/2+8*L0);break;

     case 8:outtextxy(x+L0/2,y+L0/3+9*L0,"8");

     line(x-w,y+L0/2+9*L0,x,y+L0/2+9*L0);break;

     case 9:outtextxy(x+L0/2,y+L0/3+10*L0,"9");

    line(x-w,y+L0/2+10*L0,x,y+L0/2+10*L0);break;

     case 10:outtextxy(x+L0/5,y+L0/3+11*L0,"10");

    line(x-w,y+L0/2+11*L0,x,y+L0/2+11*L0);break;

     case 11:outtextxy(x+L0/5,y+L0/3+12*L0,"11");

    line(x-w,y+L0/2+12*L0,x,y+L0/2+12*L0);break;

     case 12:outtextxy(x+L0/5,y+L0/3+13*L0,"12");

    line(x-w,y+L0/2+13*L0,x,y+L0/2+13*L0);break;

     case 13:outtextxy(x+L0/5,y+L0/3+14*L0,"13");

    line(x-w,y+L0/2+14*L0,x,y+L0/2+14*L0);break;

     case 14:outtextxy(x+L0/5,y+L0/3+15*L0,"14");

    line(x-w,y+L0/2+15*L0,x,y+L0/2+15*L0);break;

     case 15:outtextxy(x+L0/5,y+L0/3+16*L0,"15");

    line(x-w,y+L0/2+16*L0,x,y+L0/2+16*L0);break;

  }

}

//функція, що малює стрілку

void arrow(int x, int y)

{

setfillstyle(1,4);

setcolor(4);

line(x,y,x-20,y-10);

line(x,y,x-20,y+10);

line(x-15,y,x-20,y-10);

line(x-15,y,x-20,y+10);

floodfill(x-5,y,4);

}

//введення кодової комбінації на адресні входи мультиплексора

void adress(int x,int y,int n,int m)

{

int i,j,k,g,t,L0=100/n;

t=0;

switch(n)

{

  case 2://для мультиплексора з 2-ма адр. входами

     for(i=0;i<2;i++)

     for(j=0;j<2;j++)

    {

    switch(i)

    {

              case 0:if(t==m)outtextxy(x-90/n,y+(1+pow(2,n))*L0,"0");

              break;

              case 1:if(t==m)outtextxy(x-90/n,y+(1+pow(2,n))*L0,"1");

    }

    switch(j)

    {

              case 0:if(t==m)outtextxy(x-90/n,y+(2+pow(2,n))*L0-L0/5,"0");

              break;

              case 1:if(t==m)outtextxy(x-90/n,y+(2+pow(2,n))*L0-L0/5,"1");

    }

    outtextxy(x-90/n,y+(3+pow(2,n))*L0-L0/2.5,"1");

    t++;

    }

     break;

  case 3:// для мультиплексора з 3-ма адр. входами

     for(i=0;i<2;i++)

     for(j=0;j<2;j++)

     for(k=0;k<2;k++)

    {

    switch(i)

    {

              case 0:if(t==m)outtextxy(x-90/n,y+pow(2,n)*L0,"0");break;

              case 1:if(t==m)outtextxy(x-90/n,y+pow(2,n)*L0,"1");

    }

    switch(j)

    {

              case 0:if(t==m)outtextxy(x-90/n,y+pow(2,n)*L0+L0-L0/4,"0");

              break;

              case 1:if(t==m)outtextxy(x-90/n,y+pow(2,n)*L0+L0-L0/4,"1");

    }

    switch(k)

    {

              case 0:if(t==m)outtextxy(x-90/n,y+pow(2,n)*L0+2*L0-L0/2,"0");

              break;

              case 1:if(t==m)outtextxy(x-90/n,y+pow(2,n)*L0+2*L0-L0/2,"1");

    }

    outtextxy(x-90/n,y+pow(2,n)*L0+3*L0-L0/1.5,"1");

    t++;

    }

     break;

  case 4:// для мультиплексора з 4-ма адр. входами

     for(i=0;i<2;i++)

     for(j=0;j<2;j++)

     for(k=0;k<2;k++)

     for(g=0;g<2;g++)

    {

    switch(i)

    {

              case 0:if(t==m)outtextxy(x-90/n,y+(pow(2,n)-2)*L0+L0/3,"0");

              break;

              case 1:if(t==m)outtextxy(x-90/n,y+(pow(2,n)-2)*L0+L0/3,"1");

    }

    switch(j)

    {

              case 0:if(t==m)outtextxy(x-90/n,y+(pow(2,n)-1)*L0+L0/6,"0");

              break;

              case 1:if(t==m)outtextxy(x-90/n,y+(pow(2,n)-1)*L0+L0/6,"1");

    }

    switch(k)

    {

              case 0:if(t==m)outtextxy(x-90/n,y+(pow(2,n))*L0,"0");break;

              case 1:if(t==m)outtextxy(x-90/n,y+(pow(2,n))*L0,"1");

    }

    switch(g)

    {

              case 0:if(t==m)outtextxy(x-90/n,y+(pow(2,n)+1)*L0-L0/4,"0");

              break;

              case 1:if(t==m)outtextxy(x-90/n,y+(pow(2,n)+1)*L0-L0/4,"1");

    }

    outtextxy(x-90/n,y+(pow(2,n)+2)*L0-L0/2.5,"1");

    t++;

    }

}

 

}

void main()

{

int dr=DETECT,mod,y,i,n,L0,key,c;

initgraph(&dr,&mod,"");

again:;

n=intro();

table(25,10,n);

fill(25,10,n);

mult(310,10,n);

instr(20,380,n);

i=-1;

y=0;

L0=80/n;

setcolor(2);

//на адр. входи не подаються сигнали

if(n==2)outtextxy(310-90/n,75+(3+pow(2,n))*L0-L0/2.5,"0");

if(n==3)outtextxy(310-90/n,82+pow(2,n)*L0+3*L0-L0/1.5,"0");

if(n==4)outtextxy(310-90/n,95+n+(pow(2,n)+2)*L0-L0/2.5,"0");

outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"0");

//на адр. входи подаються сигнали

while(!kbhit())

{

  key=getch();if(key==13){cleardevice();goto again;}

  if(key==27) goto next;

  key=getch();

  //керування стрілкою

  switch(key)

    {

    case 72:cleardevice();//стрілка вверх

    table(25,10,n);

    fill(25,10,n);

    mult(310,10,n);

    instr(20,380,n);

    i--;

    if(i<0) i=pow(2,n)-1;

    arrow(260,10+(i+1)*L0+L0/2);//y+L0/2+7*L0

    setcolor(2);

    //комутація з одного із інф. входів на вихід

    switch(i)

    {

      case 0:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D0");

               break;

      case 1:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D1");

               break;

      case 2:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D2");

               break;

      case 3:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D3");

               break;

      case 4:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D4");

               break;

      case 5:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D5");

               break;

      case 6:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D6");

               break;

      case 7:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D7");

               break;

      case 8:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D8");

               break;

      case 9:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D9");

               break;

      case 10:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D10");

               break;

      case 11:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D11");

               break;

      case 12:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D12");

               break;

      case 13:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D13");

               break;

      case 14:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D14");

               break;

      case 15:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D15");

               break;

    }

    adress(310,10,n,i);

    break;

    case 80:cleardevice();//стрілка вниз

    table(25,10,n);

    fill(25,10,n);

    mult(310,10,n);

    instr(20,380,n);

    i++;

    if(i>pow(2,n)-1) i=0;

    arrow(260,(i+1)*L0+10+L0/2);

    setcolor(2);

    switch(i)

    {

      case 0:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D0");

               break;

      case 1:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D1");

               break;

      case 2:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D2");

               break;

      case 3:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D3");

               break;

      case 4:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D4");

               break;

      case 5:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D5");

               break;

      case 6:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D6");

               break;

      case 7:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D7");

               break;

       case 8:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D8");

               break;

      case 9:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D9");

               break;

      case 10:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D10");

               break;

      case 11:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D11");

               break;

      case 12:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D12");

               break;

      case 13:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D13");

               break;

      case 14:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D14");

               break;

      case 15:outtextxy(310+450/n+1.5*L0,y+L0*(3+n+pow(2,n))/2,"D15");

               break;

    }

    adress(310,10,n,i);

    break;

    }

}

    next:closegraph();

}

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: