Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // main.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <iostream>
- #include<string>
- #include<fstream>
- using namespace std;
- //struct termin {
- // int rok;
- // int miesiac;
- // int dzien;
- //};
- //
- //struct czas_ukonczenia {
- // int godzin;
- // int minut;
- // int sekund;
- //};
- /** Struktura reprezentujaca jeden bieg. Jest to wezel drzewa binarnego. */
- struct bieg {
- string miejsce;
- int data;
- int czas;
- /** lewy potomek wg daty */
- bieg *pLewy;
- /** prawy potomek wg daty */
- bieg *pPrawy;
- };
- /** Struktura reprezentuje biegacza */
- struct id {
- /** nazwisko :-) */
- string nazwisko;
- /** nastepny biegacz w liscie */
- id*pNext;
- /** biegi w ktorych bral udzial */
- bieg * pBiegi;
- };
- void help();
- string wyciagnijNazwisko(string line); // Wyciagamy substringa od pierwszego do drugiego przecinka
- int konwertujStringNaInt(string napis);
- int wyciagnijCzasNaMecie(string line); // Wyciagamy substringa od ostatniego przecinka do konca
- int indexPierwszejNazwyPliku(int ile, char ** argumenty, int &h);
- id* adressPamieciZawodnika(id *pHead, string id_nazwisko);
- void dodajZawodnika(id* & pHead, string id_nazwisko);
- void dodajBiegDoZawodnika(bieg* &pRoot, string nazwa_maratonu, int data, int czas);
- void wypiszBiegi(bieg *& pRoot, std::ostream & plik);
- void wypiszBiegiDoPliku(id * zawodnik);
- void usunListe(id* & pHead);
- void wypiszDateWFormacie(int data, std::ostream & plik);
- void wypiszCzasWFormacie(int czas, std::ostream & plik);
- int main(int argc,char *argv[])
- {
- int ETYKIETAhelp = 1;
- id *Glowa=NULL;
- ifstream input;
- for (int i = indexPierwszejNazwyPliku(argc, argv, ETYKIETAhelp); i < argc; i++) // nazwy plikow podane po etykiecie "-i"
- {
- if (i == ETYKIETAhelp) continue; // jesli po -i wystpilo -h pomoc zostanie wyswietlona, ale -h nie zostanie potraktowane jako nazwa pliku
- input.open(argv[i]);
- if (input.good())
- {
- string nazwa_maratonu, datastr, linia, nazwisko;
- int data, czasNaMecie;
- getline(input, nazwa_maratonu); // Pobierz pierwsza linie(nazwa maratonu)
- getline(input, datastr); // Pobierz druga linie(data)
- data = konwertujStringNaInt(datastr); // przekonwertuj date na int
- while (getline(input, linia)) // Dla ka¿dego biegu wykonuj:
- {
- nazwisko = wyciagnijNazwisko(linia);
- czasNaMecie = wyciagnijCzasNaMecie(linia);
- dodajZawodnika(Glowa, nazwisko); // sprawdza czy zawodnik istnieje, jesli nie dodaje zawodnika na poczatku listy // KS: Gdyby ta funkcja zwracala adres, bylby od razu do nastepnej intrukcji.
- dodajBiegDoZawodnika(adressPamieciZawodnika(Glowa, nazwisko)->pBiegi,nazwa_maratonu,data,czasNaMecie);
- }
- input.close();
- }
- else
- cout << "Nie udalo sie otworzyc pliku: " << argv[i] << endl;
- }
- wypiszBiegiDoPliku(Glowa);
- return 0;
- }
- void help()
- {
- cout << "Krotka pomoc" << endl;
- }
- int indexPierwszejNazwyPliku(int ile, char ** argumenty, int &h)
- {
- const string ETYKIETAINPUT("-i");
- const string ETYKIETAHELP("-h");
- const int FLAGAINPUT = 1;
- const int FLAGAOUTPUT = FLAGAINPUT << 1;
- const int POPRAWNYWYNIK = FLAGAINPUT;
- int wynik = 0;
- int miejsce=ile;
- for (int i = 1; i < ile; i++)
- {
- string arg(argumenty[i]);
- if (arg == ETYKIETAINPUT)
- {
- miejsce = i + 1;
- wynik |= FLAGAINPUT;
- }
- if (arg == ETYKIETAHELP)
- {
- h = i;
- help();
- }
- }
- return miejsce;
- }
- string wyciagnijNazwisko(string line) // Wyciagamy substringa od pierwszego do drugiego przecinka
- {
- int a, b;
- a = line.find(',');
- b = line.find(',', a + 1);
- string napis = line.substr(a + 1, b - a - 1);
- for (int i = 0; i < napis.length(); i++)
- if (napis[i] == ' ') napis.erase(i, 1);
- return napis;
- }
- int konwertujStringNaInt(string napis)
- {
- for (int i = 0; i < napis.length(); i++)
- if (!(napis[i] >= '0' && napis[i] <= '9'))
- napis.erase(i, 1);
- return atoi(napis.c_str());
- }
- int wyciagnijCzasNaMecie(string line) // Wyciagamy substringa od ostatniego przecinka do konca
- {
- int a;
- a = line.rfind(',');
- line = line.substr(a + 1);
- return konwertujStringNaInt(line);
- }
- id* adressPamieciZawodnika(id *pHead, string id_nazwisko)
- {
- if (pHead)
- {
- auto p = pHead;
- while (p) {
- if (p->nazwisko == id_nazwisko) return p;
- p = p->pNext;
- }
- }
- return NULL;
- }
- void dodajZawodnika(id* & pHead, string id_nazwisko)
- {
- if (!adressPamieciZawodnika(pHead, id_nazwisko))
- pHead = new id{ id_nazwisko, pHead, NULL };
- }
- void dodajBiegDoZawodnika(bieg* &pRoot, string nazwa_maratonu, int data, int czas)
- {
- if (!pRoot)
- pRoot = new bieg{ nazwa_maratonu, data, czas, NULL, NULL };
- else
- {
- if (data < pRoot->data)
- dodajBiegDoZawodnika(pRoot->pLewy, nazwa_maratonu, data, czas);
- else
- dodajBiegDoZawodnika(pRoot->pPrawy, nazwa_maratonu, data, czas);
- }
- }
- void wypiszBiegi(bieg *& pRoot, std::ostream & plik)
- {
- if (pRoot)
- {
- wypiszBiegi(pRoot->pLewy, plik);
- wypiszDateWFormacie(pRoot->data, plik);
- plik << "\t" << pRoot->miejsce << "\t";
- wypiszCzasWFormacie(pRoot->czas, plik);
- wypiszBiegi(pRoot->pPrawy, plik);
- }
- }
- void wypiszBiegiDoPliku(id * zawodnik)
- {
- auto p = zawodnik;
- while (p)
- {
- ofstream output;
- output.open("../data/" + p->nazwisko + ".txt");
- output << p->nazwisko << endl << endl;
- if (p->pBiegi)
- {
- wypiszBiegi(p->pBiegi->pLewy, output);
- wypiszDateWFormacie(p->pBiegi->data, output); // Korzen
- output << "\t" << p->pBiegi->miejsce << "\t";
- wypiszCzasWFormacie(p->pBiegi->czas, output);
- wypiszBiegi(p->pBiegi->pPrawy, output);
- }
- output.close();
- p = p->pNext;
- }
- }
- void wypiszDateWFormacie(int data, std::ostream & plik)
- {
- string a = to_string(data);
- plik << a.substr(0, 4) << "-" << a.substr(4, 2) << "-" << a.substr(6, 2);
- }
- void wypiszCzasWFormacie(int czas, std::ostream & plik)
- {
- string a = to_string(czas);
- if (a.length() == 5)
- a = '0' + a;
- plik << a.substr(0, 2) << ":" << a.substr(2, 2) << ":" << a.substr(4, 2) << endl;
- }
- void usunListe(id* & pHead)
- {
- while (pHead)
- {
- auto p = pHead;
- pHead = pHead->pNext;
- delete p;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement