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 site-ul nostru dedicat Informatică. Sperăm că informațiile disponibile v-au fost utile. Dacă aveți întrebări sau aveți nevoie de asistență suplimentară, vă rugăm să ne contactați. Revenirea dumneavoastră ne va bucura, iar pentru acces rapid, nu uitați să ne salvați la favorite!