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.