duminică, 25 octombrie 2015

C# lecția 7 - tipul enum, instructiunea foreach, tablouri neregulate




Tipul enum
[atribute][modificatori]enum NumeEnumerare [: Tip]
{
  lista
}
  în mod implicit, valoarea primului membru al enumerării este 0, iar fiecare variabilă care urmează are valoarea (implicită) mai mare cu o unitate decât precedenta.
  valorile folosite pentru iniţializări trebuie să facă parte din domeniul de valori al tipului enum
  nu se admit referinţe circulare
{class Program
{ enum lunaAnului
{ Ianuarie = 1,
Februarie,
Martie,
Aprilie,
Mai,
Iunie,
Iulie,
August,
Septembrie,
Octombrie,
Noiembrie,
Decembrie
}
static void Main(string[] args)
{
Console.WriteLine("Luna Mai este a {0}",(int)lunaAnului.Mai + "
luna din an.");
Console.ReadLine();
}
}
Instrucţiunea foreach
Această instrucţiune  enumeră elementele dintr-o colecţie, executând o instrucţiune pentru fiecare element. Elementul care se extrage este de tip read-only, neputând fi transmis ca parametru şi nici aplicat un operator care să-i schimbe valoarea.

Să se împartă un şir de caractere în cuvinte. Se va afişa numărul de cuvinte şi
fiecare cuvânt în parte
using System;
namespace Exemplul_foreach
{
    class Program
    {
        static void Main()
        {
            string sir = "Acesta este un sir";
            char[] delimitator = { ' ', ',', '.', ':' };// spatiu, virgula, punct, doua puncte
            Console.WriteLine("Sirul care va fi impartit in cuvinte\n{0}", sir);
     string[] cuvant = sir.Split(delimitator); //cuvant = tablou de string-uri returnat de                        //sir.Split
            Console.WriteLine("Sunt {0} cuvinte in text:", cuvant.Length);
            foreach (string s in cuvant) //pentru fiecare element s din tabloul cuvant
            {
                Console.WriteLine(s);
            }
            Console.ReadKey();
        }
    }
}

jagged array = tablou liniar de tablouri rectangulare uni – sau  n- dimensionale
int[][] mat = new int[][]
{
new int[3] {1,2,3},
new int[2] {4,5},
new int[4] {7,8,9,1}
};

int[][] mat = {
new int[3] { 1, 2, 3 },
new int[2] { 4, 5 },
new int[4] { 7, 8, 9, 1 }
};

Descompunerea unui număr în sumă de numere naturale consecutive. Se citeşte un număr natural n. Să se memoreze toate posibilităţile de descompunere a numărului n în sumă de numere consecutive. Dacă numărul n se scrie ca sumă de numere naturale consecutive, atunci rezultă că există i,k naturale  astfel încât
i+(i+1)+(i+2)+(i+3)+……+(k)=n
↔ (1+2+...+k)-(1+2+...+i-1)=n↔k*(k+1)/2-i*(i-1)/2=n
↔k2+k-i2+i-2n=0
↔k=(-1+Radical(1+8n-4i+4i*i))/2
Vom memora descompunerile în matricea neregulată a (descompunerile au dimensiuni variabile).

using System;
namespace TablouriNeregularte
{
    class Program
    {
        static void Main()
        {
            Console.Write("Introduceti un numar natural ");
            int n = Convert.ToInt32(Console.ReadLine());
            int[][] a = new int[n / 2][];
            int l = 0, i, j;
            for (i = 1; i <= n / 2; i++)
            {
                double k = (Math.Sqrt(1 + 8 * n - 4 * i + 4 * i * i) - 1) / 2;
                if (k == (int)k)
                {
                    a[l] = new int[(int)k - i + 1];
                    for (j = i; j <= k; j++) a[l][j - i] = j;
                    l++;
                }
            }
            Console.WriteLine("Descompunerea lui {0} in suma de numere naturale consecutive", n);
            for (i = 0; i < l; i++)
            {
                for (j = 0; j < a[i].Length; j++)
                    Console.Write(a[i][j] + " ");
                Console.WriteLine();
            }
            Console.ReadKey();
        }
    }
}

joi, 22 octombrie 2015

C# 6 Aplicatie la siruri de caractere



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CuvinteCareRimeaza
{
    class Program
    {
        /* se citeste un text, sa se scrie perechile de cuvintele care rimeaza (au ultimele 2 litere identice)
        apoi sa se scrie toate literele distincte si frecventele de aparitie
        metoda de rezolvare: intr-o unica parcurgere a sirului caracterele se numara intr-un tablou de structuri
        textul se reține intr-o variabila string apoi cuvintele se separa intr-un tablou de structuri
        care se parcurge apoi in 2 cicluri
        */
        struct caractere
        {
            public char caracter;
            public int contor;
        }
        struct cuvinte
        {
            public string cuvant;
            public bool folosit;
        }
        static caractere[] aparitii = new caractere[30];
        static cuvinte[] fraza = new cuvinte[300];
        static void Main(string[] args)
        {
            Console.Write("Introdu textul:");
            string text = Console.ReadLine(); //citeste text cu spatii pana la ENTER
            //intr-un singur ciclu numara caracterele distincte si separa cuvintele
            int l = text.Length;
            Console.WriteLine("lungime text={0}", l);
            int i = 0; // indice general in text
            int nrcar = 0; //contor in array aparitii
            int nrcuv = 0; //contor cuvinte in fraza
            int inceputCuvant = 0; //indice inceput cuvant
            bool spatii = true; //indicator ciclare spatii
            bool gasit = false; //indicator caracter gasit in vectorul aparitii
            while(i<l)
            {
                if (text[i] == ' ')
                {
                    if (!spatii)
                    {
                        spatii = true;
                        fraza[nrcuv].cuvant = text.Substring(inceputCuvant, i - inceputCuvant);
                        fraza[nrcuv].folosit = false;
                        nrcuv++;
                    }
                }
                else
                {
                    for (int k = 0; k <= nrcar; k++)
                    {
                        if (aparitii[k].caracter == text[i])
                        {
                            aparitii[k].contor++;
                            gasit = true;
                        }
                    }
                    if (!gasit)
                    {
                        aparitii[nrcar].caracter = text[i];
                        aparitii[nrcar].contor = 1;
                        nrcar++;
                    }
                    gasit = false;
                    if (spatii)
                    {
                        spatii = false;
                        inceputCuvant = i;
                    }
                }
                i++;
            }
            //trateaza ultima litera  (pentru  i=l-1)
            i--;
            for (int k = 0; k <= nrcar; k++)
            {
                if (aparitii[k].caracter == text[i])
                {
                    aparitii[k].contor++;
                    gasit = true;
                }
            }
            if (!gasit)
            {
                aparitii[nrcar].caracter = text[i];
                aparitii[nrcar].contor = 1;
                nrcar++;
            }
            i++;
            fraza[nrcuv].cuvant = text.Substring(inceputCuvant, i - inceputCuvant);
            fraza[nrcuv].folosit = false;
            nrcuv++;
            //afiseaza numarul de aparitii
            for (int j = 0; j <= nrcar-1; j++)
                Console.WriteLine("{0} de {1} ori", aparitii[j].caracter, aparitii[j].contor);
            //afiseaza cuvintele
            for (int j = 0; j < nrcuv; j++)
                Console.WriteLine(fraza[j].cuvant);
            //cauta cuvintele pereche in 2 cicluri imbricate
            Console.WriteLine("perechi de cuvinte care rimeaza");
            for(int u=0;u<=nrcuv-1;u++)
            {
                for(int v=u+1;v<nrcuv;v++)
                {
                    bool b1 = fraza[u].folosit;
                    bool b2 = fraza[v].folosit;
                    string s1 = fraza[u].cuvant;
                    string s2 = fraza[v].cuvant;
                    int lg1 = s1.Length;
                    int lg2 = s2.Length;
                    if (lg1>=2&&lg2>=2&&s1[lg1-2]==s2[lg2-2]&&s1[lg1-1]==s2[lg2-1]&&!b1&&!b2)
                    {
                        b1 = true;
                        b2 = true;
                        Console.WriteLine("{0} {1}",fraza[u].cuvant, fraza[v].cuvant);
                    }
                }
            }
            Console.ReadKey();
        }
    }
}