Szkielet programu z obsługą pliku wejściowego w C++
Można wykorzystać m. in. w zadaniu 63.3 ze zbioru CKE, liczba czynników rozkładu ma być równa 2 (tej części nie zaimplementowano)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <fstream> #include <cstdlib> #include <iostream> using namespace std; class file { ifstream inFile; public: file(); ~file(); void loop(); //pętla wczytująca z pliku //USER CODE 1: pozostałe metody programu }; file::file() { inFile.open("ciagi.txt"); //tu nazwa pliku wejscia if (!inFile.good()) { cerr << "Blad - pliku nie da sie otworzyc!\n"; exit(1); } } file::~file() { inFile.close(); } //USER CODE 2: pozostałe metody - implementacja void file::loop() { string data; //lub np. int jeśli czytamy liczby while (!inFile.eof()) //string po stringu (do spacji/nowej linii) wczyta cały plik { inFile >> data; //USER CODE 3: obsługa danych wczytanych z pliku za pomocą metod powyżej cout << data <<" "; } } int main() { file f; f.loop(); return 0; } |
Przykład użycia w zadaniu maturalnym 63.1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include <fstream> #include <cstdlib> #include <iostream> using namespace std; class file { ifstream inFile; public: file(); ~file(); void loop(); //pętla wczytująca z pliku bool even(string); bool twoCycle(string); }; file::file() { inFile.open("c:\\pliki\\ciagi.txt"); if (!inFile.good()) { cerr << "Blad - pliku nie da sie otworzyc!\n"; exit(1); } } file::~file() { inFile.close(); } bool file::even(string s) { return s.size() % 2 == 0; } bool file::twoCycle(string s) { if (!even(s)) //jesli ciag jest nieparzysty to na pewno NIE JEST DWUCYKLICZNY return false; string s1 = s.substr(0, s.size()/2), //od 0 znaku ilość znaków = pół dlugosci s2 = s.substr(s.size()/2); //od polowy ciagu do końca (brak drugiej liczby) return s1==s2; } void file::loop() { string data; //lub np. int jeśli czytamy liczby while (!inFile.eof()) //string po stringu (do spacji/nowej linii) wczyta cały plik { inFile >> data; if( twoCycle(data) ) cout << data << endl; } } int main() { file f; f.loop(); return 0; } |
Przykład z metodą virtual 63.1
Bardziej zaawansowany przykład z dziedziczeniem i metodą wirtualną, to samo zadanie:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include <iostream> #include <fstream> #include <string> #include <cstdlib> using namespace std; class file { protected: ifstream inFile; public: file(); ~file(); virtual void loop()=0; }; file::file() { inFile.open("ciagi.txt"); if (!inFile.good()) { cerr << "Blad - pliku nie da sie otworzyc!\n"; exit(1); } } file::~file() { inFile.close(); } ////////////////////////////////////////// class exercise63_1 : public file { bool even(string); bool twoCycle(string); public: virtual void loop(); //przykrycie funkcji wirtualnej }; bool exercise63_1::even(string s) { return s.size() % 2 == 0; } bool exercise63_1::twoCycle(string s) { if (!even(s)) //jesli ciag jest nieparzysty to na pewno NIE JEST DWUCYKLICZNY return false; string s1 = s.substr(0, s.size()/2), //od 0 znaku ilość znaków = pół dlugosci s2 = s.substr(s.size()/2); //od polowy ciagu do końca (brak drugiej liczby) return s1==s2; } void exercise63_1::loop() { string data; //lub np. int jeśli czytamy liczby while (!inFile.eof()) //string po stringu (do spacji/nowej linii) wczyta cały plik { inFile >> data; if( twoCycle(data) ) cout << data << endl; } } int main(int argc, char** argv) { exercise63_1 exercise; exercise.loop(); return 0; } |
Plik danych
https://cke.gov.pl/images/_EGZAMIN_MATURALNY_OD_2015/Materialy/Zbiory_zadan/inf-pr-dane.zip