Programowanie strukturalne w językach Pascal i C Krzysztof Grąbczewski Tematy zajęć • Wprowadzenie do programowania • Język Pascal • Język C • Podstawowe algorytmy • Dynamiczne struktury danych • Programowanie dla Windows Plan zajęć • Spotkanie 1: Podstawy, schematy blokowe • Spotkania 2, 3, 4: Język Pascal • Spotkania 5, 6, 7: Język C • Spotkanie 8: Struktury dynamiczne • Spotkanie 9: Programowanie dla Windows • Spotkanie 10: Różne uwagi i drobne problemy Bibliografia • Niklaus Wirth, Algorytmy + struktury danych = programy, WNT 1989 • Andrzej Marciniak, Turbo Pascal x.x • B. Kernighan, D. Ritchie, Język C, WNT 1988
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Programowanie strukturalnew językach Pascal i C
Krzysztof Grąbczewski
Tematy zajęć
• Wprowadzenie do programowania
• Język Pascal
• Język C
• Podstawowe algorytmy
• Dynamiczne struktury danych
• Programowanie dla Windows
Plan zajęć
• Spotkanie 1: Podstawy, schematy blokowe
• Spotkania 2, 3, 4: Język Pascal
• Spotkania 5, 6, 7: Język C
• Spotkanie 8: Struktury dynamiczne
• Spotkanie 9: Programowanie dla Windows
• Spotkanie 10: Różne uwagi i drobne problemy
Bibliografia
• Niklaus Wirth, Algorytmy + struktury danych = programy,WNT 1989
• Andrzej Marciniak, Turbo Pascal x.x
• B. Kernighan, D. Ritchie, Język C, WNT 1988
Programowanie Strukturalne dla PSPiZK 1
Komputer i jego wykorzystanie
• Sprzęt to ciało - oprogramowanie to dusza
• Komputer - jak pracują krasnoludki
Pamięćoperacyjna
Procesor kartagraficzna
kartadźwiękowa
Magistrala zewnętrzna
kontrolerydysków
• Rodzaje oprogramowania - poziomy od niskiego do wysokiego
– systemy operacyjne i podstawowe biblioteki obsługi urzą-dzeń
Operatory i ich priorytetyOperatory Priorytet Kategoria+, -, @, not 1 jednoargumentowe*, /, div, mod, and, shl, shr 2 multiplikatywne+, -, or, xor 3 addytywne=, <>, <, >, <=, >=, in 4 relacyjne
Wyrażeniem jest:
• stała bez znaku• nazwa zmiennej• wywołanie funkcji• wyrażenie w nawiasach• wyrażenie poprzedzone operatorem jednoargumentowym• dwa wyrażenia połączone operatorem dwuargumentowym
Relacje
• dają w wyniku wartości typu Boolean
• działają także dla napisów (leksykograficznie wg kodów ASCII)
Operacje teoriomnogościowe
• +, -, * - suma, różnica i iloczyn zbiorów o zgodnych typachbazowych
function nazwa_funkcji(lista_parametrów) : typ_wyniku;część_opisowabegin
ciąg instrukcjiend;
• Przykłady:
procedure WycentrujNapis(napis : string, n : Integer);var ile_spacji, i : Integer;begin
ile_spacji := n - Length(napis);for i:=1 to ile_spacji div 2 do
Write(’ ’);Write(napis);for i:=1 to (ile_spacji+1) div 2 do
Write(’ ’)end;
function Silnia(n : Integer) : LongInt;var wynik, i : LongInt;begin
wynik := 1;for i:=2 to n do
wynik := wynik * i;Silnia := wynik
end;
Programowanie Strukturalne dla PSPiZK 22
Argumenty przekazywane przez wartość i przez zmienną
var a, b : Integer;
procedure Zamien1(x, y : Integer);var z : Integer;begin
z := x;x := y;y := z;
end;
procedure Zamien2(var x, y : Integer);var z : Integer;begin
z := x;x := y;y := z;
end;
begina := 5;b := 7;WriteLn(’a = ’, a, ’, b = ’, b); { ’a = 5, b = 7’ }Zamien1(a, b);WriteLn(’a = ’, a, ’, b = ’, b); { ’a = 5, b = 7’ }Zamien2(a, b);WriteLn(’a = ’, a, ’, b = ’, b); { ’a = 7, b = 5’ }
end.
Programowanie Strukturalne dla PSPiZK 23
Stos wywołań
• Adresy funkcji i argumentów
• Rozmiar stosu jest skończony
Funkcje bezpośrednio rekurencyjne (wywołujące same siebie)
function Silnia(n : Integer) : LongInt;begin
if n <= 1 then Silnia := 1else Silnia := n*Silnia(n-1)
end;
function Potega(n, p:Integer) : LongInt;var pomoc : LongInt;begin
if p = 0then potega := 1elsebegin
pomoc := Potega(n, p div 2);if p mod 2 = 0then Potega := pomoc*pomocelse Potega := pomoc*pomoc*n
endend;
Typy rekurencyjne
• Liczby naturalne: 0 i operator następnika
• Drzewa: drzewo puste i drzewo łączące dwa drzewa
Programowanie Strukturalne dla PSPiZK 24
Funkcje pośrednio rekurencyjne (wywołujące siebie nawzajem)
type ListaDrzew = ...Drzewo = rekord
wezel : String [10];poddrzewa : ListaDrzew;
end;
function SzukajWDrzewie(d : Drzewo; var wynik : Drzewo): Boolean;
{ Rewrite - aby utworzyć nowy plik }Rewrite(zmienna_plikowa)Rewrite(zmienna_plikowa, rozmiar_zapisu){ Reset - aby otworzyć istniejący plik }Reset(zmienna_plikowa)Reset(zmienna_plikowa, rozmiar_zapisu){ Append - aby dopisywać do pliku tekstowego }Append(zmienna_plikowa){ Close - aby zamknąć plik }Close(zmienna_plikowa)
• Operacje na pliku
{ Dla plików tekstowych }Write(zmienna_plikowa, lista_argumentów)WriteLn(zmienna_plikowa, lista_argumentów)Read(zmienna_plikowa, lista_zmiennych)ReadLn(zmienna_plikowa, lista_zmiennych){ Dla plików zdefiniowanych }Write(zmienna_plikowa, lista_zmiennych_wyjściowych)Read(zmienna_plikowa, lista_zmiennych_wejściowych){ Dla plików niezdefiniowanych }BlockWrite(zmienna_plikowa, bufor, licznik)BlockWrite(zmienna_plikowa, bufor, licznik, wynik)BlockRead(zmienna_plikowa, bufor, licznik)BlockRead(zmienna_plikowa, bufor, licznik, wynik)
Programowanie Strukturalne dla PSPiZK 30
• Inne operacje na plikach
{ Czy to koniec pliku }Eof(zmienna_plikowa)
{ Czy to koniec pliku + ignoruj odstępy }SeekEof(zmienna_plikowa)
{ Czy to koniec linii }Eoln(zmienna_plikowa)
{ Czy to koniec linii + ignoruj odstępy }SeekEoln(zmienna_plikowa)
{ Aktualna pozycja w pliku }FilePos(zmienna_plikowa)
{ Rozmiar pliku }FileSize(zmienna_plikowa)
{ Skocz do pozycji }Seek(zmienna_plikowa, pozycja)
{ Usuń aż do końca pliku }Truncate(zmienna_plikowa)
{ Zmień nazwę pliku dyskowego }Rename(zmienna_plikowa, wyrażenie_łańcuchowe)
Programowanie Strukturalne dla PSPiZK 31
• Przykład obsługi plików (drukowanie pliku tekstowego)
var nazwa, linia : string;plik, druk : Text;
beginWrite(’Podaj nazwę pliku do wydrukowania : ’);ReadLn(nazwa);Assign(plik, nazwa);Assign(druk, ’LPT1’);Reset(plik);Rewrite(druk);while not SeekEof(plik) dobeginReadLn(plik, linia);WriteLn(druk, linia);
end;Close(plik);Close(druk);WriteLn(’Plik ’, nazwa, ’ został wydrukowany.’)
end.
Programowanie Strukturalne dla PSPiZK 32
Moduły
• Ogólna postać modułu
unit nazwa_modułu;część opisowaczęść implementacyjnaczęść inicjująca
• Część opisowa
interfacedeklaracje modułówdeklaracje stałychdeklaracje typówdeklaracje zmiennychlista nagłówków procedur i funkcji
• Część implementacyjna
implementationdeklaracje wewnętrznych stałych, typów etc.definicje procedur i funkcji
• Część inicjująca - instrukcja (prosta albo złożona), która będziewykonana w celu zainicjowania modułu lub end.
Programowanie Strukturalne dla PSPiZK 33
Moduły standardowe i ich ciekawe procedury i funkcje
Możliwe tryby otwarcia:r otwórz, żeby czytaćw stwórz, żeby pisaća otwórz, żeby pisać (stań na końcu)r+ otwórz, żeby czytać i pisaćw+ stwórz, żeby czytać i pisaća+ otwórz, żeby czytać i pisać (stań na końcu)b otwórz jako plik binarnyt otwórz jako plik tekstowy
Programowanie Strukturalne dla PSPiZK 50
– deskryptory plików
int handle = open(nazwaPliku, dostep, tryb);...close(handle);
Flagi dostepu:O_RDONLY otwórz, żeby czytaćO_WRONLY otwórz, żeby pisaćO_RDWR otwórz, żeby pisać i czytaćO_APPEND po otwarciu stań na końcu plikuO_CREAT stwórz plik, jeśli nie istniejeO_TRUNC jeśli plik istnieje, wyczyść zawartośćO_BINARY otwórz jako plik binarnyO_TEXT otwórz jako plik tekstowyFlagi trybu:S_IWRITE prawo pisaniaS_IREAD prawo czytaniaS_IREAD|S_IWRITE prawo pisania i czytania
– inne funkcje:
int putc(int c, FILE *stream);int getc(FILE *stream);int fprintf(FILE *stream, const char *format, ...);int fscanf(FILE *stream, const char *format, ...);int fputs(const char *s, FILE *stream);char *fgets(char *s, int n, FILE *stream);
• Standardowe urządzenia: stdin, stdout, stderr
Programowanie Strukturalne dla PSPiZK 51
Dyrektywy prekompilatora• #include - wkłada zawartość pliku w miejsce gdzie się pojawia
void DodajRekord(int n, Osoba os);Osoba CzytajRekord(int n);void ZapiszRekord(int n, Osoba os);void PokazRekord(int n);
#endif //__BAZA_H
main(){
int wybor, koniec = 0;do{
wybor = UruchomMenu();switch(wybor);{
case 0 : koniec = 1; break;case 1 : DodajRekord(); break;...
}}while (!koniec);
}
Programowanie Strukturalne dla PSPiZK 53
Wskaźniki do funkcji i funkcja qsort()#include <stdio.h> // dla printf()#include <stdlib.h> // dla qsort()#include <string.h> // dla strcmp() i stricmp()
char tmp[] = "C:\\TEMP\\TMPXXXXXX";mktemp(tmp);return tmp; // Bardzo niebezpieczne
}
• rozwiązanie: statyczne tablice, które „żyją” mimo wyjścia z funk-cji
#include <dir.h> // dla mktemp()
char *NazwaTymczasowa(void){
static char tmp[] = "C:\\TEMP\\TMPXXXXXX";mktemp(tmp);return tmp; // Teraz już w porządku
}
Programowanie Strukturalne dla PSPiZK 55
Pamięć przydzielana dynamicznieIdea: tworzymy wskaźnik (zmienna przechowująca adres) do obiek-tu, rezerwujemy fragment pamięci i jego adres zapamiętujemy wewskaźniku
• WinSight - podgląd sygnałów przychodzących do wybranychokien
• Turbo Profiler - szukanie „wąskich gardeł” w programie, licze-nie liczby wywołań poszczególnych funkcji, instrukcji itp.
• tlib - tworzenie i analizowanie bibliotek
• lex i yacc (flex i bison) - definiowanie gramatyk i genero-wanie kodu źródłowego programu analizy wyrażeń.
• zarządzanie wieloma wersjami programu i praca grupowa
– RCS - Revision Control System
– CVS - Concurrent Versions System
– SCCS - Source Code Control System
– PVCS - rozpowszechniany z Borland C++
Programowanie Strukturalne dla PSPiZK 61
Różnice pomiędzy Pascalem a C
• C rozróżnia wielke i małe litery a Pascal nie
• C jest zarazem językiem niskiego poziomu
• program skompilowany w C jest szybszy
• C jest zwięzły, Pascal jest bardziej czytelny
• w C łatwiej manewrować wskaźnikami, dynamicznie przydzielaćpamięć
• w Pascalu dokładniejsza kontrola przed korzystaniem z niedo-zwolonych obszarów pamięci
• w C są unie
• w C wskaźniki do funkcji, w Pascalu typy proceduralne
• argumenty w C przekazywane zawsze przez wartość, w Pascaluprzez wartość lub przez zmienną
• w C jest wygodna i szybka instrukcja for
• w C biblioteki, w Turbo Pascalu moduły
Programowanie Strukturalne dla PSPiZK 62
Podsumowania i przestrogi
• porządny projekt (przemyślenie problemu)
• nazywanie zmiennych i komentowanie źródeł
• programujemy z góry w dół (top-down)
• funkcje krótkie choć więcej
• kopie bezpieczeństwa
• wieloplatformowość oprogramowania
– kolejności bajtów w binarnej reprezntacji
– długości standardowych typów
– używamy funkcji określonych standardem języka
– dyrektywa #pragma
• nie używamy zmiennych globalnych
• pamięć dynamiczna
– uwaga na rozmiary przydzielonej pamięci
– pamiętajmy o jej zwalnianiu
• program budowany z małych kawałków łatwiej przetestować
• dobry programista, to nie ten, który pamięta najwięcej funk-cji, ale ten, który wie co daje się zrobić, z łatwością odnajdujefunkcje których szuka i potrafi z nich skorzystać.