lab1A

background image

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>



background image

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ń.

background image

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.wp.pl

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:



background image

4

main.cpp

UrlParser.h

UrlParser.cpp

#include <iostream>
#include UrlParser.h”
using namespace std;

int main()
{
string urlGoogle =

http://www.google.pl

;

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ść>.


Wyszukiwarka

Podobne podstrony:
Lab1a
regulamin-lab1a, Semestr IV, Podstawy Automatyki
013, LAB1A, 1
Lab1a
temp curr LAB1A
LAB1A
LAB1A
lab1a
LAB1A

więcej podobnych podstron