INFORMATYKA 1

Transkrypt

INFORMATYKA 1
MATERIAŁY POMOCNICZE NR 3
DO PRACOWNII Z PRZEMIOTU „INFORMATYKA 1”
Program wykorzystujący zmienne:
Głównym zadaniem programów przedstawianych na poprzednich zajęciach było
wyświetlanie tekstu. Napiszemy teraz prosty program wykorzystujący podczas działania
także zmienne przechowujące wartości.
Zadaniem programu będzie zamiana temperatury podanej w skali Fahrenheita na
temperaturę w skali Celsjusza. Jak ma działać program?
1. Użytkownik podaje temperaturę w skali Fahrenheita.
2. Program oblicza temperaturę w skali Celsjusza według wzoru:
5
Tc = (Tf − 32)
9
3. Program wyświetla obliczoną temperaturę w skali Celsjusza.
Zmienne
W programie będą występowały dwie wartości (temperatura w skali Fahrenheita
i temperatura w skali Celsjusza), a zatem musimy wprowadzić dwie zmienne. Kod
programu znajduje się poniżej.
3 - Wyświetlenie napisu: ”Podaj temperature... ” bez znaku \n na końcu.
4 - Wczytanie temperatury w skali Fahrenheita:
tempf
- nazwa zmiennej,
&tempf
- adres zmiennej (funkcja scanf() wymaga podania adresu zmiennej),
%f
- określa typ wczytywanej zmiennej (%f - typ float).
5 - Obliczenie wartości wyrażenia arytmetycznego.
6 - Wyświetlenie wyniku, łańcucha znaków ”Temperatura w skali... ” i wartości zmiennej
tempc. W miejscu, w którym ma być wyświetlona wartość zmiennej podajemy
specyfikator formatu - %f, podczas wyświetlania będzie on zastąpiony wartością
zmiennej, której nazwę podajemy po cudzysłowie kończącym łańcuch znaków i po
przecinku.
7 - Zatrzymanie programu w celu obejrzenia wyników działania.
8 - Zakończenie programu.
Przykład nr 3.1
Zmienne służą do reprezentacji (przechowywania) wartości danych. Zbiór wartości jakie
mogą przyjmować zmienne nazywa się typem (np. liczby całkowite, rzeczywiste).
Zmienne przechowywane są w pamięci komputera. Każda zmienna poza nazwą ma adres
(komputer nie posługuje się nazwami zmiennych tylko ich adresami).
Przed wykorzystaniem zmiennej w programie trzeba ją wcześniej zadeklarować czyli
podać jej nazwę i typ. Zmienne najczęściej deklaruje się na początku funkcji, w której
występują (są to tzw. zmienne lokalne).
Program zamieniający temperaturę podaną w skali Fahrenheita na temperaturę w skali Celsjusza.
#include <stdio.h>
#include <stdlib.h>
1
int main()
{
float tempf; /* temperatura w skali Fahrenheita */
float tempc; /* temperatura w skali Celsjusza */
Deklaracje zmiennych
2
printf("Podaj temperature w skali Fahrenheita: ");
scanf("%f",&tempf);
tempc=5*(tempf-32)/9;
printf("Temperatura w skali Celsjusza: %f\n",tempc);
3
4
5
6
system("pause");
return 0;
7
8
int a;
- int - nazwa typu, a - nazwa zmiennej
Gdy jest kilka zmiennych tego samego typu, to można je deklarować po przecinku:
int a;
float b, c;
Umieszczenie deklaracji każdej zmiennej w oddzielnej linii jest wygodne, gdy przy
każdej deklaracji dodajemy komentarz:
float d; /* zmienna d */
float e; /* zmienna e */
}
Co zawiera program?
1 - Dołączenie plików nagłówkowych:
stdio.h - zawierającego opis funkcji printf() i scanf(),
stdlib.h - zawierającego opis funkcji system().
2 - Deklaracja dwóch zmiennych: tempf i tempc będących liczbami rzeczywistymi (typ
float).
Informatyka 1 - Pracownia
Deklaracja zmiennej składa się z typu zmiennej i jej nazwy. Na końcu deklaracji stawia
się średnik:
Strona 1 z 16
© 2011 Jarosław Forenc
Zmienne mogą być deklarowane w programie wewnątrz funkcji (zmienne lokalne) lub
poza funkcją (zmienne globalne).
Zmienne lokalne widzialne są tylko w obrębie danej funkcji (a ściślej mówiąc wewnątrz
bloku funkcyjnego ograniczonego parą nawiasów klamrowych) od miejsca, w którym
zostały zadeklarowane.
Zmienne globalne są widzialne w całym programie od miejsca deklaracji.
Informatyka 1 - Pracownia
Strona 2 z 16
© 2011 Jarosław Forenc
W poniższym fragmencie programu zmienne a i b są zmiennymi globalnymi
widzialnymi w całym programie (od miejsca deklaracji), a zmienne c i d - zmiennymi
lokalnymi widzialnymi tylko wewnątrz funkcji main() (od miejsca deklaracji):
int a;
float b;
Wszystkie typy zmiennych
/* zmienna globalna */
/* zmienna globalna */
int main()
{
int c;
float d;
…
}
/* zmienna lokalna */
/* zmienna lokalna */
Komentarze
Komentarz w języku C rozpoczyna się sekwencją znaków /*, a kończy sekwencją
znaków */. Komentarz taki może obejmować więcej niż jedną linię programu, np.
/* To jest tekst komentarza w pierwszej linii
A to jest dalsza część komentarza */
Nazwa typu
Zakres wartości danych
Rozmiar
(bajty)
Uwagi
signed char = char
-128 ... 127
1
liczby całkowite
unsigned char
0 … 255
1
liczby całkowite
short = signed short int
-32768 … 32767
2
liczby całkowite
short unsigned =
unsigned short int
0 … 65535
2
liczby całkowite
signed int = int
-2147483648 … 2147483647
4
liczby całkowite
unsigned = unsigned int
0 … 4294967295
4
liczby całkowite
long = signed long int
-2147483648 … 2147483647
4
liczby całkowite
long unsigned =
unsigned long int
0 … 4294967295
4
liczby całkowite
float
-3,4⋅10-38 … 3,4⋅1038
4
7 cyfr znaczących
double
long double
Zastosowanie sekwencji znaków // umożliwia wstawienie komentarza obejmującego
tekst tylko do końca bieżącej linii, np.
-1,7⋅10
3,4⋅10
-308
-4932
308
… 1,7⋅10
4932
… 1,1⋅10
-
void
8
15 cyfr znaczących
12
19 cyfr znaczących
-
-
// Tekst komentarza do końca linii
Podstawowe typy zmiennych
Nazwa typu
Zakres wartości danych
Rozmiar
(bajty)
char
-128 ... 127
1
małe liczby całkowite, znaki ASCII
int
-2147483648 ... 2147483647
4
float
double
-3,4⋅10
-1,7⋅10
void
-38
-308
Powyższe zakresy i rozmiary podane są dla środowiska Dev-C++ (kompilator gcc).
Zależnie od kompilatora mogą wystąpić różnice w rozmiarze zmiennych typu int i long
double:
Uwagi
int [bajty]
long double [bajty]
Borland C++ 3.1
2
10
Kompilator
liczby całkowite
Dev-C++
4
12
4
8
4
10
38
4
liczby rzeczywiste, 7 cyfr znaczących
Microsoft Visual C++ 6.0
308
… 1,7⋅10
8
liczby rzeczywiste, 15 cyfr znaczących
Borland C++ Builder 6
-
-
oznacza brak wartości
… 3,4⋅10
Dodatkowo istnieją cztery słowa kluczowe modyfikujące powyższe typy.
Dla liczb całkowitych:
o signed, unsigned - określa czy zmienna ma być ze znakiem czy bez,
o short, long - dla typu int oznacza krótką lub długa liczbę całkowitą.
Dla liczb rzeczywistych:
o long - dla typu double pozwala zwiększyć precyzję (liczbę miejsc po przecinku).
Informatyka 1 - Pracownia
Strona 3 z 16
© 2011 Jarosław Forenc
Rozmiar poszczególnych typów można sprawdzić stosując operator sizeof:
sizeof(nazwa_typu)
Operator sizeof zwraca wartość całkowitą będącą liczbą bajtów zajmowanych przez
pojedynczą zmienną podanego typu. Zamiast nazwy typu można podać nazwę zmiennej
i wtedy operator ten zwróci liczbę bajtów zajmowanych przez zmienną.
Informatyka 1 - Pracownia
Strona 4 z 16
© 2011 Jarosław Forenc
Nazwy zmiennych
Liczby rzeczywiste
Nazwa zmiennej może składać się z liter i cyfr (A-Z, a-z, 0-9). Pierwszym znakiem
nazwy musi być litera. Znak podkreślenia traktowany jest jak litera. Nie zaleca się
rozpoczynania nazwy zmiennej od znaku podkreślenia, gdyż takie nazwy często
występują w programach bibliotecznych.
1.0
1.312e2
-2.124E-1
W nazwach zmiennych nie stosuje się znaków spacji. Przyjęło się, że nazwy zmiennych
pisze się małymi literami, a nazwy stałych - dużymi.
Nazwa zmiennej powinna być związana z jej zawartością. Długość nazwy nie jest
ograniczona, ale rozróżnialne jest 31 pierwszych znaków.
Jako nazw zmiennych nie można stosować słów kluczowych języka C (32 słowa):
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
- stała rzeczywista typu double
- stała rzeczywista typu double (1,312⋅102)
- stała rzeczywista typu double (-2,124⋅10-1)
l lub L dodane na końcu liczby zmienia typ na long double,
f lub F dodane na końcu liczby zmienia typ na float,
2.5L
4.52
4.52f
- stała rzeczywista typu long double
- stała rzeczywista typu double
- stała rzeczywista typu float
Operatory arytmetyczne jednoargumentowe
+ (plus)
- (minus)
- jako znak liczby (zazwyczaj jest pomijany)
- jako znak liczby
Operatory arytmetyczne dwuargumentowe
Stałe liczbowe
Stałe liczbowe są to liczby zapisane bezpośrednio w kodzie programu. Typ liczby
zależny jest od formy zapisu i wartości liczby.
Liczby całkowite
1
25000
39000
4100000000
- stała całkowita typu int
- stała całkowita typu int
- stała całkowita typu int (4 bajty) lub long
- stała typu unsigned long int (bo przekracza typ long)
Operator przypisania
Operator przypisania = (znak równości) stosowany jest do nadania wartości zmiennej.
Wyrażenie:
a = 10;
u lub U dodane na końcu liczby zmienia typ na unsigned (int lub long),
l lub L dodane na końcu liczby zmienia typ na long (int lub unsigned int),
5U
5L
10ul
- mnożenie
- dzielenie (dla liczb całkowitych obcina część ułamkową)
- dzielenie modulo (reszta z dzielenia, tylko dla typów całkowitych)
- dodawanie
- odejmowanie
*
/
%
+
-
- stała całkowita typu unsigned int
- stała całkowita typu long
- stała całkowita typu unsigned long
powinno być interpretowane jako: weź wartość numeryczną 10 i umieść ją w pamięci
w miejscu skojarzonym ze zmienną a. Operatora przypisania nie należy kojarzyć ze
znakiem równości.
Zapis:
a = a + 10;
liczby w systemie ósemkowym zaczynają się od 0 (zera),
liczby w systemie szesnastkowym zaczynają się od 0x lub 0X,
011
0x11
matematycznie nie jest poprawny. W programie w języku C należy interpretować go
jako: weź wartość znajdującą się w pamięci w miejscu skojarzonym ze zmienną a, dodaj
do tej wartości liczbę 10 i otrzymany wynik umieść z powrotem w pamięci w miejscu
skojarzonym ze zmienną a.
- 11 w systemie ósemkowym to 9 w systemie dziesiętnym
- 11 w systemie szesnastkowym to 17 w systemie dziesiętnym
W języku C prawidłowy jest także poniższy zapis:
a = b = c = d + 10;
Informatyka 1 - Pracownia
Strona 5 z 16
© 2011 Jarosław Forenc
Informatyka 1 - Pracownia
Strona 6 z 16
© 2011 Jarosław Forenc
oznacza on: weź wartość zmiennej d dodaj do niej 10, otrzymaną wartość przypisz
zmiennej c, następnie zmiennej b przypisz wartość zmiennej c, a zmiennej a przypisz
wartość zmiennej b.
tempc = 5 * (tempf - 32) / 9;
tempc
tempf
5
32
9
Inicjalizacja zmiennych
Inicjalizacja jest to nadanie wartości początkowej zmiennej. Inicjalizacja może odbywać
się przy deklaracji zmiennej lub później w kodzie programu, np.
int main()
{
int a = 0;
int b;
float c = -5.5;
float d;
…
b = 15;
d = 1.6e-4;
…
}
/* deklaracja zmiennej wraz z inicjalizacją */
/* deklaracja zmiennej bez inicjalizacji */
/* deklaracja zmiennej wraz z inicjalizacją */
/* deklaracja zmiennej bez inicjalizacji */
Czy wszystko będzie w porządku skoro mamy zmienne typu float i stałe liczbowe typu
int? TAK, gdyż podczas obliczania wartości tego wyrażenia następuje automatyczna
konwersja typów.
Jeśli podczas obliczania wartości wyrażenia:
występuje niezgodność typów, to następuje automatyczna ich konwersja. Jest ona
niezauważalna dla programisty, ale trzeba mieć świadomość, że występuje.
+ (jednoargumentowe)
A = tempf - 32
B = 5*A
C = B/9
tempc = C
- jako pierwsze zostanie wykonane mnożenie a * b.
* / %
Każde wyrażenie arytmetyczne ma wartość i typ.
typ wyniku:
typ wyniku:
typ wyniku:
typ wyniku:
W powyższym przykładzie nie można określić kolejności obliczenia wyrażeń A1 i A2 jest ona zależna od zastosowanego kompilatora. Dzielenie: 5 / 9 jest wykonywane na
liczbach całkowitych, zatem i wynik jest całkowity (w tym przypadku będzie to 0).
Zatem taki zapis wyrażenia arytmetycznego jest niepoprawny, gdyż w wyniku zawsze
otrzymamy tempc = 0.
Wyrażenie to można zapisać w inny sposób:
tempc = (5.0 / 9) * (tempf - 32);
Informatyka 1 - Pracownia
Strona 7 z 16
© 2011 Jarosław Forenc
int (!!!!)
float
float
float
Wyrażenia arytmetyczne
float
float
float
float
Rozpatrzmy poniższy zapis:
A1 = (5 / 9)
A2 = (tempf - 32)
B = A1 / A2
tempc = B
Zastosowanie nawiasów zmienia priorytet operatorów. Jeśli nie jesteśmy pewni
kolejności wykonywania działań zawsze używajmy dodatkowych nawiasów zwykłych
( i ). Mogą to być wielokrotne nawiasy zwykłe. W wyrażeniach arytmetycznych nie
wolno natomiast jako nawiasy stosować symboli: [ ] { }.
Wyrażenia arytmetyczne w języku C mogą zawierać operatory arytmetyczne
jednoargumentowe, dwuargumentowe, nawiasy zwykłe oraz wywołania funkcji.
typ wyniku:
typ wyniku:
typ wyniku:
typ wyniku:
tempc = (5 / 9) * (tempf - 32);
+ (dwuargumentowe)
Kolejność wykonywania operacji w powyższym przykładzie będzie następująca:
tempc = 5 * (tempf - 32) / 9;
Priorytet operatorów określa kolejność wykonywania działań. Operatory arytmetyczne są
lewostronnie łączne. Oznacza to, że jeśli obok siebie występują dwa operatory o takim
samym priorytecie, to jako pierwsze działanie wykonywane jest to znajdujące się po
lewej stronie, np.
Najniższy
Konwersja typów przebiega w następujący sposób:
1. Typy char, short, signed char, unsigned char zamieniane są na int.
2. Jeśli po powyższej konwersji dalej występuje niezgodność typów, to typ niższy
zamienia się na typ wyższy zgodnie z hierarchią typów:
int < unsigned < long < unsigned long < float < double < long double
Najwyższy
Zmienne lokalne bez inicjalizacji mają wartość początkową nieokreśloną (przypadkową),
natomiast zmienne globalne - wartość zero.
z = a * b * c;
- zmienna typu float,
- zmienna typu float,
- liczba typu int,
- liczba typu int,
- liczba typu int,
x operator y
Priorytet operatorów arytmetycznych
Rozpatrzmy obliczanie wartości wyrażenia arytmetycznego z Przykładu nr 3.1.
Informatyka 1 - Pracownia
lub
Strona 8 z 16
tempc = (5 / 9.0) * (tempf - 32);
© 2011 Jarosław Forenc
W ten sposób liczba zapisana z kropką i zerem będzie traktowana jako stała liczbowa
typu double i wynik wyrażenia będzie prawidłowy.
Funkcja printf
Funkcja printf ma następującą składnię:
printf(”tekst opcjonalny + specyfikator”,argumenty);
Rzutowanie
Funkcja printf wyprowadza tekst. Gdy w tekście występuje specyfikator formatu
zaczynający się od znaku procentu (%), to następuje przekształcenie - w miejsce
specyfikatora wstawiana jest wartość argumentu.
Specyfikator formatu określa typ oraz sposób wyświetlania zmiennej na ekranie. Liczba
specyfikatorów formatu musi być zgodna z liczbą argumentów. Jeśli typ argumentu
zostanie błędnie określony to na ekranie wyświetlona zostanie nieprawidłowa wartość.
Przykład nr 3.2
W specyfikatorze formatu zawsze musi występować znak procentu (%) oraz typ.
Pozostałe elementy specyfikatora formatu są opcjonalne - mogą wystąpić, ale nie muszą.
Nawiasy kwadratowe w poniższym zapisie oznaczają elementy opcjonalne:
Program zamieniający podaną kwotę w złotych (PLN) na dolary (USD) i euro (EUR).
specyfikator = %[znacznik][szerokość][.precyzja][modyfikator]typ
Jeszcze inna możliwość prawidłowego zapisu wyrażenia polega na wykorzystaniu tzw.
rzutowania czyli zmiany typu wyrażenia:
(typ) wyrażenie
Przykład:
tempc = ((float) 5 / 9) * (tempf - 32);
- liczba 5 będzie traktowana jako typ float.
#include <stdio.h>
#include <stdlib.h>
#define USD 3.7273
#define EUR 4.7279
int main()
{
float pln, usd, eur;
printf("Podaj kwote w PLN: ");
scanf("%f",&pln);
usd = pln / USD;
eur = pln / EUR;
printf("%.2f PLN to %.2f USD\n",pln,usd);
printf("%.2f PLN to %.2f EUR\n",pln,eur);
}
W programie z Przykładu nr 3.2 została zastosowana dyrektywa preprocesora #define
określająca wyrażenie stałe. Dyrektywa taka umieszczana jest zazwyczaj bezpośrednio
po dyrektywach #include.
Wyrażenie stałe znajdujące się po dyrektywie #define składa się z dwóch części: nazwy
wyrażenia (USD) oraz jej wartości (3.7273).
Wyrażenia stałe są obliczane na etapie prekompilacji programu, a nie podczas jego
wykonania. Wszędzie, gdzie występuje w programie stała USD, podczas prekompilacji
zostanie wstawiona liczba 3.7273.
Wyrażenia stałe pisze się zazwyczaj dużymi literami.
Strona 9 z 16
[szerokość]
- określa minimalną liczbę wyprowadzanych znaków, jeśli znaków jest
mniej to pole jest z lewej strony uzupełniane spacjami, jeśli więcej podana szerokość jest ignorowana,
[.precyzja]
- liczba znaków po kropce dziesiętnej,
typ
- określa rodzaj i typ argumentu:
© 2011 Jarosław Forenc
-
liczba całkowita ze znakiem, dziesiętna,
liczba całkowita bez znaku, dziesiętna,
liczba całkowita bez znaku, szesnastkowa,
liczba całkowita bez znaku, ósemkowa,
liczba rzeczywista w postaci [-]ddd.ddd,
liczba rzeczywista w formacie „naukowym” (z użyciem e lub E),
liczba rzeczywista (format f lub e),
ciąg znaków,
pojedynczy znak.
[modyfikator] - służy do zmodyfikowania podstawowego typu podawanego przez
znak typu:
Dyrektywa preprocesora #define
Informatyka 1 - Pracownia
- ”+” - przed liczbą stawiany jest znak (plus lub minus), ”-” wyrównanie wyświetlanych znaków do lewej strony,
d, i
u
x, X
o
f
e, E
g
s
c
system("pause");
return 0;
[znacznik]
l
L
- stosowany tylko do liczb całkowitych do wyświetlania wartości typu
long (może stać przed d, i, o, u, x, X, o, np. %ld, %li),
- stosowany do wyświetlania wartości rzeczywistych typu long double.
Przykłady zastosowania funkcji printf
Załóżmy, że mamy w programie następujące deklaracje zmiennych (wraz z inicjalizacją):
int i=15, j=-30;
float x=15.1234567;
double y=1.456e-2;
char text[10]="Napis";
Informatyka 1 - Pracownia
Strona 10 z 16
© 2011 Jarosław Forenc
o
wyświetlenie dwóch zmiennych całkowitych (%d, %d) oraz zmiennych
rzeczywistych w formacie „zwykłym” (%f) i w formacie naukowym (%e):
printf("%d %d %f %e",i,j,x,y);
o
sposób zapisu liczb rzeczywistych przy inicjalizacji (format „zwykły” lub format
naukowy) nie ma wpływu na sposób ich przechowywania w pamięci komputera:
15.123457 1.512346e+001
printf("%f %e",y,y);
0.014560 1.456000e-002
liczba po znaku procentu określa szerokość, czyli ilość pozycji, na których jest
wyświetlana liczba. Brakujące pozycje są uzupełniane spacjami. Znacznik „+”
powoduje wyświetlenie znaku liczby, a znacznik „-” - wyrównanie wyświetlania
liczby do lewej (dodatkowe spacje są wyświetlane za liczbą, a nie przed nią):
printf("%5d %+5d %-5d",i,i,i);
o
15
+15 15
l
15.123
L
o
jeśli szerokość jest zbyt mała do wyświetlenia liczby, to zostanie przez kompilator
zignorowana:
printf("%1.5f",x);
o
15.12346
o
x = 15.123, y = 1.3f
liczba całkowita dziesiętna, typ int,
liczba całkowita dziesiętna, typ long,
liczba całkowita ósemkowa, typ int,
liczba całkowita ósemkowa, typ long,
liczba całkowita szesnastkowa, typ int,
liczba całkowita szesnastkowa, typ long,
liczba całkowita dziesiętna, ósemkowa lub szesnastkowa, typ int,
liczba całkowita dziesiętna, ósemkowa lub szesnastkowa, typ long,
liczba całkowita dziesiętna bez znaku, typ unsigned,
liczba całkowita dziesiętna bez znaku, typ unsigned long,
liczba rzeczywista, typ float,
liczba rzeczywista, typ float,
ciąg znaków,
pojedynczy znak, typ char.
- zmienia wszystkie typy całkowitoliczbowe na ich długie wersje;
zastosowany do znaków typu f, e, E, g, G spowoduje interpretację
zawartości pól wejściowych jako liczb typ double,
- zastosowany do znaków typu f, e, E, g, G spowoduje interpretację
zawartości pól wejściowych jako liczb typ long double,
- typy całkowitoliczbowe będą traktowane jako short.
Argumenty funkcji scanf() są adresami obszarów w pamięci, dlatego też muszą być
poprzedzone znakiem & (nie dotyczy ciągu znaków).
Przykłady zastosowania funkcji scanf
do wyświetlenia tekstu używamy specyfikatora formatu %s:
printf("Tekst: %s",text);
Załóżmy, że mamy w programie następujące deklaracje zmiennych:
int a,b,c;
float x,z;
double y;
char text[15];
Tekst: Napis
Funkcja scanf
h
specyfikator formatu bez znaku procentu na początku traktowany jest jak każdy
inny tekst:
printf("x = %1.3f, y = 1.3f",x,y);
-
[modyfikator] - służy do zmodyfikowania podstawowego typu podawanego
przez znak typu:
w specyfikatorze formatu liczba przed kropką oznacza szerokość, zaś liczba po
kropce oznacza precyzję, czyli liczbę znaków po kropce dziesiętnej. Szerokość
dotyczy całej liczby (część całkowita + kropka + część ułamkowa), a nie tylko
części całkowitej:
printf(”%10.3f”,x);
- określa rodzaj i typ argumentu:
d
D
o
O
x
X
i
I
u
U
f, e, E
g, G
s
c
15 –30 15.123457 1.456000e-002
printf("%f %e",x,x);
o
typ
o
Funkcja scanf ma następującą składnię:
scanf(”specyfikator”,argumenty);
Funkcja scanf wczytuje znaki ze standardowego wejścia (klawiatura), interpretuje je
zgodnie z zadanym specyfikatorem formatu i przypisuje wyniki argumentom
w odpowiedniej kolejności.
W specyfikatorze formatu zawsze musi występować znak procentu (%) oraz typ.
Pozostałe elementy specyfikatora formatu są opcjonalne:
w przypadku funkcji scanf() wczytywane argumenty mogą być oddzielone od
siebie dowolną liczbą tzw. białych znaków (spacja, tabulacja, enter). Wczytanie
trzech liczb typu int może zatem odbyć się w różny sposób:
scanf(”%d %d %d”,&a,&b,&c);
15 20 -30<enter>
lub
15
20
lub
15<enter>
20<enter>
-30<enter>
specyfikator = %[szerokość][modyfikator]typ
[szerokość]
Informatyka 1 - Pracownia
- określa ile znaków zostanie przeczytanych,
Strona 11 z 16
© 2011 Jarosław Forenc
Informatyka 1 - Pracownia
Strona 12 z 16
-30
<enter>
© 2011 Jarosław Forenc
o
wczytanie liczb typu int, float i double:
scanf(”%d %f %lf”,&a,&x,&y);
o
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
12.1 1.45e-2 –1.34e5<enter>
int main()
{
float r, pole;
wczytanie tekstu (zmienna text jest tablicą, nazwa tablicy jest adresem jej
zerowego elementu, nie jest potrzebny zatem znak & przed zmienną text):
scanf(”%s”,text);
o
Program obliczający pole koła o promieniu r.
wczytanie dwóch liczb typu float (format „zwykły” i naukowy) oraz liczby typu
double (format naukowy):
scanf(”%f %e %le”,&x,&z,&y);
o
Przykład nr 3.3
15 1.51 -12.467<enter>
napis<enter>
printf("Podaj promien kola: ");
scanf("%f",&r);
pole = M_PI * r * r;
printf("Pole kola: %f\n",pole);
funkcja scanf() kończy wczytywanie jednego argumentu po napotkaniu
pierwszego białego znaku. W przypadku poniższego tekstu zapamiętane zostanie
tylko jedno słowo „ala”:
scanf(”%s”,text);
system("pause");
return 0;
ala ma kota<enter>
}
Funkcje matematyczne z pliku nagłówkowego math.h
W pliku math.h znajdują się definicje stałych oraz funkcji matematycznych.
W przypadku środowiska Visual C++ wykorzystanie stałych zdefiniowanych w pliku
math.h wymaga dodatkowo definicji stałej: _USE_MATH_DEFINES, którą należy
umieścić przed dyrektywą dołączającą plik math.h:
#define _USE_MATH_DEFINES
#include <math.h>
Funkcje matematyczne:
Nagłówek: int abs(int x);
abs()
o
| x | - zwraca wartość bezwzględną argumentu x będącego liczbą całkowitą,
Nagłówek: double acos(double x);
acos()
o
o
o
Definicje stałych:
Nazwa stałej
Wartość
Znaczenie
M_E
2.7182818284590452354
e - liczba Eulera
M_LOG2E
1.4426950408889634074
log 2 e
asin()
M_LOG10E
0.43429448190325182765
log e
M_LN2
0.69314718055994530942
ln 2
M_LN10
2.30258509299404568402
ln 10
o
o
o
arccos x - zwraca arcus cosinus argumentu x,
argument może przyjmować wartości z przedziału (-1,1),
funkcja zwraca kąt w radianach z zakresu od 0 do π radianów,
Nagłówek: double asin(double x);
arcsin x - zwraca arcus sinus argumentu x,
argument może przyjmować wartości z przedziału (-1,1),
funkcja zwraca kąt w radianach z zakresu od -π/2 do π/2 radianów,
M_PI
3.14159265358979323846
π - liczba pi
M_PI_2
1.57079632679489661923
π/2
M_PI_4
0.78539816339744830962
π/4
M_1_PI
0.31830988618379067154
1/ π
M_2_PI
0.63661977236758134308
2/π
atan2()
M_2_SQRTPI
1.12837916709551257390
2/ π
o
arctg x/y - zwraca arcus tangens ilorazu argumentów x/y,
M_SQRT2
1.41421356237309504880
2
M_SQRT1_2
0.70710678118654752440
2/2
o
o
argumenty muszą być różne od zera,
funkcja zwraca kąt w radianach z zakresu od -π do π (radianów),
Informatyka 1 - Pracownia
Strona 13 z 16
Nagłówek: double atan(double x);
atan()
o
o
© 2011 Jarosław Forenc
arctg x - zwraca arcus tangens argumentu x,
funkcja zwraca kąt w radianach z zakresu od -π/2 do π/2 (radianów),
Nagłówek : double atan2(double x, double y) ;
Informatyka 1 - Pracownia
Strona 14 z 16
© 2011 Jarosław Forenc
Nagłówek: double ceil(double x);
ceil()
o
o
sqrt()
zaokrąglenie argumentu x w górę,
zwraca najmniejszą liczbę całkowitą większą lub równą argumentowi x,
o
tan()
Nagłówek: double cos(double x);
cos()
o
o
Nagłówek: double floor(double x);
zaokrąglenie argumentu x w dół,
zwraca największą liczbę całkowitą mniejszą lub równą argumentowi x,
Nagłówek: double log(double x);
ln x - zwraca logarytm naturalny argumentu x,
Nagłówek: double log10(double x);
log x - zwraca logarytm dziesiętny argumentu x,
Nagłówek: double pow(double x, double y);
pow()
o
sin()
o
o
sinh()
o
tgh x - zwraca tangens hiperboliczny argumentu x podanego w radianach,
| x | - zwraca wartość bezwzględną argumentu x będącego liczbą rzeczywistą,
log10()
o
Nagłówek: double tanh(double x);
Nagłówek: double fabs(double x);
log()
o
tg x - zwraca tangens argumentu x podanego w radianach,
ex - zwraca liczbę e (podstawa logarytmu naturalnego) do potęgi argumentu x,
floor()
o
o
Nagłówek: double tan(double x);
Nagłówek: double exp(double x);
fabs()
o
o
x - zwraca pierwiastek kwadratowy nieujemnego argumentu x,
cosh x - zwraca cosinus hiperboliczny argumentu x podanego w radianach,
exp()
o
tanh()
Nagłówek: double cosh(double x);
cosh()
o
o
cos x - zwraca cosinus argumentu x podanego w radianach,
funkcja zwraca wartość z przedziału od -1 do 1,
Nagłówek: double sqrt(double x);
y
x - zwraca x do potęgi y,
Nagłówek: double sin(double x);
sin x - zwraca sinus argumentu x podanego w radianach,
funkcja zwraca wartość z przedziału od -1 do 1,
Nagłówek: double sinh(double x);
sinh x - zwraca sinus hiperboliczny argumentu x podanego w radianach,
Informatyka 1 - Pracownia
Strona 15 z 16
© 2011 Jarosław Forenc
Informatyka 1 - Pracownia
Strona 16 z 16
© 2011 Jarosław Forenc