zordon - 2007-03-31 12:58:38

Rozwiazanie zadania z debuggerem na loborke (bez uzycia debuggera bo tylko przeszkadzal:P)

Kod:

/* Program przykladowa do testowania srodowiska uruchomieniowego na lab. z
 * PRM. Program zawiera bledy. Zadaniem jest wylapac bledy, a nastepnie 
 * wywolac zalaczone funkcje wg instrukcji Prowadzacego. Dla ambitniejszych:
 * napisac funkcje rysLinia, ktora uogolnialaby wszystkie funkcje o nazwach
 * zaczynajacych sie od slowa <rys>. J. Arabas */
#include <stdio.h>
#define MAXX 5
#define MAXY 10
#define PELNE '*'
#define PUSTE '.'

/* sprawdza, czy argument x jest zawarty w przedziale domknietym [min,max]
   wartosc zwracana:
   -1 jesli x<min
   0 jesli min<=x<=max
   1 jesli x>max
*/
/* signed */char pozaZak (int x, int min, int max)
{
   if (x<min) return -1; //x<min byl tu blad
   if (x>max) return 1;//x>max byl tu blad
   return 0;
}

/* Wypelnia pionowa linie w tablicy ekran znakami PELNE. 
   Polozenie poczatkowe kreslonej linii: px, py
   Linia zawiera nZnak znakow, jesli "wystawalaby" poza tablice, ta wartosc
   jest przycinana do rozmiarow tablicy
*/
void rysPion (char ekran[MAXX][MAXY], int px, int py, int nZnak)
{
   int x,y;
   int i;

   for (x=px, y=py, i=0; i<=nZnak; i++)
   {
      if (pozaZak(x,0, MAXX-1)) return;
      if (pozaZak(y,0, MAXY-1)) return;
      ekran[x][y]=PELNE;
      y++;Poziom
   }
}

/* Wypelnia pozioma linie w tablicy ekran znakami PELNE. 
   Polozenie poczatkowe kreslonej linii: px, py
   Linia zawiera nZnak znakow, jesli "wystawalaby" poza tablice, ta wartosc
   jest przycinana do rozmiarow tablicy
*/
void rysPoziom (char ekran[MAXX][MAXY], int px, int py, int nZnak)
{
   int x,y;
   int i;

   for (x=px, y=py, i=0; i<=nZnak; i++)
   {
      if (pozaZak(x,0, MAXX-1)) return;
      if (pozaZak(y,0, MAXY-1)) return;
      ekran[x][y]=PELNE;
      x++;
   }
}
/* Wypelnia ukosna w lewo linie w tablicy ekran znakami PELNE. 
   Polozenie poczatkowe kreslonej linii: px, py
   Linia zawiera nZnak znakow, jesli "wystawalaby" poza tablice, ta wartosc
   jest przycinana do rozmiarow tablicy
*/
void rysUkosL (char ekran[MAXX][MAXY], int px, int py, int nZnak)
{
   int x,y;
   int i;

   for (x=px, y=py, i=0; i<=nZnak; i++)
   { 						
      if (pozaZak(x,0, MAXX-1)) return; 
      if (pozaZak(y,0, MAXY-1)) return;
      ekran[x][y]=PELNE;
      x--;
      y++;
   }						
}
/* Wypelnia ukosna w prawo linie w tablicy ekran znakami PELNE. 
   Polozenie poczatkowe kreslonej linii: px, py
   Linia zawiera nZnak znakow, jesli "wystawalaby" poza tablice, ta wartosc
   jest przycinana do rozmiarow tablicy
*/
void rysUkosP (char ekran[MAXX][MAXY], int px, int py, int nZnak)
{
   int x,y;
   int i;

   for (x=px, y=py, i=0; i<=nZnak; i++)
   {
      if (pozaZak(x,0, MAXX-1)) return;
      if (pozaZak(y,0, MAXY-1)) return;
      ekran[x][y]=PELNE;
      x++;
      y++;
   }
}
/* --> Napisac samodzielnie  podczas laboratorium*/
/* --> Obsluzyc sytuacje, gdy px, dx<0 */
/* Wypelnia dowolna linie w tablicy ekran znakami PELNE. 
   Polozenie poczatkowe kreslonej linii: px, py.
   Argumenty dx, dy definiuja kierunek kreslenia
   Linia zawiera nZnak znakow, jesli "wystawalaby" poza tablice, ta wartosc
   jest przycinana do rozmiarow tablicy
*/
void rysLinia (char ekran[MAXX][MAXY], int px, int py, int dx, int dy, int 
nZnak)
{
   printf ("\n***\n napisz mnie! \n***\n");
}


/* Rysuje zawartosc ekranu na standardowym wejsciu */
void rysEkran (char ekran[MAXX][MAXY])
{
   int x,y;

   for (y=0; y<MAXY; y++)
{  //klamerki (bład tu byl)
      for (x=0; x<MAXX; x++)

         printf("%c", ekran[x][y]);
      printf("\n");
} //klamerki (bład tu byl)

}
/* Wypelnia ekran znakami PUSTE */
void czyscEkran (char ekran[MAXX][MAXY])
{
   int x,y;
   
   for (y=0; y<MAXY; y++)
      for (x=0; x<MAXX; x++)
         ekran[x][y] = PUSTE;
}

int main()
{
   char ekran[MAXX][MAXY];
   
   czyscEkran(ekran);
   rysPion(ekran, 4,2,5);
   rysEkran(ekran);
   return 0;
}
martus - 2007-03-31 13:14:34

nie wiem, o co chodzi, czy któś może dokładnie wyjaśnić, na czym ma polegać ta laborka?

zordon - 2007-03-31 13:19:09

Laborka polega na tym by znalezc bledy w kodzie programu przy pomocy debuggera (lub bez:P)! i w tym kodzie zrodlowym razem z omelem i rafalem znalezlismy te bledy co tu sa wskazane w komentarzach! Tyle ze jest to kod zrodlowy ze strony jarabasa!

p@weł - 2007-03-31 21:27:29

ale pojebane :D

omel - 2007-04-02 19:53:47

To jest link do strony z laborka numer 4:

http://staff.elka.pw.edu.pl/~jarabas/dyd/prm/prml4.html

Wojtek - 2007-04-02 20:13:34

http://www.ire.pw.edu.pl/~cpsp/dz_dydak/prm/lab4.htm

To jest link do strony Podgórskiego, czyli tej z której mamy teoretycznie korzystać.
Jak widać, treść zadania nie różni się niczym, z wyjątkiem tego że nie ma linka do źródła. Jak widać, ktoś tutaj na chama robił kopiuj-wklej, i mu nieco nie wyszło :)

zordon - 2007-04-02 20:19:48

Jest taki pomysl zeby jutro zrobic ta laborke na tych okienkach co to je mamy :P! Ja wezme laptopa i zrobie razem z omelem wszystko w tym debbugerze! Mam linuxa na laptopie i ten debbuger ddd wiec jak ktos bedzie chcial to zostanie na tych okienkach i zrobimy ta laborke zeby nikt juz nie mial watpliwosci typu to jest pojebane :P

p@weł - 2007-04-02 23:38:05

void rysLinia (char ekran[MAXX][MAXY], int px, int py, int dx, int dy, int nZnak)
{
   
   int x,y;
   int i;
   x=px;
   y=py;
   for (i=0; i<=nZnak; i++)
   {
      if (pozaZak(x,0, MAXX-1)) return;
      if (pozaZak(y,0, MAXY-1)) return;
      ekran[x][y]=PELNE;


      if (dx>0)
    {   
        if (dy>0)
        {y++;x++;};
        if (dy=0)
            {x++;};
        if (dy<0)
        {x++;y--;};
    };

      if (dx=0)
    {   
        if (dy>0)
        {y++;};
        if (dy=0)
            {};
        if (dy<0)
        {y--;};
    };

      if (dx<0)
    {   
        if (dy>0)
        {y++;x--;};
        if (dy=0)
            {x--;};
        if (dy<0)
        {x--;y--;};
    };
   }
}




wybiera ten jebany poczatkowy punkt ale za huja wafla nie rysuje;/ zawsze jest jedna kropka o wspolzednych px, py ;/ HELP!

wmichal - 2007-04-03 03:18:37

Trochę późno ale jest.



/* Program przykladowa do testowania srodowiska uruchomieniowego na lab. z
* PRM. Program zawiera bledy. Zadaniem jest wylapac bledy, a nastepnie
* wywolac zalaczone funkcje wg instrukcji Prowadzacego. Dla ambitniejszych:
* napisac funkcje rysLinia, ktora uogolnialaby wszystkie funkcje o nazwach
* zaczynajacych sie od slowa <rys>. J. Arabas */
#include <stdio.h>
#define MAXX 5
#define MAXY 10
#define PELNE '*'
#define PUSTE '.'

/* sprawdza, czy argument x jest zawarty w przedziale domknietym [min,max]
   wartosc zwracana:
   -1 jesli x<min
   0 jesli min<=x<=max
   1 jesli x>max
*/
char pozaZak (int x, int min, int max)
{
   if (x<min) return -1;
   else if (x>max) return 1;
   else return 0;
}

/* Wypelnia pionowa linie w tablicy ekran znakami PELNE.
   Polozenie poczatkowe kreslonej linii: px, py
   Linia zawiera nZnak znakow, jesli "wystawalaby" poza tablice, ta wartosc
   jest przycinana do rozmiarow tablicy
*/
void rysPion (char ekran[][MAXX], int px, int py, int nZnak)
{
   int x,y;
   int i;

   for (x=px, y=py, i=0; i<nZnak; i++)
   {
      if (pozaZak(x,0, MAXX-1)) return;
      if (pozaZak(y,0, MAXY-1)) return;
      ekran[y][x]=PELNE;
      y++;
   }
}
/* Wypelnia pozioma linie w tablicy ekran znakami PELNE.
   Polozenie poczatkowe kreslonej linii: px, py
   Linia zawiera nZnak znakow, jesli "wystawalaby" poza tablice, ta wartosc
   jest przycinana do rozmiarow tablicy
*/
void rysPoziom (char ekran[][MAXX], int px, int py, int nZnak)
{
   int x,y;
   int i;

   for (x=px, y=py, i=0; i<nZnak; i++)
   {
      if (pozaZak(x,0, MAXX-1)) return;
      if (pozaZak(y,0, MAXY-1)) return;
      ekran[y][x]=PELNE;
      x++;
   }
}
/* Wypelnia ukosna w lewo linie w tablicy ekran znakami PELNE.
   Polozenie poczatkowe kreslonej linii: px, py
   Linia zawiera nZnak znakow, jesli "wystawalaby" poza tablice, ta wartosc
   jest przycinana do rozmiarow tablicy
*/
void rysUkosL (char ekran[][MAXX], int px, int py, int nZnak)
{
   int x,y;
   int i;

   for (x=px, y=py, i=0; i<nZnak; i++)
   {
      if (pozaZak(x,0, MAXX-1)) return;
      if (pozaZak(y,0, MAXY-1)) return;
      ekran[y][x]=PELNE;
      x--;
      y++;
   }
}
/* Wypelnia ukosna w prawo linie w tablicy ekran znakami PELNE.
   Polozenie poczatkowe kreslonej linii: px, py
   Linia zawiera nZnak znakow, jesli "wystawalaby" poza tablice, ta wartosc
   jest przycinana do rozmiarow tablicy
*/
void rysUkosP (char ekran[][MAXX], int px, int py, int nZnak)
{
   int x,y;
   int i;

   for (x=px, y=py, i=0; i<nZnak; i++)
   {
      if (pozaZak(x,0, MAXX-1)) return;
      if (pozaZak(y,0, MAXY-1)) return;
      ekran[y][x]=PELNE;
      x++;
      y++;
   }
}
/* --> Napisac samodzielnie  podczas laboratorium*/
/* --> Obsluzyc sytuacje, gdy px, dx<0 */
/* Wypelnia dowolna linie w tablicy ekran znakami PELNE.
   Polozenie poczatkowe kreslonej linii: px, py.
   Argumenty dx, dy definiuja kierunek kreslenia
   Linia zawiera nZnak znakow, jesli "wystawalaby" poza tablice, ta wartosc
   jest przycinana do rozmiarow tablicy
*/
void rysLinia (char ekran[][MAXX], int px, int py, int dx, int dy, int
nZnak)
{
   int x,y;
   int i;
   if ((dx!=-1 && dx!=0 && dx!=1) || (dy!=-1 && dy!=0 && dy!=1))
        return;
   for (x=px, y=py, i=0; i<nZnak; i++)
   {
      if (pozaZak(x,0, MAXX-1)) return;
      if (pozaZak(y,0, MAXY-1)) return;
      ekran[y][x]=PELNE;
     
      y += dy;
      x += dx;
      /*if (dx==1 && dy ==1)
        {
            y++;
            x++;
        }
      if (dx==1 && dy == -1)
      {
            y--;
            x++;
        }
        if (dx == -1 && dy == 1)
        {
            y++;
            x--;
        }
        if (dx == -1 && dy == -1)
        {
            y--;
            x--;
        } */
   }
}


/* Rysuje zawartosc ekranu na standardowym wejsciu */
void rysEkran (char ekran[][MAXX])
{
   int x,y;

   for (y=0; y<MAXY; y++)
   {   
        for (x=0; x<MAXX; x++)
          printf("%c", ekran[y][x]);
      printf("\n");
    }
}
/* Wypelnia ekran znakami PUSTE */
void czyscEkran (char ekran[][MAXX])
{
   int x,y;
   
   for (y=0; y<MAXY; y++)
      for (x=0; x<MAXX; x++)
         ekran[y][x] = PUSTE;
}

int main()
{
   char ekran[MAXY][MAXX];
   
   czyscEkran(ekran);
   //rysPion(ekran, 4,2,5);
   //rysPoziom(ekran, 1,8,2);
  // rysUkosP(ekran, 1,1,3);
   //rysUkosL(ekran, 3,1,9);
   
   rysLinia(ekran,3,9,1,0,2);
   rysEkran(ekran);
   
   
   fflush(stdin);
   getchar();
   
   return 0;
}


Jeszcze małe wyjaśnienie. W tej mojej funkcji dla dx i dy 1 znaczy w prawo i w dół, -1 w górę i w lewo a 0 to ani jedno ani drugie, czyli po prostu kreska pionowa, pozioma albo punkt.

www.playshaman.pun.pl www.fablesite.pun.pl www.budownictwo89.pun.pl www.bojowe1kurczaki.pun.pl www.bractwo-mroku-margonem.pun.pl