Informatika2-2012/Hazi05

A MathWikiből
(Változatok közti eltérés)
(Új oldal, tartalma: „== Csomagszállító szalag szimulátor == A repülőtereken szokott lenni olyan körbe-körbe menő futószalag amin a csomagok vannak. Ilyet kell modellezni egy C pr…”)
 
(Csomagszállító szalag szimulátor)
 
(egy szerkesztő 4 közbeeső változata nincs mutatva)
1. sor: 1. sor:
 
== Csomagszállító szalag szimulátor ==
 
== Csomagszállító szalag szimulátor ==
 +
 +
'''A határidő az ünnep miatt márc. 19 hétfő.'''
  
 
A repülőtereken szokott lenni olyan körbe-körbe menő futószalag amin a csomagok vannak. Ilyet kell modellezni egy C programmal.
 
A repülőtereken szokott lenni olyan körbe-körbe menő futószalag amin a csomagok vannak. Ilyet kell modellezni egy C programmal.
  
 
A futószalag 10 rekeszre legyen osztva (a szalagot reprezentálja egy 10 elemű, egészeket tartalmazó tömb).  
 
A futószalag 10 rekeszre legyen osztva (a szalagot reprezentálja egy 10 elemű, egészeket tartalmazó tömb).  
A csomagokat csak egy azonosítóval lejöljük a tömbben (egy egész szám, 1-től kezdve egyszesével növekedően kiosztva). Ha valahol nincs csomag, akkor ott 0 érték szerepel a tömbben.
+
A csomagokat csak egy azonosítóval jelöljük a tömbben (egy egész szám, 1-től kezdve egyesével növekedően kiosztva - az azonosítők megfelelő kiosztása is a feladat része). Ha valahol nincs csomag, akkor ott 0 érték szerepel a tömbben.
  
 
Van egy speciális hely ahol az új csomagok a szalagra kerülnek. Ennek az aktuális helyét egy mutató jelölje, ezt kell léptetni a szalag forgatása helyett (az int tömb elemeinek mozgatása helyett). Írj egy függvényt ami ezt a mutatót lépteti eggyel, úgy, hogy ha a tömb utolsó elemére mutat akkor a léptetés után az első elemre mutasson. (A mutató kezdetben mutasson a 0. elemre.)
 
Van egy speciális hely ahol az új csomagok a szalagra kerülnek. Ennek az aktuális helyét egy mutató jelölje, ezt kell léptetni a szalag forgatása helyett (az int tömb elemeinek mozgatása helyett). Írj egy függvényt ami ezt a mutatót lépteti eggyel, úgy, hogy ha a tömb utolsó elemére mutat akkor a léptetés után az első elemre mutasson. (A mutató kezdetben mutasson a 0. elemre.)
14. sor: 16. sor:
 
* l - Lépteti a futószalagot (illetve gyakorlatilag a mutatót), és kiírja hogy "lep"
 
* l - Lépteti a futószalagot (illetve gyakorlatilag a mutatót), és kiírja hogy "lep"
 
* p - Kiírja az állapotot (a lenti példán látható módon)
 
* p - Kiírja az állapotot (a lenti példán látható módon)
* k''n'' - Kiveszi a csomagot az ''n''-edik rekeszből (''n'' egy szám 0 és 9 között) ha van ott csomag és hozzáférhető a rekesz. Ezesetben kiírja az azonosítóját a lenti példában látható módon ("kiveve: x"). Ha a "bejövő" helyet kijelölő mutató is éppen ide mutat, ahonnan kivennénk a csomagot, akkor kiírja hogy "most nem hozzaferheto!" a rekesz vagyis nem lehet kivenni a csomagot. Ha hozzáférhető a rekesz de nincs a kért helyen csomag, akkor kiírjha hogy "semmi sincs ott".
+
* k''n'' - Kiveszi a csomagot az ''n''-edik rekeszből (''n'' egy szám 0 és 9 között) ha van ott csomag és hozzáférhető a rekesz. Ezesetben kiírja az azonosítóját a lenti példában látható módon ("kiveve: x"). Ha a "bejövő" helyet kijelölő mutató is éppen ide mutat, ahonnan kivennénk a csomagot, akkor kiírja hogy "most nem hozzaferheto!" a rekesz vagyis nem lehet kivenni a csomagot. Ha hozzáférhető a rekesz de nincs a kért helyen csomag, akkor kiírha hogy "semmi sincs ott".  Ha a felhasználó csak 'k' parancsot ír, szám nélkül, akkor írja ki a "mondd meg honnan vegyuk ki!" üzenetet és várjuk a következő parancsot.
 
* x - kilép a program (while ciklus vége)
 
* x - kilép a program (while ciklus vége)
  
 +
Nem kell hibakezelést írni, vagyis nem kell felkészülni azokra az esetekre amikor hibás parancsot (nem megfelelő karaktert, illetve nem egy darab egész számot a 'k' után) kap a program.
  
 
Egy példa futtatás be-és kimenete (az egy vagy kétbetűs sorok a parancsok amiket be kell gépelni, a többit ezekre válaszul a program írja ki):
 
Egy példa futtatás be-és kimenete (az egy vagy kétbetűs sorok a parancsok amiket be kell gépelni, a többit ezekre válaszul a program írja ki):
70. sor: 73. sor:
 
     u
 
     u
 
     uj: 7
 
     uj: 7
 +
    k
 +
    mondd meg honnan vegyuk ki!
 
     p
 
     p
 
     allapot:  
 
     allapot:  
98. sor: 103. sor:
 
       |                 
 
       |                 
 
     x
 
     x
 +
 +
 +
Egy szép megoldás legalább 5 függvényt tartalmaz, a vezérlő parancsokhoz egyet-egyet (kivéve a kilépést), és a tömb kezdeti 0-kkal feltöltéséhez is egyet (hogy a szalag üresen induljon).
 +
 +
==== Segítség ====
 +
 +
* Megadjuk azt a függvényt ami a '0'-'9' számkaraktereket egész értékké alakítja (ez kell a 'k'-val kezdődő parancsok értelmezéséhez):
 +
<c>
 +
int atalakit(char c) {
 +
    return (int)(c - '0');
 +
}
 +
</c>
 +
* A szalag tömbje és a mutató lehetnek globális változók. És lehet hogy kell még egy valaminek globális változó.
 +
* A szalag állapotának kiírásához 3 sor kell, ez 3 ciklus egymás után. Az utolsó kettőben a tömb elemeinek a címét kell a mutatóhoz hasonlítgatni a nyíl kirajzolásához.
 +
* A main() függvény kezdődhet pl. így:
 +
<c>
 +
int main() {
 +
    /* itt ne felejtsd el kiüriteni a szalagot használat előtt */
 +
    char parancs[3];  /* max 2 karakteras parancsok lesznek, plusz a lezáró '\0' */
 +
    parancs[0] = '\0';  /* kezdetben nincs parancs */
 +
    /* praktikus ha kiírja a program hogy hogy lehet használni */
 +
    printf("parancsok: \n l - lep \n p - kiir \n kn - kivesz n-edik helyrol \n u - uj csomag \n x - kilep\n");
 +
 +
    /* ez a fő ciklus */
 +
    while (parancs[0] != 'x') {
 +
        scanf("%s", parancs);
 +
 +
        /* a parancs[0] - beli karakternek megfelelően függvényhívások, a függvények majd módosítják a szalag állapotát */
 +
 +
    }
 +
    return 0;
 +
}
 +
</c>

A lap jelenlegi, 2012. március 10., 12:01-kori változata

Csomagszállító szalag szimulátor

A határidő az ünnep miatt márc. 19 hétfő.

A repülőtereken szokott lenni olyan körbe-körbe menő futószalag amin a csomagok vannak. Ilyet kell modellezni egy C programmal.

A futószalag 10 rekeszre legyen osztva (a szalagot reprezentálja egy 10 elemű, egészeket tartalmazó tömb). A csomagokat csak egy azonosítóval jelöljük a tömbben (egy egész szám, 1-től kezdve egyesével növekedően kiosztva - az azonosítők megfelelő kiosztása is a feladat része). Ha valahol nincs csomag, akkor ott 0 érték szerepel a tömbben.

Van egy speciális hely ahol az új csomagok a szalagra kerülnek. Ennek az aktuális helyét egy mutató jelölje, ezt kell léptetni a szalag forgatása helyett (az int tömb elemeinek mozgatása helyett). Írj egy függvényt ami ezt a mutatót lépteti eggyel, úgy, hogy ha a tömb utolsó elemére mutat akkor a léptetés után az első elemre mutasson. (A mutató kezdetben mutasson a 0. elemre.)

A szimulátor programot néhány egyszerű paranccsal kell vezérelni:

parancsok egy vagy két karakteres stringek (egy while ciklusban scanf()-fel kérjétek be őket):

  • u - Új csomag oda ahová a "bejövő" mutató mutat, de csak ha üres ott a rekesz(különben "ott mar van csomag!" üzenetet ír ki). A csomag sorszáma legyen eggyel nagyobb mint az eddigi utolsó csomagé volt. Sikeres csomag-kiadás esetén kiírja hogy "uj:" és a kiosztott azonosítót.
  • l - Lépteti a futószalagot (illetve gyakorlatilag a mutatót), és kiírja hogy "lep"
  • p - Kiírja az állapotot (a lenti példán látható módon)
  • kn - Kiveszi a csomagot az n-edik rekeszből (n egy szám 0 és 9 között) ha van ott csomag és hozzáférhető a rekesz. Ezesetben kiírja az azonosítóját a lenti példában látható módon ("kiveve: x"). Ha a "bejövő" helyet kijelölő mutató is éppen ide mutat, ahonnan kivennénk a csomagot, akkor kiírja hogy "most nem hozzaferheto!" a rekesz vagyis nem lehet kivenni a csomagot. Ha hozzáférhető a rekesz de nincs a kért helyen csomag, akkor kiírha hogy "semmi sincs ott". Ha a felhasználó csak 'k' parancsot ír, szám nélkül, akkor írja ki a "mondd meg honnan vegyuk ki!" üzenetet és várjuk a következő parancsot.
  • x - kilép a program (while ciklus vége)

Nem kell hibakezelést írni, vagyis nem kell felkészülni azokra az esetekre amikor hibás parancsot (nem megfelelő karaktert, illetve nem egy darab egész számot a 'k' után) kap a program.

Egy példa futtatás be-és kimenete (az egy vagy kétbetűs sorok a parancsok amiket be kell gépelni, a többit ezekre válaszul a program írja ki):

   p
   allapot: 
    0 0 0 0 0 0 0 0 0 0
    ^                  
    |                  
   l
   lep
   u
   uj: 1
   l
   lep
   u
   uj: 2
   l
   lep
   u
   uj: 3
   u
   ott mar van csomag!
   l
   lep
   l
   lep
   u
   uj: 4
   p
   allapot: 
    0 1 2 3 0 4 0 0 0 0
              ^        
              |        
   k5
   most nem hozzaferheto!
   l
   lep
   k5
   kiveve: 4
   l
   lep
   u
   uj: 5
   u
   ott mar van csomag!
   l
   lep
   u
   uj: 6
   l
   lep
   u
   uj: 7
   k
   mondd meg honnan vegyuk ki!
   p
   allapot: 
    0 1 2 3 0 0 0 5 6 7
                      ^
                      |
   k9
   most nem hozzaferheto!
   k1
   kiveve: 1
   k1
   semmi sincs ott
   l
   lep
   p
   allapot: 
    0 0 2 3 0 0 0 5 6 7
    ^                  
    |                  
   u
   uj: 8
   l
   lep
   p
   allapot: 
    8 0 2 3 0 0 0 5 6 7
      ^                
      |                
   x


Egy szép megoldás legalább 5 függvényt tartalmaz, a vezérlő parancsokhoz egyet-egyet (kivéve a kilépést), és a tömb kezdeti 0-kkal feltöltéséhez is egyet (hogy a szalag üresen induljon).

Segítség

  • Megadjuk azt a függvényt ami a '0'-'9' számkaraktereket egész értékké alakítja (ez kell a 'k'-val kezdődő parancsok értelmezéséhez):
int atalakit(char c) {
    return (int)(c - '0');
}
  • A szalag tömbje és a mutató lehetnek globális változók. És lehet hogy kell még egy valaminek globális változó.
  • A szalag állapotának kiírásához 3 sor kell, ez 3 ciklus egymás után. Az utolsó kettőben a tömb elemeinek a címét kell a mutatóhoz hasonlítgatni a nyíl kirajzolásához.
  • A main() függvény kezdődhet pl. így:
int main() {
    /* itt ne felejtsd el kiüriteni a szalagot használat előtt */
    char parancs[3];  /* max 2 karakteras parancsok lesznek, plusz a lezáró '\0' */
    parancs[0] = '\0';  /* kezdetben nincs parancs */
    /* praktikus ha kiírja a program hogy hogy lehet használni */
    printf("parancsok: \n l - lep \n p - kiir \n kn - kivesz n-edik helyrol \n u - uj csomag \n x - kilep\n");
 
    /* ez a fő ciklus */
    while (parancs[0] != 'x') {
        scanf("%s", parancs);
 
        /* a parancs[0] - beli karakternek megfelelően függvényhívások, a függvények majd módosítják a szalag állapotát */
 
    }
    return 0;
}
Személyes eszközök