Inversul unui cuvant in C
In tutorialul de astazi mi-am propus sa va explic cum ar trebui sa abordam aceasta problema, respectiv cea a intoarcerii unui cuvant, in limbajul de programare C.
Pentru inceput, ce reprezinta inversul unui cuvant? Sa luam cuvantul test, inversul lui este tset. Inversul lui craciun este nuicarc. Ei bine, cum vom duce la bun sfarsit aceasta prolema? Stim ca fiecare caracter din cuvantul pe care dorim sa-l intoarcem este stocat intr-un array, astfel puteam accesa fiecare caracter, in parte, si putem face operatii majore aupra cuvantului intreg.
O prima idee ar fi sa copiem caracter cu caracter din primul array, de la sfarsit spre inceut, intr-un alt array.
O prima idee ar fi sa copiem caracter cu caracter din primul array, de la sfarsit spre inceut, intr-un alt array.
#include < stdio.h > #include < string.h > int main() { char string1[] = "test"; char string2[5]; int i, j; int n = strlen(string1); for(i = 0, j = n - 1; i < n; i++, j--) { string2[i] = string1[j]; //printf("%d %d\n", i, j); } string2[i] = '\0'; printf("%s", string2); return 0; }
In codul de mai sus, parcurgem caracter cu caracter din variabila string1 de la sfarsit spre inceput si il salvam in variabila string2. Astfel, variabila string2 va contine reprezentarea inversului cuvantului pe care am dorit sa-l intoarcem.
In bucla for din codul nostru, atribuim caracterul de pe pozitia j din array-ul string1 elementului string2[i]. La primul ciclu al buclei, cand variabila i are valoarea 0 si variabila j are valoarea 3,
elementul string2[0] va retine valoarea stocata in variabila string1[3] - deci, ultimul caracter din array-ul string1.
Programul nostru isi duce la bun sfarsit misiunea, dar nu in cel mai eficient mod - folosind si variabila string2 ocupam memorie in plus. Exista un mod mai elegant de indeplini aceasta cerinta. El se bazeaza pe faptul ca putem inversa primul caracter al unui cuvant cu ultimul, al doilea cu penultimul, al treilea cu antepenultimul. Vom continua asa pana cand nu vor mai fi caractere de inversat, atunci constatam ca am inversat cuvantul.
Exemplu:
test
Vom inversa primul caracter, t, cu ultimul caracter - coincidenta face ca acesta sa fie tot t.
test
Acum inversam al doilea caracter cu penultimul. Dupa acest pas observam ca nu mai avem ce inversa, deci ne-am indeplinit cerinta.
tset
Iata si codul:
#include < stdio.h > #include < string.h > int main() { char string[] = "test"; char temp; int i, j; for(i = 0, j = strlen(string) - 1; i < j; i++, j--) { temp = string[i]; string[i] = string[j]; string[j] = temp; } printf("%s", string); return 0; }
Variabila temp este folosita pentru a putea inversa elementele de pe pozitiile i si j - probabil vom vorbi intr-un tutorial viitor despre acest procedeu.
S-ar putea sa te intrebi de ce am pus drept conditie de oprire a buclei i < j. Pentru a raspunde la aceasta intrebare trebue a abordam problema mai abstract. Inversam caracterele aflate la o anumita distanta pana cand ajungem la mijloc, daca numarul de caractere al cuvantului este par, atunci, avem 2 mijlocuri. Dupa ce am facut inversia caracterelor din mijloc trebuie sa ne oprim pentru ca am inversat cuvantul. In cazul in care numarul de caractere ale cuvantului este impar, atunci, avem un singur mijloc. In acest caz vom inversa caracterele din cuvant pana ajungem la mijloc. Ultimele caractere inversate vor fi cele din jurul mijlocului.
Practic, asta ar trebui sa vizualizati cand inversam un cuvant cu numar par de caractere. Incercati, pur si simplu, sa invartiti cuvantul in mintea voastra.
Deci, daca vom continua sa inversam caractere pana cand i va fi mai mare ca j, nu vom face decat sa readucem cuvantul in forma initiala. Vom inversa inversul cuvantului, de asta ne oprim la mijloc. Daca trecem de acea bariera care este mijlocul, atunci, inversam caracterele care au fost deja inversate, deci readucem cuvantul la forma initiala. - iar noi nu vrem acest lucru.
In cazul cuvantului cu numar impar de caractere craciun, puteti observa ca vom inversa caractere pana cand ajungem la caracterul c - caracterul din mijloc, respectiv limita. Indecsi i si j nu pot trece acea limita.