#include <iostream>
#include <cstring>
// Functie pentru a verifica daca un caracter este litera
bool esteLitera(char c) {
return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
}
// Functie pentru a numara caracterele alfabetice dintr-un cuvant
int nrChar(const char* cuvant) {
int count = 0;
for (int i = 0; cuvant[i] != '\0'; i++) {
if (esteLitera(cuvant[i])) {
count++;
}
}
return count;
}
// Functie pentru a inversa prima jumatate cu a doua jumatate a unui cuvant
void preschimbaCuvant(char* cuvant) {
int lungime = strlen(cuvant);
int litere = nrChar(cuvant);
if (litere < 2) return; // Daca sunt mai putin de 2 litere, nu facem nimic
int mijloc = litere / 2;
bool areImpar = (litere % 2 != 0);
int literaCurenta = 0; // Numara doar literele alfabetice
// Interschimbam prima si a doua jumatate a cuvantului
for (int i = 0, j = lungime - 1; i < j;) {
// Gasim prima litera din prima jumatate
if (!esteLitera(cuvant[i])) {
i++;
continue;
}
// Gasim prima litera din a doua jumatate
if (!esteLitera(cuvant[j])) {
j--;
continue;
}
if (literaCurenta < mijloc) {
// Schimbam literele dintre cele doua jumatati
std::swap(cuvant[i], cuvant[j]);
}
literaCurenta++;
i++;
j--;
// Oprim cand am inversat jumatatile si caracterul din mijloc este neatins
if (areImpar && literaCurenta == mijloc) {
break;
}
}
}
int main() {
// Propozitie pe mai multe randuri
char text[] = "Aceasta este o propozitie\nMai complexa si ciudata!";
// Cream un buffer pentru a lucra cu fiecare cuvant
char* cuvant = strtok(text, " \n");
// Parcurgem fiecare cuvant si aplicam functia de preschimbare
while (cuvant != nullptr) {
preschimbaCuvant(cuvant); // Apelam functia pentru a preschimba cuvantul
cuvant = strtok(nullptr, " \n");
}
// Afisam propozitia rezultata
std::cout << "Propozitia cu cuvintele preschimbate este:\n" << text << std::endl;
return 0;
}