General
Środowisko pracy
Dowolne ciągi znaków zawarte między znakami
Nazwy zmiennych (a także funkcji i nowych typów) zwane też identyfikatorami. Dowolne ciągi liter (dużych i małych), cyfr i znaku
Przed wykonaniem jakichkolwiek operacji dokonywane są automatycznie następujące przekształcenia typów zmiennych i stałych:
Wartości logiczne przechowywane są w zmiennych typu
w ii eee rrrr sssss zzzzzz wwwwwwww eeeeeeeee jjjjjjjjjj śśśśśśśśśśś cccccccccccc iiiiiiiiiiiii oooooooooooooo wwwwwwwwwwwwwww yyyyyyyyyyyyyyyy
tekst..........
w.............. wi............. wie............ wier........... wiers.......... wiersz......... wiersz ........ wiersz w....... wiersz we...... wiersz wej..... wiersz wejśc.... wiersz wejści... wiersz wejścio.. wiersz wejściow. wiersz wejściowy
jest równoważna instrukcji
zawierachar wiersz[MAKSDLUGOSC];
powoduje, że przed kompilacją wszystkie wystąpienia indentyfikatora#define MAKSDLUGOSC 72
int translate(float x, float y, float z) { x = y = z; /* ... */ }
Nazwy argumentów można opuścić:int translate(float x, float y, float z);
int translate(float, float, float);
int f1(void); /* Zwraca liczbę całkowitą, nie ma argumentów */ float f3(float, int, char, double); /* Zwraca liczbę rzeczywistą */ void f4(void); /* Nie ma argumentów, nic nie zwraca */
[ przykładowy kod:YourPets1.c]
[ przykładowy kod:PassByValue.c]
[ przykładowy kod:Do pobrania adresu zmiennej służy tu operatorPassAddress.c]
[ przykładowy kod:Return.c]
[ przykładowy kod:CatsInHats.c]
zamieniającą wartości dwóch zmiennych całkowitych. Wskazówka: posłużyć się przekazywaniem przez zmienną.void zamien (int *x, int *y);
do liczenia funkcji silniaint silnia (int n);
silnia(0) = 1 silnia(n ) = n * silnia(n-1)
Przypuśćmy, że mamy trzy wieże lub, skromniej, trzy kołki, A, B i C. Na pierwszym kołku, A, znajdują się trzy krążki nanizane w porządku malejących wielkości, podczas gdy pozostałe kołki są puste. Chcemy przenieść krążki z kołka A na B, być może używając do tego kołka C. Według reguł gry krążki można przenosić po jednym na raz i w żadnej chwili krążek większy nie może być umieszczony na wierzchu mniejszego.Wskazówka: Przedstawiony tu algorytm radzi sobie z przeniesieniem N krążków z kołka A przec C na kołek B następująco. Najpierw sprawdza, czy N=1, w którym to przypadku po prostu przenosi na miejsce przeznaczenia ten jedyny krążek, z którym miał się uporać (lub, dokładniej, podaje opis jednego ruchu, który to zrobi) i natychmiast powraca. Jeśli N>1, algorytm najpierw przenosi górne N-1 krążków z kołka A na kołek "pomocniczy" C, używając rekurencyjnie tego samego podprogramu; potem bierze jedyny krążek pozostawiony na kołku A (musi to być krążek najwiekszy - dlaczego?) i przenosi go na ostateczne miejsce przeznaczenia, na kołek B; potem, znowu rekurencyjnie, przenosi N-1 krążków, które poprzednio "przechował" na kołku C, na ich ostateczne miejsce, na kołek B. Napisać rekurencyjną funkcję
realizującą ten algorytm i wydrukować wynik dla trzech krążków.void hanoi (int N, char A, char B, char C);
zawieraint a[10];
jest równoważna instrukcjifor(i = 0; i < 10; i++) { printf("a[%d] = %d\n", i, a[i]); }
Oznacza to, że instrukcja wykonywana jesti = 0; while(i < 10) { printf("a[%d] = %d\n", i, a[i]); i ++; }
[przykładowy wydruk]
[kod źródłowy]Dodać deklarację nowej zmiennej:
i zmienić powyższy program tak, aby po wczytaniu wartości zmiennejint x;
tablicascanf("%d", &x);
Co to są za liczby i jaki wynik da zmiana w powyższych relacjach liczbya [0] = x % 10; a [1] = (x / 10) % 10; a [2] = ((x / 10) / 10) % 10; a [3] = (((x / 10) / 10) / 10) % 10; ... a [9] = ...;
struct data { int dzien; int miesiac; int rok };
struct data d;
na przykład:nazwa-struktury.składowa
d.dzien = 4; d.miesiac = 7; d.rok = 1776;
mówi, żestruct date *pd;
odwołuje się do konkretnej składowej. Wskaźniki do struktur są tak często używane, że dla wygody wprowadzono następującą nową notację:(*pd).nazwa-składowej
pd->nazwa-składowej
[przykładowy wydruk]
[przykładowy wydruk]Pozwala to na opuszczanie słowa kluczowego
[przykładowy wydruk]Metoda ta jest często stosowana przy przekazywaniu struktur poprzez wskaźnik do funkcji.
[przykładowy wydruk]
i przepisać program szkielet2.c przy użyciu następującego wzorca:
void CzytajNapis (napis *wn)- czyta wpisany wiersz tekstu do struktury
napis
void DrukujNapis (napis n)- drukuje wiersz tekstu ze struktury
napis
int PustyNapis (napis n)- sprawdza, czy wczytany wiersz tekstu jest pusty
[ przykładowy wydruk ]
[ kod źródłowy ]
int Znaleziony (char z, napis n)
[ przykładowy wydruk ]
[ kod źródłowy ]badającą, czy znak
sprawdzającą, czy dwa napisyint IdentyczneNapisy (napis n1, napis n2)
int IdentyczneNapisy (napis n1, napis n2)
void CzytajNapis (napis *wn)
z zadań 1 i 2 napisać wersję programuvoid DrukujNapis (napis n)
Literze 'a' odpowiada tu zmiennatypedef struct{ char znak[MAKSDLUGOSC]; int dlugosc; int licznik[26]; } napis;
tak, aby oprócz wczytywania znaków napisu nadawała też wartości elementom tablicyvoid CzytajNapis (napis *wn)
int islower(char c)
int isupper(char c)sprawdzające, czy znak
char tolower (char c)przekształcającą duże litery na małe. Funkcje te zdefiniowane są w pliku
sprawdzającą czy napisint JestAnagramem (napis n1, napis n2)
i zmiennąnapis wyraz [100];
określającą liczbę elementów w tej tablicy. Przerobić program szkielet3.c z zadania 1 tak, aby wczytywał wpisywane wyrazy do tablicyint liczba;
for (i = 0; i < liczba - 1; i ++) for (j = i + 1; j < liczba; j ++)
łączącą dwa napisyint PolaczNapisy (napis *wn, napis n1, napis n2)
(z punktu widzenia programu działa to tak samo jak przepisanie zawartości pliku panstwa.txt z klawiatury).program.exe < panstwa.txt