HIK Elektronikus Felsőoktatási Tankönyv- és Szakkönyvtár
A Kempelen Farkas Felsőoktatási Digitális Tankönyvtár/vagy más megjelenítő által közvetített digitális tartalmat a felhasználó a szerzői jogról szóló 1999. évi LXXVI. tv. 33. paragrafus (4) bekezdésében meghatározott oktatási, illetve tudományos kutatási célra használhatja fel. A felhasználó a digitális tartalmat képernyőn megjelenítheti, letöltheti, arról elektronikus adathordozóra vagy papíralapon másolatot készíthet, adatrögzítő rendszerében tárolhatja. A Kempelen Farkas Felsőoktatási Digitális Tankönyvtár/vagy más megjelenítő weblapján található digitális tartalmak üzletszerû felhasználása tilos, valamint kizárt a digitális tartalom módosítása és átdolgozása, illetve az ilyen módon keletkezett származékos anyag további felhasználása.

5.1. Az alapvető Input/Output

Az alapvető input- output, vagyis a Konzol alkalmazások ki- és bemenetének tárgyaláshoz elsőként meg kell ismernünk néhány C#-ban használatos változó típust. A változók, a változó típusok ismerete nagyon fontos, bármely programozási nyelvet szeretnénk elsajátítani, mivel a programban használt adatokat változókban és konstansokban tudjuk tárolni. A program ezekkel számol, és segítségükkel kommunikál a felhasználóval. A kommunikáció a programozási nyelvek esetében körülbelül azt jelenti, hogy adatokat olvasunk be a billentyűzetről, s a munka végeztével a kapott eredményt kiírjuk a képernyőre.

Minden változónak van neve, vagy más néven azonosítója, típusa, és tartalma, vagyis aktuális értéke. Ezeken kívül rendelkezik élettartammal és hatáskörrel. Az élettartam azt jelenti, hogy az adott változó a program futása során mikor és meddig, a hatókör azt adja, hogy a program mely részeiben használható. A változók névének kiválasztása során ügyelnünk kell a nyelv szintaktikai szabályainak betartására.

Az alábbiakban megvizsgálunk néhány példát a helyes és helytelen névadásokra:

Valtozo

valtozo

Valtozónév

szemely_2_neve

int

alma#fa

10szemely

Az első négy névadás helyes. Vegyük észre, hogy a valtozo és a Valtozo azonosítók két külön változót jelölnek, mivel a C# nyelv érzékeny a kis-nagybetűk különbségére. Az angol terminológia ezt Case- sensitive nyelvnek nevezi.

A negyedik elnevezés helytelen, mivel az int foglalt kulcsszó. Az ötödik névben a # karakter szerepel, ami nem használható. Az utolsó elnevezés számmal kezdődik, mely szintén hibás.

A változókat a programban bevezetjük, vagyis közöljük a fordító rendszerrel, hogy milyen nével milyen típusú változót kívánunk használni a programban. Ezt a folyamatot deklarációnak nevezzük.

valtozo_nev tipus;

A típus határozza meg a változó lehetséges értékeit, értéktartományait, illetve azt, hogy, milyen műveleteket lehet értelmezni rajta, és milyen más típusokkal kompatibilis, a névvel pedig a változóra hivatkozhatunk. A kompatibilitás akkor fontos, mikor az egyik változót értékül akarjuk adni egy másiknak. Inkompatibilitás esetén a .NET fordító hibát jelez.

Más nyelvektől eltérően a C#-ban az ékezetes betűket is használhatjuk névadásra.

char ékezetes_betű;

int egész;

A változók a memóriában tárolódnak, vagyis minden azonosítóhoz hozzárendeljük a memória egy szeletét, melyet a rendszer lefoglalva tart a változó teljes életciklusa alatt. (Néhány változó típus esetén, mint a pointerek, valamivel bonyolultabb a helyzet, de a .NET rendszerben nem kell törődnünk a memória kezelésével, mivel a .NET felügyeli, lefoglalja és felszabadítja a memóriát.) Vizsgáljunk meg néhány, a C# nyelvben használatos, egyszerű típust!

típus

Méret

Értéktartomány

A típusban tárolható adatok

byte

1 byte

0 tól 255 ig

Előjel nélküli egész számok

int

4 byte

-2,147,483,648 től 2,147,483,647 ig

előjeles egész számok

float

4 byte

±1.5 × 10−45 től ±3.4 × 1038 ig

Valós(lebegőpontos) számok

double

8 byte

±5.0 × 10−324 töl ±1.7 × 10308 ig

Valós(lebegőpontos) számok

decimal

16 byte

±1.0 × 10−28 tól ±7.9 × 1028 ig

Valós(lebegőpontos) számok

bool

1 byte

true/false

True, false értékek

char

2 byte

U+0000 tól U+ffff ig

Unicode karakterek

string

-

Karakterláncok

A táblázatban felsorolt típusokkal deklarálhatunk változókat. Az alábbi példa bemutatja a deklaráció pontos szintaktikáját.

int i;

char c;

string s;

A változóinkat kezdőértékkel is elláthatjuk. A kezdőérték adása azért is fontos, mert az érték nélkül használt változók kifejezésekben való szerepeltetése esetén a fordító hibát jelez.

int k=0;

char c=’a’;

string z=”alma”;

A következő program bemutatja, hogyan lehet a változókat deklarálni, és kezdőértékkel ellátni. A képernyőn nem jelenik meg semmi, mivel kiíró és beolvasó utasításokat nem használunk. Ezeket a fejezet későbbi részeiben tárgyaljuk.

namespace deklaracio

{

class valtozok_

{

[STAThread]

static void Main(string[] args)

{

int r=0;

float h,l;

int a=0,b=1,c=0;

int d=a+b;

int k=a+10;

float f;

char ch;

char cr='a';

bool bo=true;

bool ba;

string s1;

string s2="Hello!";

}

}

}

Gyakran előforduló hiba, hogy a deklaráció során nem adunk nevet vagy típust a változónak, vagy egyáltalán nem deklaráljuk, de a programban próbálunk hivatkozni rá. Ekkor a .NET fordító a futtatáskor hibát jelez. Előfordul, hogy nem megfelelő típusú kezdő értékkel látjuk el a változókat. Ebben az esetben a következő hibaüzenetek jelenhetnek meg a képernyőn:

- Cannot implicitly convert type 'string' to 'int'

- Cannot implicitly convert type 'int' to 'string'

Azonos változónevek esetén is hibaüzenetet kapunk. Gyakori hiba az is, hogy az osztály, vagyis a class neve megegyezik valamely változó nevével, esetleg lefoglalt kulcsszót akarunk alkalmazni a névadásnál.

Bizonyos esetekben, amikor nem Error, hanem Warning típusú hibaüzenetet kapunk, a fordító olyan hibát talál a programunkban, amitől az még működőképes, de hatékonyságát csökkenti. Ilyen hiba lehet, ha egy változót deklarálunk, de nem használunk fel.

A következő példában láthatunk néhány rossz deklarációt. (- hogy a programozás során ne kövessünk el hasonló hibákat.)

int a="alma"; az int típus nem kompatibilis a string konstanssal

string f=2; az s változóba számot akarunk elhelyezni

int class=10; a class foglalt szó

int void=10; a void az eljárásoknál használatos cimke

A következő példa megmutatja, hogy a programjaink mely részeiben deklarálhatunk.

using System;

namespace AlapIO

{

class IO_

{

int a,b;

int d=10;

char c;

bool t,f=false;

string s;

int y = (int)3.0;

[STAThread]

static void Main(string[] args)

{

int l;

string s="ez egy string konstans";

int a = 12;

int b = a + 10;

bool t = true;

bool f = !t;

char c = 'a';

}

}

}

A fenti változók (a, b, c, d, t, f) a programunk futása közben használhatóak, az értékadások után tartalommal, értékkel rendelkeznek, melyet a program futása alatt, vagy a változóra vonatkozó következő értékadásig meg is tartanak. A felhasználó még mindig nem láthatja őket, és az értéküket nem tudja módosítani. Ahhoz, hogy lehetővé tegyük a program használójának a változók értékének manipulálását, nekünk kell a megfelelő utasításokat beépíteni a forráskódba. Amennyiben ezt tesszük, ügyelnünk kell a programkód helyességére.

Az értékadásnak jól meghatározott szintaktikája van. Az értékadó utasítás bal oldalán a változó azonosítója áll, középen egyenlőség jel, a jobb oldalon pedig az érték, vagy kifejezés, melynek az aktuális értékét a változóban tárolni szeretnénk.

int d=2;

c=a+40;

k=(10+4)/2;

int y = (int)3.0;

A helytelenül felírt értékadást a fordító hibaüzenettel jelzi.

A példában az y változónak egy valós típust adunk értékül, de ebben az esetben az (int)3.0 típus kényszerítéssel nem okozunk hibát. Ez egy ún.: explicit konverzió. A változók egy érdekes típusa a literál. Akkor használjuk, mikor a programban egy konkrét értéket szeretnénk szerepeltetni, pl.:

hibauzenet_1 = ”Helytelen Értékadás”;

max_Db = 20;

A literálok alapértelmezés szerint int típusúak, ha egészek, és double, ha valósak. Amennyiben float típust szeretnénk készíteni, az érték után kell írni az f karaktert, long típus esetén az l, illetve ulong esetén az ul karakterpárt, stb.

Float_literal = 4.5f;

Long_literal = 4l;

A C# programokban állandókat, vagy más néven konstansokat is definiálhatunk. A konstansok a program futása alatt megőrzik értéküket, s nem lehet felüldefiniálni őket, illetve értékadó utasítással megváltoztatni értéküket. Más nyelvektől eltérően, itt a konstansnak is van típusa.

const int a=10;

const string s=”string típusú konstans”;

A programjainknak fontos része a felhasználóval való kommunikáció. Adatokat kell kérni tőle, vagy közölnünk kell, mi volt a program futásának eredménye. Ahhoz, hogy az adatokat, vagyis a változók tartalmát be tudjuk olvasni vagy meg tudjuk jeleníteni a képernyőn, a .NET rendszerben igénybe vehetjük a C# alapvető I/O szolgáltatásait, a System névtérben található Console osztály ide tartozó metódusait (függvények és eljárások).

System.Console.Read();

System.Console.Write();

System.Console.ReadLine();

System.Console.WriteLine();

A Console.Write() és a Console.WriteLine() a kiírásra, míg a Console.Read() és a Console.ReadLine() a beolvasásra használható. A beolvasás azt jelenti, hogy az ún.: standard input stream –ről várunk adatokat. Amennyiben a Read() beolvasó utasítást használjuk, int típusú adatot kapunk, a ReadLine() metódus esetében viszont stringet. Ez kiderül, ha megnézzük a két metódus prototípusát.

public static string ReadLine();

public static int Read();

Jól látszik, hogy a Read() int típusú, a ReadLine() viszont string. Adat beolvasásakor természetesen nem csak erre a két típusra van szükségünk, ezért az input adatokat konvertálnunk kell a megfelelő konverziós eljárásokkal, melyekre később bővebben kitérünk.

A System hivatkozás elhagyható a metódusok hívásakor, amennyiben azt a program elején, a using bejegyzés után felvesszük a következő módon:

using System;

Ezt a műveletet névtér importálásnak nevezzük és a könyv későbbi fejezeteiben bővebben olvashatunk a témáról.

Mikor eltekintünk a névtér importálástól, akkor az adott metódus teljes, minősített, vagy q nevéről beszélünk, ami a függvény névtérben elfoglalt helyével kezdődik. Ez a minősítő előtag (pl.: System.Console…), így a program bármely részéből meghívhatjuk az adott függvényt, vagy eljárást. Erre szükség is lehet, mivel a System névtér is több fájlból (DLL) ál, amelyeket a fordító nem biztos, hogy megtalál a hivatkozás nélkül. Ez nem csak a System -re, hanem valamennyi névtérre igaz.

Pl.:System.Thread.Threadpool.QueueUserWorkItem();

(a többszálú programok készítésénél van jelentősége, később még visszatérünk rá)

Ahhoz, hogy használni tudjuk a Consol metódusait, meg kell vizsgálnunk néhány példát. A következő program bemutatja a beolvasás és a kiírás mechanizmusát.

using System;

namespace ConsoleApplication7

{

class Class1

{

[STAThread]

static void Main(string[] args)

{

int a=0,b=0;

Console.Write("a erteke : ");

a=Convert.ToInt32(Console.ReadLine());

Console.Write("b erteke : ");

b=Convert.ToInt32(Console.ReadLine());

Console.WriteLine("\n a={0}\n b={1}\n a+b={2}",a,b,a+b);

Console.ReadLine();

}

}

}

Amennyiben futtatjuk a programot a képernyőn a következő output (kimenet) jelenik meg:

A System.Console.WriteLine() metódussal a standard output - ra, vagyis a képernyőre tudunk írni, pontosabban a képernyőn megjelenő Consol alkalmazás ablakába. A metódusban ún.: formátum string - et, vagy más néven maszkot alkalmaztunk, hogy a változók értékeit formázottan, vagyis a számunkra megfelelő alakban tudjuk megjeleníteni.

A formátum string tartalmaz konstans részeket (a=, b=, a+b=) ami változatlan formában kerül a képernyőre. A {0}, {1}, {2} bejegyzéseket arra használjuk, hogy a formátum string megfelelő pontjaira behelyettesítsük a paraméterlistában felsorolt változók értékeit: a {0} jelenti a nulladik, vagyis a sorban az első változó helyét, a {1} a második változó helyét, és így tovább. Amennyiben a {} zárójelek között olyan értéket adunk meg, mely nem létező változóra hivatkozik, a program leáll.

Console.WriteLine("{1} {3}",i);

A példában az első és a harmadik változóra hivatkoztunk (sorrendben a második és a negyedik), de ilyenek nem léteznek, mivel az egyetlen változó a kiíró utasításban az i, mely a nulladik helyen áll. A helyes hivatkozás tehát:

Console.WriteLine("{0}",i);

Ezek a bejegyzések nem hagyhatóak el, mivel csak így tudjuk a változók tartalmát a képernyőre írni. A sorrendjük sem mindegy. Vegyük észre, hogy a példaprogramban a második Console.WriteLine() paraméter listájában a változók fel vannak cserélve, a kiírási sorrend mégis megfelelő, mivel a formátum definiálja, a változók helyét a kiírt szövegben.

(Érdekes kérdés lehet, hogy a {, }, {0} karaktereket hogyan írjuk a képernyőre. A Console.WriteLine(”{} {0} = {0}”,a); nem megfelelő. A kedves olvasó kipróbálhatja a Console.WriteLine(”{{0}} = {0}”,a); utasítást…)

A formátum maszkjába a következő vezérlő karaktereket helyezhetjük el:

\b

Backspace

\*

Újsor

\t

vízszintes tabulátor

\\

Fordított perjel

\’

Aposztróf

\”

Idézőjel

\n

Sortörés

Vegyük észre, hogy a programunk megjeleníti a tárolt értékeket, s azok összegét is, de nem ad lehetőséget felhasználónak a változók értékének a megváltoztatására.

Ahhoz, hogy tovább tudjunk lépni, el kell sajátítanunk, hogyan kezelhetjük le a felhasználótól érkező inputot, vagyis a billentyűzetről bevitt adatokat.

A felhasználói input kezelésére lehetőséget biztosítanak a Console.Read() ,és a Console.ReadLine() metódusok. Mindkettő esetében adatokat olvashatunk be a standard inputról, vagyis a billentyűzetről, s ha megtámogatjuk a két metódust a Convert osztály konverziós függvényeivel, nemcsak int és string típusú adatokat, hanem szám típusú, vagy logikai értékeket is beolvashatunk a felhasználótól. A példaprogramban a Convert.ToInt32() metódust használjuk az input 32-bites int típussá konvertálására. Ha a beolvasás során az input stream –ről hibás adatot kapunk, mely nem konvertálható, a programunk leáll.

Az ilyen jellegű hibákra megoldás lehet a kivételek kezelése, melyről a későbbi fejezetekben szót ejtünk majd.

Nézzünk meg a példát a beolvasásra és a konverzióra!

using System;

namespace ConsoleApplication7

{

class Class1

{

[STAThread]

static void Main(string[] args)

{

int a=0,b=0;

Console.Write("a erteke : ");

a=Convert.ToInt32(Console.ReadLine());

Console.Write("b erteke : ");

b=Convert.ToInt32(Console.ReadLine());

Console.WriteLine("\n a={0}\n b={1}\n a+b={2}",a,b,a+b);

Console.ReadLine();

}

}

}

Ebben az alkalmazásban a változók a felhasználói inputról nyernek értéket, így a beolvasott adatok változtatásával minden lefutásnál más-más eredményt kapunk. A program végén a Console.ReadLine() utasítást arra használjuk, hogy a Consol ablak ne tűnjön el a képernyőről, miután a program lefutott. Ez fontos a Consol alkalmazások esetén, mivel ezek nem esemény vezérelt működésűek. A programok elindulnak, végrehajtják a programozó által definiált utasításokat, majd leállnak, és a kimeneti képernyőt is bezárják. Így a felhasználó nem lát szinte semmit az egészből.

A fentiek ismeretében vegyük sorra, hogy a változók milyen módon kaphatnak értéket!

Egyszerű értékadással:

A=2;

B=”alma”;

C=A+B;

E=2*A;

A standard inputról:

A=Convert.ToInt32(Console.ReadLine());

B=Console.ReadLine();

Kezdőérték adásával:

int D=10;

char c=”a”

A változókba beolvasott értékeket fel is tudjuk használni, és legtöbbször ez is a célunk. Miért is olvasnánk be értékeket, ha nem kezdünk velük semmit? A következő program két változó értékéről eldönti, hogy melyik a nagyobb. Ez a program viszonylag egyszerű, és jól bemutatja a billentyűzetről nyert adatok egész számmá konvertálását. A Convert osztály ToInt32() metódusával alakítjuk a beolvasott, itt még String típusként szereplő számot, majd azt konvertáljuk egész számmá (int), s adjuk értékül az a változónak. A b változóval ugyanígy járunk el. A beolvasást követően megvizsgáljuk, hogy a számok egyenlők-e, ha ez a feltétel nem teljesül, megnézzük, hogy melyik változó értéke a nagyobb, majd az eredményt kiírjuk a képernyőre. Nézzük meg a forráskódot!

using System;

namespace Convert

{

class KN

{

[STAThread]

static void Main(string[] args)

{

int a=0,b=0;

Console.Write("a értéke? = ");

a=Convert.ToInt32(Console.ReadLine());

Console.Write("b értéke? = ");

b=Convert.ToInt32(Console.ReadLine());

if (a==b)

{

Console.WriteLine("{0} és {1} egyenlőek",a,b);

}

else

{

if (a>b)

{

Console.WriteLine("{0} a nagyobb mint {1}",a,b);

}

else

{

Console.WriteLine("{0} a nagyobb mint {1}",b,a);

}

}

Console.ReadLine();

}

}

}

Az alkalmazás kimenetére kerek mondat formájában írjuk ki az eredményt úgy, hogy a kiírt string konstanst konkatenáljuk a változók értékével, így foglalva mondatba a program futásának eredményét. Ez gyakori megoldás a felhasználóval történő kommunikáció megvalósítására. Mindenképpen jobb, ha összefüggő szöveg formájában beszélgetünk. A hétköznapi kommunikáció során is jobb, ha kerek mondatokat használunk, hogy jobban megértsenek minket.

A program használhatóságát növeli, vagyis felhasználóbarát programokat készíthetünk.

Biztosan sokan emlékeznek a következő párbeszédre:

- Mennyi?

- Harminc.

- Mi harminc?

- Mi mennyi?

Az ilyen és hasonló párbeszédek érthetetlenné teszik a kommunikációt mind a valós életben, mind a programok világában. Az elsőben már egész jól megtanultuk a társas érintkezés formáit, tanuljuk meg a másodikban is!

A kiíratás és beolvasás mellett a műveletvégzés is fontos része a programoknak. A műveleteket csoportosíthatjuk a következő módon:

  • Értékadás: a = 2,

  • matematikai műveletek: z = a + b,

  • összehasonlítások: a = = b, a < c,

  • feltételes műveletek.

A műveleti jelek alapján három kategóriát hozhatunk létre. Unáris, bináris és ternáris műveletek. Az elnevezések arra utalnak, hogy a műveletben hány operandus szerepel.

Az aritmetikai értékadásokat rövid formában is írhatjuk. A következő táblázat bemutatja a rövidítések használatát, és azt, hogy a rövidített formulák mivel egyenértékűek.

rövid forma

Használat

Jelentés

+=

x += 2;

x = x + 2;

-=

x -= 2;

x = x – 2;

*=

x *= 2;

x = x * 2;

/=

x /= 2;

x = x / 2; (egész osztás)

%=

x %= 2;

x = x % 2; (maradékos osztás)

Most, hogy elegendő tudással rendelkezünk a Consol I/O parancsairól és a műveletek használatáról, készítsünk programot, mely a felhasználótól bekéri egy tetszőleges kör sugarát, majd kiszámítja annak kerületét és területét.

A programhoz szükséges ismeretek: a kör kerülete: 2r*∏, és a területe: r*r*∏, vagy r2*∏.

A feladat az, hogy egy változóba beolvassuk az adott kör sugarát, majd a képernyőre írjuk a körhöz tartozó kerületet és a területet. A kifejezések kiszámítását elvégezhetjük a kiíró utasításban is, csak a megfelelő formátum string-et kell elkészítenünk, és a pí értékét behelyettesítenünk a képletekbe.

Honnan vegyük a pí-t? Írhatnánk egyszerűen azt, hogy 3.14, de ebben az esetben nem lenne elég pontos a számításunk eredménye. Használjuk inkább a C# math osztályban definiált PI konstanst!

Ekkor a program a következő módon írható le:

using System;

namespace ConsoleApplication7

{

class Class1

{

[STAThread]

static void Main(string[] args)

{

int r=0;

Console.WriteLine("kör sugara : ");

r=Convert.ToInt32(Console.ReadLine());

Console.WriteLine("A kör kerülete : {0}, területe : {1} ",2*r*Math.PI,r*r*Math.PI);

Console.ReadLine();

}

}

}

Vizsgáljuk meg, hogyan működik a program! Az r változóban tároljuk a billentyűzetről beolvasott értéket, a kör sugarát, majd a Console.WriteLine() – metódusban kiszámoljuk a megadott kifejezés alapján a kör kerületét és területét. Az eredmény kiíródik a képernyőre, s a program az enter leütése után befejezi futását.

Az egész típusú számokkal már jól boldogulunk, de sajnos az élet nem ilyen egyszerű. A legtöbb alkalmazásban szükség van a típusok közti konverzióra.

A fejezetben már szóltunk a típusok konverziójáról, és a Convert osztályról, de a teljesség kedvéért vegyük sorra a fontosabb metódusait!

Az alábbi felsorolás tartalmazza azokat a konvertáló metódusokat, melyeket az alapvető I/O alkalmazása során használni fogunk:

ToBoolean()

ToByte()

ToChar()

ToString()

ToInt32()

ToDateTime()

A ToBoolean() metódus logikai értékkel tér vissza.

Console.WriteLine("{0}",Convert.ToBoolean(1));

Bool b=Convert.ToBoolean(Console.ReadLine());

Logikai true értéket kapunk eredményül. Nullánál false visszatérési értéket kapnánk.

A ToByte() metódus byte típust ad vissza, de ez a fenti kiíró utasításban nem követhető nyomon, mivel a kiírt érték byte típusban is 1, viszont az értéktartomány megváltozik. Egy bájtnál nagyobb érték nem fér el a byte típusban. Nagyobb szám konvertálása hibához vezet.

Console.WriteLine("{0}",Convert.ToByte(1));

A ToChar() metódus a karakter ASCII kódjával tér vissza. Ez a metódus jól használható a számrendszerek közti átváltások programozására, mivel a kilences számrendszertől fölfelé történő konvertáláskor a 9-nél nagyobb számok esetén az ABC nagy betűit használjuk.

10=A, 11=B,…,15=F.

Az átváltáskor, ha az adott számjegy nagyobb, mint 9, átalakíthatjuk a következő módon:

Convert.ToChar(szamjegy+55);

A példában a számjegy ASCII kódját toltuk el annyival, hogy az megegyezzen a megfelelő tizenhatos számrendszerbeli számjegy ASCII kódjával. A kódot ezután karakterré konvertáltuk. A következő programrészlet a fent említett eljárás használatával a 10 szám helyett egy A betűt ír a képernyőre.

Console.WriteLine("{0}",Convert.ToChar(10+55));

Amennyiben a ToChar() bemenő paramétere a 11+55 lenne, a B betű jelene meg a képernyőn.

A ToString() string-et konvertál a bemenő paraméterből.

string s=Convert.ToString(1.23);

Console.WriteLine("{0}",s);

Eredménye az 1.23 szám string-ként. Konvertálás után 1.23-al nem végezhetünk aritmetikai műveletet, mivel string típust készítettünk belőle, de alkalmas string-ekhez való hozzáfűzésre.

A ToInt32() metódust már használtuk az előző programokban, de álljon itt is egy példa a használatára.

int a=Convert.ToInt32(Console.ReadLine());

A kódrészletben az int típusú változóba a billentyűzetről olvasunk be értéket. A Console.ReadLine() metódust ”paraméterként” átadjuk a Convert.ToInt32() függvénynek, így a beolvasott érték egész típusú számként (int) kerül a memóriába.

Másik lehetőség a konverzióra az i=Int32.Parse(Console.ReadLine()); forma használata. A két megoldás azonos eredményt szolgáltat.

A felsorolás végére hagytuk a ToDateTime() metódust, mivel a dátum típussal még nem foglalkoztunk.

Előfordulnak programok, ahol a felhasználótól a születési dátumát, vagy éppen az aktuális dátumot szeretnénk megkérdezni. Amennyiben ki akarjuk íratni a képernyőre amit beolvastunk, nincs szükség konverzióra, de ha dátum típusként tárolt adattal szeretnénk összehasonlítani azt, vagy adatbázisban tárolni, akkor használnunk kell a ToDateTime() függvényt.

Console.WriteLine("dátum :{0}",Convert.ToDateTime("2004/12/21"));

A fenti programrészlet futásának az eredménye a következő:

Látható, hogy a dátum mellett az aktuális idő is megjelenik, ami alapértelmezésként 0:00:00. Ebből következik, hogy ToDateTime() paraméterében megadott string-ben az aktuális időt is fel tudjuk venni a következő módon:

Console.WriteLine("datum + idő : {0}

",Convert.ToDateTime("2004/12/21 1:10:10"));

Ennek a kódrészletnek az eredményeként a dátum mellett az idő is kiíródik a képernyőre. Természetesen a C# -ban sokkal több konverziós metódus létezik, de a programjaink megírásához a felsoroltak elegendőek. (Amennyiben a többire is kíváncsiak vagyunk, használjuk a .NET dinamikus HELP rendszerét!)

A példákban a konvertálást a kiíró utasítással kombináltuk, hogy az eredmény megjelenjen a képernyőn, de a metódusokat változók értékének a beállításakor, vagy típus konverzió esetén is használhatjuk.

string s=Convert.ToString(1.23);

int k=Convert.ToInt32('1');

k=2+Convert.ToInt32(c);

char c=Convert.ToChar(1);

bool b=Convert.ToBoolean(1);

Logikai érték esetén a beolvasás a következő módon oldható meg:

bool b;

b=Convert.ToBoolean(Console.ReadLine());

Ennél a programrészletnél a true szót kell begépelni a billentyűzeten. Ez kicsit eltér a fent bemutatott bool b=Convert.ToBoolean(1); értékadástól. A beolvasásnál az 1 érték nem megfelelő. Nem szerencsés a logikai értékek beolvasásakor a Read() metódust használni, mivel az int típust olvas be.

A standard Input/Output kezelésének alapjait elsajátítottuk. A következő fejezetben a szelekcióval ismerkedünk meg. A szelekció, vagyis a feltételes elágazások témakörét ez a fejezet is érintette, de nem merítette ki. A teljes körű megismeréshez mindenképpen fontos a következő fejezet tanulmányozása.

A szintaktika mellett fontos megemlíteni, hogy a programozás folyamata nem a fejlesztői eszköz kód editorában kezdődik. Elsőként fel kell vázolni a születendő programok működését, tervezni kell, meg kell keresni a lehetséges matematikai megoldásokat (persze, csak ha erre szükség van). A tervek leírása sok esetben már a program vázlatát adja. (Egyszerűbb programok esetén elég, ha a felhasználói igényeket papírra vetjük .) A tervezés, előkészítés lépésekeit soha nem szabad kihagyni. A megfelelően átgondolt, megtervezett programok elkészítése a későbbiekben felgyorsítja a programozási folyamatot, egyszerűbbé teszi a hibák keresését, javítását.