Se dă un text format din mai multe cuvinte, semne de punctuație și caractere speciale care pot fi stocate folosind char. Să se interschimbe pentru fiecare cuvânt prima parte a sa cu ultima parte a sa. În cazul în care cuvântul are lungime impară, litera din mijloc rămâne pe poziția sa.
Un cuvânt este o succesiune de litere mari și mici ale alfabetului englez.
Date de intrare
Se va citi textul, care se poate afla pe mai multe linii.
Date de ieșire
Programul va afișa textul după aplicarea transformărilor cerute.
Restricții și precizări
Lungimea totală a textului este mai mică sau egală cu 2 000.
Date de intrare
test
Ana, dar si Maria invata sa programeze pe WellCode!!
Invata si tu sa programezi$$
Date de iesire:
stte
anA, rad is iarMa atainv as amezeprogr ep CodeWell!!
ataInv is ut as ameziprogr$$
Limbaj C++
Răspunsuri la întrebare
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
void invarte_cuvant(char cuvant[1000]) {
//Retine dimenisunea
int dim = strlen(cuvant);
//Ia prima parte din cuvant
char prima[1000];
strncpy(prima, cuvant, dim / 2);
//ATENTIE : strncpy NU inchide sirul de caractere cu caracterul NULL, trebuie inchis manual
prima[dim / 2] = 0;
//Ia ultima parte din sir
char ultima[1000];
strcpy(ultima, cuvant + dim / 2);
//Daca e cuvant cu numar par de litere
if (dim % 2 == 0) {
strcpy(cuvant, ultima);
strcat(cuvant, prima);
}
//Daca e cuvant cu numar impar de litere
else {
//Ia mijlocul cuvantului
char mijloc = ultima[0];
//Pune ultima parte din cuvant (ultima[0] este mijloc, incepem de la ultima+1)
strcpy(cuvant, ultima + 1);
//Pune mijocul
cuvant[dim / 2] = mijloc;
//Am modificat manual ultimul caracter care era NULL, trebuie acum sa punem manual NULL pe pozitia urmatoare
cuvant[dim / 2 + 1] = 0;
//Punem prima parte din cuvant
strcat(cuvant, prima);
}
}
int main() {
//Citeste text intreg
char txt[2000];
cin.get(txt, 2000, 0); //Destinatie variabila txt, max 2000 char, se incheie cu caracter null
//Pentru fiecare pozitie
for (int poz = 0; poz < strlen(txt); poz++) {
//Declara cuvant si initializeaza cu sir gol
char cuvant[2000];
strcpy(cuvant, "");
//Cat timp caracterul curent e litera adauga in cuvant si treci la litera urmatoare
while (txt[poz] >= 'a' && txt[poz] <= 'z' || txt[poz] >= 'A' && txt[poz] <= 'Z') {
strncat(cuvant, txt + poz, 1);
poz++;
}
//Daca exista un cuvant, schimba prima parte cu ultima si afiseaza-l
if (strlen(cuvant) > 0) {
invarte_cuvant(cuvant);
cout << cuvant;
}
//Afiseaza caracterul curent
cout << txt[poz];
}
}
► Nota :
→ Iti sugerez sa rulezi pas cu pas programul pentru a intelege ce se intampla. Documentatia pentru functiile din cstring este utila pentru a intelege particularitatile acestora
► In C, un sir de caractere este un vector de caractere unde ultimul caracter este caracterul NULL (cod ASCII 0). Un vector este implementat folosind un pointer catre primul caracter din sir. Putem face aritmetica cu pointerii pentru a gasi sirurile care incep mai din dreapta.
daca txt = "ana are mere"; atunci
txt[0] → 'a'
txt[1] → 'n'
txt[12] → NULL
txt+1 = "na are mere"
txt+2 = "a are mere"
txt+3 = " are mere"
etc.