IMPERATÍV PROGRAMOZÁS Bánsághi Anna anna.bansaghi@mamikon.net 4. ELŐADÁS - ADATFOLYAMOK KEZELÉSE 2014 Bánsághi Anna 1 of 35
TEMATIKA I. ALAPFOGALMAK, TUDOMÁNYTÖRTÉNET II. IMPERATÍV PROGRAMOZÁS Imperatív paradigma Procedurális paradigma Generikus paradigma III. STRUKTÚRÁLT PROGRAMOZÁS Moduláris paradigma Objektumorientált paradigma 2014 Bánsághi Anna 2 of 35
II. IMPERATÍV PROGRAMOZÁS IMPERATÍV PARADIGMA 1. Jelkészlet 2. Lexikális elemek 3. Utasítások, vezérlési szerkezetek 4. Elemi és összetett típusok 5. Programozási tételek 6. Adatfolyamok kezelése 2014 Bánsághi Anna 3 of 35
6. ADATFOLYAMOK KEZELÉSE az adatfolyam nem feltétlenül struktúrált adatok összefüggő, azok sorrendjét megtartó halmaz, mely írható és olvasható pl.: konzol képernyő, billentyűzet, fájl, hálózati csatorna a nyelv az adatfolyamokat hasonló módon kezeli, ugyanazon műveletek (írás, olvasás) és hasonló viselkedés várható el 2014 Bánsághi Anna 4 of 35
ADATFOLYAMOK MŰVELETEI adatfolyamokból egyenként olvashatunk ki adatokat Read egyetlen karakter olvasása ReadLine egyetlen sor olvasása ReadBlock adott számú karakter olvasása adatfolyamokba egyenként írhatunk adatokat Write egyetlen karakter írása WriteLine egyetlen sor írása WriteBlock adott számú karakter írása 2014 Bánsághi Anna 5 of 35
VÉGJELIG TÖRTÉNŐ FELDOLGOZÁS ha tetszőleges számú adatot akarunk elemenként feldolgozni, akkor az olvasást végezhetjük egy adott végjelig általában a végjelet már nem akarjuk feldolgozni, ezért ellenőriznünk kell, hogy végjelet olvastunk-e be előreolvasás + elöltesztelő ciklus hátultesztelő ciklus 2014 Bánsághi Anna 6 of 35
ELŐREOLVASÁSI TECHNIKA Beolvas( adat ) ciklus amíg adat!= végjel Feldolgoz( adat ) Beolvas( adat ) ciklus vége HÁTULTESZTELŐ CIKLUSOS TECHNIKA ciklus eleje Beolvas( adat ) Feldolgoz( adat ) ciklus amíg adat!= végjel 2014 Bánsághi Anna 7 of 35
ADATFOLYAM FAJTÁK konzol képernyő és billentyűzet szekvenciális fájlok 2014 Bánsághi Anna 8 of 35
KONZOL KÉPERNYŐ ÉS BILLENTYŰZET Olvassunk be a billentyűzetről egy sort, majd írjuk ki a képernyőre using System; namespace KonzolAlkalmazasok { public class Pelda { public static void Main() { string bemenet = Console.ReadLine(); Console.WriteLine( "be: " + bemenet ); 2014 Bánsághi Anna 9 of 35
Olvassunk be a billentyűzetről egy sort, majd írjuk ki a képernyőre, hogy valós szám volt-e Használjuk a TryParse metódust public static void Main() { string bemenet; double valos; bemenet = Console.ReadLine(); if( double.tryparse( bemenet, out valos )) { Console.WriteLine( "Valós számot adtál meg: {0", valos ); else { Console.WriteLine( "Nem valós számot adtál meg" ); 2014 Bánsághi Anna 10 of 35
Olvassunk be a billentyűzetről egy sort. Ha egész számot kaptunk, akkor írjuk ki a rákövetkezőjét Szüntessük meg az előző példában használt bemenet nevű változót public static void Main() { int szam; if( int.tryparse( Console.ReadLine(), out szam )) { Console.WriteLine( ++szam ); else { Console.WriteLine( "Nem egész számot adtál meg" ); 2014 Bánsághi Anna 11 of 35
Olvassunk be karakterenként a billentyűzetről az ENTER leütéséig, és írjuk is ki elemenként Használjuk az előreolvasási technikát public static void Main() { ConsoleKeyInfo billentyu = Console.ReadKey(); while( billentyu.key!= ConsoleKey.Enter ) { Console.WriteLine( " és tényleg: {0", billentyu.keychar ); billentyu = Console.ReadKey(); 2014 Bánsághi Anna 12 of 35
Olvassunk be karakterenként a billentyűzetről az ENTER leütéséig, és írjuk is ki elemenként Használjuk a hátultesztelő ciklusos technikát public static void Main() { ConsoleKeyInfo billentyu; do { billentyu = Console.ReadKey(); Console.WriteLine( " és tényleg: {0", billentyu.keychar ); while (billentyu.key!= ConsoleKey.Enter ); 2014 Bánsághi Anna 13 of 35
Írjuk ki a beolvasott szám rákövetkezőjét. Ha nem számot ad meg a felhasználó, akkor kérjük be újra Az ellenőrzéshez használjuk az előreolvasási technikát public static void Main() { int szam; Console.WriteLine( "Kérek egy számot" ); bool megfelelo = int.tryparse( Console.ReadLine(), out szam ); while(! megfelelo ) { Console.Clear(); Console.WriteLine( "Kérek egy számot" ); megfelelo = int.tryparse( Console.ReadLine(), out szam ); Console.WriteLine( ++szam ); 2014 Bánsághi Anna 14 of 35
Írjuk ki a beolvasott szám rákövetkezőjét. Ha nem számot ad meg a felhasználó, akkor kérjük be újra Az ellenőrzéshez használjuk a hátultesztelő ciklusos technikát public static void Main() { int szam; do { Console.Clear(); Console.WriteLine( "Kérek egy számot" ); while(! int.tryparse( Console.ReadLine(), out szam )); Console.WriteLine( ++szam ); 2014 Bánsághi Anna 15 of 35
Adjuk meg, hogy hány páros számot olvastunk a bemenetről, a beolvasás végjele a 0 A Számlálás programozási tételhez használjuk az előreolvasási technikát public static void Main() { int szam; int.tryparse( Console.ReadLine(), out szam ); int darab = 0; while( szam!= 0 ) { if( szam % 2 == 0 ) { ++darab; int.tryparse( Console.ReadLine(), out szam ); Console.WriteLine( "A számok közül {0 páros volt", darab ); 2014 Bánsághi Anna 16 of 35
SZEKVENCIÁLIS FÁJLOK hasonlóan tudunk írni és olvasni, mint konzol képernyő vagy billentyűzet esetén a billentyűzetről olvasás helyett egy előre rögzített tartalmat olvasunk be, és dolgozunk fel a képernyőre írás helyett egy újonnan létrehozott fájlba írunk a fájl típusa szerint sokféle lehet: szöveges, bináris, összetett ha az adatokat sorban olvassuk és sorban írjuk, akkor szekvenciális fájlról beszélünk 2014 Bánsághi Anna 17 of 35
SZEKVENCIÁLIS FÁJLOK VÉGJELEI az elemenkénti feldolgozáshoz meg kell tudnunk különböztetni a fájl elemeit minden fájl végén van egy minden sor végén van egy fájl vége sor vége (EOF) végjel (EOL) végjel 2014 Bánsághi Anna 18 of 35
fizikai fájl FÁJLOK A HÁTTÉRTÁRON ÉS A PROGRAMBAN a háttértáron, elérési útvonallal adott tartalom logikai fájl a programkódban, adott típusú változó értéke a programban a fizikai és a logikai fájlt össze kell rendelni 2014 Bánsághi Anna 19 of 35
LOGIKAI FÁJLTÍPUSOK a fájlkezelés szabványos könyvtára a System.IO általában megkülönböztetjük egymástól a kizárólag írható, a kizárólag olvasható és a módosítható fájlokat System.IO.FileStream System.IO.StreamReader System.IO.StreamWriter tetszőlegesen paraméterezhető olvasható fájl írható fájl 2014 Bánsághi Anna 20 of 35
A FELDOLGOZÁS LÉPÉSEI 1. Fizikai és logikai fájl összerendelése 2. Fizikai fájl megnyitása a logikai fájlon keresztül 3. Fizikai fájl feldolgozása a logikai fájlon keresztül 4. Fizikai fájl bezárása a logikai fájlon keresztül 2014 Bánsághi Anna 21 of 35
SYSTEM.IO.FILESTREAM szekvenciális fájlok byte-onkénti feldolgozásának típusa FÁJL HOZZÁFÉRÉSI MÓDOK az összerendelés során megadható a fájl hozzáférési módja Read Write ReadWrite adatok kizárólag olvasáshatók a fájlból adatok kizárólag írhatók a fájlba adatok írhatók és olvasáshatók a fájlból 2014 Bánsághi Anna 22 of 35
FÁJL ÜZEMMÓDOK az összerendelés során megadható a fájl üzemmódja Append létező fájl megnyitása úgy, hogy a soron következő írás a fájl végére történik Create fájl létrehozása, ha létezik, akkor törlése és újralétrehozása CreateNew fájl létrehozása, ha létezik, akkor kivétel váltódik ki Open létező fájl megnyitása OpenOrCreate ha nem létezik a fájl, akkor létrehozása, ha létezik, akkor megnyitása Truncate létező fájl megnyitása és tartalmának törlése 2014 Bánsághi Anna 23 of 35
A fájl feldolgozásának négy lépése using System.IO;... public static void Main() { string fajl = "adat.txt"; FileStream fs; if( File.Exists( fajl )) { Console.WriteLine( "Létezik a fájl" ); fs = new FileStream( fajl, FileMode.Open, FileAccess.ReadWrite ); else { Console.WriteLine( "Mostanáig nem létezett a fájl" ); fs = new FileStream( fajl, FileMode.CreateNew, FileAccess.Write ); fs.close(); 2014 Bánsághi Anna 24 of 35
EGYSZERŰBB FELDOLGOZÁS LÉPÉSEI a fájl megnyitásához és bezárásához kapcsolódó feladatok kiválthatók egyetlen utasítással a using utasítás feltételezi, hogy létezik a fizikai fájl using( Fizikai és logikai fájl összerendelése ) { Fizikai fájl feldolgozása a logikai fájlon keresztül 2014 Bánsághi Anna 25 of 35
Fájl feldolgozása a using utasítással using System.IO;... public static void Main() { string fajl = "adat.txt"; if(! File.Exists( fajl )) { Console.WriteLine( "Nem létezik a fájl" ); else { using( FileStream fs = new FileStream( fajl, FileMode.Open, FileAccess.Read )) { Console.WriteLine( "Létezik a fajl" ); 2014 Bánsághi Anna 26 of 35
SYSTEM.IO.STREAMWRITER kizárólag írható szekvenciális fájlok soronkénti feldolgozása Hozzunk létre egy fájlt, soronként egy-egy egész számmal A számok generálásához használjuk a véletlenszám generátort public static void Main() { Random rand = new Random(); using( StreamWriter sw = new StreamWriter( "szamok.txt" )) { for( int i = 1; i <= 10; ++i ) { sw.writeline( rand.next(0, 100) ); 2014 Bánsághi Anna 27 of 35
SYSTEM.IO.STREAMREADER kizárólag olvasható szekvenciális fájlok soronkénti feldolgozása Irassuk ki egy fájl tartalmát soronként public static void Main() { string fajl = "szamok.txt"; if(! File.Exists( fajl )) { Console.WriteLine( "Nem létezik a fájl" ); else { using( StreamReader sr = new StreamReader( fajl )) { while( sr.peek()!= -1 ) { Console.WriteLine( sr.readline() ); 2014 Bánsághi Anna 28 of 35
Adjuk meg egy fájlban tárolt egész számok összegét. Feltételezzük, hogy a fájl helyes adatokat tartalmaz. Az Összegzés programozási tételhez használjuk az előreolvasási technikát public static void Main() { int osszeg = 0; using( StreamReader sr = new StreamReader( "szamok.txt" )) { while( sr.peek()!= -1 ) { osszeg += int.parse( sr.readline() ); Console.WriteLine( osszeg ); 2014 Bánsághi Anna 29 of 35
Kérjünk be egy fájl nevet, és írjuk ki a sorai hosszát public static void Main() { Console.WriteLine( "Adja meg a fájl nevét:" ); string fajl = Console.ReadLine(); if(! File.Exists( fajl )) { Console.WriteLine( "A fájl nem létezik" ); else { using( StreamReader sr = new StreamReader( fajl )) { while( sr.peek()!= -1 ) { Console.WriteLine( sr.readline().length ); 2014 Bánsághi Anna 30 of 35
Olvassunk a billentyűzetről egy sort, és írjuk ki egy szöveges fájlba Ha létezik a fájl, írjuk felül. public static void Main() { Console.Write( "Írjon ide valamit: " ); string szoveg = Console.ReadLine(); using( StreamWriter sw = new StreamWriter( "ujfajl.txt" )) { sw.writeline( szoveg ); 2014 Bánsághi Anna 31 of 35
Adott egy egész számokat tartalmazó fájl. Paritás szerint válogassuk szét egy fájl elemeit két új fájlba. Használjuk a Szétválogatás programozási tételt public static void Main() { using( StreamWriter sw1 = new StreamWriter( Path.Combine( dir, "paros.txt" )), sw2 = new StreamWriter( Path.Combine( dir, "prtln.txt" ))) { using( StreamReader sr = new StreamReader( "szamok.txt" )) { while( sr.peek()!= -1 ) { int szam = int.parse( sr.readline() ); if( szam % 2 == 0 ) { sw1.writeline( szam ); else { sw2.writeline( szam ); 2014 Bánsághi Anna 32 of 35
ELSŐ BEADANDÓ FELADATCSOPORT C# Fundamentals for Absolute Beginners channel9.msdn.com/series/c-fundamentals-for-absolute-beginners Mod 03: Hello World Mod 04: Release könyvtár Mod 05 Mod 06: változók Mod 07: elágazás Mod 08: miért ad szintaktikai hibát az "x + y;" sor? Mod 09: számlálásos ciklus Mod 10: tömbök Mod 12: fájlok 2014 Bánsághi Anna 33 of 35
PROGRAMOZÁSI TÉTELEK KOMBINÁCIÓJA Készítsen egy 10 sorból álló adatfájlt, soronként egy-egy természetes számmal. Számítsa majd írja ki a konzolra az átlagnál nagyobb elemek számát. Segítség: három részből fog állni a program. Az elsőben használatba vesszük a fájlt az Összegzési tételt alkalmazva, a másodikban kiszámítjuk az átlagot, a harmadikban újra használatba vesszük a fájlt a Számlálás tételét alkalmazva. 2014 Bánsághi Anna 34 of 35
BEADÁS FORMAI KÖVETELMÉNYEI Hallgató_Neve_1.zip mod_03.cs Release könyvtár mod_06.cs mod_07.cs mod_08.txt mod_09.cs mod_10.cs mod_12.cs Program.cs 2014 Bánsághi Anna 35 of 35