• Nie Znaleziono Wyników

Ćwiczenie laboratoryjne. Oprogramowanie i badanie kolejki

N/A
N/A
Protected

Academic year: 2022

Share "Ćwiczenie laboratoryjne. Oprogramowanie i badanie kolejki"

Copied!
8
0
0

Pełen tekst

(1)

Ćwiczenie laboratoryjne

„Oprogramowanie i badanie kolejki”

Tematy ćwiczenia

realizacja kolejki dla tablicowej i listowej reprezentacji.

operacje nad kolejką.

Sprawozdanie

Na każdym zajęciu laboratoryjnym sporządza się za pomocą edytora Word sprawozdanie.

Bazowa zawartość sprawozdania musi być przygotowana w domu przed ćwiczeniem (sprawozdanie do ćwiczenia pierwszego jest przygotowywane w czasie ćwiczenia).

W czasie ćwiczenia do sprawozdania są dodawane wyniki testowania.

Treść sprawozdania:

strona tytułowa,

spis treści sporządzony za pomocą Word'a,

dla każdego zadania rozdziały "Zadanie ", "Opracowanie zadania" (rozdział z tekstem programu i komentarzami),

"Testowanie" (rozdział z opisem danych wejściowych i wynikami testowania, w tym zrzuty aktywnego okna).

Wzorzec strony tytułowej znajduje się w pliku Strona_tytulowa_niestac_AiSD.doc.

Nazwa (bez polskich liter, żeby można było archiwizować) pliku ze sprawozdaniem musi zawierać skrót "AiSD_", numer grupy, numer ćwiczenia i nazwisko studenta.

Pliki ze sprawozdaniem są przekazywane do archiwum grupy.

a) Kolejka przy tablicowej reprezentacji Zadanie

Zadanie polega na oprogramowaniu kolejki liczb lub liter dla tablicowej reprezentacji.

Program musi

 wyświetlać zawartość kolejki oraz elementy na początku i końcu kolejki,

 przyjmować i zapisywać do kolejki nowy element,

 odczytywać element z kolejki,

 komunikować o tym, że kolejka jest pusta.

Opracowanie zadania

( t e k s t p r o g r a m u )

Testowanie

1. Wypróbować odczyt elementu z kolejki i otrzymać komunikat, że kolejka jest pusta.

2. Wprowadzać do kolejki elementy danych (liczby lub litery) sprawdzając poprawność zapisywania i przemieszczenia wskaźnika końca kolejki.

3. Odczytywać z kolejki elementy danych (liczby lub litery) sprawdzając poprawność wyprowadzenia i przemieszczenia wskaźnika początku kolejki.

Tabela wariantów

Np Typ

elementu Rozmiar Np Typ

elementu Rozmiar Np Typ

elementu Rozmiar Np Typ

elementu Rozmiar 1 litera 5 9 liczba 21 17 litera 4 25 liczba 20 2 litera 7 10 liczba 23 18 litera 6 26 liczba 22 3 litera 9 11 liczba 25 19 litera 8 27 liczba 24 4 litera 11 12 liczba 27 20 litera 10 28 liczba 26 5 litera 13 13 liczba 29 21 litera 12 29 liczba 28 6 litera 15 14 liczba 31 22 litera 14 30 liczba 30 7 litera 17 15 liczba 33 23 litera 16 31 liczba 32 8 litera 19 16 liczba 35 24 litera 18 32 liczba 34

(2)

Wskazówki 1) Środowisko

[---

Projekt dla tego ćwiczenia pod nazwą np. „cwN” można stworzyć poprzez kopiowanie poprzedniego projektu pod nazwą np. „cwP”.

W tym celu należy:

a) skopiować folder poprzedniego projektu ze wszystkimi plikami i folderami;

b) zmienić nazwy folderów z cwP na cwN;

c) wprowadzić korektę do nazw plików z rozszerzeniami „.sln” i „.vcxproj”; inne pliki z cwP w nazwie można skasować;

d) wewnątrz plików z rozszerzeniami „.sln” i „.vcxproj” za pomocą Notatnika zamienić cwP na cwN;

e) w plikach MyForm.h i MyForm.cpp za pomocą Notatnika zamienić cwP na cwN;

f) foldery Debug można wyczyścić.

---]

Wejść do środowiska Microsoft Visual Studio.

Wybrać punkt menu „File / New / Project...”,

zaznaczyć rodzaj aplikacji „CLR” w „Templates / Visual C++” i wybrać "CLR Empty Project", dalej na dole okna w polu "Name" wprowadzić nazwę projektu, a

za pomocą przycisku "Browse" w polu "Location" wyznaczyć folder projektu.

Nacisnąć przycisk "OK".

W menu projektu wybrać "PROJECT / Properties".

W oknie "Property Pages" wpisać do opcji "Configuration Properties / Linker / Advanced / Entry Point" nazwę "main".

Nacisnąć przyciski "Zastosuj" i "OK".

W podoknie "Solution Explorer" nacisnąć prawym przyciskiem myszy na nazwę projektu, wybrać punkt menu "Add / New Item...",

wybrać "UI / Windows Form" (w polskojęzycznym środowisku „UI / Formularz systemu Windows”) i nacisnąć "Add".

Jeśli środowisko pokaże okno „MyForm.h[Design]” z komunikatem o niemożliwości stworzenia obrazu, to należy zamknąć tą kartę.

Otworzyć kartę "MyForm.cpp", w którą umieścić tekst z głównym podprogramem "main":

#include "MyForm.h"

using namespace cli;

using namespace System;

using namespace System::Windows::Forms;

[STAThreadAttribute]

int main(array<System::String^>^ args) {

Application::EnableVisualStyles();

Application::SetCompatibleTextRenderingDefault(false);

Application::Run(gcnew Pr::MyForm());

}

gdzie "Pr" to nazwa projektu.

Po zakończeniu tych operacji należy zamknąć projekt i znowu otworzyć go.

2) Opracowanie graficznej części aplikacji Dodać do formularza obiekty graficzne:

- do wyświetlenia zawartości kolejki i elementów na początku i końcu kolejki, - do wprowadzenia nowego elementu w celu zapisywania do kolejki,

- do odczytu elementu z kolejki,

- do komunikowania o przepełnieniu kolejki lub o tym, że kolejka jest pusta, - do wyświetlenia elementu odczytanego z kolejki.

Potrzebne zmienne należy zadeklarować jako globalne na początku pliku, na przykład:

(3)

const int RK=3; //rozmiar kolejki int kolej[RK]; // kolejka z liczbami lub

wchar_t kolej[RK]; // kolejka z literami int jpk=0; //indeks początku kolejki int jkk=0; //indeks końca kolejki

Do wyświetlenia zawartości kolejki oraz elementów na początku i końcu kolejki jest wygodnie skorzystać z obiektu typu ListBox.

Początku i końcu kolejki mogą odpowiadać zaznaczone wiersze ListBox’a.

Aby wyświetlić dwa wiersze w obiekcie typu ListBox, właściwość SelectionMode musi być ustawiona na "MultiSimple".

Wiersze w obiekcie typu ListBox należy zaznaczać przez metodę „SetSelected”.

Przykładowo:

listBox1->SetSelected(0,true); //zaznaczony jest pierwszy wiersz z indeksem 0 listBox1->SetSelected(0,false); //zdejmowanie zaznaczenia wierszu 0

Wyświetlenie zawartości kolejki w obiekcie listBox1:

listBox1->Items->Clear();

for (int i=0;i<RK;i++) listBox1->Items->Add(kolej[i]);

if (jpk<RK) listBox1->SetSelected(jpk,true);//zaznaczony jest wiersz z indeksem jpk

if (jkk<RK) listBox1->SetSelected(jkk,true);//zaznaczony jest wiersz z indeksem jkk

W celu zapełnienia ListBox’a wewnątrz procedury "Load", którą system wykonuje jeden raz przy ładowaniu formularza, należy wpisać następujące instrukcje:

listBox1->Items->Clear();

//---

for (int i=0;i<RK;i++) listBox1->Items->Add(0); //dla liczb lub

for (int i=0;i<RK;i++) listBox1->Items->Add(L"-"); //dla liter //---

if (jpk<RK) listBox1->SetSelected(jpk,true);//zaznaczony jest wiersz z indeksem jpk

if (jkk<RK) listBox1->SetSelected(jkk,true);//zaznaczony jest wiersz z indeksem jkk

Wprowadzenie nowego elementu lepiej realizować za pomocą dwóch obiektów:

dla liczb: okienka typu NumericUpDown lub okienka typu TextBox , dla liter: okienka typu TextBox

i klawiszu typu Button z napisem „Dodaj”.

Odczyt liczby z obiektu typu NumericUpDown:

kolej[jkk]=(int)numericUpDown1->Value;

Odczyt liczby z obiektu typu TextBox:

kolej[jkk]=System::Int32::Parse(textBox1->Text);

Odczyt litery z obiektu typu TextBox:

kolej[jkk]=textBox1->Text[0];

(4)

Odczyt elementu z kolejki możną inicjować naciśnięciem klawisza "Odczyt" typu Button.

Odczytaną wartość można pokazać w okienku typu TextBox:

dla liczb:

textBox2->Text=kolej[jpk].ToString();

dla liter:

textBox2->Text=kolej[jpk].ToString();

(lub textBox2->Text=gcnew System::String(kolej[jpk],1); )

Bazowe operacje powinny być realizowane ze sprawdzaniem, czy jest kolejka pusta.

Do wyświetlenia tekstów komunikatów można dodać do formularza obiekt typu „StatusBar” lub

„StatusStrip / toolStripStatusLabel”.

Wyświetlenie komunikatu w obiekcie typu StatusBar:

statusBar1->Text = "...";

Podobnie w obiekcie typu toolStripStatusLabel:

toolStripStatusLabel1->Text = "...";

Inny sposób wyświetlenia tekstów komunikatów - wykorzystanie statycznej metody Show() klasy MessageBox:

System::Windows::Forms::MessageBox::Show("tekst komunikatu", "Komunikat", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);

Oprogramowanie operacji bazowych

Warunek "czy jest kolejka pusta" sprawdzamy następująco:

if (jpk==jkk) {

// komunikat "Kolejka jest pusta"

} else {

// instrukcje odczytu elementu z kolejki }

Aby dodać do kolejki nowy element korzystamy z dwóch instrukcji:

1) zapisywanie do tablicy kolejki nowego elementu według indeksu jkk końca kolejki, 2) zwiększenie indeksu jkk końca kolejki o jeden.

(jeżeli indeks jkk końca kolejki przyjmie wartość rozmiaru kolejki, to w kolejce cyklicznej ten indeks należy zerować).

Instrukcje należy rozmieścić wewnątrz procedury, którą tworzy system w odpowiedzi na podwójne klikniecie klawisza „Dodaj”.

W celu odejmowania elementu od kolejki korzystamy z dwóch instrukcji:

1) odczyt z tablicy kolejki elementu według indeksu jpk początku kolejki, 2) zwiększenie indeksu jpk początku kolejki o jeden.

(jeżeli indeks jpk początku kolejki przyjmie wartość rozmiaru kolejki, to w kolejce cyklicznej ten indeks należy zerować).

(5)

b) Kolejka przy listowej reprezentacji Zadanie

Zadanie polega na oprogramowaniu kolejki liczb lub liter dla listowej reprezentacji.

Program musi

 wyświetlać zawartość kolejki oraz elementy na początku i końcu kolejki,

 przyjmować i zapisywać do kolejki nowy element,

 odczytywać element z kolejki,

 komunikować o tym, że kolejka jest pusta.

Opracowanie zadania

( t e k s t p r o g r a m u )

Testowanie

1. Wypróbować odczyt elementu z kolejki i otrzymać komunikat, że kolejka jest pusta.

2. Wprowadzać do kolejki elementy danych (liczby lub litery) sprawdzając poprawność wprowadzenia.

3. Odczytywać z kolejki elementy danych (liczby lub litery) sprawdzając poprawność wyprowadzenia.

Tabela wariantów

Np Typ

elementu Początek

kolejki Np Typ

elementu Początek

kolejki Np Typ

elementu Początek

kolejki Np Typ

elementu Początek kolejki 1 liczba początek

listy 9 litera początek listy

17 liczba początek listy

25 litera początek listy 2 liczba koniec

listy 10 litera koniec listy

18 liczba koniec listy

26 litera koniec listy 3 liczba początek

listy 11 litera początek listy

19 liczba początek listy

27 litera początek listy 4 liczba koniec

listy 12 litera koniec listy

20 liczba koniec listy

28 litera koniec listy 5 liczba początek

listy 13 litera początek listy

21 liczba początek listy

29 litera początek listy 6 liczba koniec

listy 14 litera koniec listy

22 liczba koniec listy

30 litera koniec listy 7 liczba początek

listy 15 litera początek listy

23 liczba początek listy

31 litera początek listy 8 liczba koniec

listy 16 litera koniec listy

24 liczba koniec listy

32 litera koniec listy

Wskazówki

Strukturę elementu kolejki, wskaźnik na początek listy oraz wskaźniki na elementy na początku i końcu kolejki należy deklarować jako globalne na początku pliku z klasą formularza, na przykład:

struct s_elem {

int liczba;

lub

wchar_t litera;

s_elem* nast;

s_elem(int newvalue,s_elem *pnast) {

this->liczba=newvalue;

this->nast=pnast;

} lub

s_elem(wchar_t newvalue,s_elem *pnast) {

this->litera=newvalue;

this->nast=pnast;

} };

s_elem* plista=0; //wskaźnik na początek listy

(6)

s_elem* ppk=0; //wskaźnik na końcowy element kolejki s_elem* pkk=0; //wskaźnik na początkowy element kolejki

W przypadku danej - litery pole danych ma typ wchar_t.

W przypadku reprezentacji kolejki przez listę nie są potrzebne zmienne - indeksy kolejki.

Opracowanie graficznej części aplikacji

Do wyświetlenia zawartości kolejki najlepiej skorzystać z obiektu typu ListBox.

Dlatego dodać do formularza drugi obiekt typu ListBox.

Wyświetlenie zawartości kolejki w obiekcie listBox2:

listBox2->Items->Clear();

if (plista!=0) {

s_elem *pt=plista;

while (pt!=NULL) {

listBox2->Items->Add(pt->liczba.ToString());

lub

listBox2->Items->Add(pt->litera.ToString());

//---

pt=pt->nast;

} }

W celu zapełnienia ListBox’a wewnątrz procedury "Load", którą system wykonuje jeden raz przy ładowaniu formularza, należy wpisać następującą instrukcję:

listBox2->Items->Clear();

Wprowadzenie nowego elementu lepiej realizować za pomocą dwóch obiektów:

dla liczb: okienka typu NumericUpDown lub okienka typu TextBox, dla liter: okienka typu TextBox

oraz klawiszu typu Button z napisem „Dodaj (lista)”.

Odczyt liczby z obiektu typu NumericUpDown:

int dana=(int)numericUpDown2->Value;

Odczyt liczby z obiektu typu TextBox:

kolej[jkk]=System::Int32::Parse(textBox2->Text);

Odczyt litery z obiektu typu TextBox:

wchar_t dana=textBox2->Text[0];

Odczyt elementu z początku kolejki możną inicjować naciśnięciem klawisza "Odczyt (lista)" typu Button.

Odczytaną wartość można pokazać w okienku typu TextBox:

dla liczb: textBox1->Text=liczba.ToString();

dla liter: textBox1->Text=litera.ToString();

(lub textBox1->Text=gcnew String(litera,1);)

Bazowe operacje na kolejce powinny być realizowane ze sprawdzaniem, czy jest kolejka pusta.

Do wyświetlenia tekstów komunikatów można dodać do formularza obiekt typu „StatusBar” lub

„StatusStrip / toolStripStatusLabel”.

(7)

Wyświetlenie komunikatu w obiekcie typu StatusBar:

statusBar1->Text = "...";

Podobnie w obiekcie typu toolStripStatusLabel:

toolStripStatusLabel1->Text = "...";

Inny sposób wyświetlenia tekstów komunikatów - wykorzystanie statycznej metody Show() klasy MessageBox:

System::Windows::Forms::MessageBox::Show("tekst komunikatu", "Komunikat", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);

Oprogramowanie operacji bazowych

Warunek "czy jest kolejka pusta" sprawdzamy po wartości wskaźnika na początek listy:

if (plista==0) {

// komunikat "Kolejka jest pusta"

} else {

// instrukcje odczytu elementu z kolejki }

Wariant "Początek kolejki - koniec listy"

Dodawanie elementu do kolejki jest równoważnie dodawaniu elementu na początku listy:

... //przygotowywanie danej do dodawania plista=new s_elem(liczba,plista);

lub

plista=new s_elem(litera,plista);

Odejmowanie elementu od kolejki jest równoważnie odejmowaniu elementu na końcu listy:

if (plista==0) {

System::Windows::Forms::MessageBox::Show( "kolejka jest pusta",

"Komunikat",MessageBoxButtons::OK, MessageBoxIcon::Exclamation );

} else {

s_elem *pt=plista;

s_elem *pprev=0;//wskazuje na element, który wskazuje na aktualny element while (pt->nast!=0)

{ //szukanie końca listy pprev=pt;

pt=pt->nast;

} //---

int liczba=pt->liczba;

lub wchar_t litera=pt->litera;

... //wyświetlenie danej

delete pt; //niszczenie elementu //---

if (pprev==0) plista=0;

else pprev->nast=0;

}

(8)

Wariant "Początek kolejki - początek listy"

Dodawanie elementu do kolejki jest równoważnie dodawaniu elementu na końcu listy:

Algorytm operacji dodawania elementu na końcu listy niecyklicznej jednokierunkowej jest realizowany w niżej przytoczonym fragmencie.

... //przygotowywanie danej do dodawania //dodawanie:

s_elem *pnew=new s_elem(liczba, 0);//alokacja elementu lub

s_elem *pnew=new s_elem(litera, 0);//alokacja elementu //---

if (plista==0) plista=pnew; // dodawanie do pustej listy else

{ // lista nie jest pusta s_elem *pt=plista;

while (pt->nast!=NULL) pt=pt->nast; //szukanie końca listy pt->nast=pnew; //dołączenie do listy

}

Odejmowanie elementu od kolejki jest równoważnie odejmowaniu elementu z początku listy:

if (plista==0) {

System::Windows::Forms::MessageBox::Show( "Kolejka jest pusta",

"Komunikat",MessageBoxButtons::OK, MessageBoxIcon::Exclamation );

} else {

int liczba=plista->liczba;

lub

wchar_t litera=plista->litera;

... //wyświetlenie danej s_elem *pt=plista;

plista=pt->nast; //odejmowanie elementu z początku listy delete pt; //niszczenie elementu

}

Cytaty

Powiązane dokumenty

We wszystkich tych placówkach, gdy wybrałem wariant przy- padek pilny, uzyskałem następujący wynik: liczba osób oczeku- jących – 0, liczba osób skreślonych – 0 i średni

Jeżeli chcielibyśmy dodać element do kolejki należałoby „przejść” przez wszystkie elementy kolejki (od pierwszego do ostatniego) i dopiero po wyznaczeniu jej końca

Tymczasem ich praca nie ogranicza się jedynie do przyjmowania pacjen- tów, którzy byli hospitalizowani, ale każdy pacjent ze skierowaniem może się tam zarejestrować.. De facto

Średni czas oczekiwania na kolejną wizytę do specjalisty endokrynologa jest nieco krót- szy niż na pierwszą wizytę, jednak nie jest to regułą – na Dolnym Śląsku

Gdy w kolejce brak komunikatów wywołanie funkcji mq_receive spowoduje zablokowania procesu bieżącego. Proces ulegnie odblokowaniu gdy w kolejce pojawi się jakiś

mq_open Otwarcie kolejki komunikatów mq_getattr Pobranie atrybutów kolejki mq_setattr Ustawienie atrybutów kolejki mq_receive Odbiór komunikatu z kolejki

mq_open Otwarcie kolejki komunikatów mq_getattr Pobranie atrybutów kolejki mq_setattr Ustawienie atrybutów kolejki mq_receive Odbiór komunikatu z kolejki mq_send

Gdy w kolejce brak komunikatów wywołanie funkcji mq_receive spowoduje zablokowania procesu bieżącego. Proces ulegnie odblokowaniu gdy w kolejce pojawi się