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

Adaugarea unui nod la sfarsitul listei inlantuite

Sa se adauge un nod la sfarsitul unui liste inlantuite.

Analiza Programului
Listele simplu inlantuite sunt structuri de date dinamice, care, spre deosebire de vectori, nu sunt alocate ca blocuri de memorie omogene, ci ca elemente separate de memorie. Fiecare nod va contine adresa urmatorului nod si informatia utila. In acest mod, accesul la elementele listei se va face secvential.

Inserarea unui element se poate face la inceputul, la sfarsitul listei sau dupa un anumit nod, deja existent. Inserarea unui element la sfarsitul listei necesita verificarea conditiei pentru lista vida, parcurgerea acesteia si legarea elementului.

Rezolvarea in C#

Adaugarea unui nod la inceputul listei inlantuite

Sa se adauge un nod la inceputul unui liste inlantuite.

Analiza Programului
Listele simplu inlantuite sunt structuri de date dinamice, care, spre deosebire de vectori, nu sunt alocate ca blocuri de memorie omogene, ci ca elemente separate de memorie. Fiecare nod va contine adresa urmatorului nod si informatia utila. In acest mod, accesul la elementele listei se va face secvential.

Inserarea unui element se poate face la inceputul, la sfarsitul listei sau dupa un anumit nod, deja existent. Inserarea unui element la inceputul listei este cazul cel mai simplu: se aloca nodul listei, se leaga de primul nod, care se va repozitiona.

Rezolvarea in C#

Lista simplu inlantuita

Sa se creeze o lista simplu-inlantuita din 3 noduri.

Analiza Programului
Listele simplu inlantuite sunt structuri de date dinamice, care, spre deosebire de vectori, nu sunt alocate ca blocuri de memorie omogene, ci ca elemente separate de memorie. Fiecare nod va contine adresa urmatorului nod si informatia utila. In acest mod, accesul la elementele listei se va face secvential.

Pentru crearea unei liste simplu inlantuite:
cream primul nod p;
cream celelalte noduri prin legarea fiecaruia de ultimul nod creat.

Rezolvarea in C#

Special folders

In crearea unor functionalitati este nevoie de accesarea directoarelor cu caracter special din Windows: Desktop, Documents, Favorites, Music, Videos, Fonts, Programs, Startup, Windows, Program Files, etc.

            //Windows special folders
            foreach (var value in Enum.GetValues(typeof(Environment.SpecialFolder)))
            {
                Console.WriteLine(value);
            }

Caile catre aceste directoare se pot afla astfel:

            foreach (Environment.SpecialFolder folder in Enum.GetValues(typeof(Environment.SpecialFolder)))
            {
                var path = Environment.GetFolderPath(folder);

                Console.WriteLine(path);
            }

Aceste cai nu trebuie “hard-coded” pentru ca ele difera in functie de versiunea sistemului de operare si utilizatorul le poate schimba.

Tips C# 10

Procedeul de reflection consta in interogarea metadatelor si a codului compilat, la runtime. Aceste informatii sunt folosite in dynamic binding, data binding, serializare, Remoting.
Folosind API-urile oferite de reflection se poate executa in mod dinamic cod dintr-un assembly oarecare. Presupunem ca avem un dll la care nu avem referinta si care contine o clasa pe care dorim sa o instantiem.

    namespace Dynamic
    {
        public class Agent
        {
            public string Name { get; set; }

            public Agent()
            {

            }
        }
    }

    static void Main(string[] args)
    {
        string assemblyName = @"C:\Users\marius\Documents\Visual Studio 2010\Projects\Reflection\Dynamic\bin\Debug\Dynamic.dll";
          
        Assembly assembly = Assembly.LoadFrom(assemblyName);
        if (assembly != null)
        {
            Type type = assembly.GetType("Dynamic.Agent");

            if (type != null)
            {
                dynamic agent = Activator.CreateInstance(type);
                agent.Name = "Marius";
                Console.WriteLine(agent.Name);
            }
        }
    }

Am folosit tipul dynamic din C# 4.0 pentru a apela proprietatea obiectului agent, la runtime. Alte optiuni ar fi fost clasa MethodInfo si apelurile Invoke.

In comparatie cu dynamic binding, care este mai usor de folosit si care se bazeaza pe DLR pentru interoperabilitate, reflection pare mai dificil in utilizare, acesta fiind mai strans legat de CLR.

Tips C# 9

Exista multe moduri de a compara sirurile de caractere in C#. O situatie deosebita apare in cazul compararii string-urilor a caror valoare se schimba in functie de limba in care proiectul este construit. In acest caz, “localized strings”, sirurile de caractere pot parea la fel, dar valoarea bitilor poate fi diferita.

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

namespace StringComparer
{
    class Program
    {
        static void Main(string[] args)
        {
            string s1 = "file";
            string s2 = "FILE";

            bool invariantCultureComparer = string.Compare(s1, s2, true, CultureInfo.InvariantCulture) == 0;
            bool turkishCultureComparer = string.Compare(s1, s2, true, CultureInfo.CreateSpecificCulture("tr-TR")) == 0;

            Console.WriteLine("{0} si {1} sunt egale?", s1, s2);
            Console.WriteLine("---------");
            //da
            Console.WriteLine("Invariant culture:" + (invariantCultureComparer ? "da" : "nu"));
            //nu
            Console.WriteLine("Turkish culture:" + (turkishCultureComparer? "da": "nu"));
           
            Console.ReadLine();
        }
    }
}

Chiar daca vizual reprezentarea sirurilor de caractere este aceeasi, bitii sunt diferiti.

            //11001100110100101101100011001010
            Console.WriteLine(GetBits(s1));
            //10001100100100101001100010001010
            Console.WriteLine(GetBits(s2));

        public static string GetBits(string input)
        {
            StringBuilder sb = new StringBuilder();
            foreach (byte b in Encoding.Unicode.GetBytes(input))
            {
                sb.Append(Convert.ToString(b, 2));
            }
            return sb.ToString();
        }

Se poate observa cat de important este sa tinem cont de “culture” atunci cand comparam sirurile de caractere.

Exercitiu

Se citeste de la tastatura o succesiune de litere mic terminata cu caracterul punct.Sa se afiseze pe ecran literele care se repeta.

Analiza Programului
O prima solutie ar fi memorarea caracterelor intr-un vector, parcurgerea lui pentru fiecare element si verificarea daca mai apare sau nu pe o alta pozitie. Daca da, il afisam. Aceasta varianta nu este foarte potrivita, deoarece caracterul va fi afisat ori de cate ori va fi gasit pe o alta pozitie. Asta inseamna ca va trebui sa stim daca un caracter a mai fost sau nu afisat. Pentru asta, vom declara un vector cu 26 de componente (numarul de litere mici din alfabet). Chiar de la citirea caracterelor, vom numara in acest vector ori de cate ori va aparea fiecare litera din alfabet in sir. Vom parcurge vectorul si vom afisa doar literele pentru care numarul de aparitii va fi mai mare decat 1.

Rezolvarea in C#

Tips C# 8

In lucrul cu sirurile de caractere, de regula trebuie acordata atentie:

  • Daca string-ul este null
  • Daca string-ul este gol
  • Daca string-ul contine spatii

Primele doua conditii se pot verifica folosind metoda String.IsNullOrEmpty().

In .NET 4.0 a aparut si metoda String.IsNullOrWhiteSpace() cu ajutorul careia se poate verifica daca sirul contine doar spatii.

using System;

namespace String
{
    class Program
    {
        static void Main(string[] args)
        {
            string s1 = null;
            string s2 = "";
            string s3 = "  ";
            
            //true
            Console.WriteLine(string.IsNullOrEmpty(s1));
            //true
            Console.WriteLine(string.IsNullOrEmpty(s2));
            //true
            Console.WriteLine(string.IsNullOrWhiteSpace(s3));

            Console.ReadLine();
        }
    }
}