1.1 Wprowadzenie do języka C w pigułce



Podobne dokumenty
Kilka prostych programów

Programowanie w języku C++ Agnieszka Nowak Brzezińska Laboratorium nr 2

1 Podstawy c++ w pigułce.

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Podstawy programowania skrót z wykładów:

Programowanie w języku Python. Grażyna Koba

1 Podstawy c++ w pigułce.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Programowanie komputerowe. Zajęcia 1

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

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Ćwiczenia podstawowe, zestaw 5, część 1

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

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

Programowanie w Turbo Pascal

2 Przygotował: mgr inż. Maciej Lasota

Podstawy Programowania Podstawowa składnia języka C++

lekcja 8a Gry komputerowe MasterMind

Programowanie w języku C++ Grażyna Koba

Podstawy programowania w języku C++

Wstęp do programowania. Wykład 1

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

1 Powtórzenie wiadomości

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wstęp do Programowania, laboratorium 02

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby

Zmienne, stałe i operatory

4. Funkcje. Przykłady

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Język ludzki kod maszynowy

Języki i metodyka programowania. Wprowadzenie do języka C

Podstawy Programowania C++

Wprowadzenie do programowania w języku C

Zapisywanie algorytmów w języku programowania

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Programowanie i techniki algorytmiczne

1. Wprowadzanie danych z klawiatury funkcja scanf

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Języki programowania zasady ich tworzenia

Programowanie strukturalne i obiektowe

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Struktura pliku projektu Console Application

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Podstawy programowania

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

Wprowadzenie do programowania w języku C

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

do instrukcja while (wyrażenie);

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie strukturalne i obiektowe. Funkcje

Zadanie nr 3: Sprawdzanie testu z arytmetyki

Cw.12 JAVAScript w dokumentach HTML

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

KURS C/C++ WYKŁAD 1. Pierwszy program

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.

Część 4 życie programu

Laboratorium nr 1. i 2.

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni,

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

Pytania sprawdzające wiedzę z programowania C++

1 Przygotował: mgr inż. Maciej Lasota

Pętle. Dodał Administrator niedziela, 14 marzec :27

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Podstawy programowania - 1

Podstawy Programowania

Definicje. Algorytm to:

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Warsztaty dla nauczycieli

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

Podstawy programowania C. dr. Krystyna Łapin

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

1. Wypisywanie danych

Przedrostkowa i przyrostkowa inkrementacja i dekrementacja

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

Powtórka algorytmów. Wprowadzenie do języka Java.

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Algorytm. a programowanie -

Język C część 1. Sformułuj problem Zanalizuj go znajdź metodę rozwiązania (pomocny może byd algorytm) Napisz program Uruchom i przetestuj czy działa

Algorytmika i pseudoprogramowanie

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Laboratorium nr 4: Arytmetyka liczb zespolonych

1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

WHILE (wyrażenie) instrukcja;

Transkrypt:

Języki programowania język C Ćwiczenie 1 1 Łagodny start Ćwiczenie to poświęcone jest tworzeniu krótkich programów, pozwalających na zapoznanie się z takimi elementami programowania jak: struktura programu bez podprogramów, definiowanie stałych, deklarowanie zmiennych, wykonywanie operacji wejścia/wyjścia, budowanie wyrażeń arytmetycznych i korzystanie z instrukcji sterujących wykonaniem programu instrukcje warunkowe i iteracyjne. 1.1 Wprowadzenie do języka C w pigułce Rozdział ten prezentuje skrót najistotniejszych informacji, niezbędnych do realizacji programów przewidywanych w ramach tego ćwiczenia. 1.1.1 Rola funkcji main Każdy program, który ma zostać skompilowany do wersji wykonywalnej, musi posiadać funkcję o nazwie main, stanowiącą tzw. punkt wejściowy programu. Od niej się rozpoczyna wykonanie programu napisanego w języku C. Typowy scenariusz uruchomienia takiego programu wykonywalnego wygląda następująco: 1. Użytkownik przekazuje systemowi operacyjnemu zlecenie uruchomienia programu zawartego w określonym pliku wykonywalnym (wpisując jego nazwę w linii poleceń lub wskazując jego nazwę 1 myszką w środowisku graficznym). 2. System operacyjny ładuje kod programu do pamięci, przygotowuje jego środowisko, przekazuje sterowanie do bloku kodu startowego programu (tzw. startup). W ten sposób w systemie powstaje proces realizujący określony program 2. 3. Kod startowy, wykonuje szereg czynności inicjalizujących. Po ich zakończeniu wywołuje funkcje main. 1 Oczywiście uruchomienie programu może nastąpić również poprzez wskazanie myszą skrótu do odpowiedniego pliku wykonywalnego albo jakkolwiek bądź inaczej. Ważne jest to, aby system operacyjny wiedział, jaki plik wykonywalny ma być uruchomiony. 2 A tym samym procesowi przydzielana jest pamięć, określone zasoby i wszystko to, co niezbędne do wykonania danego programu.

2 Kilka prostych programów 4. Funkcja main działa, po jej zakończeniu bieżący proces jest kończony i opcjonalnie do systemu zwracany jest liczba całkowita kod wyjścia, stanowiący informację dla systemu operacyjnego określającą status zakończenia programu 3. Upraszczając całą sprawę można stwierdzić, że funkcja main jest wywoływana przez system operacyjny w celu realizacji zadania określonego zawartością programu, po wykonaniu tego zadania main kończy swoje działanie, przekazując systemowi informację zwrotną w postaci kodu zakończenia programu 4. Czym jest wspomniany wcześniej kod startowy i dlaczego został w tych rozważaniach pominięty? O istnieniu kodu startowego można nie wiedzieć, i rzeczywiście, wielu programistów znających język C o nim nie słyszało. Na tym etapie nauki języka można o nim nie pamiętać. Co się stanie, gdy program nie zawiera funkcji main? W większości przypadków kompilacja zakończy się sukcesem, jednak konsolidator (ang. linker) nie utworzy kodu wykonywalnego. 1.1.2 Najkrótszy program w języku C Czas przedstawić kod programu, który robi nic jest to Kod 1. Program ten zawiera definicję funkcji main, czyli niezbędnego elementu programu, od którego zaczyna się jego wykonanie. Znaczenie elementów owej definicji opisuje Rysunek 1. int main() { return 0; } Kod 1 Kod programu, który robi nic Typ rezultatu Ciało funkcji Nazwa funkcji int main() { return 0; } Parametry Instrukcja powrotu z podprogramu Wartość przekazywna w miejscu wywołania Rysunek 1 Znaczenie elementów deklaracji funkcji main 3 W szczególnym przypadku program może być uruchomiony przez inny proces, nie będący częścią systemu operacyjnego. Wtedy kod zakończenia przekazywany jest temu właśnie procesowi. 4 W rzeczywistości przebieg uruchomienia i zakończenia programu może być bardziej skomplikowany. Język C dopuszcza uruchamianie pewnych funkcji na starcie a więc przed uruchomieniem funkcji main, oraz po jej zakończeniu.

Języki programowania język C Definicja każdej funkcji w języku C a zatem i funkcji main rozpoczyna się od nagłówka zawierającego kolejno: typ rezultatu funkcji, jej nazwę, informacje o parametrach. Typ rezultatu określa, jakiego rodzaju będzie wartość, zwracana 5 przez funkcję w miejscu wywołania. W tym przypadku występuje tutaj nazwa int, oznaczająca predefiniowany typ całkowity. Zatem rezultatem funkcji main jest liczba całkowita. Nazwa funkcji main zapisana winna być tak właśnie, czyli wyłącznie z wykorzystaniem małych liter. Występujące po nazwie funkcji puste nawiasy oznaczają, że funkcja main nie wykorzystuje parametrów 6. Początek bloku opisującego akcje wykonywane przez funkcję main następuje po nawiasie klamrowym otwierającym. Tą część funkcji aż do nawiasu klamrowego zamykającego nazywa się potocznie ciałem funkcji, co pochodzi od angielskiego sformułowania function body. Ciało funkcji zawiera tylko jedną instrukcję jest to instrukcja return kończąca wykonanie funkcji oraz powodująca, iż rezultatem funkcji stanie się wartość zapisana za tą właśnie instrukcją. Jedyne, co ta funkcja robi, to zakończenie jej wywołania? przecież piszemy właśnie funkcję, która robi nic! Zwróćmy również uwagę, że linia zawierająca return zakończona jest średnikiem. W języku C symbol średnika (;) kończy instrukcję i w tym miejscu jest właśnie niezbędny. Wartość stanowiąca rezultat funkcji powinna być zgodna z typem rezultatu określonym w nagłówku funkcji. Rzeczywiście, wartość zero, stanowiąca rezultat, jest liczbą całkowitą. Co oznacza wartość zero? Wg. obowiązującej konwencji, zakończenie funkcji main z rezultatem o wartości zero, oznacza bezbłędne zakończenie programu. Przekazywanie kodu zakończenia procesu jest standardem. Procesy bardzo często komunikują się właśnie przy wykorzystaniu kodu zakończenia. W wersji minimalnej, niesie on informacje o statusie zakończenia procesu. Wartość 0 przyjmowana jest jako informacja o pomyślnym zakończeniu procesu, wartość 1 oznacza zakończenie z błędem. Tak jest w systemach zgodnych z POSIX 7. Zamiast bezwzględnych wartości 0 i 1 można wykorzystać symbole EXIT_SUCCESS oraz EXIT_FAILURE, oznaczające odpowiednio zakończenie bezbłędne oraz 5 Właściwe stwierdzenie, że funkcja zwraca coś jest nieprawidłowe. Jak stwierdził jeden z wykładowców:, zwraca to czasem pijany za bardzo student, a funkcja udostępnia rezultat. 6 W istocie funkcja main otrzymuje parametry. Pozostawienie pustych nawiasów jest dyplomatycznym chwytem pozwalającym na razie nie rozwodzić się nad tym tematem. 7 Powstanie standardu POSIX (ang. Portable Operating System Interface for Unix) wiąże się z próbą standaryzacji różnych odmian systemu Unix. POSIX standaryzuje m.in. interfejs programistyczny, interfejs użytkownika, polecenia systemowe, właściwości powłoki systemu.

4 Kilka prostych programów zakończenie z informacją o błędzie. Wykorzystanie tych symboli przedstawione przez Kod 2 pozwala polepszyć przenośność kodu źródłowego na inne platformy systemowe. Jednak, aby z nich skorzystać, należy uzupełnić program i linie rozpoczynającą się od frazy #include. #include <stdlib.h> int main() { return EXIT_SUCCESS; } Kod 2 Wykorzystanie symbolu EXIT_SUCCESS 1.1.3 Włączanie plików nagłówkowych Twórcy języka C na etapie jego projektowania poczynili pewne założenie odnośnie funkcji. Otóż w języku C nie występują żadne funkcje standardowe 8. Oznacza to, że kompilator nie zna nazwy żadnej funkcji. Kompilator owszem, wie, co to są funkcje, zna składnię ich definicji oraz wywołania, ale nie zna żadnej konkretnej funkcji. Załóżmy, że wiemy, iż do wyprowadzania napisów do strumienia wyjściowego programu służy funkcja puts. Wyprowadzenie przykładowego napisu może wyglądać następująco: #include <stdlib.h> int main() { puts( "To ja Twoj pierwszy program w C" ); return EXIT_SUCCESS; } Kod 3 Wykorzystanie symbolu EXIT_SUCCESS Ale skoro kompilator nie zna żadnej funkcji, to nie zna też funkcji puts. Stąd bierze się ostrzeżenie związane z wykorzystaniem funkcji puts. Kompilator informuje nas w ten sposób, że nie zna tej funkcji, i nie jest w stanie zapewnić, iż nie została błędnie wywołana. W jaki sposób przedstawić kompilatorowi funkcję puts? Do tego celu służą prototypy funkcji. Wizytówki funkcji czyli ich prototypy umieszczane są w plikach nagłówkowych (ang. header files). Pliki nagłówkowe są zwykłymi plikami tekstowymi, można je odnaleźć i podejrzeć ich zawartość 9. Aby przedstawić kompilatorowi daną funkcję należy jej wizytówkę umieścić w programie, przed 8 W przeciwieństwie do np. języka Pascal. W jego przypadku takie funkcje i procedury jak Sin, Cos, Write, WriteLn, Read, ReadLn są standardowymi elementami języka. 9 Pliki nagłówkowe znajdują się zwyczajowo w podkatalogu include danej instalacji kompilatora języka C. I tak, jeżeli przykładowo kompilator zainstalowany jest w katalogu c:\c_compiler to pliki nagłówkowe powinniśmy odnaleźć w katalogu c:\c_compiler\include.

Języki programowania język C pierwszym wywołaniem tej funkcji. A to można osiągnąć, włączając do programu zawartość odpowiedniego pliku nagłówkowego. Kod 4 prezentuje poprawiony program zawierający włączenie zawartości pliku nagłówkowego zawierającego wizytówkę (prototyp) funkcji puts. Plik ten nazywa się stdio.h a jego zawartość włączana jest dyrektywą #include. Tą samą dyrektywą włączamy plik nagłówkowy stdlib.h, Zawierający definicje stałych EXIT_SUCCESS i EXIT_FAILURE. #include <stdio.h> #include <stdlib.h> int main() { puts( "To ja Twoj pierwszy program w C" ); return EXIT_SUCCESS; } Kod 4 Włączenie pliku nagłówkowego stdio.h Plik nagłówkowy stdio.h zawiera prototypy funkcji obsługujących standardowe strumienie programu, a więc strumieni stdin, stdout i stderr. Stąd nazwa stdio, od standardowego, strumieniowego wejścia i wyjścia programu. Rozszerzenie nazwy h pochodzi od słowa header file, czyli plik nagłówkowy. 1.1.4 Deklaracje zmiennych W języku C, każdą zmienną należy zadeklarować przed jej użyciem. Deklaracja polega na określeniu typu zmiennej oraz jej nazwy. Nazwy zmiennych wymyśla programista. Mogą one być dowolne, pod warunkiem, że są poprawnymi identyfikatorami oraz są różne od zastrzeżonych słów kluczowych. Identyfikator to ciąg liter, cyfr i znaków podkreślenia, rozpoczynający się od litery, przy czym znak podkreślenia traktowany jest jako litera. Uwaga dozwolone są tylko litery alfabetu anglojęzycznego, obejmujące kody ASCII poniżej 128. Kod 5 prezentuje deklaracje dwóch zmiennych całkowitoliczbowej i (typ int) oraz zmiennoprzecinkowej f (typ float). #include <stdio.h> #include <stdlib.h> int main() { int i; float f; } puts( "To ja Twoj pierwszy program w C" ); return EXIT_SUCCESS; Kod 5 Program ze zmiennymi

6 Kilka prostych programów Pojawia się jednak istotne pytanie gdzie można deklarować zmienne? W rozważanym przez nas przypadku zmienne zostały zadeklarowane na początku bloku ujętego w nawiasy klamrowe {}. Rzeczywiście, dla zmiennych deklarowanych wewnątrz bloku (w tym przypadku wewnątrz ciała funkcji main) obowiązuje prosta zasada zmienne te mogą być deklarowane na początku każdego bloku, przed pierwszą instrukcją programu 10. W naszym przypadku tą pierwszą instrukcją programu jest wywołanie funkcji puts. 1.1.5 Wczytywanie danych ze strumienia wejściowego Załóżmy, że naszym celem jest wczytanie liczby całkowitej do zmiennej i oraz rzeczywistej do zmiennej f (zobacz Kod 5). Proces ten zostanie podzielony na wczytanie napisu zawierającego znaki składające się na wczytywaną liczbę a następnie dokonaniu konwersji do odpowiedniej postaci binarnej. Do zapamiętania napisu wprowadzonego przez użytkownika potrzebujemy ciągu znaków tablicy znakowej. Deklaracja tablicy pozwalającej na zapamiętanie ciągu znaków, wyglądać może następująco: char bufor[ 80 ]; Zmienna bufor pozwala na zapamiętanie maksymalnie 80-cio znakowego ciągu. Zatem liczba wpisana pomiędzy nawiasami kwadratowymi [] określa maksymalną długość ciągu znaków, jaki można w danej zmiennej zmieścić. Nazwa bufor odzwierciedla funkcję tej zmiennej jest ona w istocie zmienną buforową, przechowującą chwilowo ciąg znaków, zanim zostanie on poddany procesowi zamiany na liczbę. W jaki sposób wczytać dane ze strumienia wejściowego programu do zmiennej bufor? Do tej pory operacje związane ze strumieniami realizowały funkcje, z biblioteki obsługi wejścia/wyjścia, identyfikowane przez plik nagłówkowy stdio.h. Rzeczywiście, również w tej bibliotece znajdziemy funkcje wczytujące dane. Pierwszą taką funkcją jest funkcja gets. Sposób jej wykorzystania jest prosty: printf( "Wpisz cos: " ); gets( bufor ); Wywołanie to spowoduje wyprowadzenie napisu-zachęty a następnie uruchomienie funkcji gets, która oczekiwać będzie na wprowadzenie ciągu znaków ze standardowego strumienia wejściowego, zakończonego znakiem nowej linii (naciśnięciem klawisza Enter). Dlaczego do wypisania komunikatu-zachęty wykorzystano funkcję printf a nie wcześniej poznaną funkcję puts? Funkcja puts po wypisaniu napisu przenosi kursor do początku następnej linii, funkcja printf 10 Inaczej jest w języku C++ oraz w standardzie C99.

Języki programowania język C tego nie robi. Kursor oczekujący na wpisanie napisu. umiejscowiony zatem będzie tuż na napisem-zachętą. Po zakończeniu działania funkcji gets w zmiennej bufor znajduje ciąg znaków wprowadzony przez użytkownika. Załóżmy, że użytkownik wpisał słowo programowanie. Jak ten ciąg znaków liczący 13-ście znaków został zapisany w zmiennej bufor? Intuicja podpowiada, że wprowadzone słowo powinno zająć pierwsze 13-cie znaków tej zmiennej. Jest tak rzeczywiście. Co się jednak dzieje z resztą znaków? A jest ich jeszcze w zmiennej bufor 63. Otóż prawie wszystkie te znaki, póki co, marnują się, nie będąc wykorzystanymi. Zatem nasza zmienna została zadeklarowana ze sporym zapasem, wykorzystujemy w tym momencie jedynie jej pierwsze 13-cie znaków. Na 14-stym znaku zapisywany jest znacznik końca napisu, oznaczany w języku C sekwencją '\0'. Co się stanie z nadmiarowymi, niemieszczącymi się w zmiennej bufor znakami? Zostaną one zapisane w komórkach pamięci operacyjnej umieszczonych za zbyt krótką zamienną, co oczywiście powoduje zniszczenie zapisanej tam zawartości. Spowodować to może nieprzewidziane skutki w zależności od tego, co w nadpisanych komórkach się mieściło. Lepszym rozwiązaniem jest ograniczenie długości wprowadzanego ciągu znaków. Niestety funkcja gets takiej możliwości nie posiada, natomiast posiada ją funkcja fgets. Wykorzystanie tej funkcji pozornie jest nieco bardziej skomplikowane: char bufor[ 10 ]; printf( "Wpisz cos: " ); fgets( bufor, 10, stdin ); Tym razem bufor jest dziesięcioznakowy. Funkcję fgets wywołujemy z trzema parametrami. Znaczenie pierwszego parametru jest takie jak w przypadku funkcji gets, drugi parametr określa maksymalną długość ciągu znaków z uwzględnieniem znacznika końca napisu. Ostatni parametr identyfikuje z jakiego strumienia funkcja ma odczytywać dane, stdin oznacza predefiniowaną zmienną reprezentującą strumień wejściowy programu 11. 1.1.6 Konwersja - z napisu do postaci liczby Zastanówmy się, dlaczego dane wczytane z klawiatury nie trafiły bezpośrednio do odpowiednich zmiennych? Dane wczytane z klawiatury to ciąg znaków. Jeżeli założymy, że użytkownik wprowadził prawidłową liczbę, np. 521 to program wczytał do bufora ciąg zawierający kolejno znaki '5', '2', '1' oraz znacznik końca napisu '\0'. W jaki sposób wyznaczyć wartość liczby reprezentowaną przez taki napis? 11 Funkcja fgets pozostawia na końcu napisu znak odpowiadający naciśnięciu klawisza Enter, jest to znak \n. W naszym przypadku nie jest to istotne, natomiast w innych zastosowaniach występuje konieczność usunięcia tego znaku.

8 Kilka prostych programów Każdy z nas robił to już nie jeden raz w szkole podstawowej! Wartość tej liczby to suma iloczynów poszczególnych cyfr i kolejnych potęg liczby 10-ęć: Funkcja atof Wartość liczby = 5 10 2 + 2 10 1 + 1 10 0 W przypadku liczby rzeczywistej proces ten jest nieco bardziej skomplikowany, trzeba bowiem uwzględnić również część ułamkową liczby. Na szczęście nie trzeba robić tego własnoręcznie, operację tą wykonuje jedna z funkcji bibliotecznych o nazwie atof (od ang. ascii to float). Zatem konwersja napisu reprezentującego liczbę na wartość numeryczna może wyglądać następująco: f = atof( bufor ); Funkcja atof otrzymuje w postaci parametru ciąg znaków, który powinien zawierać tekstową formę liczby. Rezultatem funkcji jest numeryczna wartość rzeczywista liczbę tą reprezentująca. Taką samą czynność realizuje funkcja atoi dla danych załkowitoliczbowych. i = atoi( bufor ); 1.1.7 Wyprowadzanie zawartości zmiennych Najpopularniejszą funkcją służącą do wyprowadzania wartości zmiennych do strumienia wyjściowego programu jest funkcja printf. Jest to funkcja ze zmienną liczbą parametrów, przy czym otrzymać musi przynajmniej jeden parametr będący napisem. Wtedy funkcja ta wyprowadza po prostu ten napis do strumienia wyjściowego programu, przykładowo: printf( "Dzisiaj jest słoneczna pogoda" ); W napisie tym mogą jednak występować sekwencje formatujące, rozpoczynające się od znaku %. Funkcja printf analizuje zawartość napisu, i po napotkaniu sekwencji formatującej pobiera kolejny parametr wywołania i wyprowadza go do strumienia wyjściowego programu, zgodnie ze specyfikacją formatowania umieszczoną na znakiem %. Przykładowo, poniższe wywołanie: int wiek = 18; printf( "Wiek: %d", wiek ); spowoduje wyprowadzenie do stdout linii: Wiek: 18 Zatem w miejscu sekwencji formatującej %d pojawi się zawartość zmiennej wiek. Funkcja printf może wyprowadzać wiele wartości zmiennych różnych typów. Wywołanie: int wiek = 18; float waga = 67.5;

Języki programowania język C printf( "Wiek: %d, waga: %f", wiek, waga ); spowoduje wyprowadzenie do stdout linii: Wiek: 18, waga 67.500000 Dlaczego tyle zer po przecinku? To zależy od domyślnej precyzji wyprowadzania liczb rzeczywistych. Można na to wpływać, np. umieszczona niżej sekwencja wyprowadzi wagę na sześciu miejscach z obcięciem do dwóch po przecinku. printf( "Wiek: %d, waga: %6.2f", wiek, waga ); Wiek: 18, waga 67.50 Możliwości funkcji printf są spore. Ich opisanie wykracza poza ramy tego opracowania. 1.1.8 Instrukcja warunkowa i alternatywy Instrukcja warunkowa to jedna z instrukcji sterujących przebiegiem programu. Oznacza to, że instrukcja ta może zmieniać sekwencyjny tok przebiegu sterowania przez nasz program niektóre z instrukcji mogą zostać pominięte. O tym, czy pewien fragment programu ma być wykonany czy nie, decyduje warunek. Gdy jest on spełniony (inaczej mówiąc, gdy jest prawdziwy) warunkowany blok będzie wykonany, jeżeli warunek jest niespełniony (jest fałszywy) blok ten zostanie pominięty. if( dochod >= 0 ) printf( "Osiągnięto dochód!" ); Słowo kluczowe if oznacza instrukcję warunkową. Wewnątrz obowiązkowych nawiasów występuje warunek, decydujący o wykonaniu instrukcji zapisanej poniżej. Warunek dochoed >= 0 zawiera wyrażenie porównujące wartość zmiennej dochod z wartością zero. W ogólnym przypadku instrukcja warunkowa przyjmuje następującą postać: if( wyrażenie ) instrukcja graficzną interpretacje przebiegu wykonania programu zawierającego taka instrukcję warunkową przedstawia Rysunek 2.

10 Kilka prostych programów wyrażenie fałsz prawda instrukcja Rysunek 2 Graficzna interpretacja instrukcji warunkowej if Kolejną instrukcją jest instrukcja alternatywy, zwaną instrukcją if-else. Gdy warunek zapisany w nawiasach jest prawdziwy, wykonywana jest instrukcja zapisana pod frazą if, gdy warunek jest nieprawdziwy, wykonywana jest instrukcja zapisana pod fraza else. W ogólnym przypadku instrukcja alternatywy ma postać: if( wyrażenie ) instrukcja_1 else instrukcja_ Co ilustruje Rysunek 3. prawda wyrażenie fałsz instrukcja_1 instrukcja_1 Rysunek 3 Graficzna interpretacja instrukcji alternatywy if-else 1.1.9 Instrukcja iteracyjna do-while Instrukcja iteracyjna do-while pozwala na wielokrotne wykonywanie pojedynczej instrukcji lub ciągu instrukcji. Ciało iteracji wykona się przynajmniej raz. Powtarzalnością iteracji steruje wyrażenie, gdy jego wartość jest różna od zera ciało iteracji jest powtarzane, gdy wartość wyrażenia jest zerowa, iteracja jest kończona. do instrukcja while( wyrażenie ); lub gdy swoim zasięgiem obejmuje więcej niż jedną instrukcję: do {

Języki programowania język C ciąg instrukcji } while( wyrażenie ); Schemat blokowy instrukcji do-while prezentuje Rysunek 4. instrukcja prawda wyrażenie fałsz Rysunek 4 Schemat blokowy instrukcji do-while Przykładowe wykorzystanie instrukcji while i if do testowania poprawności wprowadzanych danych prezentuje przedstawiony niżej przykład. do { printf( "Podaj wiek osoby:" ); gets( linia ); wiek = atoi( linia ); if( wiek <= 0 ) printf( "Wiek musi być liczbą dodatnią i różną od zera!\n" ); } while( wiek <= 0 ); Omówienie instrukcji iteracyjnej while oraz instrukcji przełączającej switch w materiałach wykładowych. 1.2 Ćwiczenia do wykonania 1.2.1 Przeliczanie jednostek odległości Napisać program przeliczający odległość podaną w metrach na następujące miary: cal, stopę,

12 Kilka prostych programów jard, milę lądową. Można założyć, że użytkownik wprowadzi prawidłową liczbę rzeczywistą. Scenariusz działania programu 1. Program wyświetla informację o jego przeznaczeniu. 2. Program wczytuje liczbę rzeczywistą określającą odległość wyrażona w metrach. 3. Program wyświetla w osobnych liniach odległości wyrażone w zadanych jednostkach długości. 4. Program kończy swoje działanie po naciśnięciu przez użytkownika klawisza Enter. Przykładowa organizacja komunikacji z użytkownikiem Wymagania Rysunek 5 Przebieg dialogu z użytkownikiem Należy odnaleźć (internet, podręczniki itp.) współczynniki pozwalające na przeliczenie jednostek. Współczynniki te mają być reprezentowane w programie w postaci stałych. Wartości po przeliczeniu mają być zaokrąglane do czterech miejsc po przecinku. Należy wbudować w program reakcję na wpisanie przez użytkownika liczby ujemnej. Rozszerzenia Proszę rozbudować program o przeliczanie na inne jednostki sążnie, mile morskie, angstremy, kable, łokcie, wiorsty, itp., itd.. Proszę również spróbować rozszerzyć program w taki sposób, aby możliwe było powtarzanie operacji przeliczania długości. Powtórzenie wczytania, przeliczenia i wyświetlenia wyników odbywa się po potwierdzeniu przez użytkownika chęci ponowienia obliczeń, przykładowy dialog programu z użytkownikiem może mieć postać przedstawioną na Rysunek 5 i Rysunek 6.

Języki programowania język C Rysunek 6 Powtarzanie obliczeń na życzenie użytkownika 1.2.2 Tabela przelicznikowa odległości Napisać program wyświetlający tabelę przeliczeniową odległości wyrażonej w metrach na następujące miary: cal, stopę, jard, milę lądową. Tabela powinna mieć postać zbliżoną do następującej przedstawionej na Rysunek 7. Odległości wyrażone w metrach narastają z krokiem równym 5-ciu jednostkom, począwszy od wartości 5 a skończywszy na wartości 100. Rozszerzenia Proszę rozbudować program o możliwość wprowadzania przez użytkownika kroku zwiększania długości podanej w metrach. Należy się zastanowić nad wartościami ujemnymi, wartością zerową, i tym, że liczba wierszy może przekroczyć pojemność ekranu. W tym ostatnim przypadku należy przewidzieć zatrzymanie wyświetlania np. co 24 linie. W pełnej wersji użytkownik może wprowadzać również, oprócz kroku, wartość startowa i końcową odległości zadawanej w metrach.

14 Kilka prostych programów Rysunek 7 Tabela przelicznikowa przykładowa forma 1.2.3 Kalkulator dwuargumentowy Napisać program realizujący funkcje prostego kalkulatora, pozwalającego na wykonywanie operacji dodawania, odejmowania, mnożenia i dzielenia na dwóch liczbach rzeczywistych. Program ma identyfikować sytuację wprowadzenia błędnego symbolu działania oraz próbę dzielenia przez zero. Podobnie jak w poprzednich przykładach zakładamy, że użytkownik wprowadzi prawidłowe liczby. Scenariusz działania programu 1. Program wyświetla informację o swoim przeznaczeniu. 2. Wczytuje pierwszą liczbę. 3. Wczytuje symbol operacji arytmetycznej: +, -, *, /. 4. Wczytuje drugą liczbę. 5. Wyświetla wynik lub w razie konieczności informację o niemożności wykonania działania. 6. Program kończy swoje działanie po naciśnięciu przez użytkownika klawisza Enter. Przykładowa organizacja komunikacji z użytkownikiem Przykładowy sposób organizacji komunikacji z użytkownikiem przedstawiają Rysunek 8, Rysunek 9, Rysunek 10.

Języki programowania język C Rysunek 8 Typowy przebieg wykonania programu Rysunek 9 Reakcja na błędny symbol działania Rozszerzenia Rysunek 10 Reakcja na próbę dzielenia przez zero Proszę rozszerzyć program w taki sposób, aby możliwe było powtarzanie obliczeń. Powtórzenie wczytania, przeliczenia i wyświetlenia wyników odbywa się po potwierdzeniu przez użytkownika chęci ponowienia obliczeń, przykładowy dialog programu z użytkownikiem może mieć postać przedstawioną na Rysunek 11. Rysunek 11 Powtarzanie obliczeń na życzenie użytkownika 1.2.4 Gierka w za dużo, za mało Napisać program realizujący grę polegającą na odgadywaniu liczby wylosowanej przez komputer. Użytkownik próbuje odgadnąć tą liczbę, wprowadzając swoja propozycję. Jeżeli liczba wprowadzona przez użytkownika jest mniejsza od wylosowanej przez program, użytkownik informowany jest, że wprowadził wartość zbyt małą. Jeżeli liczba wprowadzona przez użytkownika jest większa od

16 Kilka prostych programów wylosowanej przez program, użytkownik informowany jest, że wprowadził wartość zbyt dużą. Wprowadzenie wartości równej wylosowanej kończy grę. Scenariusz działania programu 1. Program wyświetla informację o swoim przeznaczeniu. 2. Następuje wylosowanie liczby. 3. Wczytanie propozycji użytkownika. 4. Porównanie liczby wylosowanej i wczytane, wyprowadzenie odpowiednich komunikatów. 5. Jeżeli liczba została odgadnięta to koniec gry, w przeciwnym wypadku powrót do pkt. 3. Przykładowa organizacja komunikacji z użytkownikiem Rozszerzenia Rysunek 12 Przykładowy przebieg gry Proszę rozszerzyć program w taki sposób, aby możliwe było powtarzanie odgadywania liczby bez ponownego uruchamiania programu. Powtórzenie to odbywa się po potwierdzeniu przez użytkownika chęci kontynuowania gry. W ramach każdego cyklu odgadywania wylosowanej liczby powinna być zliczana liczba prób, koniecznych do odgadnięcia. Liczba prób powinna zostać wyświetlona po każdorazowym odgadnięciu wylosowanej liczby. Przykładowy przebieg takiej gry ilustruje Rysunek 12. Następnym krokiem może być rozszerzenie programu o określanie przez użytkownika górnego zakresu losowanych liczb, tak, by np. zakres ten mógł wynosić np. od 1 do 10 po wprowadzeniu przez użytkownika na starcie programu wartości 10 jako górnego ograniczenia zakresu losowanych liczb. Zobacz Rysunek 13.

Języki programowania język C Rysunek 13 Wersja z powtarzaniem odgadywania i zliczaniem liczby prób 1.2.5 Roczne przychody Napisać program Roczne przychody. Program wczytuje kolejno przychody osiągnięte przez podatnika w kolejnych miesiącach roku podatkowego. Wczytuje zatem kolejno 12-cie liczb rzeczywistych. Przychody są przetwarzane na bieżąco (bez magazynowania np. w tablicy). Po wczytaniu danych program wyznacza: 1. sumę przychodów z wszystkich miesięcy, 2. średni przychód miesięcznych, 3. maksymalny i minimalny przychód. Scenariusz działania programu 5. Program wyświetla informację o jego przeznaczeniu. 6. Program wczytuje kolejno przychody z olejnych 12-tu miesięcy. 7. Program wyświetla sumę dochodów, dochód średni, minimalny i maksymalny.

18 Kilka prostych programów 8. Program kończy swoje działanie po naciśnięciu przez użytkownika klawisza Enter. Przykładowa organizacja komunikacji z użytkownikiem Przykładowy przebieg wykonania programu prezentuje Rysunek 14. Wymagania Dane maja być przetwarzane na bieżąco, bez ich magazynowania w żadnej złożonej strukturze danych (np. tablicy). Rozszerzenia Proszę rozbudować program tak, by umożliwiał obliczenia dla dowolnej liczby miesięcy. Liczba ta ma być wczytana przez program tuż po rozpoczęciu jego działania. 1.2.6 Program sędziowski Rysunek 14 Przebieg dialogu z użytkownikiem Napisać program przyśpieszający pracę sędziów w pewnej dyscyplinie sportowej. Jest zwykle 10-ciu sędziów, każdy z nich podaje swoją ocenę punktową, przy czym liczba punktów pochodzi z przedziału od 0 do 10. Program ma wyliczyć średnią ocen sędziów po odrzuceniu ocen skrajnych, czyli oceny minimalnej i maksymalnej. Scenariusz działania programu 1 Program wyświetla informację o jego przeznaczeniu. 2 Program wczytuje kolejno oceny punktowe, kontrolując ich poprawność, 3 Po odrzuceni ocen skrajnych program ocenę średnią. 4 Program kończy swoje działanie po naciśnięciu przez użytkownika klawisza Enter. Wymagania

Języki programowania język C Program ma kontrolować wpisywane oceny liczba punktów podana przez każdego sędziego może być z dozwolonego przedziału. Ponieważ startuje wielu zawodników, program po ocenie każdego zawodnika ma pytać się, czy powtórzyć obliczenia dla nowego zawodnika czy tez zakończyć program. Dane maja być przetwarzane na bieżąco, bez ich magazynowania w żadnej złożonej strukturze danych (np. tablicy). Rozszerzenia Proszę rozbudować program tak, by umożliwiał obliczenia dla zmiennej liczby sędziów, przy czym sędziów ma być nie mniej niż 3-ch i nie więcej niż 10-ciu. Liczba sędziów powinna być wczytana przez program tuz po rozpoczęciu jego działania. Prawidłowość liczby sędziów ma być przez program kontrolowana. 1.2.7 Program dla sprintera Napisać program przyśpieszający ocenę wyników sprintera. Sprinter wielokrotnie pokonuje jednakowy dystans, notując kolejno osiągane czasy. Co jakiś czas zawodnik siada do komputera, wpisuje kolejne czasy i oczekuje, że program wyznaczy mu czas najlepszy, najgorszy oraz średni. Liczba wprowadzanych czasów jest bliżej nieznana. Może ich być np. kilka, kilkanaście, kilkadziesiąt. Scenariusz działania programu Program wyświetla informację o jego przeznaczeniu. Program wczytuje kolejno czasy, kontrolując ich poprawność, przy czym liczba wprowadzonych czasów nie jest z góry ograniczona ani wcześniej zadana. Program wyznacza czas najlepszy, najgorszy i średni. Program kończy swoje działanie po naciśnięciu przez użytkownika klawisza Enter. Wymagania Należy tak skonstruować program, aby pozwalał na obliczenia dla dowolnej liczby czasów, przy czym liczba wprowadzanych danych nie ma być z góry określana (tak jak w przypadku poprzednich ćwiczeń). Można założyć, że ciąg wprowadzanych przez użytkownika czasów kończy pewna wyróżniona liczba, np. 0 lub -1. Program ma kontrolować wpisywane czasy musza on być liczbami nieujemnym. 1.3 Co po tych ćwiczeniach należy umieć? Zakłada się, że po tym ćwiczeniu każdy student potrafi:

20 Kilka prostych programów 1. budować krótkie programy realizujące proste obliczenia oraz przetwarzające ciągi liczb, 2. deklarować zmienne i definiować stałe, 3. wykonywać podstawowe operacje we/wy, 4. podejmować decyzje z wykorzystaniem instrukcji warunkowych (if, ifelse, switch), 5. sterować cyklicznym powtarzaniem instrukcji z wykorzystaniem instrukcji iteracyjnych (while, do-while, for). 6. badać poprawność wprowadzanych danych, 7. wyznaczać minimum, maksimum, wartość sumaryczną i średnią dla ciągów liczbowych przetwarzanych na bieżąco.