Niniejsza instrukcja poświęcona jest trzem zagadnieniom:
Praktyczny program powinien mieć możliwość interaktywnej komunikacji z użytkownikiem. W celu drukowania informacji często wykorzystywane jest standardowe wyjście (ekran).
Utwórz nowy projekt pakietu MS Visual Studio i napisz program, który wydrukuje tekst Witaj na trzecim laboratorium!
void main() {
"Witaj na trzecim laboratorium!");
printf( }
Funkcja printf()
służy do wypisywania tekstu na ekran. Jako pierwszy argument przyjmuje sformatowany tekst. Do formatowania tekstu służą kody sterujące, które pozwalają wprowadzić znak nowej linii, tabulacji itp. Przykładowo, umieszczona wewnątrz tekstu sekwencja znaków:
"\n"
– wprowadza znak nowej linii,"\t"
– wprowadza znak tabulacji.Używając pojedynczej funkcji printf()
oraz odpowiednich kodów sterujących, wygeneruj tekst identyczny z poniższym:
To jest pierwsze zdanie w mojej instrukcji.
To jest tuz po znaku nowej linii. Zas ten fragment
oddzielony jest znakiem
tabulacji!
W ponizszej linii wszystkie liczby oddzielono tabulatorami:5.2 3.14 -7 8
Uwaga: jeśli instrukcja jest długa, a przez to mało czytelna, warto kontynuować ją w nowej linii. W tym celu należy posłużyć się ukośnikiem wstecznym ,,\’’. Przykładowo:
"Ta instrukcja kontynuowana jest \
printf(w kolejnej linii\n);
Spróbuj osiągnąć ten sam efekt, co powyżej, ale tym razem użyj osobnej instrukcji printf
dla każdego ze zdań.
W instrukcji printf()
nie używaj polskich znaków diakrytycznych. Można to zrobić, jednak ze względu na przenośność w prostych programach nie jest praktykowane.
Pewne znaki są w języku C zarezerwowane na potrzeby wykonania konkretnych operacji. Jeśli chcemy je wydrukować na ekran, nie mogą być użyte wprost. Przykładowo, jeśli chcemy za pomocą funkcji printf()
wydrukować znaki ,,%’’ i ,,\’’ należy je zapisać podwójnie, tzn. ,,%%’’ i ,,\\’’.
Dopisz do swojego programu instrukcję, która wydrukuje następujący tekst:
82% dysku C:\ jest w uzyciu!
Przepisz do funkcji main następujące instrukcje:
int a = 5;
double b = 8.2, c = 7.5;
"a = %d, b = %lf, c = %lf\n", a, b, c);
printf(
c += b;
c -= a;1;
a =
"a = %d, b = %lf, c = %lf\n", a, b, c); printf(
Zauważ, że do drukowania wartości przechowywanych w zmiennych służą tzw. specyfikatory formatu. Na zajęciach najczęściej będą używane:
- %lf -- dla zmiennych typu `double`
- %d -- dla zmiennych typu `int`
- %f -- dla zmiennych typu `float`
- %c -- dla zmiennych typu `char`
+=
i -=
?%lg
, %e
, %.2lf
, %.4lf
(dla zmiennych typu double
),%.3f
(dla zmiennych typu float
).Instrukcją służącą do czytania danych ze standardowego wejścia (klawiatury) jest funkcja scanf()
. Przykład jej użycia wygląda następująco:
int a;
"%d", &a);
scanf("Wczytana liczba: %d\n", a);
printf(
double c;
"%lf", &c);
scanf("Wczytana liczba: %lf\n", c);
printf(
int b, d;
double g, h;
"%lf %d %d %lf", &g, &d, &b, &h);
scanf("Wczytane liczby: %lf %d %d %lf\n", g, d, b, h); printf(
Uwaga:
scanf()
wczytuje dane z klawiatury, które musi gdzieś zapisać. Stosując znak ,,&’’ dostarczamy informacji o tym gdzie znajduje się zmienna, do której należy zapisać wczytaną wartość.scanf
możesz wczytać wiele liczb. Należy przy tym pamiętać o podaniu specyfikatorów formatu w takiej kolejności jak zmienne na liście argumentów. Powinno się unikać stosowania innych symboli niż spacje i specyfikatory formatu. Inaczej należy pamiętać o podaniu liczb razem z tymi dodatkowymi symbolami.Napisz prosty kalkulator, który wczyta z klawiatury dwie liczby typu rzeczywistego i wykona na nich dodawanie, odejmowanie, mnożenie i dzielenie. Pamiętaj, że odejmowanie i dzielenie nie jest przemienne – policz zatem każdą z możliwych różnic i ilorazów. Wydrukuj wszystkie wyniki na ekran.
Każdy element programu musi być zapisany gdzieś w pamięci komputera. Oznacza to, że musi mieć swój adres. Adres ten można zapisać w pewnej zmiennej i posłużyć się nim w programie. Zmienną zawierającą adres innej zmiennej nazywamy wskaźnikiem. Wskaźniki mogą zawierać adresy różnych elementów (zmiennych, tablic, funkcji, …). Z tego powodu będą pojawiały się na różnych etapach tego kursu. W tej instrukcji opiszemy jedynie podstawy.
Jak już wspomnieliśmy, każda zmienna ma swój adres. Można go uzyskać stosując operator & i zapisać w zmiennej typu wskaźnikowego. Mówiliśmy o tym podczas zajmowania się funkcją scanf()
. Zmienne różnych typów wymagają różnej wielkości pamięci. Dlatego deklaracja wskaźnika zawierającego adres zmiennej danego typu, ma postać typ *wskaznik;
.
Przykładowo:
double x; // Deklaracja zmiennej typu double
4.2; // Definicja - nadanie zmiennej wartosci
x =
double *wsk_x; // Deklaracja wskaznika mogacego przechowac
// adres zmiennej typu double
// Definicja - nadanie zmiennej wartosci
wsk_x = &x; // bedacej adresem zmiennej x
"%p", wsk_x); // wydrukowanie adresu przechowywanego przez
printf(// wskaznik na ekran
"%lf", *wsk_x); // wydrukowanie wartosci zmiennej, ktorej
printf(// adres przechowuje wskaznik
"%lf", x); // wydrukowanie wartosci zmiennej x printf(
Podsumowując:
&x
– pobiera adres zmiennej,*wsk_k
– pobiera wartość zmiennej, na którą wskazuje wskaźnik,"%p"
– informuje funkcję printf()
, że wyświetlana wartość to adres.a
, b
i c
tego samego typu.a
wczytaj liczbę.a
do pozostałych zmiennych.Do tej pory, funkcje deklarowaliśmy i definiowaliśmy w tym samym samym miejscu (przed funkcją main()
). W przypadku gdy kod programu jest długi lub ma być wykorzystany przez innego użytkownika rozdziela się deklarację od definicji. Instrukcja:
void NazwaFunkcji(int argument1, double argument2);
jest deklaracją (zauważ, że kończy się średnikiem).
Instrukcja:
void NazwaFunkcji(int argument1, double argument2) {
// Tu znajduje sie cialo funkcji.
}
jest definicją i może być umieszczona także za funkcją main()
.
Funkcje nie tylko grupują pewne logicznie wydzielone bloki instrukcji, których używamy wielokrotnie (jak funkcja rysująca ludzika z kółek i kresek. W takim przypadku wystarczyło zadeklarować, że funkcja nic nie zwraca wykorzystując słowo kluczowe void
.
Funkcje mogą jednak zwracać także wartość. Typ zmiennej, jaka jest zwracana znajduje się przed nazwą funkcji.
Weźmy dla przykładu funkcję, która przyjmuje dwie wartości (jedną typu double
, drugą typu float
) i zwraca liczbę całkowitą równą 5, gdy większą wartość ma pierwszy argument lub wartość 10 w przeciwnym razie. Przeanalizujmy odpowiednio deklarację i kod takiej funkcji:
int KtoryWiekszy(double a, float b);
int KtoryWiekszy(double a, float b) {
int Wynik;
if(a > b) {
5;
Wynik =
}else {
10;
Wynik =
}return Wynik;
}
Zwróć uwagę na instrukcję return
, która służy do zwracania wartości przechowywanej w konkretnej zmiennej.
Ponadto, zmienna zadeklarowana w danej funkcji będzie dla programu widoczna tylko i wyłącznie wewnątrz tej funkcji, a nie będzie rozpoznawana w innych fragmentach kodu (np. wewnątrz funkcji main
). Prześledźmy jeszcze kod funkcji main()
, w której występuje wywołanie naszej funkcji.
void main() {
float c = 8.14;
double d = -7.3814;
int InnaZmienna = 15;
KtoryWiekszy(d, c);
InnaZmienna = KtoryWiekszy(d, c);12.5, c);
InnaZmienna = KtoryWiekszy( }
KtoryWiekszy
wydrukują wartość aktualnie przechowywaną przez zmienną InnaZmienna
. Zastanów się, jaki będzie wynik i sprawdź czy masz rację.Sumuj
, Odejmij
, Pomnoz
i Podziel
.