miercuri, 6 august 2014

Palindrom

   Un palindrom este un cuvant, o fraza, un numar sau o secventa de simboluri, care citit de la staga la dreapta sau de la dreapta la stanga ramane neschimbat.
   Cuvantul is are originea in greaca, find un cuvant compus din "palin" (care inseamana: iar) si "dromos" (care inseamna: drum, sens)

Enunt:
Sa se citeasca de la tastatura o valoare si sa se verifice daca este palindrom.
Ex: 1221, abba sau p sunt palindrom
Rezolvarea problemei se va face in limbajul C++

Metoda de rezolvare:
Pentru a fi mai usor, am impartit problema in 3 parti:
- citirea valorii de la tastatura cu functia citireValoare
- verificarea valorii cu functia isPalindrom
- afisarea rezultatului in metoda principala main
//============================================================================
// Name        : Palindrom.cpp
// Author      : exempleinformatica.blogspot.com
// Version     : 1.0
// Description : Palindrom in C++
//============================================================================

#include <iostream>
using namespace std;

/*
 * Citeste o valoare de la tastatura si o returneaza.
 * @return valoare citita de la tastatura
 */
string citireValoare() {
    string value;
    cin >> value;
    cout << "Valoare citita:" << value << endl;
    return value;
}
/*
 * Verifica daca stringul dat este palindrom.
 * @param value stringul care trebuie testat
 * @return true daca stringul dat este palindrom
 */
bool isPalindrom(string value) {
    // se gaseste pozitia de mijloc a sirului
    // pentru numar impar de pozitii se ia cu o pozitie in minus
    int lengthMid = value.length() / 2;
    // executa parcurgerea pozitiilor pana la mijloc
    for (int i = 0; i < lengthMid; i++) {
        // compara prima si ultima pozitie, continuand cu cate o
        // pozitie in plus sper interior
        if (value[i] != value[value.length() - i - 1]) {
            return false;
        }
    }
    return true;
}

/*
 * Functia de pornire a aplicatiei C++.
 */
int main() {
    // afiseaza Palindrom
    cout << "Palindrom C++" << endl;
    // citeste valoarea de la tastatura
    string value = citireValoare();
    // verifica daca valoarea citita este un palindrom
    if (isPalindrom(value)) {
        cout << "Este Palindrom" << endl;
    } else {
        cout << "Nu este Palindrom" << endl;
    }
    return 0;
}

Functia citireValoare

Functia citireValoare este folosita pentru a primi valoarea tiparita cu intermediul tastaturii. Are ca parametru de iesire o valoare de tipul string.
string value;
Pentru a realiza citirea se declara o variabila de tipul string, care va fi folosita pentru a returna valoarea primita.
cin >> value;
Aceasta variabila are valoarea initializata cu ajutorul functiei cin. Functia cin citesteste de la tastatura caracterele introduse pana cand se apasa tasta Enter.
cout << "Valoare citita:" << value << endl;
Pentru a vedea valoarea citita este folosita functia cout, care face afisarea in consola. endl are rolul de a introduce un rand nou.
return value;
Returneaza rezultatul functiei, adica valoarea cititat de la tastatura.

Functia isPalindrom

Functia isPalindrom este folosita poentru a verifica daca valoarea primita este un palindrom. Are ca parametru de intrare o valoare de tipul string asupra careia se va face verificarea. Are ca parametru de iesire o valoare de tipul boolean, valoarea true find returnata daca verificarea este pozitiva.
int lengthMid = value.length() / 2;
Se calculeaza mijlocul lungimii(se ia cu o pozitie in minus daca lungimea e impara) pentru stringul dat si se stocheaza in variabila lengthMid. Pentru a afla lungimea stringului se foloseste functia length, care returneaza numarul de caractere din stringul atasat. Pentru a afla mijlocul, valoare se imparte la 2. Iar pentru cazul in care numarul este impar se foloseste operatorul / (mod), care returneaza valoarea absoluta a impartirii, restul fiind ignorat.
for (int i = 0; i < lengthMid; i++)
Acum ca am aflat mijlocul stringului primit ca parametru, vom folosi structura repetitiva for pentru a itera prin acesta. Se defineste contorul int i=0, pentru a incepe de la primul caracter al stringului. Numerotarea pozitiilor in C++ pentru un string se incepe de la 0, deci prima pozitie are ca identificator 0 si nu 1. Se defineste limita iteratiei i<lengthMid, ciclul se va repeta pana cand i va fi mai mare sau egal cu lengthMid. Se defineste regula de incrementare i++. La fiecare iteratiei valoarea lui i va creste cu o unitate.
if (value[i] != value[value.length() - i - 1])
Pentru a face verificarea fom folosi structura if. Aceasta primeste o conditie pe care o va verfica. In cazul nostru se verifica daca valorile comparate sunt diferite cu ajutorul operatorului !=. Daca rezultatul este adevarat se continua pe ramura if, altfel se continua pe ramura else. In cazul in care ramura else nu exista, se continua la urmatoarea linie de cod. Conditia din if compara primul caracter din string cu ultimul si continua se interior cu fiecare iteratie. Prima valoare trece prin caracterele stringului de la prima pozitie 0 pana la mijlocul stringului. A doua valoare trece prin caracterele stringului de la ultima valoare pana la mijlocul stringului. Pentru a ajunge la ultimul string se foloseste identificatorul value.length-1 (se scade o unitate deoarece numerotarea se face de la 0).
return false;
Returneaza rezultatul functiei ca fiind fals. De asemenea opreste si ieratia for, deoarece return iese din functie oprind parcurgerea codului ramas in aceasta.
return true;
Returneaza rezulatatul functiei ca fiind adevarat. Aceasta linie de cod este accesata numai in cazul in care in interiorul iteratiei for nu se ajunge la return false. Asta inseamna ca fiecare pereche de caractere comparata are aceasi valoare. Prin urmare este indeplinita conditia de palindrom.

Functia main

Functia main este functia principala care este apelata la incepera programului. Prin intermediul acesteia sunt apelate metodele aferente. In aceasta functie se realizeaza apelarea functiilor de citire si de verificare. De asemenea se face si afisarea rezultatului.
cout << "Palindrom C++" << endl;
Se afiseaza o mica descriere a programului in consola. Se poate face detalierea functiei programului. In cazul nostru este afisata valoarea Palindrom C++.
string value = citireValoare();
Se defineste valoarea care va fi verificata. De asemenea se face si initializarea ei prin intermediul operatorului =. Aceasta va lua valoarea returnata de functia citireValoare.
if (isPalindrom(value))
Cu ajutorul constructiei if se face validarea valorii obtinute de la tastatura. Conditia structurii este definita de functia isPalindrom. In cazul in care sunt necesare conditii complexe, se recurge la functii pentru simplificarea codului si sporirea lizibilitatii acestuia (cod mai simplu de citit). In cazul de fata avem si ramura else a constructiei if, care este parcursa cand valoarea conditiei este false.
cout << "Este Palindrom" << endl;
Pe ramura if se face afisarea textului "Este palindrom".
cout << "Nu este Palindrom" << endl;
Pe ramura else se face afisare textului "Nu este Palindrom".