1
Praktyka programowania w C — laboratorium nr 1a
Doskonalenie podstawowych umiejętności związanych z programowaniem w C++.
Materiał do przygotowania / tematyka laboratorium:
Struktura programu w języku C++
Referencje i wskaźniki
Biblioteka standardowa - <string>, <list>, <vector>, <sstream>, <fstream>, <map>
2
Celem dzisiejszych zajęć jest opanowanie zasady pisania prostych programów w języku C++. Wymagane będzie utrzymanie struktury
programu, która została przedstawiona na poprzednich zajęciach, czyli odpowiedni podział na pliki. Poniżej przykład dla opracowywanej na
poprzednich zajęciach klasy Student:
main.cpp
Student.h
Student.cpp
#include <iostream>
#include “Student.h”
using namespace std;
int main()
{
Student krzys(111, „Krzysztof”);
krzys.wyswietl();
return 1;
}
#pragma once
#include <string>
class Student
{
public:
Student(int nrAlb, std::string im);
void wyswietl();
private:
int nrAlbumu;
std::string imie;
}
#include ”Student.h”
#include <string>
#include <iostream>
using namespace std;
Student::Student(int nrAlb, string im)
{
cout << “Tworze studenta” << endl;
nrAlbumu = nrAlb;
imie = im;
}
void Student::wyswietl()
{
cout << “Student:” << imie << “ “ <<
nrAlbumu << endl;
}
Zastanów się teraz jak napisać funkcję, która potrafi zmienić studentowi imię (może to być np. void zmienImie(std::string);). Gdzie
umieścisz deklarację? Gdzie definicję? W jaki sposób ją wywołasz?
Potencjalne zadanie na kartkówkę znajdziesz poniżej!
Zaprezentowana struktura programu pozwoli zachować porządek w kodzie, jego czytelność i przejrzystość dla innych użytkowników. Zadanie do zastanowienia: każdy
student nosi przy sobie długopis. Jak mogłaby wyglądać klasa Długopis? W jaki sposób mógłbyś „dać” studentowi długopis? Rozwiązań jest kilka, każde ma swoje
plusy i minusy. Zastanów się też nad kolejnością wykonania konstruktorów i destruktorów w każdym z tych rozwiązań.
3
Na kolejnym laboratorium zajmiesz się rozwiązywaniem problemu analizy składniowej (parsowania) URL. W tym celu niezbędny jest krótki
wstęp teoretyczny.
URL - Uniform Resource Locator jest formatem służącym do identyfikowania zasobów. URL pozwala na pewną standaryzację opisu dostępnych zasobów i składa się z
elementów, które można wyróżnić. Na potrzeby tych zajęć zajmiemy się niektórymi jego elementami:
<protokół><adresSerwera>:<port><scieżkaDoPliku><nazwaPliku>?<paramter1>=<wartosc1>&<p2>=<w2>.
Zatem chcielibyśmy w nim wyróżnić następujące elementy:
protokół (http://, https://, ftp:// ftps://)
adres serwera(www.google.pl, wp.pl, pwr.edu.pl)
port (liczba np. 80, 443, 22, 51234)
ścieżka do pliku (np. /folder/, /, /folder1/folder2/)
nazwa pliku (plik.txt, plik.xml, )
argumenty postaci (parameter1=wartosc1 , parametr2= wartosc2).
Przykłady URL:
http://www.serwer.com.pl:80/plik.txt
http://serwer.pl:443/folder/plik2.txt
https://serwer.eu/plik1?wiek=10&imie=rafal
gmail.com/folder/
www.o2.pl/folder1/folder2/folder3/
www.yahoo.com/plik.php?arg1=val1&arg2=val2
Zadaniem, którym będziesz się zajmował na tych zajęciach jest analiza składniowa podanych powyżej adresów url. Chodzi o to, żeby z pojedynczego napisu w
postaci std::string wydzielić elementy składowe takie jak adres serwera, port … , które zostały podane powyżej. Poniżej krótki przykład struktury programu wraz z
możliwym rozwiązaniem:
4
main.cpp
UrlParser.h
UrlParser.cpp
#include <iostream>
#include ”UrlParser.h”
using namespace std;
int main()
{
string urlGoogle =
UrlParser parser;
string protokol =
parser.pobierzProtokol(urlGoogle);
return 1;
}
#pragma once
#include <string>
class UrlParser
{
public:
std::string
pobierzProtokol(std::string
url);
private:
}
#include ”UrlParser.h”
#include <string>
#include <iostream>
using namespace std;
string UrlParser::pobierzProtokol(string
url)
{
size_t znaleziony;
znaleziony = url.find(“http://”);
if (znaleziony != string::npos)
{
return „http://”;
}
}
Powyższy przykład zadziała dla sytuacji, gdy mamy w adresie protokół http, ale nie zadziała dla innych protokołów. Zastanów się nad bardziej ogólnym
rozwiązaniem. Poniższe zadania do realizacji mają rosnący poziom trudności i wymagają zastosowania różnych funkcji dostępnych w bibliotece standardowej. Bardzo
dobrym źródłem informacji jest strona cplusplus.com, zakładka reference. Najlepiej zacząć od oglądnięcia bibliloteki string i jej funkcji (przykłady są zawarte na
stronie). Poniżej lista zadań do wykonania:
1. Dla wszystkich zademonstrowanych przykladow URL odczytaj wykorzystywany protokół.
2. Odczytaj adres serwera.
3. Odczytaj ścieżkę i plik
4. Odczytaj numer portu, zapisz go w postaci liczby całkowitej. Za pomocą biblioteki sstream zademonstruj konwersję liczby całkowitej z powrotem na wartość
std::string.
5. Utwórz kontener typu std::list lub std::vector, który będzie zawierał wszystkie nazwy protokołów (z możliwością łatwego dodania nowych w przyszłości) i
wykonaj zadanie 1 przeszukując ten kontener jako źródło do porównania.
6. Odczytane adresy serwera zapisz w postaci kontenera std::list lub std::vector, posortuj je, (*usuń duplikaty) i zapisz w utworzonym przez siebie pliku
wykorzystując bibliotekę fstream (ofstream)
7. **Zastanów się, czy utworzone przez Ciebie funkcje pracują na oryginalnych napisach, czy na ich kopiach (sprawdź czy zastosowałeś w odpowiednich
miejscach wskaźnik/referencję).
8. ***Z podanych adresów URL odczytaj listę parametrów i zapisz je w postaci mapy dobierając w pary <parametr><wartość>.