Informatică, întrebare adresată de oanaroxana3, 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

Date de intrare Date de ieșire

test --> stte

Ana, dar si Maria invata sa programeze pe WellCode!! -- >anA, rad is iarMa atainv as amezeprogr ep CodeWell!!


Invata si tu sa programezi$$--> ataInv is ut as ameziprogr$$


Acesta este codul meu :

#include

#include

using namespace std;


int main() {

char s[101];

cin.getline(s, 101);

int n = strlen(s);

for(int i = 0; 2 * i <= n - 1; i++) {

char aux = s[i];

s[i] = s[n - i - 1];

s[n - i - 1] = aux;

}

cout << s;

return 0;

}

ideea este ca imi inverseaza si cuvintele intre ele , exemplu : radu canta -->afiseaza: atnac udar, in loc de -->udar atnac.

Cum sa fac sa nu imi mai inverseze si cuvintele?

Multumesc!


VxF: Ești sigură de cerință? Eu am înţeles că „radu canta” ar trebui să devină „dura tanca”.
oanaroxana3: Da, ai dreptate.
oanaroxana3: Ma poti ajuta? Multumesc!
VxF: Ar fi bine să pornești de la https://brainly.ro/tema/10330113 Acolo ai parcurgerea pe cuvinte a unui sir de caractere unde separatorii pot fi și semne de punctuaţie pe lângă spaţii. Apoi inversarea aplici separat de fiecare dată când ajungi la sfârșitul unui cuvânt.

Răspunsuri la întrebare

Răspuns de VxF
2

Răspuns:

#include <iostream>

#include <cstring>

using namespace std;

int main() {

   char s[2001], cuvant[2001];

   int inceput = -1;

   cin.getline(s, 2001, 0);

   int n = strlen(s);

   for (int i = 0; i < n; ++i) {

       if ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')) {

           if (inceput == -1) {

               inceput = i;

           }

       } else if (inceput != -1) {

           strncpy(cuvant, s + inceput, i - inceput);

           strncpy(s + inceput, cuvant + (i - inceput + 1) / 2, (i - inceput) / 2);

           strncpy(s + inceput + (i - inceput + 1) / 2, cuvant, (i - inceput) / 2);

           inceput = -1;

       }

   }

   

   if (inceput != -1) {

       strncpy(cuvant, s + inceput, n - inceput);

       strncpy(s + inceput, cuvant + (n - inceput + 1) / 2, (n - inceput) / 2);

       strncpy(s + inceput + (n - inceput + 1) / 2, cuvant, (n - inceput) / 2);

   }

   

   cout << s;

   return 0;

}

Explicație:

Cum am propus, am adaptat rezolvarea de la https://brainly.ro/tema/10330113


oanaroxana3: Multumesc!
oanaroxana3: Imi poti spune daca am folosi functia strcpy in loc strncpy cum ar arata bucata asta de cod strncpy(cuvant, s + inceput, n - inceput);

strncpy(s + inceput, cuvant + (n - inceput + 1) / 2, (n - inceput) / 2);

strncpy(s + inceput + (n - inceput + 1) / 2, cuvant, (n - inceput) / 2);?
VxF: „The strcpy() function copies the string pointed to by src, including the terminating null byte ('\0'), to the buffer pointed to by dest.” — Dacă folosești strcpy() atunci o să te trezești cu niște terminatori 0 în mijlocul șirului. Alternativa ar fi copierea caracter cu caracter într-o buclă for. Dar cum ai avea nevoie de 6 astfel de bucle, ar fi ideal să muţi codul respectiv într-o funcţie. Și astfel ai avea o funcţie care face fix ce face strncpy() dar nu se numește strncpy().
VxF: Să facem asa: primul strncpy() înlocuim cu strcpy(), următoarele 2 le comasăm într-un singur for, iar ultimele 3 strncpy() (de după for) le ștergem (scuze, nu mi-am dat seama că în acest caz nu e nevoie de ele). Deci:
strcpy(cuvant, s + inceput);
for (int j = 0; j < (i - inceput) / 2; j++) {
s[inceput + j] = cuvant[(i - inceput + 1) / 2 + j];
s[inceput + (i - inceput + 1) / 2 + j] = cuvant[j];
}
oanaroxana3: Dupa ce verific in ambele cazuri daca inceput este diferit de -1 am pus codul strcpy(cuvant, s + inceput);
for (int j = 0; j < (i - inceput) / 2; j++) {
s[inceput + j] = cuvant[(i - inceput + 1) / 2 + j];
s[inceput + (i - inceput + 1) / 2 + j] = cuvant[j];
} doar ca nu functioneaza corect
Alte întrebări interesante