Labor, 1. hét: operációs rendszer, egyszerű programok

Pohl László, Czirkos Zoltán · 2016.08.28

Operációs rendszer, Windows parancssor alapismeretek: fájlok, parancssori argumentumok. Egyszerű C programok lefordítása, futtatása.

Bár az átlagos felhasználó nem szokta használni, a Windows is rendelkezik egy ún. parancssori felhasználói felülettel, ahogyan a Unix típusú operációs rendszerek is. Ezen a felületen különböző parancsokat begépelve lehet elvégezni az alapvető feladatokat, pl. fájlok létrehozását, listázását és törlését. A mai laboron többek között ezzel is megismerkedünk, míg a Programozás alapjai 2. tárgy a Unix parancssori felületét fogja bemutatni.

Ezen az első laboron a CodeBlocks fejlesztőkörnyezet használatának alapjait is megismerjük. Felkészülés a laborra:

1Parancssor indítása, programok indítása

A Start menü Futtatás… parancsát választva indítsd el a cmd.exe programot! (A Start menü Programok/Kellékek/Parancssor pontjára kattintva is elindul.) A továbbiakban a megjelenő konzolablakban kell dolgozni. A föl-le billentyűkkel kiválaszthatóak a korábban beírt parancsok, így nem kell egy dolgot többször begépelni.

Program indítása parancssorból

Egy program indításához csak be kell írni a nevét. Írd be:

notepad.exe

Erre elindul a Jegyzettömb, mintha a Start menüből indítottad volna.

A Windows automatikusan kiegészíti a programok nevét az ahhoz tartozó kiterjesztéssel (végződéssel, extension, .com, .exe, .bat). Így a programot a .exe kiterjesztés beírása nélkül is futtathatod. Zárd be a Jegyzettömböt, és próbáld ki így is:

notepad

Programok paraméterei

A legtöbb konzolos alkalmazás, de gyakran az ablakokat használó programok is, kaphatnak paramétereket. Próbaképp írd be az alábbi sort. Mit tapasztalsz?

notepad szoveg.txt

Egy programnak tetszőleges számú parancssori paramétere, más néven parancssori argumentuma (command line argument) lehet. Ezeket a program neve után írjuk, és szóközzel választjuk el egymástól.

Ha paraméterként fájlt adunk meg, és az útvonalban vagy a fájlnévben szóköz van, normál esetben a Windows a szóközzel elválasztott elemeket külön paraméternek tekintené. Ezért kell ilyenkor idézőjelek közé tenni azt. Pl.:

notepad "Uj szoveg.txt"

Elérési útvonal – path

Honnan tudta az előbb a Windows, hogy hol van a notepad.exe? Hiszen az is egy fájl, amit meg kell keresnie a program elindításához. Onnan, hogy van egy lista azokról a mappákról, ahol a gyakran használt programok vannak. Így nem kell mindig beírni a mappa teljes nevét. A listát így tudod kiíratni:

path

2Mappa parancsok

A kurzor az ún. prompt végén villog. Ez alapesetben az aktuális útvonalból (mappa nevéből, path) és a > jelből áll. Ezt figyeld majd, miközben dolgozol!

A mappát (folder) a parancssori parancsok a directory szóból származtatják (a mappák másik neve, magyarul könyvtár). A mappa tartalmának listázása:

dir

Az eredmény a mappa tartalma: itt további mappák, valamint fájlok lehetnek. Ha nem a legfölső szinten (a gyökérkönyvtárban) vagyunk (C:\), akkor egy . és egy .. nevű mappa (<DIR> jelzi) is látható. A . az aktuális mappát jelenti, a .. az egy szinttel feljebb lévőt. Navigálj el egy intézővel a parancssori ablakod mappájába, és hasonlítsd össze a listát az Intézőben látható tartalommal!

A dir parancsnak számos paramétere (kapcsolója) van, ezekről bővebb információ a

dir /?

paranccsal kapható. A többi parancsnak is van hasonló helpje, ezt a továbbiakban nem jelezzük külön.

Mappa váltása

Mappát váltani a chdir paranccsal, vagy ennek rövidebb változatával, a cd-vel lehet. Lépj egy szinttel feljebb:

cd ..

Lépj a gyökérkönyvtárba:

cd \

vagy

cd /

A mappák neveit a \ (fordított per vagy visszaper (backslash), AltGr+Q) választja el egymástól az elérési útvonalon. A Windows támogatja a UNIX-ból származó /-t is, a két jel bármelyikét bármikor használhatjuk. A Windows hasonlóan rugalmas a kis és nagybetűk kezelésében: a mappák és fájlok és parancsok nevében nem számít, hogy kis- ill. nagybetűről van szó (pl. notepad, Notepad, NOTEPAD, stb. egyaránt használható). Más rendszerek azonban megkülönböztetik ezeket. Informatikusként sokféle rendszerrel dolgoznod kell majd, ezért jobb, ha mindent a tényleges nevén használsz.

Menj most vissza a felhasználód saját mappájába, a lentihez hasonló módon! Az 111111 helyére a felhasználóneved kerül.

cd C:\Users\111111\

Mappa létrehozása és törlése

Mappát létrehozni az mkdir vagy md parancsokkal lehet:

md clabor

Mappát törölni az rmdir vagy rd paranccsal lehet:

rd clabor

A parancs a mappát csak akkor törli, ha az üres.

Vigyázz! Ha a következő sort írod, két mappa jön létre, egy „c” és egy „labor” nevű: md c labor. Ha „c labor” nevű mappát szeretnél, tedd idézőjelbe a nevet: md "c labor"! (Akkor is szabad idézőjelbe tenni, ha nincs benne szóköz? Próbáld ki!)

Egyes parancsoknak, mint pl. a dir-nek is, ún. wildcard-okkal megadott fájlneveket is lehet adni paraméterként. Pl. az alábbi sor csak az .exe kiterjesztésű fájlokat listázza:

cd c:\Windows
dir *.exe

A ? karakterrel egy, a * karakterrel több karaktert helyettesíthetünk a névben. Pl.: dir x*e kilistázza az x-szel kezdődő, e-re végződő fájlokat. Akár több * is lehet: dir x*py*e. A kérdőjel használata: dir C_85?.NLS.

3Be- és kimenet átirányítása

A more parancs sok dologra használható, most a begépelt szöveg ismételt megjelenítésére fogjuk. Írd be:

more

Most nem jelent meg a prompt, ami mutatja, hogy a more program éppen fut, és várja tőlünk a bemenetét. Írj be tetszőleges szöveget, és nyomd meg az Enter-t. Mi történik? Ezt többször is megismételheted. A Ctrl+Z billentyűkombinációval léphetsz ki a more-ból, vissza a parancssorba.

Jegyezd meg: a more fájl vége jelig olvas be szöveget. Ha ezzel találkozik, kilép. Ha billentyűzetről gépelsz, a Windowsban a fájl, vagyis a begépelt szöveg vége jelet a Ctrl+Z-vel lehet adni.

A konzol programokból a Ctrl+C kombinációval is ki tudsz lépni, ez az ablakozó programok jobb felső sarkában lévő × programbezárás gombnak felel meg.

Írd be:

more > szoveg.txt

Gépeld be ismét szövegeket! Mit tapasztalsz? Több sor begépelése után lépj ki a more-ból a szokásos módon! Listázd ki a mappa tartalmát! Mit tapasztalsz?

C:\WINDOWS> more > szoveg.txt
Access denied

Előfordulhat, hogy a mappa, amelyben épp vagy, írásvédett. Ekkor hibaüzenetet fogsz kapni. (Vajon miért nem engedi a gép, hogy az operációs rendszer fájljai közé írj?) Ha kell, keress másik mappát, amelyben dolgozni fogsz, pl. C:\USER\xxxxx. Kérd a laborvezető segítségét!

Írd be:

more < szoveg.txt

Most mit látsz? Figyeld meg, hogy most nem kellett Ctrl+Z-t írni a kilépéshez, mert a more a szoveg.txt fájl tartalmát jelenítette meg.

Magyarázat: A konzolos programok a felhasználókkal a szabványos bemenet (standard input) és a szabványos kimenet (standard output) segítségével kommunikálnak. A szabványos bemenet alapértelmezés szerint a billentyűzet, a szabványos kimenet pedig a képernyő. Ezek azonban, a fenti módon, átirányíthatók. A programok nem is tudják, hogy valójában honnan olvasnak és hová írnak, billentyűzetről/képernyőre, vagy fájlból/fájlba.

Tipp: ha egy régebben beírt parancshoz hasonlót szeretnél újra beírni, akkor a felfelé nyíl billentyűt használva visszakeresheted a régebben beírt sorokat.

more >> szoveg.txt

parancsot írod, a szoveg.txt fájl végéhez fűzi az újonnan beírt szöveget (egy > esetén törli a korábbi szoveg.txt-t, ha volt olyan). Ha nem létezett a szoveg.txt, mindkét esetben létrehozza.

A programoknak a szabványos kimenet mellett van egy szabványos hibakimenete is, a hibaüzeneteket ide szokták írni. Alapértelmezés szerint ez is a képernyőre kerül kiírásra. Ha a program kimenetét átirányítjuk, pl. more nincsilyen.txt > szoveg.txt, és a more valami hibaüzenetet szeretne közölni, akkor a hibaüzenet továbbra is a képernyőn jelenik meg, nem kerül a fájlba. Ha a hibaüzenetet szeretnénk fájlba írni, akkor azt a 2> átirányítással adhatod meg:

more 2> hiba.txt

Megjegyzés. A konzol ablakban nem működik a Ctrl+C másolás és Ctrl+V beillesztés (emlékezzünk, hogy a Ctrl+C a programok leállítására használható). A konzol ablak keretére jobb egérgombbal klikkelve a Szerkesztés menüpontban találod meg a keresett funkciókat. A Megjelölést kiválasztva egérrel tudod kijelölni a vágólapra másolandó szövegrészt, a másolás maga a kijelölés után az Enter leütésével történik. Ugyancsak ebben a menüben, a Tulajdonságok pont alatt tudjuk megváltoztatni például a konzolablak méretét (alapértelmezés szerint 80×25 karakter).

Tipp: ha egy meglévő fájl nevét nem szeretnéd végig begépelni, akkor kezdd el az első pár betűvel, és utána nyomd meg a Tab billentyűt. Erre a Windows parancssora ki fogja egészíteni a fájlnevet. Pl. a szoTab olyan lesz, mintha beírtad volna, hogy szoveg.txt.

Windows pipe

Írd be, hogy

cd c:/Windows/System32
dir

Túl sok fájl neve került kiírásra. A more parancs igazi funkciója, hogy egy szöveget képernyőnyi részekre osztva jelenítsen meg. Használd ezt a mappa tartalmának kilistázására (a | az AltGr+W kombinációval érhető el):

dir | more

A bemutatott módszer a csővezeték (pipe): az egyik program kimenete adja a másik program bemenetét, vagyis ezúttal is a szabványos kimenet és bemenet átirányításáról van szó.

A more programban szóköz-t leütve egy képernyőnyivel tovább haladhatsz. Ha csak egy sornyit akarsz léptetni, üss Enter-t! Kilépni a Q billentyű lenyomásával lehet.

4A Code::Blocks fejlesztőkörnyezet

Az integrált fejlesztőkörnyezetek (integrated development environment, IDE) a programok fejlesztését – készítését, tesztelését, hibakeresését segítő programok. A C nyelv szabványos és elterjedt volta miatt rengeteg ilyen készült hozzá. A Prog1 tárgyban az ajánlott fejlesztőkörnyezet a Code::Blocks nevű, ingyenesen letölthető szoftver, ami megtalálható a HSzK gépein is.

Indítsd el a Code::Blocks programot! Válaszd ki a File menü New/Project… menüpontját! Az alábbi ábrákon látható módon folytasd a projekt létrehozását! Figyelj minden részletre!

  • A projekt típusának válaszd ki a Console application-t. Nyomd meg a Go gombot.
  • A következő oldalon a programozási nyelvet kell megadnod. Ez legyen a C.
  • Ezután arról érdeklődik a Code::Blocks, hogy mi legyen a projekt neve. Írd be, hogy „elso”. Alatta kell beállítanod azt a mappát, ahol a projekt fájlok tárolódnak. Ha ez üresen van hagyva, akkor válaszd ki a ... gombot megnyomva a Dokumentumok mappádat. (Jegyezd meg a mappa elérési útját!) Fontos: a projekt mappa neve, se elérési útja ne tartalmazzon se ékezetes betűket, se szóközt!
  • A negyedik ablakban a fordítóprogramot lehet megadni. Ha nem a „GNU GCC Compiler” van kiválasztva, akkor válaszd azt, továbbá ha a „Create "Debug" configuration” nem lenne beikszelve, akkor azt javítsd ki. De ezek így szoktak lenni.
  • Ezzel létre is jött a projekt. A bal oldalon, a „Management” résznél láthatóak a hozzá tartozó fájlok. A „Sources” mappát kinyitva megtalálod a fő programmodult, a main.c-t. Ebben egy helló világ program van. Fontos: a megadott mappanév ne tartalmazzon ékezetes betűket! Sok program ezeket nem szereti.
  • Az AltGr-probléma

    Előfordulhat, hogy a Code::Blocks Windowson az AltGr+G billentyűkombinációra a magyar billentyűzeten ] karakter írása helyett a „Go to function” ablakot nyitja meg. Ennek az a szerencsétlen oka, hogy a Windows nem különbözteti meg az AltGr-t a Ctrl+Alt együttes megnyomásától. Próbáld ki a programkódnál! Ha így tesz, ez a Settings/Editor… menüpont alatt a gyorsbillentyű kikapcsolható:

5Helló Világ

A Code::Blocks eleve úgy hozta létre a projektet, hogy egy egyszerű helló világ programot tett bele. Ha másik fejlesztőkörnyezetet használsz, akkor másold be ezt a C programot (kettőt kattintva a kódra kijelölheted az egészet):

#include <stdio.h>

int main(void)
{
    printf("Hello world!\n");
    return 0;
}

Figyeld meg a szövegszerkesztőben a kódot: ki van színezve. Mely szavak színesek? Vajon miért jó ez a szolgáltatás? Áttekinthetőbb a kód, segít észrevenni bizonyos elgépeléseket. Sok környezet az összetartozó zárójelpárokat is kiemeli.

A futtatható program

A fejlesztőkörnyezet által létrehozott saját program ugyanúgy működik, mint a többi parancssori alkalmazás: tartozik hozzá egy .exe fájl, és fájlba irányítható ennek is a kimenete. A programodat a „Build and run” (zöld play gomb + sárga fogaskerék) gombra kattintva indíthatod el, vagy a Build/Build and run menüpontot választva. Ilyenkor előbb lefordítja a gép, és aztán el is indítja. Ennek eredménye így kell kinézzen.

Keresd meg a lefordított programot a számítógépen! Ez valahol abban a mappában lesz, amelyiket kiválasztottad a projekt létrehozásánál.

Nyiss egy parancssori ablakot (cmd), és a tanult módon navigálj el ebbe a mappába. A main.c mellett néhány másik fájlt is fogsz találni. Lesz egy bin nevű mappa is, azon belül pedig a Debug. És még azon belül – ott a lefordított program, az elso.exe. Indítsd el!

A lefordított program egy fájl, amely tartalmazza azokat a számítógépnek szóló utasításokat, amelyek végül kiírják a kívánt szöveget; és még egy sor egyéb dolgot, amelyek az operációs rendszernek kellenek. Az ilyet futtathatónak szokás nevezni (vagy a szakzsargonban binárisnak, binary). Ilyen fájlokat tartalmaznak a programok telepítői is (installer). A lefordított program emberi fogyasztásra már alkalmatlan. Próbáld meg kiíratni a tartalmát a type (Linuxon: cat) paranccsal, látni fogod.

Tipp: ha nem emlékszel a mappa nevére, meg tudod keresni. A Code::Blocks az ablakának bal oldalán sorolja fel a projekthez rendelt fájlokat, a „Management/Project” sávon. Itt van a main.c nevű is. Jobb klikk, „Properties…”: a „File name (absolute)” résznél látod a fájl teljes elérési útját, mappákkal együtt:

  • C:\Documents and Settings\Név\Dokumentumok... – Windows XP.
  • C:\Users\Név\... – Windows 7.
  • /home/név/... – Linux.

A fejlesztőkörnyezet fájljai

Vizsgáld meg a projekt mappájában lévő többi fájlt is! Főként a main.c-t és az elso.cbp-t (ez függ a projekted nevétől). Ez megnyitható a Jegyzettömbbel is (notepad elso.cbp).

A main.c a programodat tartalmazza:

main.c
#include <stdio.h>

int main(void)
{
    printf("Hello world!\n");
    return 0;
}

Az elso.cbp projektfájl pedig a projekt leírását, adatait. Ezt a CodeBlocks kezeli automatikusan, nem az a programkód van benne, amit te írtál:

elso.cbp
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
    <FileVersion major="1" minor="6" />
    <Project>
        <Option title="elso" />
        <Option pch_mode="2" />
        <Option compiler="gcc" />
...

Megjegyzés. A windowsos fájlkezelő (Intéző) alapbeállítás szerint nem mutatja a fájlok kiterjesztését (main.c helyett csak main jelenik meg). Ez ugyan az irodai munkát lehet, hogy segíti, de a programozói munkát semmiképp. Javasoljuk, hogy a saját gépeden majd állítsd be, hogy ne így legyen.

A kimenet átirányítása

Irányítsd át a fent látott módon, a > karakterrel a programod kimenetét egy hello.txt nevű fájlba! Írasd ki a keletkező szövegfájlt a type paranccsal!

Láthatod, hogy a programod ugyanúgy viselkedik, mint a többi parancssori program – alapértelmezés szerint a konzol ablakba kerül a kimenete, de kérésre át is lehet irányítani azt fájlba. Ezt az operációs rendszer intézi, és a programot nem kell módosítani hozzá. Ezek a konzolos, vagy más néven parancssori programok; a projekt létrehozásánál éppen azt adtuk meg a típussal, hogy ilyet szeretnénk írni.

6A tartály

Tartály

Feladat: írj programot, amely segít kiszámolni a felhasználónak, hogy hány doboz festéket kell vennie a lábakon álló tartály festéséhez! Ehhez használnod kell majd az első előadásokon tanultakat: a változódefiníciót, a szám beolvasását és a kiírást.

A tartálynak ismerjük a magasságát és az átmérőjét. Mindenhol le kell festeni, az oldalát, a tetejét és az alját is. Tudjuk azt is, hogy egy doboz festék 2 m2 felület lefestéséhez elegendő.

Tartaly festese

Milyen magas? 2
Mennyi az atmeroje? 1.2

4.900885 doboz festek kell.

Figyelj arra, hogy a program kódjában tizedesvessző helyett tizedespontot kell használni (pl. 3.14), ugyanígy a bemenet megadásánál is. Ha nem jön ki a fenti eredmény, gondold át, helyes-e a képlet, amit használsz.

A kiírás formátuma

A felhasználónak nem túl hasznos információ, ha milliomod dobozokkal számolunk. Kerekítsd ezért az eredményt egy tizedesjegyre: a printf-ben a %f-et módosítsd %.1f-re. Ez azt jelenti, hogy a tizedespont után egyetlen számjegy fog megjelenni.

4.9 doboz festek kell.

Megoldás

#include <stdio.h>

int main(void) {
    double atmero, magas;
    double sugar, doboz;

    printf("Tartaly festese\n\n");
    printf("Milyen magas? ");
    scanf("%lf", &magas);
    printf("Mennyi az atmeroje? ");
    scanf("%lf", &atmero);

    sugar=atmero/2;
    doboz=(2*sugar*sugar*3.14159265 + magas*2*sugar*3.14159265) / 2;

    printf("\n%.1f doboz festek kell.\n", doboz);

    return 0;
}

7\n és %d

Indulj ki egy Helló, világ programból. Írd át így a programodban a kiírt szöveget:

printf("Hello\nworld\n\n!");

Mit tapasztalsz? És ha így írod át a szöveget, ékezetekkel?

printf("Helló világ!");

Sajnos Windowson az ékezetes betűket tartalmazó szövegek másképp jelennek meg egy menüs-grafikus programokban, mint a parancssorban. Ennek okáról majd lesz szó. Egyelőre egyszerűbb ékezet nélküli szöveget használni: Hello vilag!

Két \\ karaktert használva mit látsz?

printf("Hello world!\\n");

A visszaper \ speciális karakter az idézőjelek között megadott "szövegekben": ezzel kell megjelölni a fordítóprogram számára a különleges karaktereket, pl. a sortörést. Mivel így ennek a karakternek jelentése van, ha magát a visszapert \ szeretnénk a szövegben szerepeltetni, kétszer írjuk egymás után. Hasonló a helyzet a printf()-nél a százalék % karakter esetén, amely a változók helyeit jelöli meg; azzal a különbséggel, hogy a \-eket még a fordító dolgozza fel, a %-okat pedig már a program futása közben a printf(). Erről később részletesen lesz még szó.

Írd ki darabonként egyetlen printf() utasítással az alábbi szövegeket!

  /
 /
/
\
 \
  \
A printf("hello\n") kiirja, hogy "hello",
es kezd egy uj sort.
A "%d" segitsegevel egy valtozo erteket
tudjuk kiirni.

Megoldás

#include <stdio.h>

int main(void) {
    printf("  /\n /\n/\n");
    printf("\\\n \\\n  \\\n");
    printf("A printf(\"hello\\n\") kiirja, hogy \"hello\",\nes kezd egy uj sort.\n");
    printf("A \"%%d\" segitsegevel egy valtozo erteket\ntudjuk kiirni.\n");

    return 0;
}

8További feladatok

Ha elkészültél, folytasd a feladatgyűjtemény ehhez a témakörhöz kapcsolódó feladataival!