Informatică, întrebare adresată de teodortoderitap37w4j, 8 ani în urmă

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 "!%&$"

Anexe:

Apollyon: programezi$$ trebuie să devină mezi$$progra sau ameziprogr$$ ?
Apollyon: la fel și Ana, să fie anA, sau a,An
teodortoderitap37w4j: Ana va fi anA
Apollyon: ca să delimitezi mai ușor cuvintele te poți folosi de strtok(...)
teodortoderitap37w4j: virgula ramane
teodortoderitap37w4j: iar programezi$$ devine ameziprogr$$
teodortoderitap37w4j: caracterele speciale cum ar fi virgule, semnul exclamarii, semnul dolarului raman pe aceleasi pozitii
Apollyon: Caracterele alea speciale apar doar la începutul/sfârșitul cuvântului ? Gen poate exista „progr$$amezi” sau „într-adevăr”?
teodortoderitap37w4j: Chiar nu m am gandit la exemplul acesta. In enunt are exemplul numai cu ele la final. Poate sa apara "!!programezi" dupa parerea mea. Nu stiu ce sa spun pentru ele in interior. De obicei cand aveam o incertitudine puneam codul pe site si vedeam cate puncte iau. Daca nu era 100 inseamna ca acolo era greseala. Daca poti sa ma ajuti considera ca nu ar exista in interior

Răspunsuri la întrebare

Răspuns de Apollyon
1

#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% :)).


Apollyon: dă-mi add
teodortoderitap37w4j: ...}
teodortoderitap37w4j: mai ales la alte probleme care le faceam
teodortoderitap37w4j: Poate problema e la while (!cin.eof()) {
getline(cin, textInitial);
teodortoderitap37w4j: Fiind un string si citind numai cate o linie, nu tot textul
Apollyon: Dă-mi add și ne auzim acolo
Apollyon: pe D1scord ( nu înțeleg de ce nu merge să scriu ) =))
teodortoderitap37w4j: Asta e parerea mea si cred ca de aceea nu trece toate testele. Scuze daca is "fitos", codul tau e unul foarte bun si cred ca ti a luat ceva timp si sa il scrii, da pai sa il si gandesti. Nu e neaparat sa o rezolvi azi. E pentru licieu pana pe 2 am de facut 5 probleme si sunt destul de grele si nu prea stiu sa le fac. Cand ai tu timp liber si poti sa te uiti peste cod. Multumesc frumos anticipat
teodortoderitap37w4j: Sau asa, mult mai usor
teodortoderitap37w4j: Ti-am dat
Alte întrebări interesante