Rozwiazanie zadania z debuggerem na loborke (bez uzycia debuggera bo tylko przeszkadzal:P)
/* 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; }
Ostatnio edytowany przez zordon (2007-03-31 13:15:58)
Offline
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!
Offline
To jest link do strony z laborka numer 4:
http://staff.elka.pw.edu.pl/~jarabas/dyd/prm/prml4.html
Offline
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
Offline
Jest taki pomysl zeby jutro zrobic ta laborke na tych okienkach co to je mamy ! 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
Ostatnio edytowany przez zordon (2007-04-02 20:23:37)
Offline
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!
Ostatnio edytowany przez p@weł (2007-04-02 23:38:27)
Offline
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.
Ostatnio edytowany przez wmichal (2007-04-03 03:51:11)
Offline