# PBinfo #1009 – Cuvinte3 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Cerința
Se consideră un text alcătuit din mai multe linii, în care cuvintele sunt separate prin spatii și caractere din setul .,;:-?!. Să se determine cuvintele distincte din text care conţin subşirul ate, fără a face distincţie între litere mari şi mici.

Date de intrare
Fișierul de intrare cuvinte3.in conține textul dat.

Date de ieșire
Fișierul de ieșire cuvinte3.out va conține mai multe linii; pe fiecare linie se află câte un cuvânt distinct din textul dat care conține subșirul ate.

Restricții și precizări

fiecare linie din fișierul de intrare va avea cel mult 255 de caractere
ordinea de afișare a cuvintelor este cea din textul dat
dacă un cuvânt apare în text de mai multe ori (fără a face distincţie între litere mari şi mici) se va afișa în fișierul de ieșire prima sa apariție
în fișierul de intrare sunt cel mult 100 de cuvinte distincte care conține subșirul ate

Exemplu:
cuvinte3.in

Daca satelitii nu sunt activi, GPS-ul nu functioneaza... 
- Ai vazut cate cuvinte marcate sunt?? Poate esti si tu atent! 
Cate sunt?
cuvinte3.out

satelitii
cate
marcate
Poate
atent

## Cod sursă C++

```cpp
#include <fstream>
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
ifstream fin("cuvinte3.in");
ofstream fout("cuvinte3.out");
int n;
char lista[505][256];
void to_lower(char * p)
{
	for(int i = 0 ; p[i] ; i++)
		p[i] = tolower(p[i]);
}
bool OK(char * p)
{
	char t[256];
	strcpy(t , p);
	to_lower(t);
	if( strstr(t , "ate") )
		return true;
	return false;
}
bool egale(char * s , char * t)
{
	char ss[256], tt[256];
	strcpy(ss , s);
	strcpy(tt , t);
	to_lower(ss); to_lower(tt);
	if(strcmp(ss , tt) == 0)
		return true;
	return false;
}
int main()
{
	char linie[256], sep[]=".,;:-?! ";
	while( fin.getline(linie , 256) )
	{
		char * p = strtok(linie , sep);
		while(p)
		{
			if(OK(p))
			{
				bool gasit = false;
				for(int i = 1 ; i <= n && ! gasit ; i++)
					if( egale(p , lista[i]) )
						gasit = true;
				if(! gasit)
				{
					n ++;
					strcpy(lista[n] , p);
				}
			}
			p = strtok( NULL , sep);
		}
	}
	for(int i = 1 ; i <= n ; i ++)
		fout << lista[i] << "\n";
	return 0;	
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1009)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1009/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1009/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
