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");
        }
    }       
}