C++ 3 warunki zwiazane z plikami / napisami

0

Witam,
Mam sobie plik w ktorym sa dane osob (to jest mniej wazne). Chodzi o to ze mam zrobi takie cos:
Z pliku wybierz osobę o następujących cechach:
imię ma długość > 3 litery
nazwisko kończy się na "ski"
ma najwyższą skuteczność spośród wszystkich osób w pliku
Musze uzywac klas: ofstream, ifstream i string
Chodzi o to ze nie bardzo wiem, jak zrobic te warunki ;/
Wrzucilem sobie osoby z pliku do strukturyki wszystko ladnie, powrocilem na poczatek pliku i teraz chce przejsc po calej powiedzmy "tablicy struktur" i znalezc osobe / osoby spelniajace te warunki. Na chwile obecna zrobilem takie cos, ale nie wiem jak uporac sie z warunkiem nr 2 ;/

for(int i = 0; i < licznik; i++)
	{
		if(tab[i].imie.size() > 3)
		{
			
		}
	}
1

Moment: ... powrocilem na poczatek pliku ...
Czy: ... chce przejsc po calej powiedzmy "tablicy struktur" ...
to są sprzeczne pomysły.

Warunek nr 2: http://www.cplusplus.com/reference/string/string/substr/

1

pierwsze co to robisz klase

class Person
{
private:
  string name;
  string lastName;
  double efficiency;
public:
  Person():{} // zdefiniuj konstruktor tak by pobieral 3 parametry i przypisywal te zmienne
};

na koncu nie zapomnij do plasy Person przeciazyc operatora << by wyswietlic ta osobe

drugie, robisz klase ktora obsluguja/tworzy osoby. Do tego przeciazasz operator >>

class PersonFactory // ta nazwa tutaj nie pasuje... no ale chodzi o idee
{
private:
  std::vector<Person> people;
public:
  friend std::istream& operator >> (std::istream& in, Person& o);
  const std::vector<Person>& GetPeople() const;
};

przeciazasz sobie operator >> do wczytywania w pliku

jak juz masz osoby wczytane do vectora to robisz ostatnia klase

class ProcessPeople
{
private:
  std::vector<Person> people
  std::string endingCondition = "ski";
  bool HasEnding (std::string const &fullString, std::string const &ending) 
  {
    if (fullString.length() >= ending.length()) 
    {
        return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
    } 
    return false;
  }
public:
  ProcessPeople(std::vector<Person> &people);
  const Person& GetBestPerson() const;
};

W GetBestPerson robisz cos takiego

for (auto person : people)
{
  if (person.name.size() > 3)
  {
    if(HasEnding(person.lastName, endingCondition))
    {
       // tutaj juz jedynie musisz wybrac osobe z najwyzsza efficiency
       // ewentualnie mozesz posortowac sobie vector wedlug efficiency i wtedy od gory te dwa ify co napisalem jezlei bedzie to juz masz swoja najlepsza osobe
    }
  }
} 
     
2

Trzymaj się drogi @fasadin 'a, jednakże można to zrobić troszeczkę inaczej z boostem:

BOOST_FUSION_DEFINE_STRUCT(
    (data), person,
    (std::string, name)
    (std::string, surname)
    (double, efficiency)
)

mało zgrabna, ale pomocna funkcja do wczytywania osób:

std::vector<data::person> read_people(std::istream &in = std::cin) {
    using namespace boost::fusion;
    using namespace boost::fusion::operators;
    
    std::vector<data::person> people;
    
    data::person p;
    while(in >> tuple_open(' ') >> tuple_close('\n') >> tuple_delimiter(" ") >> p) {
        people.push_back(p);
    }
    
    return people;
};

Serce programu:

auto people = read_people();
    
auto ends_with_ski = [](person const &p) {
    return boost::algorithm::ends_with(p.surname, "ski");
};
    
auto cmp_efficiency = [](person const &p1, person const &p2) {
    return p1.efficiency < p2.efficiency;
};
    
auto most_efficient = boost::max_element(people | filtered(+ends_with_ski), cmp_efficiency);
cout << *most_efficient << endl;

Uruchomienie: melpon.org/wandbox/permlink/r8iFbMWZ2Gnwidv4

input output
Adam Kowalski 0.73
Adrian Kowalewski 0.63
Antoni Antoni 0.98

|

(Adam Kowalski 0.73)

Linki do poczytania:
http://www.boost.org/doc/libs/1_52_0/libs/fusion/doc/html/fusion/adapted/define_struct.html
http://www.boost.org/doc/libs/1_54_0/libs/fusion/doc/html/fusion/sequence/operator/i_o.html
http://en.cppreference.com/w/cpp/language/lambda
http://www.boost.org/doc/libs/1_34_0/doc/html/boost/algorithm/ends_with.html
http://www.boost.org/doc/libs/1_46_1/libs/range/doc/html/range/reference/algorithms/non_mutating/max_element.html
http://www.boost.org/doc/libs/1_56_0/libs/range/doc/html/range/reference/adaptors/reference/transformed.html
http://www.cplusplus.com/reference/iterator/
http://stackoverflow.com/questions/18889028/a-positive-lambda-what-sorcery-is-this?lq=1

1 użytkowników online, w tym zalogowanych: 0, gości: 1