Ćwiczenia laboratoryjne Oprogramowanie i badanie prostych metod sortowania w tablicach 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. Sortowanie w tablicy Zadanie Zadanie polega na oprogramowaniu sortowania w tablicy przez wstawianie proste, wybieranie proste, zamianą prostą lub metodą bąbelkowej według wariantu z tabeli wariantów. Dane pseudolosowe w ilości 10000 rozmieścić w tablicę dynamicznej i zapisać do pliku tekstowego, przy tym liczby po 20, a litery po 100 w wierszu. Posortować dane w tablicy, a przy tym zmierzyć i wyświetlić czas sortowania, i wynik zapisać do innego pliku tekstowego, przy tym liczby po 20, a litery po 100 w wierszu. Opracowanie zadania ( t e k s t p r o g r a m u ) Testowanie Sprawdzić w plikach poprawność sortowania. W sprawozdaniu umieścić po 100 wierszy z obydwóch plików. Przedstawić zrzut okna z czasem sortowania. Tabela wariantów Np Algorytm Dane Na początku tablicy Np Algorytm Dane Na początku tablicy 1 wstawianie proste liczby najmniejszy 17 wstawianie proste liczby największy 2 wybieranie proste liczby najmniejszy 18 wybieranie proste liczby największy 3 zamiana prosta liczby najmniejszy 19 zamiana prosta liczby największy 4 bąbelkowy liczby najmniejszy 20 bąbelkowy liczby największy 5 wstawianie proste litery najmniejszy 21 wstawianie proste litery największy 6 wybieranie proste litery najmniejszy 22 wybieranie proste litery największy 7 zamiana prosta litery najmniejszy 23 zamiana prosta litery największy 8 bąbelkowy litery najmniejszy 24 bąbelkowy litery największy 9 wstawianie proste liczby największy 25 wstawianie proste liczby najmniejszy 10 wybieranie proste liczby największy 26 wybieranie proste liczby najmniejszy 11 zamiana prosta liczby największy 27 zamiana prosta liczby najmniejszy 12 bąbelkowy liczby największy 28 bąbelkowy liczby najmniejszy 13 wstawianie proste litery największy 29 wstawianie proste litery najmniejszy 14 wybieranie proste litery największy 30 wybieranie proste litery najmniejszy 15 zamiana prosta litery największy 31 zamiana prosta litery najmniejszy 16 bąbelkowy litery największy 32 bąbelkowy litery najmniejszy
Wskazówki Środowisko W zależności od zainstalowanego środowiska Microsoft Visual Studio wykonać punkt A lub B. A) Wejść do środowiska Microsoft Visual Studio 2005. Wybrać punkt menu File / New Project.., zaznaczyć język programowania Visual C++, rodzaj aplikacji Windows Forms Application, wprowadzić na dole okna nazwę projektu, na przykład Pr1, oraz wybrać folder projektu. B) Wejść do środowiska Microsoft Visual Studio 2012. Wybrać punkt menu File / New / Project..., zaznaczyć rodzaj aplikacji Win32 w Templates / Visual C++ i wybrać "Win32 Project", dalej na dole okna w polu "Name" wprowadzić nazwę projektu, na przykład Pr1, a za pomocą przycisku "Browse" w polu "Location" wyznaczyć folder projektu. Nacisnąć przycisk "OK". W oknie "Win32 Application Wizard" wybrać punkt "Application Settings" i zaznaczyć opcję "Empty project". Nacisnąć przycisk "Finish". W menu projektu wybrać "PROJECT/Properties". W oknie "Property Pages" : 1) zaznaczyć opcję "Configuration Properties / General / Project Defaults / Common Language Runtime Support" na wartość "Common Language Runtime Support (/clr)"; 2) zaznaczyć opcję "Configuration Properties / C/C++ / General / Common Language Runtime Support" na wartość "Common Language Runtime Support (/clr)"; 3) 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" i nacisnąć "Add". Do pliku "MyForm.cpp" dodać tekst z głównym podprogramem "Main": using namespace System; using namespace System::Windows::Forms; [STAThread] void Main(array<System::String^>^ args) Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); Application::Run(gcnew Pr::MyForm()); gdzie "Pr" to nazwa projektu. Opracowanie graficznej części aplikacji Nadać formularzowi nagłówek Sortowanie przez.... Autor.... Wprowadzić do formularza obiekty graficzne: - do wyświetlenia czasu sortowania, - do inicjalizacji operacji (klawisz Start ). Czas sortowania można wyświetlić w obiekcie typu "Label". Do inicjalizacji sortowania jest potrzebny klawisz typu Button z napisem Start. Programowanie operacji Zdefiniować potrzebne struktury programowe oraz zmienne.
Generowanie liczb pseudolosowych W środowisku Visual C++ do generowania liczb pseudolosowych można zastosować obiekt klasy Random lub funkcję rand. Funkcja rand jest opisana w pliku <stdlib.h>: int rand(); Funkcja rand zwraca pseudolosową liczbę całkowitą nieujemną z zakresu (0..RAND_MAX), gdzie RAND_MAX jest równa 32767. Stosowanie tylko funkcji rand powoduje, że łańcuch liczb pseudolosowych będzie jednakowy przy każdym uruchomieniu aplikacji. Aby łańcuch liczb pseudolosowych nie był jednakowym, stosuje się ustawienie początkowe generatora liczb pseudolosowych za pomocą funkcji srand: void srand(unsigned int seed); Jako argument seed funkcji srand zwykle jest wykorzystywany czas systemowy zwrócony przez funkcję _time32 (opis znajduje się w pliku <time.h>): srand((unsigned)_time32(null)); Odczyt z pliku W środowisku Visual C++ można operować plikami na dwa sposoby: 1) można stosować funkcje standardowego języka C; 2) można stosować klasy środowiska, w tym StreamReader. Funkcje standardowego języka C są lepiej przystosowane do potrzebnych w tym ćwiczeniu operacji bajtowych. Odczyt z pliku w przypadku stosowania funkcji standardowego języka C: #include <string.h> #include <stdio.h> #include <io.h> #include <direct.h> #include <stdlib.h> #include <vcclr.h> char folder[512]; char nazwa[640]; _getcwd(folder,512);//odczyt ścieżki do foldera z projektem strcpy(nazwa,folder); //formowanie nazwy pliku strcat(nazwa,"\\dane.txt"); //formowanie nazwy pliku FILE* pf=fopen(nazwa,"rt+"); // otwarcie pliku tekstowego if (pf) int handle=_fileno(pf); // deskryptor pliku long filesize=_filelength(handle); // rozmiar pliku char* buf=new char[filesize]; //alokacja bufora fread(buf,1,filesize,pf); // odczyt do bufora fclose(pf); // zamknięcie pliku // tekst w buforze "buf" W środowisku Visual C++ plik "dane.txt" musi być w tym folderze, gdzie znajduje się plik projektu "*.vcxproj".
Odczyt z pliku w przypadku stosowania klas środowiska: using namespace System::IO; nazwa katalogu, w którym znajduje się aplikacja: System::String^ paskat=system::io::directory::getcurrentdirectory(); System::String^ pas1=system::string::concat(paskat,l"\\dane.txt");//nazwa pliku ze ścieżką //ładowanie pliku: StreamReader^ din1 = File::OpenText(pas1); // otwarcie pliku tekstowego String^ ps1=din1->readtoend(); din1->close(); Zapisywanie do pliku W środowisku Visual C++ można operować z plikami na dwa sposoby: 1) można stosować funkcje standardowego języka C; 2) można stosować klasy środowiska, w tym StreamWriter. Funkcje standardowego języka C lepiej przystosowane do potrzebnych w tym ćwiczeniu operacji bajtowych. Zapisywanie do pliku w przypadku stosowania funkcji standardowego języka C: char buf[512]; char nazwa[640]; FILE* pf; _getcwd(buf,512);//odczyt ścieżki do foldera z projektem strcpy(nazwa,buf); //formowanie nazwy pliku strcat(nazwa,"\\dane11.txt"); //formowanie nazwy pliku pf=fopen(nazwa,"wt+"); // otwarcie pliku tekstowego if (pf) for (int j=0;j<10000;j+=20) //zapisywanie po 20 liczb; każda w 6 pozycjach; z bufora Licz10000 for (int k=0,pos=0;k<20;k++,pos+=6) int liczba=licz10000[j+k]; sprintf(&buf[pos],"%6d\r\n",liczba); int size=strlen(buf); fwrite(buf,1,122,pf); //122=20*6+2 zapisywanie bufora fclose(pf); // zamknięcie pliku Zapisywanie do pliku w przypadku stosowania klas środowiska: using namespace System::IO; nazwa katalogu, w którym znajduje się aplikacja: String ^paskat=system::io::directory::getcurrentdirectory(); zapisywanie do pliku: String ^pas1=string::concat(paskat,l"\\dane01.txt");//nazwa pliku ze ścieżką //ładowanie pliku: StreamWriter ^din1 = gcnew StreamWriter(pas1); // otwarcie pliku tekstowego for (int j=0;j<10000;j+=20) //zapisywanie po 20 liczb w wierszu z buforu Lit10000 String ^ps1=""; for (int k=0;k<20;k++) ps1+=lit10000[j+k].tostring(); din1->writeline(ps1); din1->close();
Mierzenie czasu W środowisku Visual C++ do mierzenia czasu można zastosować właściwość Ticks klasy DateTime, która podaje czas w 100 nanosekundowych interwałach: DateTime dt; dt=datetime::now; int64 beg=dt.ticks; // działania, których czas zamierzamy zmierzyć dt=datetime::now; int64 end=dt.ticks; int64 delta=end-beg; double czas=(double)(delta/10000000.0); // czas w sekundach Dla dokładnego mierzenia czasu lepiej stosować zegar z wielką częstotliwością: #include <windows.h> LARGE_INTEGER freq,beg,end; BOOL bb1=queryperformancefrequency(&freq); BOOL bb2=queryperformancecounter(&beg); // działania, których czas zamierzamy zmierzyć BOOL bb3=queryperformancecounter(&end); if (bb1 && bb2 && bb3) int64 freq64=freq.quadpart; int64 beg64=beg.quadpart; int64 end64=end.quadpart; int64 delta=end64-beg64; double czas=(double)delta/(double)freq64; /* czas w sekundach */