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:
#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