Podstawy programowania w języku C++



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

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++

Funkcje zawarte w bibliotece < io.h >

Funkcje zawarte w bibliotece < io.h >

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

Podstawy programowania

Biblioteka standardowa - operacje wejścia/wyjścia

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

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

Programowanie w języku C++

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

Tablice, funkcje - wprowadzenie

Wprowadzenie do programowania w języku C

Podstawy programowania w języku C++

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

Programowanie w języku C++

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

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

Podstawy programowania w języku C i C++

Tablice deklaracja, reprezentacja wewnętrzna

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

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.

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

Podstawy programowania

Struktury czyli rekordy w C/C++

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

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.

Strumienie i pliki. Programowanie Proceduralne 1

Programowanie w językach wysokiego poziomu

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

Wskaźniki. Programowanie Proceduralne 1

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

Wprowadzenie do programowania w języku C

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

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

Podstawy programowania w języku C++

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

Programowanie w językach

Wprowadzenie do programowania w języku C

Programowanie Procedurale. Pliki w języku C++

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

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.

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

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

Podstawy programowania 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.

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

Programowanie Proceduralne

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

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

Programowanie Proceduralne

Ghost in the machine

Wstęp do programowania 1

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

Wprowadzenie do programowanie obiektowego w języku C++

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

Podstawy programowania w języku C++

PODSTAW PROGRAMOWANIA WYKŁAD 7 ŁAŃCUCHY

Programowanie strukturalne i obiektowe

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

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ść

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

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

Funkcja (podprogram) void

Struktury. Przykład W8_1

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

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

Systemy ekspertowe Część siódma Realizacja dziedzinowego systemu ekspertowego Roman Simiński

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

Ć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.

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

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

tablica: dane_liczbowe

INFORMATYKA Studia Niestacjonarne Elektrotechnika

7 Przygotował: mgr inż. Maciej Lasota

Systemy ekspertowe Część siódma Realizacja dziedzinowego systemu ekspertowego Roman Simiński

1 Przetwarzanie plików

Podstawy programowania w języku C++

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

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

Programowanie i struktury danych

Transkrypt:

Podstawy programowania w języku C++ Część trzynasta Tablice struktur, pliki struktur Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski 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 Copyright Roman Simiński Strona : 2

Jakie informacje będziemy przetwarzać i przechowywać? Obiekty rzeczywiste Dane Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Analityk i/lub projektant systemu informatycznego Copyright Roman Simiński Strona : 3

Dane opisują jeden pojazd Dane Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Dane opisujące jeden pojazd to porcja różnych informacji Analityk i/lub projektant systemu informatycznego Copyright Roman Simiński Strona : 4

Pojazdów jest wiele... Dane Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Dane Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Dane 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. Dane Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Dane Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Dane Marka Model Rok produkcji Cena Przebieg Nr rejestracyjny Copyright Roman Simiński 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 marka[ MAKS_M ]; char model[ MAKS_M ]; short int rok_prod; float cena; float przebieg; char 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. Copyright Roman Simiński 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 ); Copyright Roman Simiński 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[ MAKS_M - 1 ] = '\0'; strcpy( info->marka, bufor ); 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 ); Copyright Roman Simiński 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 ); ` Copyright Roman Simiński 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 ); Copyright Roman Simiński 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 ); Copyright Roman Simiński 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 ); Copyright Roman Simiński 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 ); Copyright Roman Simiński 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 Copyright Roman Simiński 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 Copyright Roman Simiński 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 Copyright Roman Simiński 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 Copyright Roman Simiński 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!" ); Copyright Roman Simiński 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 ); Copyright Roman Simiński 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 Copyright Roman Simiński 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 Copyright Roman Simiński 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 ); Copyright Roman Simiński 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 ); Copyright Roman Simiński 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 if( lb_pojazdow > 0 ) niezgodna n = fwrite( pojazdy, sizeof( pojazd ), lb_pojazdow, plik ); if( n!= lb_pojazdow ) printf( "\nblad w pliku ewidencji pojazdow." ); Copyright Roman Simiński 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 Copyright Roman Simiński 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 ); Copyright Roman Simiński 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 ); Copyright Roman Simiński 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 Copyright Roman Simiński Strona : 28