Sari la conținut

b0rn0key

Elite Members
  • Număr conținut

    1.078
  • Înregistrat

  • Ultima Vizită

Postări postat de b0rn0key

  1. Model reclamatii utilizatori

    1)  Nick:

    2) Numele membrului reclamat:

    3) Motivul pentru care-l reclami:

    4) Dovezi:

    ! Atentie ! - daca nu prezentati dovezi clare, cererea va fi respinsa!

    Model reclamatii staff

    1) Nick:

    2)Numele adminului reclamat:

    3)Motivul pentru care-l reclami:

    4)Dovezi:

    ! Atentie ! - daca adminul se gaseste vinovat, atunci se aplica pedepsele enuntate in REGULAMENT in functie de gravitate!

    ! Atentie ! - doar detinatorii si ownerii au dreptul de a da decizia finala, ceilalti pot raspunde cu Pro sau Contra.

  2. Model Cerere Avansare

    1) Nick:

    2) Grad avut:

    3) Grad dorit:

    4) De ce doresti sa primesti up?:

    5) Link Ban-List personal:

     

    ! Atentie ! - nerespectarea modelului duce la respingerea si inchiderea topicului.

    ! Atentie ! - cererea de avansare se face o data la o luna de la ultima cerere/grad primit.

    ! Atentie! - la subpunctul 5 nu este obligatoriu postarea ban-listului, insa va influenta decizia finala a cererii.

    • Un tablou bidimensional este tablou pătratic sau matrice pătratică dacă numărul de linii este egal cu numărul de coloane. Bordarea unei matrici se poate face indiferent daca aceasta este pătratică sau nu.

    Vecinii unui element din matrice

    • De obicei, în probleme se precizează care sunt vecinii unui element al matricei. De regulă, sunt elementele învecinate pe linie și pe coloană, dar pot fi și pe diagonală, sau în formă de L, așa cum se deplasează calul de șah.

    Vectori de direcție ( de deplasare)

    • Putem implementa vectorii de direcție astfel:

    image.thumb.png.adb90bc813dd6b6e2b255ea223b632d1.pngimage.thumb.png.df38147794741244db7daa38002d5755.png

    -numărul de elemente ale vectorilor de directie este egal cu numărul de vecini ai unui element;
    -valorile elementelor vectorilor de directie sunt astfel alese, încât adunându-le la i, respectiv j, să obținem coordonatele vecinilor elementului de coordonate i,j;
    -identificarea vecinilor se face parcurgând vectorii de directie.

     

    image.png.2f0a8198e4cb530895e71c7912b5c25f.png
    Când considerăm vecinii pe linie, coloană si diagonale ai unui element a[j], numarul de vecini poate fi 3, 5 sau 8.

    image.png.a50108d391044ca63b64c87fa0960f04.png

     

    image.png.c713c9e4be029a1881da7802451a942e.pngimage.png.bad04a04a0b9ef21fff32e43b4c3e096.png

    Bordarea unei matrice

    În rezolvarea problemelor care necesită deplasarea în spațiul bidimensional, este important să nu ieșim din matrice – analiza unor elemente care nu fac parte din domeniu, poate avea consecințe impredictibile.
    Pentru a evita acest lucru, ori folosim bordarea matricei cu obstacole, adică adăugarea la matrice a două linii respectiv două coloane ori folosim o funcție care verifică apartenența elementului prelucrat la domeniul dat.

    image.png.0e8835396355bb37389b55ffdc42b3da.pngimage.png.7fd4b0c845f217ac784c3d8770a3aa10.png

    image.png

  3. Metode de cautare

    • Se pot formula foarte multe probleme pe tema CAUTARE.mEx: să se verifice dacă într-un vector dat are o anumita valoare. Căutarea se poate face - Liniar, adică parcurgem tot șirul și verificăm existența valorii cerute - Binar, folosim metoda căutării binare într-un tablou ordonat.
    • Cele 2 metode, diferă ca și timp de execuție.

                                  Cautare liniara

    image.png.400db82b26e6723008e199075f889d1d.png image.png.f9b491c934bf1da2bee20010d9c9ae28.png

                             Cautare binara

    //vectori indexati de la 0, la n-1

    cin>>x;

    st=-1; dr=n;

    ///setam capetele in afara indicilor

    while(dr-st>1) { mij=(st+dr)/2;

    ///elementul din mijloc

    if (v[mij]<x)

    ///micsoram spatial de cautare

    st=mij;

    else dr=mij; }

    if(dr==n or v[dr]!=x)

    cout<<"0 ";

    else cout<<"1 ";

    Metode de sortare

    Sortarea unui tablou reprezintă o rearanjare a elementelor astfel încât valorile acestora să fie într-o anumită ordine. De regulă ordinea cerută este cea crescătoare sau descrescătoare. Din punct de vedere al eficienței avem:
    - Algorimi neeficienți de complexitate O(n*n)
    o Metoda bulelor
    o Sortare prin selecție
    o Sortare prin inserare
    o Etc.
    - Algoritmi eficienți, de complexitate O(n * log n)
    o Quicksort
    o MergeSort
    o HeapSort

    SORTARE PRIN SELECTIE

    image.png.7070aa764e2b45367acca1e268e43cec.png

    METODA BULELOR

     

    image.png.d64ed2925362e6b060c570aff4436e32.png

    Funcția sort este declarată în header-ul algorithm, care trebuie inclus în programul sursă:
    #include <algorithm>
    sort(A, A + n); // indexare 0.. n-1
    sort(A+1, A+n+1); //indexare 1..n
    sort(A + s, A + d + 1, greater<int>()); //ordonare descrescătoare

    Interclasarea tablourilor

    Considerăm două tablouri unidimensionale cu elemente numere întregi ordonate crescător. Se dorește construirea unui alt tablou, care să conțină valorile din cele două tablouri, în ordine. O soluție foarte eficientă este interclasarea:  considerăm două tablouri, cu n, respectiv m elemente, ordonate crescător  cele două tablouri se parcurg concomitent;  se alege valoarea mai mică dintre cele două elemente curente o se adaugă în al treilea tablou o se avansează numai în tabloul din care am ales valoarea de adăugat  parcurgerea unuia dintre cele două tablouri se încheie  toate elementele din celălalt tablou, neparcurse încă, sunt adăugate în tabloul destinație  tabloul destinație are k = n + m elemente
    Algorimul de interclasare se poate folosi în problemele care cer reuniunea, intersecția sau diferența a 2 mulțimi date.

    image.png.57229ec2004c8e065ef2ded3bcbfcbac.png

    image.png

    • Like 1
  4. Vector caracteristic

    Considerăm următoarea problemă: Se dă o listă cu numere naturale. Să se determine numerele naturale nenule cu cel mult patru cifre care nu apar în lista dată. Ideea de rezolvare:
    - Indicii elementelor din șir reprezintă valorile posibile ale elementelor din șir;

    - inițial elementele din vector sunt 0;

    - pentru fiecare valoare x care apare în fișier vom marca în vectorul v[] elementul corespunzător cu 1, v[x] = 1;

    Vectorul v[] este vector caracteristic. Elementele lui caracterizează toate numerele naturale de maxim 4 cifre, stabilind despre fiecare dacă face sau nu parte din șirul corespunzător.

    image.png.55192c2bb67fc844bd7b3169c274c86d.png

    image.png.a9878dda59f296ad9fbb83ac965b479f.png

    Vector de frecvență

    Considerăm următoarea problemă: Să considerăm din nou un șir de cifre zecimale. Să se determine cifra care apare de cele mai multe ori. Dacă sunt mai multe cifre care apar de număr maxim de ori, să se determine cea mai mică (sau cea mai mare, sau toate, etc.).

    De această dată nu putem folosi un vector caracteristic, dar putem folosi un vector de frecvență, adică un vector cu același număr de elemente ca numărul posibil de valori distincte din șirul dat cu semnificația: v[c] = numărul de apariții ale cifrei c în șirul dat. După construirea acestui vector, valoarea maximă din el va reprezenta numărul maxim de apariții ale unei cifre, iar indicii pentru care elementul corespunzător are valoare maximă reprezintă cifrele care apar de număr maxim de ori.

    image.thumb.png.bac0edcb9a60a158fa470d62d0bf6cfc.png

    • Like 1
  5. Tablouri unidimensionale

    • Un tablou unidimensional se declară în C++ astfel: tipDeBază denumire[Dimensiune]; int X[10]; Indicii unui tablou sunt între 0 și Dimensiune-1, deci în exemplul nostru între 0 și 9.
    • Elementele unui tablou declarat global (în afara oricărei funcții) sunt inițializate cu 0.
    • Elementele unui tablou declarat local (în interiorul unei funcții) sunt inițializate cu valori aleatorii.
    • Parcurgerea unui tablou reprezintă referirea fiecărui element al tabloului, într-o anumită ordine. Referirea elementului se face prin intermediul indicelui.

    image.png.14c5e09a3b55f32bcd593b3fbccead0c.png

    Tabloul poate fi parcurs și de la dreapta la stânga, adică în ordinea descrescătoare a indicilor, de la n-1 la 0.

    • Citirea unui vector

    image.png.0d6228ca6c1afea39c49673ef7d6edc1.png

    • Afișarea unui vector

    image.png.50c0a2345ee7573c9acb8b6cd80637dc.png

  6. Alegerea structuriilor repetitive in aplicatii

    • Dupa cum bine stiti, structurile repetitive se folosesc pentru a repeta un anumit lucru de atatea ori cat conditia este adevarata si pentru "a usura" munca programatorului (adica sa nu foloseasca mii de if-uri).
    • Insa de cele mai multe ori ne punem intrebarea "Ce structura sa folosesc". Ei bine, trebuie sa gandim problema astfel incat sa ne dam seama daca avem de a face cu un numar cunoscuti de pasi, sau nu.
    • In momentul in care stim care este procedeul: "luam o variabila j care pleaca de la o valoare, aceasta sa fie intr-un interval, crescand pana la n", atunci cel mai rapid si mai usor este sa folosim un for care ia toti pasii, fara a ne "chinui" cu declararea variabilei si initializarea ei, deodata cu celelalte variabile, si prin  crearea unui while si marirea contorului de fiecare data.
    • In schimb daca, in momentul realizarii problemei identificam ca datele nu sunt tocmai precise, avand un numar cunoscut de pasi, cel mai bine si mai sigur este sa folosim un while.
    • Spre exemplu cand nu avem nevoie de un contor, atunci conditia ar putea fi plasata doar in while (ex: while(n>0) ) si nu in for.
    • De asemenea daca va este mai la indemana "do while" puteti folosi cu cea mai mare incredere, executia este la fel. 
  7. Structura repetitiva cu numar cunoscuti de pasi

    - FOR -

    • Atunci când anumite operații trebuie repetate de un număr de ori cunoscut (de obicei de un număr mare de ori, care nu permite scrierea repetată a operațiilor în algoritm), se utilizează structura repetitivă pentru.
    • SINTAXA STRCTURII FOR:               

    for(contor=expresie_initiala; contor<=expresie_finala; contor=contor+pas)

    instructiuni;

    • Executia instructiunii for are etapele urmatoare: Etapa 1. Se inițializează contorul (variabila care numără pașii)
    • Etapa 2. Se verifică daca valoarea contorului este mai mica sau egala cu valoarea finala . Dacă DA, se execută instrucțiuni, apoi contorul creste cu valoarea pasuluiși revenim la Etapa 2 . Dacă NU este îndeplinită, se oprește execuția instructiunii for
    • Obs: daca sunt două sau mai multe instrucţiuni în for se vor grupa între acolade {...}

                  Ca exemplu voi lua un algoritm elementar de la divizorii unui numar natural:

    int n,d;

      if(n==1)

        cout<< 1;

    else

    {

                                           cout<<1<<’ ’ ;

                                                           for(d=2;d<=n/2;d++)

                                                                  if(n%d==0)

                                                                        cout<< d << " ";

                                             cout << n;

    }

  8.                                                                                                  Structura repetitiva cu numar necunoscuti de pasi si test final

                                                                                                                                                               - DO WHILE -

    • Structura repetitiva cu test final se datoreaza faptului ca conditia executarii programului se gaseste la finalul structurii.

                SINTAXA STRUCTURII:        do

                                                                                     {

                                                                                            prelucrari;

                                                                                     }

                                                                       while(conditie);

    • Structura do while se citeste repeta cat timp si va repeta instructiunile din corpul structurii cat timp conditia de la finalul executarii va fi adevarata.
    • OBSERVATIE: ! In momentul scrierii in pseudocod al acestei structuri, ar fi bine sa mentionez ca exista 2 moduri de executie:  executa ..... cat timp sau repete .... pana cand. Vreau sa atentionez ca in momentul in care scriem din pseudocod in c++ si invers, trebuie sa fim atenti la modul pe care l am ales si la conditie. 
    • Ca exemplu pot lua urmatoarea scriere in pseudocod, pe care o voi transcrie in c++.

    citeste n                                                                                                                                cin >> n, i = 1;

    repeta                                                                                                                                    do{

                    scrie i                                                                                                                                    cout << i;

                    i <- i + 1                                                                                                                                 i++;}

    pana cand i > n                                                                                                                  while(i <= n);

    • Cu alte cuvinte trebuie sa avem grija cum citim conditia. In pseudocod, toate lucrurile se vor repeta pana cand i va deveni mai mare ca n, iar in c++ lucrurile se vor repeta cat timp i este mai mic sau egal ca n.

     

    • O noua observatie o face faptul ca daca vom pune conditia ca n sa fie diferit de 0, programul tot va prelucra informatiile o singura data, adica va afisa 1. DIN CE CAUZA?   Din cauza faptului ca, si de aici vine si denumirea structurii cu test final, conditia este evaluata ultima! RECOMANDARE: pentru a nu evita un caz de test in probele de concurs, olimpiada etc, se poate plasa un if inaintea structurii pentru a nu executa informatiile cat timp conditia este falsa!

     

  9.                                                                                                  STRUCTURA REPETITIVA CU NUMAR NECUNOSCUTI DE PASI SI TEST INITIAL

                                                                                                                                                                                                  -WHILE-

    • Structura "While" este o structura repetitiva cu numar necunosctuti de pasi, deoarece nu cunoastem fiecare pas al executarii programului.

               Sintaxa structurii While este:         while(conditie)

                                                                                                       {

                                                                                                                    prelucrari;

                                                                                                        }

    • Cu alte cuvinte, cat timp, aceasta fiind si scrierea in pseudocod al acestei structuri repetitive, expresia logica este adevarata, programul va executa prelucrarile din interiorul corpului, marcate cu acolade {}.
    • In momentul in care conditia este adevarata, programul va intra in structura si va executa fiecare cerinta data de program.
    • In momentul in care conditia a devenit falsa, atunci programul va sari instant peste structura si va continua sa prelucreze informatiile de dupa.

               Ca exemplu, voi folosi o problema scurta prin care voi introduce structura repetitiva "while" :

    ENUNT: Se citeste un numar natural n. Sa se afiseze toate numerele pana la n.

    REZOLVARE SI EXPLICARE: 

    #include<iostream>

    using namespace std;

    int main()

    {

           int n, i = 1;              /// am declarat o variabila n si un index i pe care l am initializat cu prima valoare de la care vrem sa plecam

             cin >> n;                 /// am citit de la tastatura valoarea lui n

             while(i <= n)      /// am folosit structura while deoarece ne era foarte obositor sa folosim if-uri(structura de decizie)  si am pus conditia ca i sa fie mai mic egal  de cat n, valoarea pe care am citit o

          

                    cout << i << " ";         /// am afisat i-ul;

                    i++;                                /// iar acesta creste cu o unitate pana cand i devine n.   (i++ este echivalent cu i = i + 1, adica va creste cu o unitate)

            }

       return 0;

    }

    • Ca explicatie pot adauga ca, daca pentru n luam valoarea 5, atunci i este mai mic sau egal ca 5, deoarece i pleaca de la 1, mi-l afiseaza si dupa creste cu o unitate, adica devine 2. Deci mi a afisat 1, iar " " inseamna spatiu. Dupa care va face acelasi lucru (analog va afisa 2 3 4 si 5) iar cand i ajunge la 6 iese din structura si da return 0.
    • Aceasta este unul dintre milioanele de exercitii prin care putem usor sa le rezolvam folosind structura while.
×
×
  • Creează nouă...

Informații Importante

Termeni de Utilizare & Politică Intimitate