Języki programowania. Tablice struktur, pliki struktur. Część ósma. Autorzy Tomasz Xięski Roman Simiński

Podobne dokumenty
Podstawy programowania w języku C++

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Funkcje zawarte w bibliotece < io.h >

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Funkcje zawarte w bibliotece < io.h >

Biblioteka standardowa - operacje wejścia/wyjścia

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Podstawy programowania

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Podstawy programowania w języku C++

Wprowadzenie do programowania w języku C

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Tablice, funkcje - wprowadzenie

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Tablice deklaracja, reprezentacja wewnętrzna

Programowanie w języku C++

Wprowadzenie do programowania w języku C

Podstawy programowania w języku C++

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Podstawy programowania w języku C++

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Struktury czyli rekordy w C/C++

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

Programowanie w języku C++

Podstawy programowania

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Formatowane (tekstowe) wejście/wyjście. Binarne wejście/wyjście.

Podstawy programowania w języku C i C++

Strumienie i pliki. Programowanie Proceduralne 1

Programowanie w językach wysokiego poziomu

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

Wskaźniki. Programowanie Proceduralne 1

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Języki programowania obiektowego Nieobiektowe elementy języka C++

PRZYKŁADY OPERACJI PLIKOWYCH z wykorzystaniem biblioteki <stdio.h>

Programowanie w językach

Plik jest reprezentowany przez strumień znaków (bajtów) o zmiennej długości. Koniec strumienia identyfikowany jest znacznikiem końca pliku EOF.

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Programowanie Procedurale. Pliki w języku C++

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Podstawy programowania 1

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Podstawy programowania w języku C++

Wprowadzenie do programowania w języku C

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Pliki. Informacje ogólne. Obsługa plików w języku C

MATERIAŁY POMOCNICZE PODSTAWY PROGRAMOWANIA Na podstawie: Programowanie w C - Stworzone na Wikibooks, bibliotece wolny podręczników

W języku C każdy plik fizyczny jest ciągiem bajtów, z których każdy może być niezależnie odczytany. Borland 01234

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Programowanie Proceduralne

Wprowadzenie do programowania w języku C

Pliki. Informacje ogólne. Obsługa plików w języku C

Programowanie Proceduralne

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Podstawy programowania w języku C++

Operacje wejścia/wyjścia (odsłona druga) - pliki

Wstęp do programowania 1

Ghost in the machine

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Struktury - wprowadzenie

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Ćwiczenie 7. Strumień trójelementowy. A g a EOF... EOF... Wprowadzenie do programowania w języku C. Wskaźnik bieżącej pozycji. bieżącej pozycji.

PODSTAW PROGRAMOWANIA WYKŁAD 7 ŁAŃCUCHY

Programowanie strukturalne i obiektowe

Podstawy programowania w języku C++

1 Przetwarzanie plików

Łańcuchy znaków. Agnieszka Nowak - Brzezińska

Języki programowania. Karolina Mikulska-Rumińska Pokój 573, tel Konsultacje wtorek 9-10.

Co nie powinno być umieszczane w plikach nagłówkowych:

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Program wykonujący operację na plikach powinien zachować schemat działania zapewniający poprawną pracę:

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

Struktury. Przykład W8_1

Funkcja (podprogram) void

Temat: Operacje na plikach. Pliki tekstowe i binarne. Faza otwarcia, zapisu/odczytu i zamknicia pliku.

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wprowadzenie do programowanie obiektowego w języku C++

tablica: dane_liczbowe

INFORMATYKA Studia Niestacjonarne Elektrotechnika

7 Przygotował: mgr inż. Maciej Lasota

Operacje wejścia/wyjścia odsłona pierwsza

2 Przygotował: mgr inż. Maciej Lasota

KURS C/C++ WYKŁAD 7. struct Punkt { int x, y; int kolor; };

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Programowanie i struktury danych

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Języki programowania - podstawy

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Transkrypt:

Języki programowania Część ósma Tablice struktur, pliki struktur Autorzy Tomasz Xięski Roman Simiński Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim uczestnictwa. Opracowanie to jest chronione prawem autorskim. Wykorzystywanie jakiegokolwiek fragmentu w celach innych niż nauka własna jest nielegalne. Dystrybuowanie tego opracowania lub jakiejkolwiek jego części oraz wykorzystywanie zarobkowe bez zgody autora jest zabronione.

System ewidencji pojazdów dla autokomisu Jakich danych potrzebujemy? Obiekty rzeczywiste Analityk i/lub projektant systemu informatycznego Strona : 2

Dane Języki programowania Jakie informacje będziemy przetwarzać i przechowywać? Obiekty rzeczywiste Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Analityk i/lub projektant systemu informatycznego Strona : 3

Dane Języki programowania Dane opisują jeden pojazd T a b l ice i p l i k i s t r u k t u r Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Dane opisujące jeden pojazd to porcja różnych informacji Analityk i/lub projektant systemu informatycznego Strona : 4

Dane Dane Dane Dane Dane Dane Języki programowania Pojazdów jest wiele... T a b l ice i p l i k i s t r u k t u r Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Potrzeba wiele porcji danych. Każda z porcji jest złożona i zawiera różne dane opisujące pojazd. Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Strona : 5

Definicja typu strukturalnego raz jeszcze /* Maksymalna dlugosc pol marka i model */ #define MAKS_M 20 /* Maksymalna dlugosc pola numeru rejestracyjnego */ #define MAKS_R 10 /* Deklaracja typu strukturalnego, opisu informacji o pojezdzie */ struct _pojazd char char short float float char ; marka[ MAKS_M ]; model[ MAKS_M ]; int rok_prod; cena; przebieg; nr_rej[ MAKS_R ]; typedef struct _pojazd pojazd; Typ short int jest reprezentowany w postaci 16-to bitowej liczby ze znakiem zarówno w kompilatorach 16-to jak i 32-u bitowych. Taka deklaracja poprawi przenośność kodu programu oraz pliku z danymi. Strona : 6

Potrzebujemy funkcji do odczytu/zapisu rekordu z stdio pojazd a; /* Przykladowe dane */ strcpy( a.marka, Honda ); strcpy( a.model, Accord ); a.rok_prod = 2006; a.przebieg = 32850.5; a.cena = 45000; strcpy( a.nr_rej, S1 XXXX ); pokaz_info( &a ); pojazd a; czytaj_info( &a );... if( zmiana_rocznika ) /* Zmniejsz cene o 10% */ a.cena -= a.cena * 0.9; pokaz_info( &a ); Strona : 7

Funkcja wczytująca zawartość struktury z stdin void czytaj_info( pojazd * info ) char bufor[ 128 ]; printf( "\nmarka: " ); gets( bufor ); if( strlen( bufor ) >= MAKS_M ) bufor[ strcpy( info->marka, bufor ); MAKS_M - 1 ] = '\0'; printf( "Model: " ); gets( bufor ); if( strlen( bufor ) >= MAKS_M ) bufor[ MAKS_M - 1 ] = '\0'; strcpy( info->model, bufor ); printf( "Rok produkcji: " ); gets( bufor ); info->rok_prod = atoi( bufor ); printf( "Cena: " ); gets( bufor ); info->cena = atof( bufor ); printf( "Przebieg: " ); gets( bufor ); info->przebieg = atof( bufor ); printf( "Numer rejestracyjny: " ); gets( bufor ); if( strlen( bufor ) >= MAKS_R ) bufor[ MAKS_R - 1 ] = '\0'; strcpy( info->nr_rej, bufor ); Strona : 8

Funkcja wyprowadzająca zawartość struktury do stdout void pokaz_info( pojazd * info ) printf( \nmarka: %s, info->marka ); printf( \nmodel: %s, info- >model ); printf( \nrok produkcji: %d, info->rok_prod ); printf( \ncena: %g, info->cena ); printf( \nprzebieg: %g, info->przebieg ); printf( \nnr rejestracyjny: %s, info->nr_rej ); ` Strona : 9

Zapis blokowy struktury do pliku pojazd a; FILE * f; czytaj_info( &a ); if( ( f = fopen( pojazdy.dat, wb ) )!= NULL ) fwrite( &a, sizeof( pojazd ), 1, f ); marka model rok_prod cena Mazda 626 1999 12000 fclose( f ); przebieg nr_rej 134500 KTA1234 a fwrite( &a, sizeof( pojazd ), 1, plik ); Strona : 10

Odczyt blokowy struktury z pliku pojazd a; FILE * f; if( ( f = fopen( pojazdy.dat, rb ) )!= NULL ) fread( &a, sizeof( pojazd ), 1, f ); marka model Mazda 626 pokaz_info( &a ); rok_prod cena 1999 12000 fclose( f ); przebieg nr_rej 134500 KTA1234 a fread( &a, sizeof( pojazd ), 1, plik ); Strona : 11

Odczyt struktury z pliku wykorzystanie funkcji int info_z_pliku( pojazd * info, FILE * file ) return ( fread( info, sizeof( pojazd ), 1, file ) == 1 );... if( ( f = fopen( auta.dat, rb ) )!= NULL ) if( info_z_pliku( &a, f ) ) pokaz_info( &a ); else printf( Blad odczytu danych ); fclose( f ); Strona : 12

Zapis struktury do pliku wykorzystanie funkcji int info_do_pliku( pojazd * info, FILE * file ) return ( fwrite( info, sizeof( pojazd ), 1, file ) == 1 );... czytaj_info( &a ); if( ( f = fopen( auta.dat, wb ) )!= NULL ) if( info_do_pliku( &a, f ) ) printf( Dane zapisane poprawnie ); else printf( Blad zapisu danych ); fclose( f ); Strona : 13

Tablica struktur pseudotabela z danymi /* Maksymalna liczba ewidencjonowanych pojazdow */ #define MAKS_P 200 /* Tablica struktur opisujacych pojazdy */ pojazd pojazdy[ MAKS_P ]; Typ elementów tablicy Maks. liczba elementów tablicy pojazd pojazdy [ MAKS_P ]; 0 1 2 3 MAKS_P - 2 MAKS_P - 1 Tablica struktur Strona : 14

Tablica struktur jak odwoływać się do pól struktur w tablicy? /* Maksymalna liczba ewidencjonowanych pojazdow */ #define MAKS_P 200 /* Tablica struktur opisujacych pojazdy */ pojazd pojazdy[ MAKS_P ]; pojazdy[ 0 ].przebieg = 123000; strcpy( pojazdy[ 0 ].marka, Mazda ); Mazda 123000 0 1 2 3 MAKS_P - 2 MAKS_P - 1 Tablica struktur Strona : 15

Tablica struktur pusty magazyn na dane o pojazdach /* Maksymalna liczba ewidencjonowanych pojazdow */ #define MAKS_P 200 /* Tablica struktur opisujacych pojazdy */ pojazd pojazdy[ MAKS_P ]; /* Aktualna liczba ewidencjonowanych pojazdow, domyślnie zerowana */ short int lb_pojazdow = 0; /* Nazwa pliku danych ewidencji pojazdow */ const char nazwa_pliku[] = "pojazdy.dat"; lb_pojazdow 0 W sensie logicznym tabela jest pusta pojazdy 0 1 2 3 MAKS_P - 2 MAKS_P - 1 Strona : 16

Tablica struktur dopisanie rekordu do ewidencji... czytaj_info( &pojazdy[ lb_pojazdow ] ); lb_pojazdow++;... lub... czytaj_info( &pojazdy[ lb_pojazdow++ ] );... lb_pojazdow 1 Pierwszy wolny rekord pojazdy 123000 Mazda 626 0 1 2 3 MAKS_P - 2 MAKS_P - 1 Strona : 17

Tablica struktur dopisywanie kolejnych rekordów do ewidencji void dopisz_pojazd( void ) int jeszcze_jeden; /* Czy wczytac dane nastepnego pojazdu? */ if( lb_pojazdow < MAKS_P ) /* Czy jest miejsce w tablicy? */ do czytaj_info( &pojazdy[ lb_pojazdow ] ); lb_pojazdow++; printf( "\nczy wprowadzasz nastepny pojazd? (t/n): " ); jeszcze_jeden = ( tolower( getchar() ) == 't' ); fflush( stdin ); while( jeszcze_jeden && lb_pojazdow < MAKS_P ); if( lb_pojazdow == MAKS_P ) /* Czy wyczerpano miejsce w tablicy? */ printf( "\newidencja pelna!" ); Strona : 18

Tablica struktur wypisywanie kolejnych rekordów z ewidencji void pokaz_pojazdy( void ) int nr; if( lb_pojazdow == 0 ) printf( "\newidencja jest pusta." ); for( nr = 0; nr < lb_pojazdow; nr++ ) printf( "\ndane pojazdu nr: %d\n", nr + 1 ); pokaz_info( &pojazdy[ nr ] ); if( nr < lb_pojazdow - 1 ) printf( "\n\n[enter] = Nastepny pojazd >>" ); else printf( "\n\n[enter] = Zakoncz przeglad" ); ( void )getchar(); fflush( stdin ); Strona : 19

Tablica struktur zapis z tablicy do pliku Program lb_pojazdow 3 Pierwszy wolny rekord pojazdy 123000 Mazda 626 Honda Accord Volvo V40 0 1 2 3 MAKS_P - 2 MAKS_P - 1 Zapis liczby pojazdów: 1-en blok o rozmiarze sizeof( lb_pojazdow ), spod adresu &lb_pojazdow Zapis info o pojazdach: tyle bloków o rozmiarze sizeof( pojazd ) ile wynosi lb_pojazdow, spod adresu pojazdy Strona : 20

Struktura pliku ewidencji pojazdów Fizycznie 3 Mazda 626 Honda Accord Volvo V40 EOF Logicznie Liczba rekordów 3 rekordy opisu pojazdów Strona : 21

Tablica struktur zapis liczby pojazdów Program lb_pojazdow 3 Pierwszy wolny rekord pojazdy 123000 Mazda 626 Honda Accord Volvo V40 0 1 2 3 MAKS_P - 2 MAKS_P - 1 fwrite( &lb_pojazdow, sizeof( lb_pojazdow ), 1, plik ); Strona : 22

Tablica struktur zapis rekordów z danymi pojazdów Program lb_pojazdow 3 Pierwszy wolny rekord pojazdy 123000 Mazda 626 Honda Accord Volvo V40 0 1 2 3 MAKS_P - 2 MAKS_P - 1 fwrite( pojazdy, sizeof( pojazd ), lb_pojazdow, plik ); Strona : 23

Tablica struktur zapis rekordów z kontrolą poprawności int n; n = fwrite( &lb_pojazdow, sizeof( lb_pojazdow ), 1, plik ); if( n!= 1 ) printf( "\nblad zapisu pliku ewidencji pojazdow." ); Liczba zapisanych bloków jest niezgodna if( lb_pojazdow > 0 ) n = fwrite( pojazdy, sizeof( pojazd ), lb_pojazdow, plik ); if( n!= lb_pojazdow ) printf( "\nblad w pliku ewidencji pojazdow." ); Strona : 24

Tablica struktur zapis z wykorzystaniem funkcji void z_tablicy_do_pliku( void ) FILE * plik; printf( "\nzapisywanie ewidencji..." ); if( ( plik = fopen( nazwa_pliku, "wb" ) ) == NULL ) printf( " blad aktualizacji pliku." ); else Zapis liczby pojazdów w ewidencji int n; n = fwrite( &lb_pojazdow, sizeof( lb_pojazdow ), 1, plik ); if( n!= 1 ) printf( "\nblad zapisu pliku ewidencji pojazdow." ); if( lb_pojazdow > 0 ) n = fwrite( pojazdy, sizeof( pojazd ), lb_pojazdow, plik ); if( n!= lb_pojazdow ) printf( "\nblad w pliku ewidencji pojazdow." ); fclose( plik ); Zapis blokowy rekordów z tablicy Strona : 25

Tablica struktur odczyt liczby pojazdów z pliku lb_pojazdow 3 Tyle rekordów należy odczytać Program pojazdy 0 1 2 3 MAKS_P - 2 MAKS_P - 1 fread( &lb_pojazdow, sizeof( lb_pojazdow ), 1, plik ); Strona : 26

Tablica struktur odczyt danych z pliku, do rekordów w tablicy Program lb_pojazdow 3 Pierwszy wolny rekord pojazdy 123000 Mazda 626 Honda Accord Volvo V40 0 1 2 3 MAKS_P - 2 MAKS_P - 1 fread( pojazdy, sizeof( pojazd ), lb_pojazdow, plik ); Strona : 27

Tablica struktur odczyt z wykorzystaniem funkcji void z_pliku_do_tablicy( void ) FILE * plik; printf( "\nladowanie ewidencji..." ); if( ( plik = fopen( nazwa_pliku, "rb" ) ) == NULL ) printf( "plik ewidencji pojazdow nie istnieje." ); else Odczyt liczby pojazdów w ewidencji int n; n = fread( &lb_pojazdow, sizeof( lb_pojazdow ), 1, plik ); if( n!= 1 ) printf( "\nblad w pliku ewidencji pojazdow." ); n = fread( pojazdy, sizeof( pojazd ), lb_pojazdow, plik ); if( n!= lb_pojazdow ) printf( "\nblad w pliku ewidencji pojazdow." ); fclose( plik ); Odczyt blokowy rekordów z pliku Strona : 28