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)