Zmienną (czy ogólniej obiekt danych) można opisać w trzech kategoriach:
Język C dostarcza pięciu modeli (klas) zmiennych:
W katalogu domowym utworzyć podkatalog fahr. Utworzyć w nim plik fahr.c postaci:
/* * fahr.c * * Program wg K i R z petla "for". * Przeliczanie stopni Fahrenheita na stopnie Celsjusza. */ #include <stdio.h> int main(void) { const int LOWER = 0; /* dolna granica temperatury */ const int UPPER = 300; /* gorna granica temperatury */ const int STEP = 20; /* rozmiar kroku */ int fahr; float celsius; for (fahr = LOWER; fahr <= UPPER; fahr = fahr+STEP) { celsius = (5.0/9.0)*(fahr-32); printf("%3d %6.1f\n", fahr, celsius); } return 0; }
Przygotować plik Makefile, skompilować i uruchomić program.
Zastanowić się, jak można wyeliminować zmienną celsius z programu.
Poprawić program, aby wypisywał nagłowek.
Zamienić wyrażenie fahr = fahr + STEP na fahr += STEP.
Zastosować w programie pętlę while zamiast for.
Napisać program przeliczający cale na centymetry (kalorie na dżule, mile na kilometry itp.) i wypisujący wynik w postaci nagłówka i dwóch kolumn danych.
W katalogu domowym utworzyć podkatalog sizeof. Utworzyć w nim pliki Makefile i sizeof.c postaci:
/* * sizeof.c * * Program wykorzystujacy operator sizeof(). */ #include <stdio.h> int main(void) { printf("Rozmiary typow na tym komputerze w bajtach.\n"); printf("\ttyp char: \t%d\n", sizeof(char)); printf("\ttyp short: \t%d\n", sizeof(short)); printf("\ttyp int: \t%d\n", sizeof(int)); printf("\ttyp long: \t%d\n", sizeof(long)); printf("\ttyp float: \t%d\n", sizeof(float)); printf("\ttyp double: \t%d\n", sizeof(double)); printf("\ttyp long double: \t%d\n", sizeof(long double)); printf("\ttyp char *: \t%d\n", sizeof(char *)); printf("\ttyp int *: \t%d\n", sizeof(int *)); printf("\ttyp float *: \t%d\n", sizeof(float *)); printf("\ttyp double *: \t%d\n", sizeof(double *)); printf("\ttyp void *: \t%d\n", sizeof(void *)); return 0; }
Skompilować i uruchomić program.
W katalogu domowym utworzyć podkatalog decyzja. Utworzyć w nim pliki Makefile i decyzja.c postaci:
/* * decyzja.c * * Program wykorzystujacy operator ()?():(). * Wypisywanie tablicy liczb. */ #include <stdio.h> int main(void) { const int N = 64; int i; for (i = 0; i < N; ++i) printf("%c%d", ((i % 8 == 0) ? '\n' : '\t'), i); printf("\n"); return 0; }
Skompilować i uruchomić program. Przepisać program tak, aby nie korzystać z operatora ( ? : ).
W katalogu domowym utworzyć podkatalog filtr. Utworzyć w nim pliki Makefile i filtr.c postaci:
/* * filtr.c * * Przepisanie wejscia na wyjscie (K i R, str 37). */ #include <stdio.h> int main(void) { int c; /* "int" a nie "char", bo ma przyjac EOF */ c = fgetc(stdin); while (c != EOF) { fputc(c, stdout); c = fgetc(stdin); } return 0; }
Skompilować i uruchomić program.
Poprawić program wykorzystując bardziej zaawansowaną postać pętli while:
while ((c = fgetc(stdin)) != EOF) fputc(c, stdout);
W katalogu domowym utworzyć podkatalog znaki. Utworzyć w nim pliki Makefile i znaki.c postaci:
/* * znaki.c * * Zliczanie znakow ze stdin - petla "while" (K i R str. 39). * Jezeli stdin jest puste, to wyjdzie 0 i to jest dobre. * Syntax: ./znaki < plik1 > plik2 */ #include <stdio.h> int main(void) { long nc; /* number of characters - LONG INT */ nc = 0; while (fgetc(stdin) != EOF) ++nc; /* Wypisanie liczby znakow */ printf("Liczba znakow w pliku: %ld\n", nc); return 0; }
Skompilować i uruchomić program.
Przepisać program zamieniając typ zmiennej nc z long na float. W funkcji printf() zastosować format %.0f.
W katalogu domowym utworzyć podkatalog wiersze. Utworzyć w nim pliki Makefile i wiersze.c postaci:
/* * wiersze.c * * Zliczanie wierszy ze stdin - petla "while" (K i R str. 41). * Syntax: ./wiersze < plik1 > plik2 */ #include <stdio.h> int main(void) { int c; /* przechowuje znaki i EOF */ int nl; /* number of lines */ nl = 0; while ((c = fgetc(stdin)) != EOF) if (c == '\n') ++nl; /* Wypisanie liczby wierszy */ printf("Liczba wierszy w pliku: %d\n", nl); return 0; }
Skompilować i uruchomić program.
Poprawić program, aby poza znakami nowego wiersza zliczał znaki odstępu i tabulacji.
W katalogu domowym utworzyć podkatalog wyrazy. Utworzyć w nim pliki Makefile i wyrazy.c postaci:
/* * wyrazy.c * * Zliczanie wierszy, slow i znakow ze stdin - petla "while" (K i R str 41). * Syntax: ./wyrazy < plik1 > plik2 */ #include <stdio.h> int main(void) { const int TRUE = 1; const int FALSE = 0; int c; /* przechowuje znaki i EOF */ int nl, nw, nc; /* number of lines, words, characters */ int inword; /* czy wewnatrz slowa */ inword = FALSE; nl = nw = nc = 0; while ((c = fgetc(stdin)) != EOF) { ++nc; if (c == '\n') ++nl; if (c == ' ' || c == '\n' || c == '\t') inword = FALSE; else if (inword == FALSE) { inword = TRUE; ++nw; } } /* Wypisanie liczb */ printf("Liczba wierszy, slow, znakow: %d, %d, %d. \n", nl, nw, nc); return 0; }
Skompilować i uruchomić program. Podobne zadanie w systemie UNIX wykonuje polecenie wc.
Napisać program spacje.c, który - przepisując wejście na wyjście - będzie zastępować jednym znakiem odstępu (spacji) każdy ciąg złożony z jednego lub kilku takich znaków. Takie zadanie wykonuje polecenie systemu UNIX:
tr -s " " < plik1 > plik2
Można rozszerzyć działanie programu tak, aby mieszany ciąg spacji i tabulacji ('\t') został zamieniony na jedną spację. Podział na wiersze nie powinien zostać naruszony.
Napisać program osobno.c, który każde słowo wejściowe wypisze w osobnym wierszu. Takie zadanie wykonuje polecenie systemu UNIX:
tr -cs "a-zA-Z0-9" "[\n*]" < plik1 > plik2
Przez słowo rozumiemy ciąg "czarnych" znaków. W wykrywaniu "białych" znaków (odstępów) może pomóc funkcja isspace(), z której możemy korzystać po włączeniu pliku ctype.h.