Aby uzyskać zaliczenie w pierwszym terminie (do 30 stycznia 2018) rozliczyć trzeba co najmniej 8 projektów, po 4 z każdej z części: C++ oraz Python. Pliki z rozwiązaniami projektu (wszystkie polecenia projektu skrupulatnie są zrealizowane) należy przesłać na adres danuta.makowiec@gmail.com Rozliczenie projektu musi nastąpić w terminie 2 tygodni od laboratorium, na którym dany projekt był omawiany. Rozliczenie oznacza otrzymanie listu z informacją OK. Projekty będą oceniane raz w tygodniu we wtorki. Tylko projekty przysłane do godz.18-tej będą oceniane w danym tygodniu. Możliwe jest rozliczenie ulgowe jeśli projekt wykona się na zajęciach. W terminie poprawkowym, czyli po 30 stycznia 2017, obowiązuje zaliczenie testowe każdego niezaliczonego wcześniej projektu Przygotować program wczytujący słowa z pliku tekstowego do wspólnego wektora wyszukujący wszystkie wystąpienia określonego słowa w utworzonym wektorze ( niekoniecznie na zajęciach) wybierający co dziesiąte słowo z wektora (na zajęciach) zapisujący zestaw wyszukanej informacji do pliku wynikowego. Implementacja ma być projektem modułowym być zgodna z zasadami dobrego programowania testować poprawność działania wszystkich zaimplementowanych funkcji 1
Dobre praktyki programistyczne: Program realizuje wszelkie zlecone operacje i nic ponadto. program jest zgodny ze specyfikacją program jest efektywny kodowanie jest w dobrym stylu program realizuje zlecone operacje najsprawniej jak to tylko jest możliwe 1. Projekt musi być prosty a jego kod czytelny 2. Modułowa organizacja programu - dane i operacje na nich rozmieszczone są w wydzielonych modułach, funkcjach 3. Stosowane są konsekwentnie standardy kodowania dla obliczeń, oraz nazw funkcji, plików, zmiennych, itp. Nowoczesny kod jest: Stabilny : jedna zmiana nie powoduje rozsypania się wszystkiego Reużywalny : tak podzielony, aby elementy odpowiedzialne za te same czynności nie musiały być pisane za każdym razem ponownie Testowalny: poszczególne elementy mogą być użyte (sprawdzone) w odseparowanym środowisku testowym niezależnie od całości Modyfikowalny: zmiana działania jednego elementu nie powoduje potrzeby przepisania całości Zrozumiały: zmiana właściciela nie powoduje paraliżu informacyjnego 2
/* 4 pazdziernika 2017: pobierz_slowa.cpp wczytywanie slow z pliku tekstowego o zadanej nazwie o nieustalonej strukturze zapisywanie slow w formie ponumerowanej kolumny */ #include <iostream> //biblioteka obslugi strumieni cout i cin #include <fstream> // biblioteka obslugi plikow #include <string> // biblioteka obslugi slow #include <vector> // biblioteka obslugi kontenera vector using namespace std; int main() { ifstream file_2_read("python4biologists.txt"); ofstream file_2_write("python.txt"); if ( file_2_read.is_open()) { cout << "plik jest dostepny do analiz \n\n"; else { cout << "plik jest niedostepny. Koncze \n"; return -1; string one_word; while (!file_2_read.eof()) { file_2_read >> one_word; words.push_back(one_word); int size_of_words = words.size(); for (int i = 0; i < size_of_words; ++i) file_2_write <<endl<< i<< ": " << words[i] ; return 0; cout << kolejne slowa sa zapisane w pliku \n"; file_2_read.close(); file_2_write.close(); pobierz_slowa.cpp Obiekty klasy vector tak, jak tablice zajmują ciągły obszar pamięci. Pamięć jest przydzielana dynamicznie, zazwyczaj większa niż deklarowana, aby uniknąć drogiej czasowo alokacji. Przy inicjowaniu obiektu nie trzeba podawac rozmiaru. Metoda obiektu klasy vector: dopisywanie kolejnego elementu do wektora. Metoda obiektu klasy vector: ustalenie ilości elementów w wektorze. Przeciążenie operatora [] dla obiektów klasy vector - umożliwia obsługę wektora jak tablicy Deklaracja obiektu kontenera vector #include <vector> vector<type> variable_name (number_of_elements); vector<type> variable_name; Przykłady: Wektor ma number_of_elements składowych zainicjowanych 0!! Wektor vector<int> students_marks (5); vector<double> values (20,0); vector<string> name; Korzyści: Dostęp do metod klasy vector : push_back() pop _back() insert() remove() // deklaracja wektora z 5 int // deklaracja wektora z danymi typu double, o // rozmiarze 20 i wartosciach zaincjowanych 0 // deklaracja wektora z łańcuchami // na razie pusty (zawiera 0 łańcuchów) Dostęp do bibliotek STL: sort() reverse() find() 3
Iterator: popularna zmienna umosliwiająca alternatywny dostęp do elementów wektora Zmienną iterator it typu iterator trzeba zadeklarować. vector<string>::iterator it; Zmienna it może obsługiwać dowolną zmienną typu vector<string > Iterator wskazuje na it-ty element wektora. //... (ustalenie własnosci wektora) for (vector<string>::iterator it = words.begin(); it!= words.end(); ++it) { cout << *it << endl; // it to jakby wskaźnik do i-tego elementu wektora values cout << distance(words.begin(), it); <<endl; Dostęp do zawartości wektora przez *it lub distance() pobierz_slowa_iterator.cpp 4
/* 4 pazdziernika 2017: pobierz_slowa.cpp wczytywanie slow z pliku tekstowego o zadanej nazwie o nieustalonej strukturze zapisywanie slow w formie ponumerowanej kolumny */ #include <iostream> #include <fstream> #include <string> #include <vector> using namespace std; int main() { ifstream file_2_read("python4biologists.txt"); ofstream file_2_write("python.txt"); if ( file_2_read.is_open()) { cout << "plik jest dostepny do analiz \n\n"; else { cout << "plik jest niedostepny. Koncze \n"; return -1; string one_word; while (!file_2_read.eof()) { file_2_read >> one_word; words.push_back(one_word); int size_of_words = words.size(); for (int i = 0; i < size_of_words; ++i) file_2_write <<endl<< i<< ": " << words[i] ; return 0; cout << "slowa sa zapisane. Koncze \n"; file_2_read.close(); file_2_write.close(); wielomodułowość to rozwój czytaj_slowa.cbp Zmienne główne przetwarzania powinny być dostępne w programie głównym void read_words_from_file ( ifstream &, vector<string> &, int = EOF); void write_words_to file ( ofstream &, vector<string> &, int = EOF); Biblioteka Standard Template Library STL algorithm.h Przykłady standardowych funkcji z biblioteki <algorithm> działających na obiektach klasy vector sort ( values.begin(), values.end()); //sortuje wartości wektora od początku //do końca reverse (values.begin(), values.end()); // odwraca kolejność elementów w //wektorze random_shuffle (values.begin(), values.end()); // tasuje losowo wartości //wektora int num_zeros = count (values.begin(), values.end(), 0); // zlicza ile jest 0 wśród wartości wektora find (words.begin(), words.end(), word) szukaj.cbp // zwraca iterator gdzie znajduje //się word, przeszukanie jest od //words.begin() do words.end() 5