Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Constrangeri pentru tipurile generice

Presupunem ca avem urmatoarea metoda generica in care declaram si initializam o variabila de tip T. Apoi, apelam metoda ToString.

        static void GenericMethod<T>(T obj)
        {
            T item = obj;
            Console.WriteLine(item.ToString());
        }

Acest cod functioneaza pentru toate tipurile de date din .Net. Chiar daca T este tip valoare sau tip referinta, in ambele cazuri variabila suporta atribuirea unei valori si apelul metodei ToString (metoda definita de Object).

Urmatoarea metoda generica va genera eroare la compilare: ‘T’ does not contain a definition for ‘CompareTo’ and no extension method ‘CompareTo’ accepting a first argument of type ‘T’ could be found (are you missing a using directive or an assembly reference?). Motivul este simplu, nu toate tipurile ofera metoda CompareTo.

        static T AnotherGenericMethod<T>(T obj1, T obj2)
        {
            if (obj1.CompareTo(obj2) < 0) return obj1;

            return obj2;
        }

Pentru a scapa de aceasta eroare se foloseste un mecanism pe care CLR il numeste constrangere, adica un mod de a limita tipuri care pot fi specificate tipului generic. Implementarea este realizata cu ajutorul lui where, iar compilatorul va sti ca toate tipurile specificate pentru T trebuie sa implementeze interfata IComparable.

        static T AnotherGenericMethod<T>(T obj1, T obj2) where T : IComparable
        {
            if (obj1.CompareTo(obj2) < 0) return obj1;

            return obj2;
        }

An bisect

Pentru ca tot se apropie sfarsitul de an, propun un simplu exercitiu pentru a calcula daca un an este sau nu bisect.

using System;

namespace LeapYear
{
    class Program
    {
        static void Main(string[] args)
        {
            bool isLeapYear = false;

            Console.WriteLine("Introduceti anul in formatul de 4 cifre:");
            int year = Convert.ToInt32(Console.ReadLine());

            //prima varianta
            if(DateTime.IsLeapYear(year))
                isLeapYear = true;

            //a doua varianta
            if CheckIsLeapYear(year))
                isLeapYear = true;

            if (isLeapYear)
                Console.WriteLine("Este an bisect");
            else
                Console.WriteLine("Nu este an bisect");

            Console.ReadLine();
        }

        private static bool CheckIsLeapYear(int year)
        { 
            if((year % 4 == 0) || (year % 100 == 0 && year % 400 != 0))
                return true;

            return false;
        }
    }
}

La multi ani! :)

Putere

Fie b un numar natural si e un alt numar natural. Sa se calculeze b la e.

Analiza Programului
Vom utiliza o variabila in care vom calcula puterea. Pentru fiecare iteratie de la 1 la e vom inmulti valoarea bazei cu ea insasi.

using System;

namespace Power
{
    class Program
    {
        static void Main(string[] args)
        {
            int b, p;
            
            Console.WriteLine("Introduceti baza:");
            if (!int.TryParse(Console.ReadLine(), out b))
                throw new FormatException("Format incorect");
            
            Console.WriteLine("Introduceti puterea:");
            if(!int.TryParse(Console.ReadLine(), out p))
                throw new FormatException("Format incorect");
          
            Console.WriteLine(Power(b,p));

            Console.Read();
        }

        public static int Power(int baza, int exponent)
        {
            int result = 1;

            for (int i = 1; i <= exponent; i++)
            {
                result = result * baza;
            }

            return result;
        }
    }
}

Exercitiu

Se citeste o propozitie (sir de caractere). Sa se determine cate vocale si consoane contine propozitia.

Analiza Programului
Se citeste propozitia caracter cu caracter. Daca este litera, se verifica daca este vocala sau consoana.

using System;

namespace Exercitiu
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Introduceti propozitia:");

            char[] caractere = Console.ReadLine().ToCharArray();
            int vocale = 0;
            int consoane = 0;
            int index = 0;

            while(index < caractere.Length)
            {
                if(Char.IsLetter(caractere[index]))
                {
                    switch(caractere[index])
                    {
                        case 'a':
                        case 'e':
                        case 'i':
                        case 'o':
                        case 'u':
                            vocale++;
                            break;
                        default:
                            consoane++;
                            break;
                    }
                }
                index++;
            }

            Console.WriteLine("Numarul de caractere este {0}", caractere.Length);
            Console.WriteLine("Numarul de consoane este {0}", consoane);
            Console.WriteLine("Numarul de vocale este {0}", vocale);

            Console.ReadLine();
        }
    }
}