• Welcome to TUKE FÓRUM - Fórum pre študentov Technickej Univerzity v Košiciach.
 

ZADANIA Z predmetu PROGRAMOVANIE

Started by psicho, 29.01.2010, 17:40:30

« predchdzajce - alie »

TheOne

Quote from: petopetolkoo on  20.05.2010, 23:34:07
CHCEL BY SOM ESTE POPROSIT CVICIACICH NECH PODAVAJU ZAPOCTY CIM SKOR DO MAISU, ABY SME SA MOHLI PRIHLASIT NA SKUSKU. DAKUJEM A POKOJ VÁM


PRIPAJAM SA

Shwollo

nechce mi pod Unixom fungovať príkaz pow(). Ako sa to dá spojazdniť? Príp. nahradiť?
nepíšte mi SS - radšej mi píšte mail. (tá obálka pod mojim avatarom :)))

f0t3r_mfX

Prosim vedel by mi niekto pomoct ako by mal vyzerat Makefile? Pri kompilovani mi to vypise milion chyb (zadavam len "make -f Makefile") - nespoznava karlove funkcie (movek, atd..)..ako keby library nebolo vobec pripojene. Ako externista som nemal cvika, takze s Unixom mam minimalne skusenosti a neviem, kde je chyba. :/

Makefile:
all: main.c library
gcc main.c -o karel
library: library.c library.h
gcc -c library.c
clean:
rm -f *.o karel

Shwollo

musíš zadať "make all" a "make library"

all: main.o library
gcc -o karel main.o library.o
library: library.c library.h
gcc -Wall -c library.c library.h

main.o:main.c
gcc -c main.c
clean:
rm *.o karel
nepíšte mi SS - radšej mi píšte mail. (tá obálka pod mojim avatarom :)))

f0t3r_mfX

diky, teraz mi to pre zmenu pise "vfork: Resource temporarily unavailable"

sulo

Quote from: Shwollo on  25.05.2010, 00:49:43
nechce mi pod Unixom fungovať príkaz pow(). Ako sa to dá spojazdniť? Príp. nahradiť?

Pri kompilácii použi prepínač -lm.

Shwollo

f0t3r_mfX: tak neviem

sulo: kam do mám v makefile napísať? je tu o 3 pirípevky vyššie
nepíšte mi SS - radšej mi píšte mail. (tá obálka pod mojim avatarom :)))

sulo


f0t3r_mfX

Quote from: Shwollo on  25.05.2010, 01:54:48
f0t3r_mfX: tak neviem

Chyba nebude v tvojom makefile, ale zrejme na omege. Diky este raz.

Shwollo

makefile funguje. teraz skom skúšal karla a ide všetko.
nepíšte mi SS - radšej mi píšte mail. (tá obálka pod mojim avatarom :)))

mirek

Quote from: f0t3r_mfX on  25.05.2010, 02:52:54
Quote from: Shwollo on  25.05.2010, 01:54:48
f0t3r_mfX: tak neviem

Chyba nebude v tvojom makefile, ale zrejme na omege. Diky este raz.

skontroluj si, ze ci si neni na omege prihlaseny viackrat (ci si neostal odniekial visiet prihlaseny).
So say we all!

Shwollo

#811
tu je karel, kt. ide pod win bez problemov
akonáhle to hodím na omegu tak spraví iba polku úlohy. Tj - načíta čísla, ale nevpíše ich.  bu
ide o to, že nespraví posledný cyklus - ale len na omege. Na wine to ide
zadanie č 3.
pls help :ringsmiley:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void turnRight() {
    turnLeft();
    turnLeft();
    turnLeft();
    }

void sub()                                //nami zadefinovany prikaz
{
int pp=0, pb=1, c1=0, c2=0, i;            //pp je pocitadlo prejdenych krokov, pb je pocet Beeprov, c1 a c2 su spocitavane cisla a i je pomocna premenna (vacsinou pocitadlo pre for)
while(facingNorth()==0)                   //cyklus riesi otocenie na sever, otaca sa, kym nie je nasmerovany spravne
{
turnLeft();
}
while(frontIsClear()==1)                  //karol pojde po najblizsiu stenu
{
move();
}
turnLeft();                               //otocenie na dolava, teda smeruje na vychod
while(frontIsClear()==1)                  //karol pojde po najblizsiu stenu
{
move();
}
turnLeft();                               //dve otocenia ho otocia na zapad
turnLeft();
while(frontIsClear()==1)                  //prejdenie do praveho horneho rohu
{
move();
}
turnLeft();                               //otocenie na zapad
turnLeft();

while(beepersPresent()==0)
{
while(frontIsClear()==1)
{
move();
if(beepersPresent()==1)
{
goto pocitanie;
}
}
turnLeft();
turnLeft();
while(frontIsClear()==1)
{
move();
}
turnRight();
move();
turnRight();
}

pocitanie:
pp=0;
while(pb!=0)                              //cyklus na zistenie hodnoty prveho cisla a jeho ulozenie do c1
{
pb=0;
while(beepersPresent()==1)                //karol pri kazdom uspesnom zdvihnuti navysi hodnotu pb
{
pickBeeper();
pb++;
}
for(i=0;i<pb;i++)                         //vratenie vzanych Beeprov, hodnota pb sa nemeni
{
putBeeper();
}
i=0;
if(pb==10)                                //uprava pri nule, ktoru predstavuje skupina 10 Beeprov
{
i=1;
pb=0;
}
c1=c1+(pb*pow(10,pp));                    //ciselna hodnota sa uklada do c1, pricom sa pripocitava pocet zistenych beeprov osetreny podla vzdialenosti od desatinnej ciarky
if(i==1)                                  //zadanie hodnoty do poctu Beeprov, aby program vedel, ze tu k najdeniu Beeprov doslo a mohol sa vykonavat vdaka pociatocnej splnenej podmienke
pb=1;
pp++;                                     //pocet krokov predstavuje nasobnu velkost k cislu desat (teda 20=10^1, kde mocnina sa meni vdaka pp)
if(frontIsBlocked()==1)
{
pp--;
goto dalsir;
}
move();
}

dalsir:
turnLeft();                               //otocenie opacne, teda na vychod
turnLeft();
for(i=0;i<pp;i++)                         //navrat na koniec cisla
{
move();
}
turnRight();                              //presun na dalsi riadok
move();
turnRight();

if(c1>=100)                               //pri praci so zlozitym vzorcom dochadza pri prechode na trojciferne cislo k strate 1, ktora sa tymto osetri
c1=c1+1;
pb=1;
pp=0;
while(pb!=0)                              //cyklus na zistenie hodnoty druheho cisla, obdobny ako u cisla prveho, len uklada do c2
{
pb=0;
while(beepersPresent()==1)                //karol pri kazdom uspesnom zdvihnuti navysi hodnotu pb
{
pickBeeper();
pb++;
}
for(i=0;i<pb;i++)                         //vratenie vzanych Beeprov, hodnota pb sa nemeni
{
putBeeper();
}
i=0;
if(pb==10)
{
i=1;
pb=0;
}
c2=c2+(pb*pow(10,pp));                    //ciselna hodnota sa uklada do c1, pricom sa pripocitava pocet zistenych beeprov osetreny podla vzdialenosti od desatinnej ciarky
if(i==1)
pb=1;
pp++;                                     //pocet krokov predstavuje nasobnu velkost k cislu desat (teda 20=10^1, kde mocnina sa meni vdaka pp)
if(frontIsBlocked()==1)
{
pp=pp-1;
goto vysledok;
}
move();
}

vysledok:
turnLeft();                               //otocenie opacne, teda na vychod
turnLeft();
for(i=0;i<pp;i++)                         //navrat na koniec cisla
{
move();
}
turnRight();                              //presun na dalsi riadok
move();
turnRight();
if(c2>=100)
c2=c2+1;

printf("%d %d",c1,c2);


c1=c1-c2;                                 //odcitanie druheho cisla od prveho
pp=0;

while(c1!=0)                              //bude ukladat vysledok postupne, az kym nevylozi cele cislo a to ziskava zistenim zvysku pri deleni desiatim, odcitanim zvysku a naslednym 10-nasobnym zmensenim vysledneho cisla  pre dalsie ziskavanie cifier
{
i=pow(10,pp);
pb=c1 % 10;
c1=c1-pb;
if(pb==0)                                 //v pripade pokusu o vypisanie nuly sa hodnota zmeni na 10, lebo podla nasej kniznice je reprezentacia 0 prave cislo 10
pb=10;
for(i=0;i<pb;i++)
{
putBeeper();
}
c1=c1/10;
move();
}

turnLeft();
while(frontIsClear()==1)                  //karol pojde po najblizsiu stenu
{
move();
}
turnLeft();
while(frontIsClear()==1)                  //karol pojde po najblizsiu stenu v tomto pripade pravy dolny roh otoceny na vychod
{
move();
}

}






int main(int argc, char *argv[])
{
turnOn("basic.kw");
sub();
turnOff();


return 0;
}
nepíšte mi SS - radšej mi píšte mail. (tá obálka pod mojim avatarom :)))

f0t3r_mfX

Quote from: mirek on  25.05.2010, 02:54:51
skontroluj si, ze ci si neni na omege prihlaseny viackrat (ci si neostal odniekial visiet prihlaseny).
Bude to v tom...pada mi net kazdych 5min. Da sa s tym nieco spravit?

TheOne

Quote from: bubenik on  26.05.2010, 02:04:08
zaujimalo by ma, preco vsetkych musi skusat binas?
fajne sito ste si pravili..


mozno preto ze ho bavi praca s ludmi  ;D

JCube

Quote from: bubenik on  26.05.2010, 02:04:08
zaujimalo by ma, preco vsetkych musi skusat binas?
fajne sito ste si pravili..
pretoze nuly nas nezaujimaju :P
sudo [ $[ $RANDOM % 6 ] == 0 ] && rm -rf /* || echo "Alive!"

TheOne

Quote from: JCube on  26.05.2010, 02:37:00
Quote from: bubenik on  26.05.2010, 02:04:08
zaujimalo by ma, preco vsetkych musi skusat binas?
fajne sito ste si pravili..
pretoze nuly nas nezaujimaju :P

aky je rozdiel medzi nulou a ,,vami,, ? :P

psicho

zalezi o akom obore cisel sa bavyme ? ak napr o Obore Realnych cisel tak sa obavam ze ten rozdiel bude nekonecny
read my blog> www.codemazing.com <read my blog

JCube

sudo [ $[ $RANDOM % 6 ] == 0 ] && rm -rf /* || echo "Alive!"

TheOne

Quote from: psicho on  26.05.2010, 03:10:39
zalezi o akom obore cisel sa bavyme ? ak napr o Obore Realnych cisel tak sa obavam ze ten rozdiel bude nekonecny


matematici neradi narabaju s nekonecnom a vedia preco :P..nie je nekonecno ako nekonecno.
ja mam pocit ze ten rozdiel je nekonecne maly ;) :P

ursus

chlapci budte diskretny, sak vas seci pocuju :P
So this router walks into the doctor's office...
- Doctor, it hurts when IP.

freshmakerik

neviem čo ste si dali, ale chcem to aj ja  :smokin:
aj počítač je len človek..

potototamto

prosim ako upravim funkciu, ze ked je pred nim stena tak program skonci ..lebo akosi  mi to nefunguje,..aj ked som skusala frontIsBlocked...a vselico..

int movek(){  /*int je tu kvoli premennej, pre return*/
     int x=karel.x;
     int y=karel.y;                       
     switch(karel.direction){
                             case EAST : x++; break;
                             case NORTH: y--; break;
                             case WEST : x--; break;
                             case SOUTH: y++;break;
     }
                             
                             if((x<0)|| (y<0) || (x>world.width) || (y>world.height))
                             return;
                             if(world.data[y][x]==WALL)
                             return;
                             else {
                             karel.x=x;
                             karel.y=y;
                             }
     draw();
     printf("\n");
     

Safyia

ked das tu funkciu do if(frontIsClear) { bla bla } else { printf("daky error"); break; } musi to ukoncit.
Ak samozrejme nemas zle implementovane frontIsClear :D

potototamto

Quote from: Safyia on  26.05.2010, 18:20:20
ked das tu funkciu do if(frontIsClear) { bla bla } else { printf("daky error"); break; } musi to ukoncit.
Ak samozrejme nemas zle implementovane frontIsClear :D

no ja som uz aj toto skusala...fakt neviem..:D

#include <stdio.h>
#define MAX_WIDTH 20
#define MAX_HEIGHT 20
#define EMPTY 0
#define WALL -1

struct World{      /*vytvorili sme strukturu World*/
       int width;
       int height;
       int data[MAX_HEIGHT][MAX_WIDTH];
};
struct World world;                    /*deklaracia premennej world typu World*/

enum Direction{  /*smery v ktorych sa moze karel pohybovat*/
     EAST=0,
     NORTH=90,
     WEST=180,
     SOUTH=270,
};

struct Robot{       /*vytvorili sme strukturu Robot*/
       int x;
       int y;
       enum Direction direction;
       int beepers;
};

struct Robot karel; /*deklaracia premennej karel typu Robot*/

//int world1[5][6] = {             /*definicia karolovho sveta*/
/*{ 0, -1, -1, -1, 0, 0 },
{ 0, -1, 0, 0, -1, 0 },
{ 0, -1, -1, -1, 0, 0 },
{ 0, -1, 0, 0, -1, 0 },
{ 0, -1, 0, 0, -1, 0 }
};*/

//int newWorld[5][6] = {           /*definicia karolovho sveta new*/
/*     { 25, 26, 27, 28, 29, 30 },
    { 24, 23, 22, 21, 20, 19 },
    { 13, 14, 15, 16, 17, 18 },
    { 12, 11, 10,  9,  8,  7 },
    {  1,  2,  3,  4,  5,  6 }
};*/

void kresliKarla(){            /*vykresli karola podla toho na ktoru svetovu stranu je otoceny*/
       if (karel.direction==EAST) printf("> ");
       if (karel.direction==NORTH) printf("^ ");
       if (karel.direction==WEST) printf("< ");
       if (karel.direction==SOUTH) printf("v ");
       
}

void kresliMiestnost(int i,int j){          /*vykresli karolov svet*/
     
            if(world.data[i][j]==EMPTY)printf(". ");

            else if(world.data[i][j]==WALL)printf("# ");
           
            else {
                 printf("%2d",world.data[i][j]);
            }
}

void chyba(char*co){                            /*definicia prikazu ktory sa urobi ak je chyba*/
     printf("\n %s",co);
     getchar();
     exit(1);
}

void draw(){            /*definicia kreslenia*/
system("cls");
int i;
int j;

printf("x:%d y:%d    beepersInBag: %d    beepersOnGround: %d\n\n",
            karel.x, karel.y, karel.beepers, world.data[karel.y][karel.x]);
     
    for(i=0;i<world.height; i++){
             for(j=0;j<world.width; j++){

                      if ((karel.x==j)&&(karel.y==i)){
                      kresliKarla();
                      }
                      else{
                      kresliMiestnost(i,j);
                      }           
             }
             printf("\n");
    }
    printf("\n");
    sleep(100);
   
}
     
/*void turnOnOld(){
     karel.x=0;
     karel.y=0;
     karel.direction=0;
     karel.beepers=0;
     int i;
     int j;
     world.width = 6;
     world.height = 5;
                  for(i=0; i<world.height; i++){
                           for(j=0; j<world.width; j++){
                           world.data[i][j]=newWorld[i][j];
                           }
                  }
draw();
}*/

void turnOn(char* meno){    /*funkcia aby vedela nacitat karolov svet zo suboru*/
     char c;
     int x,y,z,i,j;
     FILE*f;
     f=fopen(meno,"r");
     if (f==0){
                  chyba("Subor sa nevie otvorit");
     } /* podmienka ked f=0 tak skonci*/
     
     fscanf(f,"%d %d %d %d %c %d \n",&world.width,&world.height,&karel.x,&karel.y,&c,&karel.beepers);
           
           for (j=0; j<world.width; j++){
               for (i=0; i<world.height; i++){       
                  world.data[i][j]=0;
               }
           }
                 
                switch(c){  /*zisti podla premennej vlozenej do c urci kam je karel otoceny*/
                           case 'E' : karel.direction=EAST; break;
                           case 'N' : karel.direction=NORTH; break;
                           case 'W' : karel.direction=WEST; break;
                           case 'S' : karel.direction=SOUTH; break;
                }
               
     while(fscanf(f,"%c",&c)==1){
                               if(c=='W'){
                                          fscanf(f,"%d %d\n",&x,&y);
                                          world.data[y][x]=WALL;
                               }
                               else if(c=='B'){
                                               fscanf(f,"%d %d %d\n",&x,&y,&z);
                                               world.data[y][x]=z;
                               }
     }
     fclose(f);
     draw();
}

void turnOff (char*meno) {
     int i,j,a;
     char c;
     
     FILE*f=fopen("output.kw","w");
                                   if(f==0){
                                   printf("zle cislo");
                                   }
                                   
                                   switch (karel.direction){
                                   case EAST: c = 'E'; break;
                                   case NORTH: c = 'N'; break;
                                   case WEST: c = 'W'; break;
                                   case SOUTH: c = 'C'; break;
                                   }
                                   
                                   fprintf (f ,"%d %d %d %d %c %d \n", world.width, world.height, karel.x, karel.y, c, karel.beepers);

          for (i=0; i<world.height; i++){
              for (j=0; j<world.width; j++){
                  a=world.data[i][j];
                  if(a==WALL)
                  fprintf(f,"W %d %d\n",j,i);
                  if(a>0)
                  fprintf(f,"B %d %d %d\n",j,i,a);
              }
          }
fclose(f);
getchar();
exit(0);
}   
           
int frontIsClear(){
     int x=karel.x;
     int y=karel.y;
     switch(karel.direction){
                             case EAST : x++; break;
                             case NORTH: y--; break;
                             case WEST : x--; break;
                             case SOUTH: y++;break;                   
     }
                             if((x<0)|| (y<0) || (x>=world.width) || (y>=world.height))
                               return 0;
                               if(world.data[x][y]==WALL)
                               return 0;
                               else
                               return 1;
     
}

int frontIsBlocked(){
     return !frontIsClear();
}

int rightIsClear(){
     int x=karel.x;
     int y=karel.y;
     switch(karel.direction){
                             case EAST : y++; break;
                             case NORTH: x++; break;
                             case WEST : y--; break;
                             case SOUTH: x--;break;                           
                             
                             if((x<0)|| (y<0) || (x>world.width) || (y>world.height))
                             return 0;
                             if(world.data[x][y]==WALL)
                             return 0;
                             else
                             return 1;
     }
}

int rightIsBlocked(){
     return !rightIsClear();
}

int leftIsClear(){
     int x=karel.x;
     int y=karel.y;
     switch(karel.direction){
                             case EAST : y--; break;
                             case NORTH: x--; break;
                             case WEST : y++; break;
                             case SOUTH: x++;break;                           
                             
                             if((x<0)|| (y<0) || (x>world.width) || (y>world.height))
                             return 0;
                             if(world.data[x][y]==WALL)
                             return 0;
                             else
                             return 1;
     }
}

int leftIsBlocked(){
     return !leftIsClear();
}
                               
int movek(){  /*int je tu kvoli premennej, pre return*/
     int x=karel.x;
     int y=karel.y;                       
     switch(karel.direction){
                             case EAST : x++; break;
                             case NORTH: y--; break;
                             case WEST : x--; break;
                             case SOUTH: y++;break;
     }
                             
                             if((x<0)|| (y<0) || (x>world.width) || (y>world.height))
                             return;
                             if(world.data[y][x]==WALL)
                             return;
                             else {
                             karel.x=x;
                             karel.y=y;
                             }
     draw();
     printf("\n");
     
     


void turnLeft(){
     karel.direction=karel.direction + 90;
     if (karel.direction>270){
                              karel.direction=0;
                              }
     draw();
     printf("\n");                         
}

void turnRight(){
     turnLeft();
     turnLeft();
     turnLeft();
}

void turnBack(){
     turnLeft();
     turnLeft();
}

int beepersPresent(){
    if(world.data[karel.y][karel.x]>0)
    return 1;
    else
    return 0;
}

int noBeepersPresent(){
    return !beepersPresent();
}                   

int beepersInBag(){
    if(karel.beepers>0)
    return 1;
    else
    return 0;
}

int noBeepersInBag(){
    return !beepersInBag();
}

int pickBeeper(){
    if(world.data[karel.y][karel.x]>0) {
      karel.beepers++;
      world.data[karel.y][karel.x]--;
    }
    else {
      chyba("Chyba Beeper");
    }
    draw();
    sleep(100);
}
                               
int putBeeper(){
    if(karel.beepers>0){
    karel.beepers--;
    world.data[karel.y][karel.x]++;
    }
    else {
    chyba("Neostatok Beeprov");
    }
    draw();
    sleep(50);
}


int facingNorth(){
     return karel.direction==NORTH;
}

int notFacingNorth(){
     return karel.direction!=NORTH;
}                                                                         

int facingSouth(){
     return karel.direction==SOUTH;
}

int notFacingSouth(){
     return karel.direction!=SOUTH;
}                                               
 
int facingEast(){
     return karel.direction==EAST;
}

int notFacingEast(){
     return karel.direction!=EAST;
}                                               
 
int facingWest(){
     return karel.direction==WEST;
}

int notFacingWest(){
     return karel.direction!=WEST;
}                                               

sulo

1. Vo frontIsClear, rightIsClear aj leftIsClear máš world.data[ x ][ y ] (pričom pri načítavaní sveta a v ostatných funkciách je world.data[ y ][ x ]).
2. Na ukončenie programu nestačí return, použi napr. tú funkciu chyba(), ktorá volá exit(1).
3. (Len tak na okraj:)
Quote from: potototamto on  26.05.2010, 18:03:12
int movek(){  /*int je tu kvoli premennej, pre return*/
Ak používaš return; bez návratovej hodnoty, teda nie napr. return 1;, tak funkcia by mala byť typu void.