´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
´ r 5) Jazyk C# (seminaˇ ´ Pavel Prochazka KMI
23. ˇr´ıjna 2014
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
ˇ zovan´ ´ ı metod – motivace Pˇreteˇ
I
I
I I I
I
´ ˇ a´ prakticky to Pˇredstavme si, zˇ e mame metodu, ktera´ uvnitˇr del ´ ale liˇs´ı se pouze parametry same, V C# muˇ ˚ zeme v´ıce metod nazvat stejneˇ s t´ım, zˇ e se budou liˇsit ve sv´ych parametrech a t´ım se odliˇs´ı ´ ˇ zovali jsme konstruktory Vlastneˇ uˇz to trochu zname, pˇreteˇ ˇ zovat i metody Jelikoˇz je konstruktor metoda, lze pˇreteˇ ´ ı metody se kompilator ´ Pˇri volan´ rozhodne, kterou pouˇzije na ´ zaklad eˇ typu pˇredan´ych parametru˚ Pozor! Vˇsechny pˇret´ızˇ ene´ metody mus´ı vracet stejn´y typ
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
Ilustrace pouˇzit´ı
static class MyMath{ public int Plus( int x public int Plus( int x { return x+y+z; } } ... /* vybere metodu s dvemi MyMath.Plus (5, 6); /* vybere metodu s tremi MyMath.Plus (5, 6 , 7);
, int y ){ return x+y; } , int y , int z )
parametry */ parametry */
´ v cˇ em ne? V cˇ em je to v´yhodne,
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
ˇ zovan´ ´ ı operator ´ u˚ Pˇreteˇ
I
´ Zopakujeme co je to operator
I
V jazyc´ıch rodiny C jsou to obvykle +, -, *, / ,. ,[] , ==, ——, =, atd. ˇ z jinak prefixove´ notace typu operace( arg1 , .. , Jsou vyˇcleneny argn ) ´ Ale v zasad eˇ jsou implementovatelne´ funkcemi – v naˇsem pˇr´ıpadeˇ metodami. ´ C# nab´ız´ı, jak tyto operatory (na ktere´ se muˇ ˚ zeme d´ıvat jako na metody) pˇret´ızˇ it ˇ Umoˇznuje take´ definovat implicitn´ı konverze typu˚
I
I
I
I
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
Demonstraˇcn´ı pˇr´ıklad
class Frac{ public int citatel, jmenovatel; ... public static Frac operator *( Frac f1, Frac f2) { return new Frac(f1.citatel * f2.citatel, f1.jmenovatel * f2.jmenovatel); } } Frac num1 = new Frac( 3 , 4 ); Frac num2 = new Frac( 2 , 8 ); Frac num = num1 * num2; Console.WriteLine( "{0} / {1}" , num.citatel , num.jmenovatel );
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
Rozˇs´ıˇren´y demonstraˇcn´ı pˇr´ıklad
I I
I
I
ˇ sˇ patne? ˇ Definice zlomku. Co je na nem ´ (rekurzivne) ˇ takto: a/b je zlomek, kde a je Zlomek je definvan zlomek nebo cele´ cˇ ´ıslo, b je zlomek nebo nenulove´ cele´ cˇ ´ıslo. ˇ implementaci, v C# mame ´ Takˇze trochu mus´ıme zmenit zˇrejmeˇ ˇ ame ´ jenom jednu moˇznost, jak to udel – zkuste to vymyslet. Vyuˇzijeme faktu, zˇ e i cˇ ´ıslo je zlomek a tud´ızˇ ho muˇ ˚ zeme implicitneˇ ´ pˇretypovavat na zlomek.
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
Demonstraˇcn´ı pˇr´ıklad 2 class Frac{ public Frac citatel, jmenovatel; bool je_cele_cislo = false; public cele_cislo = 0; /* konstruktory */ public Frac( int citatel ){ je_cele_cislo = true; cele_cislo = citatel; } public Frac( Frac c , Frac j ){ citatel = c; jmenovatel = j; } /* implicitni pretypovani intu na Frac */ public static implicit operator Frac(int x) { return new Frac( x ); } }
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
Pˇr´ıklad pouˇzit´ı demo2
... Frac c1 = new Frac( 2 ); // 2/1 Frac f1 = new Frac( 1 , 2 ); // 1/2 Frac f3 = new Frac( c1 , new Frac( 1 , 2 ) ); // 2/(1/2)
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
´ se soubory v C# Prace
I I
I
I
I
Zajiˇst’uj´ı je tˇr´ıdy z namespace System.IO ´ bude zaj´ımat pˇredevˇs´ım BinaryReader, BinaryWriter, Nas Directory, DirectoryInfo, FileStream – analogie k FILE v C. StringReader, StringWriter, File – slouˇz´ı k ˇ znejˇ ˇ s´ım ukol nejbeˇ ´ um ˚ ´ Pouˇzit´ı je analogicke´ jako v C, zejmena mus´ıme explicitneˇ pouˇz´ıt Close metodu ´ ı metody Close, Microsoft pro Pokud se chcete vyhnout pouˇz´ıvan´ ´ pˇripravil novou semantiku ´ ´ vas kl´ıcˇ oveho slova using, kdyˇz ho pouˇzijete ve tvaru using( INICIALIZACE_POPISOVACE ){ PRACE_SE_SOUBOREM } ´ tak se chova´ tak, zˇ e implictneˇ zavola´ Close m´ısto vas Namespace File obsahuje celou ˇradu pˇripraven´ych writeru˚ a readeru˚ napˇr. File.AppendText, ale hlavneˇ Open
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
ˇ zn´y zapis ´ Beˇ a cˇ ten´ı – textove´ soubory – cˇ ten´ı
using System.IO; /* cteni celeho textoveho souboru unix */ string readText = File.ReadAllText( "/path/to/file" ); /* cteni windows */ string readText = File.ReadAllText( "C:\\path\\to\\file" ); /* cteni textoveho souboru po radcich */ StreamReader file = new StreamReader("c:\\test.txt"); while((string line = file.ReadLine()) != null) { Console.WriteLine (line); }
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
ˇ zn´y zapis ´ ´ Beˇ a cˇ ten´ı – textove´ soubory – zapis
/* zapis do txt souboru */ /* prepise nebo vytvori file */ File.WriteAllText ( "/path/to/txt/file" , "Hello World!"); /* zapis textoveho souboru po radcich */ /* pokud je druhy argument true -jsme v rezimu append */ string [] lines = { "hello" , "world" , "there" ); StreamWriter file = new StreamWriter( "path/to/fle", true); foreach( string l in lines ) { file.WriteLine (line); }
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
ˇ zn´y zapis ´ ´ ı soubory – cˇ ten´ı Beˇ a cˇ ten´ı – binarn´
using (BinaryReader b = new BinaryReader(File.Open("file.bin", FileMode.Open))) { int pos = 0; int length = (int)b.BaseStream.Length; while (pos < length) { /* Dulezite je nasledujici hodnotu "parsovat" */ int v = b.ReadInt32(); Console.WriteLine(v); pos += sizeof(int); } }
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
ˇ zn´y zapis ´ ´ ı soubory – zapis ´ Beˇ a cˇ ten´ı – binarn´
using (BinaryWriter binWriter = new BinaryWriter(File.Open(fileName, FileMode.Create))) { binWriter.Write("Hello"); binWriter.Write("World"); binWriter.Write(10); binWriter.Write(true); binWriter.Write(Math.PI); }
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
´ ´ an´ ´ ı v´yjimek Zapis a cˇ ten´ı – odchytav
I
Vyj´ımkami se budeme jeˇsteˇ zab´yvat, berte to zat´ım jako dogma
try{ // Prace se souborem } catch(Exception e){ // Pokud se neco nepovede (otevreni apod.) // Vysvetleni co se nepovedlo je v e }
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
´ an´ ´ ı argumentu˚ konzolove´ aplikaci Pˇredav
I I
I I
Skoro stejne´ jako v C ´ ı pomoc´ı vstupn´ı metody Main, vˇsimnete ˇ si, zˇ e obsahuje Pˇredan´ pole string [] args V poli args jsou potom argumenty napsane´ zleva doprava ´ Pozor na rozd´ıl od jazyka C nen´ı nulta´ poloˇzka args rovna jmenu skriptu!
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ
´ u˚ Pˇret´ızˇ en´ı metod a operator ´ Prace se soubory
A ted’ vy
I
I
I
I
I
Pˇrepiˇste ve tˇr´ıdeˇ Frac metodu ToString, aby vypisovala zlomek cˇ iteln´ym zpusobem. Napˇr. ˚ Console.WriteLine ( new Frac( 1 , new Frac( 3 , 2 ) ) se vyhodnot´ı na (1 / (3 / 2)) ˇ zte operator ´ Pˇreteˇ ! tak, aby se choval jako inverze zlomku tzn. a −1 b =a b ˇ zte operator ´ ´ Pˇreteˇ konverze na double tak, aby vypoˇc´ıtal realnou hodnotu zlomku ˇ Udelejte konzolovou aplikaci, ktera´ bere jako sve´ argumenty dva ´ ı soubory obsahuj´ıc´ı matice libovolne´ dimenze (strukturu binarn´ souboru si urˇcete sami). Tˇret´ı argument je voliteln´y pˇreb´ıra´ ˇ zˇ e nen´ı operaci s maticemi, pro jednoduchost +,,*-, v pˇr´ıpade, ´ provede se vytiˇsten´ ˇ ı obou matic na obrazovku. V pˇr´ıpade, ˇ pˇredan ´ tˇret´ı argument, muˇ zˇ e je pˇredan ˚ zeme pˇredat cˇ tvrty argument, coˇz ´ provede se vytiˇsten´ ˇ ı matice je v´ystupn´ı soubor, pokud nen´ı zadan na obrazovku. ´ Pro shrnut´ı syntaxe nastroje vypada´ takto matrix_comp mat1.bin mat2.bin [{+,-,*} [mat_out.bin]]
´ Pavel Prochazka
´ r 5) Jazyk C# (seminaˇ