Tamás Ferenc: Programozási tételek 3. rész
Az 1. részhez kattintson IDE!
A 2. részhez kattintson IDE!
A 3. rész tartalma:
21. tétel: Betűszámlálás fájlból
22. tétel: Eltelt napok számolása
23. tétel: Legnagyobb közös osztó
24. tétel: Átváltás kettes számrendszerbe
25. tétel: Véletlen csillagok
26. tétel: Téglalap felirattal
27. tétel: Számok kiíratása helyiérték-helyesen
28. tétel: Hatványok kiírása helyiérték-helyesen
29. tétel: Faktoriális
30. tétel: Számok összeadása
21. tétel: Betűszámlálás fájlból
Feladat: Írjon egy programot szöveges környezetben, amely bekér egy karaktert a billentyűzetről, majd a SZOVEG1.TXT fájl beolvasása után megszámolja, hogy hányszor fordult elő az adott karakter a fájlban.
Feltételezheti, hogy a fájl létezik, legalább 10, maximum 1000 karakter van benne. Az adatok valódiságát nem kell ellenőriznie. A feladat során a kis- és nagybetűk különbözőnek számítanak. A működő programot és a kódot mutassa be tanárának!
Egy lehetséges megoldás Visual C# nyelven:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; //Ez kell a fájlműveletekhez namespace 21tetel { class Program { static void Main(string[] args) { // 21. tétel: Betűszámlálás fájlból Console.Write("Kérem, adjon meg egy karaktert! "); string ezlesz = Console.ReadLine(); //Szöveget a legegyszerűbb beolvasni. char kar = ezlesz[0]; //Ezt fogjuk ellenőrizni - ez a szöveg 1. karaktere StreamReader bevisz = new StreamReader("SZOVEG1.TXT"); string s; //Beolvasáshoz szükséges segédváltozó int karszam = 0; //Karakterek száma do { s = bevisz.ReadLine(); for (int i = 0; i < s.Length; i++) { if (s[i]==kar) { karszam++; } } } while (!bevisz.EndOfStream); bevisz.Close(); Console.WriteLine("Talált {0} katakterek száma a szövegben: {1}",kar, karszam); Console.WriteLine("\n\nA program futása véget ért!"); } } }
A SZOVEG1.TXT fájl egy lehetséges tartalma:
Lásd a 20.tételnél!
22. tétel: Eltelt napok számolása
Feladat: Írjon egy programot szöveges környezetben, mely beolvas a VERCUKOR.TXT fájlból adatsorokat. 1 adatsor 1 sorból olvasható. Minden adatsor a következőket tartalmazza: mérés dátuma, a hét napja, napszak, mért érték (ponttal elválasztva). Az egyes adatok üres hellyel vannak elválasztva.
Írja ki a képernyőre, hogy hány mérés történt! Számolja meg, hogy hány nap telt el az egyes mérések között és írja is ki a képernyőre, majd az eltelt napok átlagát is – két tizedesjegyre kerekítve!
Feltételezheti, hogy a fájl létezik, legalább 2 sor van benne, maximum 100 adatsor várható. Az adatok valódiságát nem kell ellenőriznie. A működő programot és a kódot mutassa be tanárának!
Egy lehetséges megoldás Visual C# nyelven:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; //Ez kell a fájlműveletekhez namespace 22tetel { class Program { struct meres //Így könnyebb lesz eltárolni a beolvasott adatokat { public string datum; public string hetnapja; public string napszak; public DateTime datumom; } static void Main(string[] args) { // 22. tétel: Eltelt napok számolása StreamReader bevisz = new StreamReader("VERCUKOR.TXT"); meres[] adat = new meres[100]; string s; //Beolvasáshoz segédváltozó int szamol = 0; //Adatsorokat számolja meg. string[] reszek = new string[6]; //Tördeléshez ideális segítség do { szamol++; s = bevisz.ReadLine(); reszek = s.Split(' '); adat[szamol].datum = reszek[0]; adat[szamol].hetnapja = reszek[1]; adat[szamol].napszak = reszek[2]; adat[szamol].datumom = DateTime.Parse(adat[szamol].datum); //Átkonvertálás dátumra } while (!bevisz.EndOfStream); bevisz.Close(); Console.WriteLine("\nBeolvasott mérések száma: {0}", szamol); Console.WriteLine("\nMérések között eltelt napok:"); double eltelt; double ossz = 0; //Összesítéshez segédváltozó for (int i = 2; i <= szamol; i++) { eltelt = (adat[i].datumom - adat[i - 1].datumom).TotalDays; //Eltelt napok számolása Console.Write("{0} ", eltelt); ossz += eltelt; } Console.WriteLine("\nKét mérés között eltelt átlagos idő: {0,5:.00}",ossz/(szamol-1)); Console.WriteLine("\n\nA program futása véget ért!"); } } }
A VERCUKOR.TXT fájl egy lehetséges tartalma:
Lásd a 18. tételnél!
23. tétel: Legnagyobb közös osztó
Feladat: Kérjen be a billentyűzetről két egész számot és számolja ki tetszőleges módszerrel a legnagyobb közös osztójukat, majd írja is ki azt a képernyőre.
Az adatok valódiságát nem kell ellenőriznie. A működő programot és a kódot mutassa be tanárának!
Egy lehetséges megoldás Visual C# nyelven:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 23tetel { class Program { static int beker() { string s = Console.ReadLine(); return (Convert.ToInt32(s)); } static void Main(string[] args) { //23. tétel: Legnagyobb közös osztó – Euklídeszi algoritmus Console.WriteLine("Ez a program két pozitív egész szám legnagyobb közös osztóját számolja ki"); Console.Write("Kérem az 1. számot: "); int szamx = beker(); Console.Write("Kérem a 2. számot: "); int szamy = beker(); Console.WriteLine("A beolvasott két szám: {0} és {1}", szamx, szamy); if (szamy>szamx) { int csere = szamx; szamx = szamy; szamy = csere; } //Console.WriteLine("A nagyobb szám: {0}; a kisebb szám: {1}.", szamx, szamy); bool megvan = false; //Megvan-e a végeredmény? int hanyados; do { hanyados = szamx % szamy; if (szamy*hanyados == szamx) //Ekkor pontosan osztható! { megvan = true; } szamx = szamy; szamy = hanyados; //Console.WriteLine("x:{0} y:{1} hanyados: {2}", szamx, szamy, hanyados); if (hanyados == 0) { megvan = true; } } while (megvan==false); Console.WriteLine("A két szám legnagyobb közös osztója: {0}", szamx); if (szamx == 1) { Console.WriteLine("Tehát a két szám relatív prím!"); } Console.WriteLine("\n\nA program futása véget ért!"); } } }
24. tétel: Átváltás kettes számrendszerbe
Feladat: Kérjen be a billentyűzetről egy pozitív egész számot váltsa át kettes számrendszerbe, majd írja is ki azt a képernyőre.
Az adatok valódiságát nem kell ellenőriznie. Feltételezheti, hogy a szám legfeljebb 1millió lehet. A működő programot és a kódot mutassa be tanárának!
Egy lehetséges megoldás Visual C# nyelven:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 24tetel { class Program { static void Main(string[] args) { //24. tétel: Átváltás kettes számrendszerbe Console.Write("Kérem a számot: "); string s = Console.ReadLine(); int szam = Convert.ToInt32(s); int[] jegy = new int[21]; //Maximum 20 bináris jegy lehet. int sz = szam; int j = 0; do { if (sz % 2 != 0 ) { jegy[j] = 1; Console.Write("1"); } else { jegy[j] = 0; Console.Write("0"); } sz = (int) sz / 2; j++; } while (sz>=1); Console.WriteLine("\n"); j--; do { Console.Write("{0}",jegy[j]); j--; } while (j >= 0); Console.WriteLine("\n\nA program futása véget ért!"); } } }
25. tétel: Véletlen csillagok
Feladat: A szöveges képernyőre egy 80x25-ös téglalapon belül rajzoljon fel véletlenszerűen 111 piros és 111 kék színű csillagot!
A működő programot és a kódot mutassa be tanárának!
Egy lehetséges megoldás Visual C# nyelven:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 25tetel { class Program { static void Main(string[] args) { //25. tétel: Véletlenszerű csillagok const string csillag = "*"; Console.Clear(); //Ez a képernyőtörlés Console.ForegroundColor = ConsoleColor.Red; Random r1 = new Random(); for (int i = 0; i < 222; i++) { Console.SetCursorPosition(r1.Next(0, 80), r1.Next(0, 25)); Console.Write(csillag); if (i==111) { Console.ForegroundColor = ConsoleColor.Blue; } } Console.ForegroundColor = ConsoleColor.White; Console.SetCursorPosition(0, 24); Console.WriteLine("\n\nA program futása véget ért!"); } } }
26. tétel: Téglalap felirattal
Feladat: A szöveges képernyőn rajzoljon ki az üres képernyőre egy 20*40-es téglalapot „x” karakterekkel, majd kb. a közepére írassa ki a „Escape = Kilépés” szöveget! A programból Escape karakter lenyomásával lehessen kilépni!
A működő programot és a kódot mutassa be tanárának!
Egy lehetséges megoldás Visual C# nyelven:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 26tetel { class Program { static void Main(string[] args) { //26. tétel: Téglalap felirattal bool billolvas = false; bool kilep = false; Console.Clear(); Console.SetCursorPosition(0, 0); for (int i = 0; i < 40; i++) { for (int j = 0; j < 20; j++) { Console.SetCursorPosition(i, j); if ((i == 0) || (i == 39) || (j == 0) || (j == 19)) Console.Write("x"); } } Console.SetCursorPosition(10, 10); Console.Write("Escape = Kilépés"); do { billolvas = Console.KeyAvailable; if (billolvas) { ConsoleKeyInfo gomb = Console.ReadKey(); if (gomb.Key == ConsoleKey.Escape) kilep = true; } } while (kilep == false); Console.SetCursorPosition(0,22); Console.WriteLine("\n\nA program futása véget ért!"); } } }
27. tétel: Számok kiírása helyiérték-helyesen
Feladat: Olvasson be a billentyűzetről 10 darab (max. 2 tizedes jegyű) valós számot, majd helyiérték-helyesen jelenítse meg egymás alatt, továbbá adja is össze őket és jelenítse meg a legnagyobbat is! Nem kell vizsgálnia az adatok helyességét!
A működő programot és a kódot mutassa be tanárának!
Egy lehetséges megoldás Visual C# nyelven:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 27tetel { class Program { static void Main(string[] args) { //27. tétel: Számok kiírása helyiérték-helyesen const int szam = 10; string s; double[] jegy = new double[szam + 1]; for (int i = 1; i <= szam; i++) { Console.Write("Kérem a(z) {0}. számot! ", i); s = Console.ReadLine(); jegy[i] = Convert.ToDouble(s); } double maxx = jegy.Max(); Console.WriteLine("\n----------------------------\n"); for (int i = 1; i <= szam; i++ ) { Console.WriteLine("{0,9:.00}", jegy[i]); //Feltételezzük, hogy max. 9 jegy lesz. } Console.WriteLine("\n----------------------------\n"); Console.WriteLine("Legnagyobb: {0}", jegy.Max()); Console.WriteLine("Összeg: {0}", jegy.Sum()); Console.WriteLine("\n\nA program futása véget ért!"); Console.ReadKey(); } } }
28. tétel: Hatványok kiírása helyiérték-helyesen
Feladat: Adja meg a 1-től 20-ig a számok négyzetét, valamint köbét oszlopokba rendezve! A feladat végrehajtása kezdődjön fejléccel!
A működő programot és a kódot mutassa be tanárának!
Egy lehetséges megoldás Visual C# nyelven:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 28tetel { class Program { static void Main(string[] args) { //28. tétel: Számok négyzete és köbe const int maxx = 20; Console.WriteLine("Szám: Négyzet: Köb:"); for (int i = 1; i <= maxx; i++) { //Console.WriteLine("{0,2} {1,3} {2,5}", i, i * i, i * i * i); //Ez az egyszerűbb megoldás! Console.WriteLine("{0,2} {1,3} {2,5}", i, Math.Pow(i,2), Math.Pow(i,3)); } Console.WriteLine("\n\nA program futása véget ért!\n"); } } }
29. tétel: Faktoriális
Feladat: Kérjen be a billentyűzetről egy pozitív egész számot, majd írassa ki annak faktoriálisát! Nem kell vizsgálnia, hogy a megadott szám megfelelő-e!
A működő programot és a kódot mutassa be tanárának!
Egy lehetséges megoldás Visual C# nyelven:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 29tetel { class Program { //29. tétel: Faktoriális static long faktor(int i) //Itt long-ot érdemes használni, mivel így nagyobb számok is beleférnek! { if (i == 1) return (1); else return (i * faktor(i - 1)); } static void Main(string[] args) { //Faktoriális - rekurzióval Console.Write("Adjon meg egy pozitív egész számot! "); string s = Console.ReadLine(); int n = Convert.ToInt32(s); Console.WriteLine("{0}! = {1}", n, faktor(n)); Console.WriteLine("\n\nA program futása véget ért!\n"); } } }
30. tétel: Számok összeadása
Feladat: Kérjen be a billentyűzetről egy pozitív egész számot, majd adja össze a pozitív egészeket 1-től a bekért számig és írassa ki az összeadást és az eredményt is!
A működő programot és a kódot mutassa be tanárának!
Egy lehetséges megoldás Visual C# nyelven:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace B30tetel { class Program { //B.30. tétel: Számösszeadás static void Main(string[] args) { int eddig = 0; bool megvan = false; do { Console.Clear(); //Képernyő törlése Console.Write("Adjon meg egy pozitív egész számot! "); string s = Console.ReadLine(); if ((Int32.TryParse(s,out eddig)) && (eddig>0)) //Megpróbáljuk a konverziót. { Console.WriteLine("Sikeres!"); megvan = true; } else { Console.WriteLine("\nSikertelen számbevitel! Próbálja újra egy billentyű megnyomása után!"); Console.ReadKey(); } } while (!megvan); int osszeg = 0; for (int i = 1; i <eddig; i++) { Console.Write("{0}+",i); //Kiírja az összeadást osszeg += i; //Meg is csinálja } osszeg += eddig; Console.WriteLine("{0} = {1}",eddig, osszeg); Console.WriteLine("\n\nA program futása véget ért!\n"); } } }