[[oktatas:programozás:csharp|< CSharp]] ====== CSharp példák ====== Néhány előforduló feladat megoldása található itt. ===== Tömb kezdőértéke ===== Kezdőérték: int[] szamok = new int[5] {1, 2, 3, 4, 5}; string[] nevek = new string[3] {"Jóska", "Pista", "Kati"}; A tömb mérete elhagyható: int[] numbers = new int[] {1, 2, 3, 4, 5}; string[] names = new string[] {"Jóska", "Pista", "Kati"}; Több dimenziós tömb: int[,] szamok = new int[3, 2] { {1, 2}, {3, 4}, {5, 6} }; string[,] tertverek = new string[2, 2] { {"Misi","Anna"}, {"Mari","Albert"} }; A tömb mérete elhagyható: int[,] szamok = new int[,] { {1, 2}, {3, 4}, {5, 6} }; string[,] testverek = new string[,] { {"Misi","Anna"}, {"Mari","Albert"} }; Elhagyható a new operátor is: int[,] szamok = { {1, 2}, {3, 4}, {5, 6} }; string[,] testverek = { {"Misi","Anna"}, {"Mari","Albert"} }; ===== Verem ===== using System; using System.Collections; class Program { static void Main() { Stack verem = new Stack(); verem.Push(20); verem.Push(50); Console.WriteLine("{0}", verem.Pop()); Console.WriteLine("{0}", verem.Pop()); } } A Stack osztály a System.Collections névtérben található. Lásd még a következőket: * System.Collections.List * System.Collections.Queue * System.Collections.Dictionary * System.Collections.Stack ===== Reguláris kifejezések ===== ==== Példányosítással ==== using System; using System.Text.RegularExpressions; class Program { public static void Main() { Console.WriteLine("Hi"); Regex rk = new Regex("^T"); //Egyezés vizsgálata Console.WriteLine(rk.IsMatch("TamTam")); //Csere Console.WriteLine(rk.Replace("TenTger", "t")); //Darabolás Regex rk2 = new Regex(":"); String[] tomb1 = rk2.Split("alma:körte:barack"); Console.WriteLine(tomb1[2]); //Egyezés vizsgálat Console.WriteLine(Regex.IsMatch("tárgy", "reg")); //Csere Regex.Replace("tárgy", "regkif", "csereszöveg") Console.WriteLine(Regex.Replace("TenTger", "^T", "t")); //Darabolás String[] tomb = Regex.Split("alma:körte:barack", ":"); Console.WriteLine(tomb[1]); } } ==== Statikusan ==== Regex.IsMatch("tárgy", "reg")); ==== Magánhangzók megszámolása ==== Console.WriteLine(Regex.Matches("tekereg", "[e|i|e|]").Count ); ==== Mássalhangzók megszámolása ==== Console.WriteLine(Regex.Matches("tekereg", "[^e|i|e|]").Count ); ===== StringBuilder használata ===== using System; using System.Text; class Program { public static void Main() { Console.WriteLine("Hi"); StringBuilder s = new StringBuilder("körte"); s.Append("alma"); Console.WriteLine(s.Length); } } s.AppendLine(); //Egy üres sor hozzáfűzése s.Append("szöveg").AppendLine(); //Egy üres sor hozzáfűzése StringBuilder átalakítása String-gé: string innerString = builder.ToString(); ===== Listák használata ===== using System; using System.Collections.Generic; class Program { public static void Main() { Console.WriteLine("Listák használata"); List szamok = new List(); szamok.Add(3); szamok.Add(1); szamok.Add(5); szamok.Add(4); szamok.Add(9); szamok.Add(6); for (int i = 0; i<6; i++) Console.WriteLine(szamok[i]); szamok.Sort(); for (int i = 0; i<6; i++) Console.WriteLine(szamok[i]); Console.WriteLine("Száma: " + szamok.Count); } } ===== Váltás számrendszerek között ===== using System; class Program { public static void Main() { int a = 11; Console.WriteLine(Convert.ToString(a,16)); //Váltás decimálisból binárisba string s = "111"; Console.WriteLine(Convert.ToInt32(s, 2)); //Váltás binárisból decimálisban string s = "b"; Console.WriteLine(Convert.ToInt32(s, 16)); //Váltás hexadecimálisból decimálisba } } Figyeljük, meg hogy a ToString() és a ToInt32() metódus második paramétere a számrendszer amibe vagy amiből váltunk. ===== MD5 lenyomat ===== Az MD5 lenyomat készítése és ellenőrzése using System; using System.Text; using System.Security.Cryptography; class Program { static string lekerMd5Lenyomat(string input) { // md5 titkosító objektum példány létrehozása MD5 md5 = MD5.Create(); //A bejövő stringet átkonvertáljuk byte tömbbe: byte[] adat = md5.ComputeHash(Encoding.Default.GetBytes(input)); StringBuilder s = new StringBuilder(); // A bytok minden elemét hexadecimális formára hozzuk. for(int i=0; i< adat.Length; i++) s.Append(adat[i].ToString("x2").ToLower()); return s.ToString(); } static bool ellenorizMd5Lenyomat(string input, string hash) { string inputHash = lekerMd5Lenyomat(input); StringComparer hasonlito = StringComparer.OrdinalIgnoreCase; if (0 == hasonlito.Compare(inputHash, hash)) { return true; } else { return false; } } static void Main() { string source = "Helló Világ"; string hash = lekerMd5Lenyomat(source); Console.WriteLine("Forrás: " + source + " md5 lenyomata: " + hash); Console.WriteLine("A lenyomat ellenőrzése"); if (ellenorizMd5Lenyomat(source, hash)) { Console.WriteLine("A lenyomat egyezik"); } else { Console.WriteLine("A lenyomat nem egyezik"); } } } ===== Lokalizálás ===== Több nyelvű program Az alábbi program két szót ír a képernyőre egymás után. Jó és rossz. A program mindig azon a nyelven írja ki, amit beállítunk. Lásd: hu-HU. Ha a "hu-HU" rész tartalmazó sort teszem megjegyzésbe a már megjegyzésben lévő helyére, akkor az adott környezet alapján dönti el a program, hogy milyen nyelven kell megjeleníteni. main.cs using System; using System.Globalization; //CultureInfo using System.Resources; //ResourceManager using System.Reflection; //Assembly class Program { static void Main() { //CultureInfo kultura = new CultureInfo(CultureInfo.CurrentUICulture.Name); CultureInfo kultura = new CultureInfo("hu-HU"); ResourceManager rm = ResourceManager.CreateFileBasedResourceManager("nemz", ".", null); Console.WriteLine(rm.GetString("good", kultura)); Console.WriteLine(rm.GetString("bad", kultura)); } } main.en-US.txt good=good bad=bad main.fr-FR.txt good=bon bad=mal main.hu-HU.txt good=jó bad=rossz Lefordítjuk a nyelvi fájlokat erőforrásfájlokká: resgen main.en-US.txt resgen main.fr-FR.txt resgen main.hu-HU.txt A következő fájlokat kapjuk: * main.en-US.resources * main.fr-FR.resources * main.hu-HU.resources Ezekkel fordítjuk a forrásfájlt: gmcs -linkresource:main.en-US.resources -linkresources:main.fr-FR.resources -linkresources:main.hu-HU.resources main.cs Ide vonatkozó külső link: * http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.71%29.aspx ===== Titkosítás ===== using System; using System.Security.Cryptography; using System.Text; class Program { public static void Main() { TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); byte[] key = {2, 3, 5,3,4,3,4,8,9,3,3,2,3,4,6,5,2,3,5,3,2,3,3,4}; byte[] plainText = Encoding.Default.GetBytes("almaalma"); tdes.KeySize = 192; tdes.Key = key; tdes.Mode = CipherMode.ECB; tdes.Padding = PaddingMode.None; ICryptoTransform ic = tdes.CreateEncryptor(); byte[] enc = ic.TransformFinalBlock(plainText, 0,8); Console.WriteLine(Convert.ToBase64String(enc)); } } ===== Jelszó bekérése ===== using System; class Program { static string getPassword() { Console.Write("Jelszó: "); string jelszo = null; ConsoleKeyInfo info; do { info = Console.ReadKey(true); if(info.Key == ConsoleKey.Backspace) { if(! String.IsNullOrEmpty(jelszo)) jelszo = jelszo.Substring(0, jelszo.Length - 1); } else { jelszo += info.KeyChar; Console.Write("*"); } } while(info.Key != ConsoleKey.Enter); Console.WriteLine(); return jelszo; } public static void Main() { Console.WriteLine("Azonosítás"); Console.Write("Felhasználónév: "); string felhasznalonev = Console.ReadLine(); string jelszo = getPassword(); Console.WriteLine("\n\nBeírt felhasznalonev: {0}", felhasznalonev); Console.WriteLine("Beírt jelszó: {0}", jelszo); } } ===== Konfiguráció tárolása ===== main.cs /* kell a fordításhoz: -r:System.Configuration A futatható fájllal azonos nevű fájlt kell létrehozni. Pl.: main.exe.config */ using System; using System.Configuration; class Program { public static void Main() { System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration( ConfigurationUserLevel.None); config.AppSettings.Settings["Név"].Value = "valami"; config.Save(ConfigurationSaveMode.Full); Console.WriteLine(config.AppSettings.Settings["Jelszó"].Value); } } main.exe.config ===== Útvonalak ===== Ez a rész az útvonalak kiíratásáról szól. A címsor csak azért van, mert a legegyszerűbb módon akartam kiírni valahova a kapott útvonalat. ==== Útvonal a címsorban ==== using System.Windows.Forms; class Program : Form { Program() { Text = Application.StartupPath; } static void Main() { Application.Run(new Program()); } } ==== Útvonal fájlnévvel ==== using System.Windows.Forms; class Program : Form { Program() { Text = Application.ExecutablePath; } static void Main() { Application.Run(new Program()); } } ===== Mérés ===== Szeretnénk megmérni, hogy a for ciklusunk mennyi idő alatt fut le. Ehhez a System.Diagnostics névtér Stopwatch osztályát használjuk. using System; using System.Diagnostics; class Program { public static void Main() { Stopwatch watch = new Stopwatch(); watch.Start(); for(int i = 0; i<1000000; i++) ; watch.Stop(); Console.WriteLine("Eltelt idő : {0}", watch.Elapsed); Console.WriteLine("Eltelt idő milliszekundumban: {0}", watch.ElapsedMilliseconds); Console.WriteLine("Eltelt idő időzítő ütemében : {0}", watch.ElapsedTicks); } } ===== Előfordítói utasítások ===== #if #else #elif #endif #define #undef #warning #error #line #region #endregion #pragma #pragma warning #pragma checksum #define DEBUG // ... #if DEBUG Console.WriteLine("Debug version"); #endif #define DEBUG #define VC_V6 using System; class Program { static void Main() { #if (DEBUG && !VC_V6) Console.WriteLine("DEBUG beállítva"); #elif (!DEBUG && VC_V6) Console.WriteLine("VC_V6 beállítva"); #elif (DEBUG && VC_V6) Console.WriteLine("DEBUG és VC_V6 beállítva"); #else Console.WriteLine("DEBUG és VC_V6 nincs beállítva"); #endif } } ===== Operációs rendszer lekérdezése ===== using System; class Program { static void Main() { OperatingSystem osInfo = Environment.OSVersion; Console.WriteLine(osInfo); Console.WriteLine(osInfo.Version.Minor); Console.WriteLine(osInfo.Version.Major); Console.WriteLine(osInfo.Platform); // platform meghatározása switch(osInfo.Platform) { // A platform Windows 95, Windows 98, // Windows 98 Second Edition vagy Windows Me. case System.PlatformID.Win32Windows: switch (osInfo.Version.Minor) { case 0: Console.WriteLine ("Windows 95"); break; case 10: if(osInfo.Version.Revision.ToString()=="2222A") Console.WriteLine("Windows 98 Second Edition"); else Console.WriteLine("Windows 98"); break; case 90: Console.WriteLine("Windows Me"); break; } break; // Ha a platform Windows NT 3.51, Windows NT 4.0, Windows 2000, // vagy Windows XP. case System.PlatformID.Win32NT: switch(osInfo.Version.Major) { case 3: Console.WriteLine("Windows NT 3.51"); break; case 4: Console.WriteLine("Windows NT 4.0"); break; case 5: if (osInfo.Version.Minor==0) Console.WriteLine("Windows 2000"); else Console.WriteLine("Windows XP"); break; } break; } } } ===== Külső program indítása ===== using System; using System.Diagnostics; class Program { [STAThread] // kezeletlen szál kezelése static void Main() { Process proc; // folyamat deklarálása // esetleg: "C:\\test.bat" proc = Process.Start("cmd"); // Parancs futtatása proc.WaitForExit(); // Várunk a folyamat végére } } A program feldob egy parancsablakot. [STAThread] //Egy szálas [MTAThread] //Több szálas ===== FizzBuzz ===== Veszünk egy számsorozatot. Kiíratjuk a számokat a képernyőre, de ha 3-mal osztható maradék nélkül akkor azt írom ki, hogy "fizz", ha 5-tel osztható maradék nélkül, akkor azt írjuk ki, hogy "buzz". Ha 5-tel és 3-mal is osztható maradék nélkül, akkor azt írjuk ki, hogy "fizzbuzz". using System; class Program { public static string Answer(int i) { string res = null; if(i%3==0) res = "fizz"; if(i%5==0) res += "buzz"; if(i%3!=0 && i%5!=0) res = Convert.ToString(i); return res; } public static void Main() { int[] t = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; for(int i=0; i ===== Fibonacci ===== using System; class Program { public static int Fibonacci(int n) { int f=0; int seged0 = 0; int seged1 = 1; if (n == 0) { return 0; } else if (n==1) { return 1; } else { for(int i=2; i<=n; i++) { f =seged0 + seged1; seged0 = seged1; seged1 = f; } } return f; } public static void Main() { Console.WriteLine(Fibonacci(8)); } } ===== Windows naplóbaírás ===== using System; using System.Diagnostics; class Program01 { public static void Main() { Console.WriteLine("Naplóba írás előtt Enter nyomj"); Console.ReadKey(); string sSource; string sLog; string sEvent; sSource = "EventSystem"; sLog = "Application"; sEvent = "Sample Event"; if (!EventLog.SourceExists(sSource)) { EventLog.CreateEventSource(sSource,sLog); } EventLog.WriteEntry(sSource,sEvent); EventLog.WriteEntry(sSource, sEvent, EventLogEntryType.Warning, 5000); } } ===== Külső linkek ===== Tömb kézikönyv: * http://msdn.microsoft.com/en-us/library/aa288453%28VS.71%29.aspx Listák: * http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx