Aleksander Timofiejew
Transkrypt
Aleksander Timofiejew
Ćwiczenie laboratoryjne „Operacje nad listami” Tematy ćwiczenia Listy z adresami. 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 ćwiczenia i nazwisko studenta. Pliki ze sprawozdaniem są przekazywane do archiwum grupy. A. Tworzenie listy ze wskaźnikami - adresami Zadanie Stworzyć listę z elementami, zawierającymi wskaźniki typu pełny adres. Pole danej elementu listy to słowo tekstu - baśni Ignacego Krasickiego ... ( w e d ł u g w a r i a n t u ) . W programie należy przeczytać tekst z pliku, wydzielić słowa, stworzyć z tych słów listę ze wskaźnikami typu pełny adres i wyświetlić listę w kontrolce ListBox. Zmierzyć czas wykonania programu i wyświetlić go w kontrolce Label. Opracowanie zadania (tekst programu) Testowanie (zrzut ekranu aplikacji) Wskazówki 1) Środowisko Wejść do środowiska Microsoft Visual Studio 2015. 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, na przykład „Pr1”, 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"; W opcji "Property Pages / Configuration Properties / Linker / Debugging / Generate Debug Info" ustawić "Optimize for debugging (/DEBUG)"; 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; [STAThreadAttribute] int main(cli::array<System::String^>^ args) { Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); Application::Run(gcnew Pr::MyForm()); } gdzie "Pr" to nazwa projektu. Dodać do formularza obiekt typu „Button” z nazwą "buttonStart" i napisem „Start” w celu uruchomienia operacji. Nacisnąć myszą dwa razy obiekt „buttonStart”, co spowoduje pojawienie się w klasie MyForm metody private: System::Void buttonStart_Click(System::Object^ sender, System::EventArgs^ e) Do tej metody będziemy wpisywać instrukcje do testowania zbudowanych obiektów programowych. 2) Odczyt z pliku W środowisku Visual C++ dla operacji z plikiem można stosować funkcje standardowego języka C. Tekst na początku pliku MyForm.h: #include #include #include #include #include #include <string.h> <stdio.h> <io.h> <direct.h> <stdlib.h> <vcclr.h> struct s_elem { char slowo[24]; s_elem* nast; s_elem(char *pslowo,s_elem *pnast) {//konstruktor strcpy_s(slowo,24,pslowo); nast=pnast; } }; Tekst w metodzie buttonStart_Click: char folder[512]; char nazwa[640]; //--_getcwd(folder,512);//odczyt ścieżki do foldera z projektem strcpy_s(nazwa,640,folder); //formowanie nazwy pliku strcat_s(nazwa,640,"\\dane.txt"); //formowanie nazwy pliku FILE* pf=0; fopen_s(&pf,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" // można wydzielić słowy s_elem* plist=0; char slowo[24]={'\0'}; int ind=0; int j=0; for (;j<filesize;j++) { if (buf[j]==' '||buf[j]=='\n'|| buf[j]=='\r'||buf[j]=='\t'|| buf[j]==','||buf[j]=='.'|| buf[j]=='\"'||buf[j]=='\''|| buf[j]=='('||buf[j]==')'|| buf[j]=='['||buf[j]==']'|| buf[j]==':'||buf[j]=='-'|| buf[j]==-51||buf[j]==0xFFFFFFA0) { if (ind>0) { plist=new s_elem(slowo,plist); ind=0; } } else { slowo[ind]=buf[j]; ind++; slowo[ind]='\0'; } } //ostatnie słowo if (ind>0) plist=new s_elem(slowo,plist); //---wyświetlenie w ListBox'e listBox1->Items->Clear(); s_elem* pp=plist; while (pp!=0) { System::String^ s=gcnew System::String(pp->slowo); listBox1->Items->Add(s); pp=pp->nast; } } W środowisku Visual C++ plik "dane.txt" musi być w tym folderze, gdzie znajduje się plik projektu "*.vcxproj". 3) Mierzenie czasu W celu mierzenia czasu do tekstu programu w języku Visual C++ można dodać niżej pokazane instrukcje, w których ma zastosowanie komputerowy zegar z wielką częstotliwością: #include <windows.h> LARGE_INTEGER freq,beg,end; BOOL bb1=QueryPerformanceFrequency(&freq); // częstotliwość //--BOOL bb2=QueryPerformanceCounter(&beg); // stan licznika przed obliczeniami //--// działania, których czas zamierzamy zmierzyć //--BOOL bb3=QueryPerformanceCounter(&end); // stan licznika po obliczeniach //--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 //--//--- Wyświetlenie czasu --... } B. Operacje nad listami ze wskaźnikami - adresami Zadanie Listą stworzoną w punkcie A rozdzielić na dwie listy: jedną listę z parzystymi i drugą listę z nieparzystymi numerami elementów. Wyświetlić stworzone listy w dodatkowych kontrolkach ListBox. Opracowanie zadania (tekst programu) Testowanie (zrzut ekranu aplikacji)