Răspuns :
#include <iostream>
#include <sstream>
#include <string>
using std::cout, std::cin, std::endl, std::string, std::istringstream,
std::getline, std::size_t, std::ostringstream;
static int numaraCaractereSpeciale(const string& cuvantInitial) {
int contorCaractereSpeciale{};
for (size_t i = 0; i < cuvantInitial.size(); ++i)
if (!isalpha(cuvantInitial[i])) ++contorCaractereSpeciale;
return contorCaractereSpeciale != 0 ? contorCaractereSpeciale : -1;
}
static string modificaCuvantCuCaractere(const string& cuvantInitial,
const int& nrCaractereSpeciale) {
ostringstream stringStream;
size_t nrCaractere = static_cast<size_t>(nrCaractereSpeciale);
size_t lungimeCuvant{cuvantInitial.size() - nrCaractere};
// N -> mijlocul cuvântului, de exemplu pentru $invata N = 4
size_t N{lungimeCuvant / 2};
// dacă caracterele speciale se află la început
if (!isalpha(cuvantInitial[0])) {
// dacă dimensiunea cuvântului este pară
// de exemplu pentru $invata
if (lungimeCuvant % 2 == 0) {
// adăugăm în SS primele N caractere speciale la început
// stringStream = "$"
stringStream << cuvantInitial.substr(0, nrCaractere);
// Pornind de la indexul N(3) + nrCaractere(2) copiem până la final
// stringStream = "$ata"
stringStream << cuvantInitial.substr(N + nrCaractere);
// De la index 0 + nrCaractere (2 în cazul nostru) copiem N caractere
// stringStream = "$atainv"
stringStream << cuvantInitial.substr(nrCaractere, N);
// Dacă lungimea cuvântului este impară, de exemplu pentru $programeaza
} else {
// copiem primele nrCaractere speciale (2 în cazul nostru)
// stringStream = "$"
stringStream << cuvantInitial.substr(0, nrCaractere);
// N(6) + nrCaractere + 1 = 8
// copiem începând de la indexul 8 și până la final
// stringStream = "$meaza"
stringStream << cuvantInitial.substr(N + nrCaractere + 1);
// copiem caracterul din mijloc
// stringStream = "$meazaa"
stringStream << cuvantInitial[N + nrCaractere];
// adăugăm în SS începând de la indexul 2 N caractere
// stringStream = "$meazaaprogr"
stringStream << cuvantInitial.substr(nrCaractere, N);
}
// dacă caracterele speciale se află la sfârșit
} else {
// dacă cuvântul este par, de exemplu invata$
if (lungimeCuvant % 2 == 0) {
// adăugăm în SS începând de la N N caractere
// stringStream = "ata"
stringStream << cuvantInitial.substr(N, N);
// adăugăm în SS N caractere începând de la indexul 0
// stringStream = "atainv"
stringStream << cuvantInitial.substr(0, N);
// adăugăm în SS începând de la indexul 6 (lungimea cuvântului)
// caracterele speciale rămase
// stringStream = "atainv$"
stringStream << cuvantInitial.substr(lungimeCuvant, nrCaractere);
} else {
stringStream << cuvantInitial.substr(N + 1, N);
stringStream << cuvantInitial[N];
stringStream << cuvantInitial.substr(0, N);
stringStream << cuvantInitial.substr(lungimeCuvant, nrCaractere);
}
}
return stringStream.str();
}
// Aceași chestie doar că de data asta nu mai avem caractere speciale.
static string modificaCuvantFaraCaractere(const string& cuvantInitial) {
ostringstream cuvantRezultat;
size_t lungimeCuvant{cuvantInitial.size()};
size_t N{lungimeCuvant / 2};
if (lungimeCuvant % 2 == 0) {
cuvantRezultat << cuvantInitial.substr(N, N);
cuvantRezultat << cuvantInitial.substr(0, N);
} else {
cuvantRezultat << cuvantInitial.substr(N + 1, N);
cuvantRezultat << cuvantInitial[N];
cuvantRezultat << cuvantInitial.substr(0, N);
}
return cuvantRezultat.str();
}
static string modificaCuvant(string cuvantInitial) {
string cuvantRezultat;
// numaraCaractereSpeciale(...) returnează -1 dacă cuvântul nu conține caractere speciale
int nrCaractereSpeciale = numaraCaractereSpeciale(cuvantInitial);
if (nrCaractereSpeciale != -1)
cuvantRezultat = modificaCuvantCuCaractere(cuvantInitial, nrCaractereSpeciale);
else
cuvantRezultat = modificaCuvantFaraCaractere(cuvantInitial);
return cuvantRezultat;
}
int main() {
string textInitial{
"Ana, dar si Maria invata sa programeze \n\nInvata si tu sa "
"programezi$"};
string cuvantSeparat;
istringstream stringStream(textInitial);
while (getline(stringStream, cuvantSeparat, ' '))
cout << modificaCuvant(cuvantSeparat) << " ";
return 0;
}
100% există altă variantă mai „frumoasă” la ochi dar din ce am testat merge 99% :)).
Vă mulțumim că ați ales să vizitați platforma noastră dedicată Informatică. Ne bucurăm dacă informațiile oferite v-au fost de folos. Pentru întrebări sau asistență suplimentară, nu ezitați să ne contactați. Revenirea dumneavoastră ne onorează – adăugați-ne la favorite pentru a fi mereu la curent!