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.
Exemple
test
stte
Ana, dar si Maria invata sa programeze
Invata si tu sa programezi$$
anA, rad is iarMa atainv as amezeprogr
ataInv is ut as ameziprogr$$
----------------------------------------------------------------------------------------------------------------------------
Asta e ce am facut eu. Nu stiam cum pot delimita altfel cuvintele si nu stiu de ce nu merge sa nu imi inverseze si caracterele "!%&$"
Răspunsuri la întrebare
#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% :)).
getline(cin, textInitial);