Nazwa forum

Opis forum


#1 2010-06-19 12:30:28

sirac

Nowy użytkownik

Zarejestrowany: 2010-06-19
Posty: 3
Punktów :   

2. Programowanie

1.    Stałe i zmienne i ich deklarowanie.
      Podstawowymi obiektami występującymi w programie są stałe i zmienne. Znaczenie ich jest takie same jak w matematyce. Stałe i zmienne muszą posiadać nazwę i mogą mieć przypisaną wartość. Nazwa jest ciągiem znaków, z których pierwszy musi być literą.
Stała - jest to pewna wartość przypisana znakowi/wyrazowi której nie można zmienić np.: stałej PI jest przyporządkowana liczba 3.1415...
Zmienna - Jak sama nazwa wskazuje zmienna jest to wyraz, któremu jest przypisana pewna wartość, która w czasie działania programu możemy swobodnie zmieniać w zakresie danego typu. Jest to określona komórka w pamięci przechowująca określony typ danych. Zmienna posiada nazwę, którą określamy podczas deklaracji.
Deklaracja Stałych (const)
Stałe deklaruje się jeszcze przed głównym programem słowem kluczowym "Const", w programie przykładowo wygląda to tak:
Const abc=500;
W języku C/C++ stałe można definiować przed pierwszym użyciem po słowie const, ale trzeba określić typ danej Np.:
Const int x=4;
Lub poprzez użycie słowa #DEFINE
#DEFINE X=4
Deklaracja Zmiennych (var)
Zmienne deklaruje się podobnie przed głównym programem (w C przed pierwszym użyciem).
W PASCALu słowem kluczowym "Var", następnie podaje się nazwę zmiennej i jej typ  Np.:
Var
x: integer;
slowo: string;
W C/C++ zmienne trzeba zadeklarować przed ich pierwszym użyciem, dokonuje się tego poprzez podanie typu zmiennej a następnie jej nazwy Np.:
Int x;
Bool sprawdz;
Można także definiować zmienne w czasie rozpoczęcia użycia
For (int i=1;i<10;i++) {…}
Deklaracja następuje po określeniu typu (int) i nazwy „i” a następnie tej zmiennej zostaje przypisana wartość 1.
Istnieją języki Np.: PHP w których nie trzeba deklarować zmiennych, zmienne są automatycznie deklarowane przy pierwszym użyciu, kompilator automatycznie rozpoznaje i nadaje typ zmiennej. W języku PHP zmienne musż rozpoczynać się znakiem $.
2.    Podstawowe instrukcje: przypisanie, złożenie, instrukcja warunkowa, instrukcje iteracyjne.
Przypisanie jest to nadanie zmiennej wartości. Wartość może być podana bezpośrednio, obliczona z wyrażenia arytmetycznego lub przypisana jako wynik działania funkcji. Przypisanie odbywa się na podstawie 3 parametrów nazwy zmiennej, operatora przypisania i wartości przypisywanej. Operatorem przypisania dla języka PASCAL jest „ := ” a dla języka C/C++ jest „ = ”.
PASCAL
x:=4;
slowo:=”kasztan”;
C/C++
x=4;
slowo=”kasztan”
Złożeniem nazywamy stworzenie ciągu instrukcji objętych w znaki rozpoczęcia złożenia i zamknięcia złożenia w jesuku PASCAL są to slowa BEGIN i END
BEGIN
Inst. 1;

Inst. N;
END;
W językach C/C++ znakami są klamry {}
{
Inst. 1;

Inst. N;
}
Instrukcje warunkowe są to instrukcje które wykonują zadane instrukcje (lub złożenie instrukcji) po zajściu warunku
Instrukcjami warunkowymi są IF … THEN …ELSE oraz CASE (odpowiednio w C/C++ IF … ELSE oraz SWITCH
PRZYKŁAD
PASCAL: IF (warunek) THEN Instrukcja1 ELSE Instrukcja2;
IF i>j THEN min:=j ELSE min:=I;
CASE (zmienna) OF
Warunek 1: instrukcja1;

Warunek n: instrukcjan;
END;
Np.:
Case x of
1 : a:=5;
2 : b:=8;
End;


C/C++: if( warunek) {instrukcja1;} else Instrukcja2;
if (i>j) {min=j;} else {min=i;}
switch(zmienna);
{
case 1: instrukcja1;
break;
case 2: instrukcja2;
break;
default: instrukcja_domyslna;
break;
}

switch(x);
{
case 1: slowo=”sniadanie”;
break;
case 2: slowo=”obiad”;
break;
default: slowo=”kolacja”;
break;
}
Instrukcie iteracyjne czyli pętle FOR WHILE i DO .. WHILE (REPEAT..UNTIL) opis w Dziale I pytanie 4
3.    Proste i złożone typy danych.
W językach programowania zmienne mają oprócz nazwy określony także typ przechowywanych informacji. Zmienna może przechowywać różne dane w różnym czasie ale tylko określonego typu. Typy danych jakie mogą być przechowywane rozróżniamy na proste i złożone. Proste typy danych są to typy liczbowe (np.: integer, word, float) lub znakowe (char, string). Do typów złożonych zaliczamy tablice, rekordy i pliki. Tablice mogą przechowywać zbiór danych jednego typu np. 100 liczb typu integer
PASCAL: a :array [1..100] of integer;
C/C++: int a[100];
Rekordy zwane także strukturami są zbiorem danych różnego typu. Dla przykładu tworząc rekord OSOBA będziemy chcieli aby zawierał on dane takie jak imię, nazwisko, które będą znakowe ale możemy chcieć także przechowywać wiek który będzie typu liczbowego.
PASCAL:
Osoba : rekord
    Imie : string;
    Nazwisko : string;
    Wiek : integer;
End;
C/C++ :
struct osoba {
    char imie[20];
    char nazwisko[50];
    int wiek;
    };
Pliki – są to skończone zbiory danych posiadające swoją nazwę. Pliki nie muszą zawierać danych jednego typu. Podstawową różnicą między plikami a innymi typami danych jest to iż przechowywane są one na dysku twardym lub innych nośnikach stałych nie zaś w pamięci operacyjnej. W programowaniu plików używa się poprzez „przywiązanie” zmiennej poprzez ścieżkę dostępu nazwę pliku do miejsca na nośniku gdzie zapisane są dane. Operacje jakie można wykonywać na plikach to otwieranie, zamykanie, kasowanie, czyszczenie, dopisywanie danych, przeszukiwanie.
Przykłady użycia plików:
PASCAL:
VAR
t:file of char; // ustala że zmienna t będzie reprezentować plik zawierający dane typu char
BEGIN
assign(t, 'C:\plik1.bin'); // przypisuje plik do zmiennej
reset(t); //otwiera plik
Close(t); // zamyka plik
END.
C/C++:
FILE *fp; //ustalenie nazwy zmiennej
fp = fopen ("c:\plik1.bin", "w"); //parametr w otwiera plik do zapisu
fclose (fp); //zamknięcie pliku
4.    Tablice, rekordy pliki na przykładzie wybranego języka programowania.
Do pól tablicy odwołujemy się poprzez index np. tab[10] wywoła 10 wiersz w tabeli w języku PASCAL aby odwołać się do pola w tabeli wielowymiarowej trzeba podać po przecinkach indeksy każdego wymiaru ( tab[10,4,7]
Poprzez wywołanie pola tabeli można zarówno odczytać jego wartość jak też ją tam wpisać.
Rekordy-aby uzyskać dostęp do wartości rekordu trzeba po nazwie reprezentującej rekord, po kropce podać nazwę pola do którego chcemy uzyskać dostęp. Dla przykładu mając rekord osoba z polami imie, nazwisko i wiek stworzyliśmy zmienną „os” typu osoba. Dostęp do danych będzie wyglądał następująco
os.imie:=”Ala”;
os.nazwisko:=”kowalska”;
os.wiek:=20;
za pomocą klauzuli WITH można uzyskać łatwiejszy dostęp
with os do
begin
imie:=”Ala”;
nazwisko:=”kowalska”;
wiek:=20;
end;
Można tworzyć także połączenie tabeli i rekordów czyli tablicę rekordów. Dostęp do pola danych mógłby wyglądać następująco
Tab[5].imie:=”Anna”;

Kiedy napiszesz np. bazę danych wypadałoby, aby cała jej zawartość była zapisane gdzieś na dysku. Można by było odczytywać poszczególne elementy, dopisywać nowe... Bez tego nie można byłoby nazwać tego programu bazą. Aby utworzyć plik w Pascalu, musisz się zdecydować, jaka będzie jego zawartość. Może to być zwykły plik tekstowy, składający się z samych elementów typu word lub np. rekordów. Istnieje jeszcze typ niezdefiniowany czyli taki, który może naraz zawierać wiele elementów różnego typu (np. BMP). Taka definicja pliku jest niezbędna, gdyż komputer musi wiedzieć, jak interpretować zawartość takiego pliku. Rolę pośrednika między nami, a plikiem pełni pewna zmienna typu odpowiedniego dla danego pliku, np:
  var plik1    :text;        {plik tekstowy}
      plik2    :file of byte;    {plik z elementami typu byte}
      plik3    :file of array [1..100] of word;
      plik4     :file;       {plik niezdefiniowany}    
Można tutaj wymyślać naprawdę różne twory. Sama jednak zmienna jest nic nie warta. Musimy ją skojarzyć z odpowiednim zbiorem na dysku. Może to być również plik nieistniejący, jeśli zamierzamy dopiero go utworzyć. Do przypisania zmiennej konkretnego pliku służy procedura assign:
  ...
  assign (plik1,'c:\autoexec.bat');
  ...
Od tej pory wszystkie operacje wykonywane na zmiennej plik1, będą wykonywane na pliku autoexec.bat. Oznacza to, że jeśli chcesz coś zrobić z plikiem, to używasz nazwy zmiennej, a nie nazwy pliku. Ponieważ nasz plik jest tekstowy, więc akurat pasuje do zmiennej plik1. Zanim jednak zaczniemy cokolwiek z nim wyrabiać trzeba ten plik otworzyć. I tutaj sposobów jest kilka. Jeśli, tak jak w naszym przypadku, plik jest tekstowy, to w zależności od potrzeb możesz użyć:
rewrite (zmienna)            | zostanie utworzony nowiutki, pusty plik
reset (zmienna)        | otwarcie już istniejącego pliku
append (zmienna}        | jw. z tą tylko różnicą, że po otwarciu pliku
              kursor zostanie ustawiony na jego końcu,
              co umożliwia bezpośrednie dopisywanie tekstu
              na jego końcu
read(P1,L)
write(P1,L)     |zapisanie do pliku P1 zmiennych, których nazwy są wymienione na liście L
seek(P1,n)         |wyszukiwanie składowej o numerze porządkowym równym n
close(zmienna)     |zamknięcie pliku

Jeżeli mamy plik inny niż tekstowy, to stosujemy te same procedury poza append, która dotyczy tylko i wyłącznie plików tekstowych. Jeżeli chodzi o dwie pierwsze instrukcje, to możemy opcjonalnie dodać im drugi parametr, który określa rozmiar tworzonych zapisów. Jest to ważne szczególnie przy plikach niezdefiniowanych, gdyż wtedy domyślnie ustawiana jest wartość 128, co oznacza, że każdy zapis miałby długość 128 bajtów (byłoby to bardzo niepożądane). Do zapisu i odczytu stosujemy standardowe procedury read i write (w przypadku plików tekstowych również readln i writeln), spróbujmy zatem rozgryźć naszego autoexeca:
  program showfile;
  var plik    : text;
      linijka    : string;
  begin
    assign (plik,'c:\autoexec.bat');
    reset (plik);
    repeat
      readln (plik,linijka);
      writeln (linijka)
    until eof(plik);
    close (plik)
  end.
Widać jak na dłoni, że aby odczytać z pliku jakąś wartość to jako pierwszy parametr procedury read (tutaj readln) podajemy zmienną charakteryzującą plik.
Funkcja eof (end of file) sprawdza czy kursor jest na końcu pliku i jeśli, to zwraca wartość true. Na końcu programu zawsze powinno się zamykać pliki. Służy do tego procedura close (ostatni wiersz). Ten programik odczytywał poszczególne linijki pliku, ale można też (mowa cały czas o plikach wyłącznie tekstowych) odczytywać po kawałku, np. literami:
  ...
  var litera : char;
  ...
  read (plik,litera);
  ...
lub kilkuliterowymi porcjami:
  ...
  var porcja : string[8];
  ...
  read (plik,porcja);
  ...
Jednak nasze rozwiązanie wydaje się najrozsądniejsze, gdyż nie trzeba dodatkowo sprawdzać, czy kursor jest na końcu linijki i czy trzeba przejść do następnego wiersza. Problem ten nie występuje w plikach nietekstowych gdyż nie wyróżniamy w nich linijek (wszystko jest zapisane jakby w jednej), dlatego też nie możemy stosować readln'ów i writeln'ów. Oprócz znaków z plików tekstowych można również wyciągnąć liczby. Załóżmy, że w pierwszej linijce mamy jakąś liczbę z przedziału 0-65535:
  var liczba : word;
      plik   : text;
  begin
    assign (plik,'bla.txt');
    reset (plik);
    read (plik,liczba);
    close (plik)
  end.
Na pewno zadziała. Jeśli byłoby nawet kilka liczb w tej samej linijce (pooddzielanych spacjami) to moglibyśmy je odczytywać do bólu i też by działało. A jak ma się sprawa z plikami innych typów (w końcu tekstowe odstawiamy na bok)? Też jest banalna. Załóżmy przykładową książkę telefoniczną:
  program telefony_write;
  type osoba    = record    {definiujemy własny typ}
                    nazwisko,
            imie     : string[20];
            telefon  : longint;
          end;
  var plik    : file of osoba;
      kto    : osoba;
  begin
    assign (plik,'tel.dat');
    rewrite (plik);
    kto.nazwisko:='Jaworski';
    kto.imie:='Bartosz';
    kto.telefon:=2582408;
    write (plik,kto);
    kto.nazwisko:='Święty';
    kto.imie:='Mikołaj';
    kto.telefon:=0700123456;
    write (plik,kto);
    close (plik)   
  end.
Plik tel.dat zawiera teraz dwa rekordy z danymi. Teraz je odczytamy:
  program telefony_read;
  type osoba    = record
                    nazwisko,
            imie     : string[20];
            telefon  : longint;
          end;
  var plik    : file of osoba;
      kto    : osoba;
  begin
    assign (plik,'tel.dat');
    read (plik,kto);
    writeln (kto.nazwisko,' ',kto.imie,' - ',kto.telefon);
    read (plik,kto);
    writeln (kto.nazwisko,' ',kto.imie,' - ',kto.telefon);
    close (plik)
  end.
Chyba jasne. Jeżeli byśmy chcieli odczytać od razu drugi rekord to posłużylibyśmy się instrukcją seek:
  ...
  seek (plik,1);
  read (kto,plik);
  writeln (kto.nazwisko,' ',kto.imie,' - ',kto.telefon);
  ...
Drugi parametr to numer elementu w pliku przy czym elementy są numerowane od zera. A jak dopisać do bazy jeszcze jedną osobę? Append odpada. Wystarczy jednak znać funkcję filesize, która zwraca rozmiar pliku (czyli ilość jego elementów). Dzięki temu możemy zastosować taki chwyt:
  ...
  seek (plik,filesize(plik));
  ...
I już! To może zastąpić nam append.. Najgorzej jest z plikami niezdefiniowanymi (po prostu file). Tutaj  do zapisu i odczytu stosuje się procedury blockread i blockwrite, a przy otwieraniu takich plików trzeba też pamiętać aby do procedury np. reset dodać drugi parametr, o którym wspominałem na początku (na razie wystarczy jak podamy 1). Wtedy: blockread (plik,x,size) do zmiennej x wczyta taką porcję danych określiliśmy parametrem size (zazwyczaj jest to rozmiar zmiennej x). Blockwrite podlega tym samym zasadom. Bardziej szczegółowo przyjrzymy się tym instrukcjom przy innej okazji. Na koniec wspomnę jeszcze tylko o kliku instrukcjach, które się przydają:
filepos (zmienna)    | zwraca pozycję kursora w pliku
eoln (zmienna) lub eoln | czy osiągneliśmy koniec linijki?
truncate (zmienna)    | usuwa wszystkie elementy od aktualnej pozycji kursora do końca pliku
erase (zmienna)    | kasuje plik

5.    Procedury i funkcje.
Procedury i funkcje są to polecenia lub zbiory poleceń wykonujące określoną czynność mające nazwę służącą do ich wywołania Np. czyszczenie ekranu – clrscr, pierwiastkowanie sqrt(). Zarówno procedury jak i funkcje w zależności od ich przeznaczenia mogą przyjmować dane wejściowe. Zasadniczą różnicą między procedurami i funkcjami jest to, że funkcje w przeciwieństwie do procedur zwracają jakieś dane. Są to dane określonego typu zwracane poprzez nazwę funkcji. Wywołanie np. funkcji sqrt wymaga podania w parametrach liczby, która ma być pierwiastkowana sqrt(36). Samo wywołanie funkcji obliczy pierwiastek z 36 ale poprzez brak możliwości zwrócenia wyniku gdziekolwiek będzie wyglądało jakoby akcja nie zaszła należy np. wypisać wynik na ekran albo przepisać go do zmiennej
x:=sqrt(36)
6.    Statyczne a dynamiczne typy danych.
Typy statyczne
W językach programowanie każda stała, zmienna, funkcja itp. musi być ściśle określonego typu. Na podstawie tego typu kompilator rezerwuje odpowiednią ilość pamięci na dany element. Typ ten charakteryzuje zbiór wartości przyjmowanych przez niego.
Możemy wyróżnić następuj typy danych:
•    Typ liczb całkowitych
•    Typ liczb rzeczywistych
•    Typ znakowy
•    Typ logiczny
•    Typ tablicowy
•    Typ rekordowy
•    Typ obiektowy
Typy dynamiczne
Dynamicznymi typami danych są Typy wskaźnikowe obejmujące wartości, które mogą wskazywać inne wartości w pamięci, oraz dodatkową wartość „pustą”, która jest inna niż jakikolwiek „prawdziwy” wskaźnik. Wartość „pusta” bywa oznaczana jako null lub nil. Wskaźniki są adresami komórek pamięci wraz z informacją o typie wskazywanych obiektów, którą posiada kompilator (i wykorzystuje do sprawdzania zgodności typu). Powodem dla którego używa się wskaźników jest możliwość dynamicznego zarządzania pamięcią oraz elastyczność, jaką daje adresowanie pośrednie. W szczególności, wskaźniki są jedynym sposobem korzystania ze zmiennych alokowanych dynamicznie na stercie. Dzięki wskaźnikom możemy tworzyć takie struktury jak stosy i listy.

Ostatnio edytowany przez sirac (2010-06-19 12:34:53)

Offline

 

#2 2010-06-22 21:24:58

alex

Nowy użytkownik

Zarejestrowany: 2010-06-20
Posty: 3
Punktów :   

Re: 2. Programowanie

Ad. 2. Wariacje na temat...
Ad. 2.1.

Teoretycznie ktoś może się zapytać, jaka jest różnica między const, a #DEFINE ( w C / C++ ). Polega ona na tym, że dla const program w momencie napotkania stałej const "skoczy" i pobierze wartość zmiennej/stałej zadeklarowanej jako const, a w przypadku #DEFINE - kompilator w każdym miejscu wystąpienia symbolu tak zdefiniowanego podstawi liczbę/(inny typ...) równą zadeklarowanej.

Osobnym problemem może być coś takiego: "for (int i=0;i<=10;i++) {...}". W zasadzie liczby 0 i 10 są stałymi, odpowiada to zastosowaniu #DEFINE, więc chyba mogą też być wpisane bezpośrednio w programie.

Ostatnio edytowany przez alex (2010-06-29 13:42:51)

Offline

 

Stopka forum

RSS
Powered by PunBB
© Copyright 2002–2008 PunBB
Polityka cookies - Wersja Lo-Fi


Darmowe Forum | Ciekawe Fora | Darmowe Fora
www.pokemonxgame.pun.pl www.bezdechowcy.pun.pl www.widma.pun.pl www.stratus-klub.pun.pl www.top-eleven.pun.pl