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

Se citeste de la tastatura un text, avand cel mult 200 de caractere, format din mai multe cuvinte, separate prin unul sau mai multe spatii sau semne de punctuatie: ,.?! . Textul se incheie cu punct. Cuvintele contin numai litere mici ale alfabetului englez. Scrie un program C++ care obtine un nou text format din toate cuvintele textului citit care incep si se incheie cu o vocala, separate intre ele printr-un spatiu. Programul va afisa pe ecran textul obtinut sau va afisa mesajul Nu exista, daca textul citit nu contine astfel de cuvinte. De exemplu, daca se citeste textul "lumina, asteroizi, comete, albine, oceane, oaza, soare, alba." se va obtine textul "asteroizi albine oceane oaza alba".


Am incercat sa o rezolv, insa folosind exemplul de mai sus imi afiseaza mesajul "Nu exista" :/


Acesta este codul meu:

#include

#include

#include


using namespace std;


ifstream in("sir.in");

ofstream out("sir.out");


char s[256], voc[] = "aeiou", sep[] = ",.?!", snou[204], *cuv;

int i, n;


int main()

{

in.getline(s, 256);

strcpy(snou, "");

cuv = strtok(s, sep);

while(cuv)

{

n = strlen(cuv);

if(strchr(voc, cuv[0]) != NULL && strchr(voc, cuv[n-1]) != NULL)

{

strcat(snou, cuv);

strcat(snou, " ");

}

cuv = strtok(NULL, sep);

}

if(strlen(snou) > 0)

{

out << snou;

}

else

out << "Nu exista";

return 0;

}
(Nu apar librariile aici,dar sunt trecute bine in codeblocks)

Răspunsuri la întrebare

Răspuns de Apollyon
1

Răspuns:

#define _CRT_SECURE_NO_WARNINGS

#include <cstring>

#include <iostream>

bool

eVocala(char caracter);

int

main()

{

/* șirul tău de caractere, el poate fi de asemena citit de la tastatură cu cin.getline(...) */

char sirCaractere[]{ "lumina, asteroizi, comete, albine, oceane, oaza, soare, alba." };

/* șirul în care vom adăuga cuvintele ce încep și se termină cu vocale (BUFSIZ = 512) */

char sirulRezultat[BUFSIZ]{};

/* un char* pe care-l vom folosi la strtok(...) */

char* tokenPointer{};

/* delimitatorii după care vom separa cuvintele */

const char* delimitatori{ ",.?! " };

tokenPointer = strtok(sirCaractere, delimitatori);

/* atâta timp cât char* e diferit de NULL (returnează null dacă nu mai găsește delimitatori sau găsește '\0' */

while (tokenPointer) {

 /* dacă primul caracter din cuvânt e vocală și ultimul e vocală le concatenăm la șirul rezultat */

 if (eVocala(tokenPointer[0]) && eVocala(tokenPointer[strlen(tokenPointer) - 1])) {

  strcat(sirulRezultat, tokenPointer);

  strcat(sirulRezultat, " ");

 }

 /* și căutăm următorul delimitator */

 tokenPointer = strtok(nullptr, delimitatori);

}

/* și la final afișăm șirul */

std::cout << sirulRezultat << "\n";

return 0;

}

/* o simplă funcție care returnează true dacă caracterul tău e vocală, false altfel */

bool

eVocala(char caracter)

{

char sirVocale[]{ "aAeEiIoOuU" };

for (int i = 0; i < strlen(sirVocale); i++)

{

 if (caracter == sirVocale[i])

  return true;

}

return false;

}

Output: asteroizi albine oceane oaza alba


anonymousxd0: Multumesc!
Alte întrebări interesante