Programowanie w C
Zaktualizowane zasoby
Odpowiedzi do wicze o numerach nieparzystych
Errata
Mam nadziej, e podoba Wam si moja ksika. Wszelkie komentarze s mile widziane! Nie wahajcie si pisa do mnie. Oczywicie, mile widziane bd take recenzje na Amazon.com!

Z pozdrowieniami,


Steve Kochan  
Zaktualizowane zasoby
Tutaj bd podawana zaktualizowane zasoby stanowice uzupenienie tego, co 
opisano w dodaku E w ksice. Prosz o sugestie, jakie jeszcze inne zasoby
powinny si tu znale! Z gry dzikuj.
Errata  
Ponisza errata dotyczy ksiki Programownie w C.
Osoby, ktre znajd jakie bdy, proszione s o list w tej sprawie. Z gry
dzikuj!
Strona	Poprawka
87, 91	Formatowanie drugiej instrukcji if w programach 6.10. i 6.10.a. jest
nieprawidowe. Instrukcja jest wcita zbyt daleko w prawo. Programy dziaaj
poprawnie; jest to kwestia tylko i wycznie estetyczna. [Podzikowania
dla Janet Wood].

Odpowiedzi do wicze o numerach nieparzystych
Powrt na gr
Rozdzia 3
Rozdzia 4
Rozdzia 5
Rozdzia 6
Rozdzia 7
Rozdzia 8
Rozdzia 9
Rozdzia 10
Rozdzia 11
Rozdzia 12
Rozdzia 13
Rozdzia 14
Rozdzia 16


Rozdzia 3

3-3
Sprawdzanie.......1...2..3

Wszystkie wyniki pojawi si w jednym wierszu, gdy znak nowego wiersza jest 
drukowany dopiero w ostatnim wywoaniu funkcji printf.

3-5
main (Void) // v powinno by ma liter
( // powinno by {
INT sum; // sowo int powinno by zapisane maymi literami
/* WYLICZ WYNIK // Needs closing */
sum = 25 + 37 = 19 // na kocu potrzebny jest rednik
/* DISPLAY RESULTS // // komentarz musi by zakoczony */
printf ("Odpowiedzi jest %i\n" sum); // brak przecinka
return 0;
}


Rozdzia 4

4-3
0996 cyfry 8 i 9 nie s prawidowymi staymi semkowymi
0x10.5 staa cakowita nie moe zawiera kropki dziesitnej
98.7U kwalifikatora "unsigned" mona uywa tylko w przypadku liczb cakowitych
1.2Fe-7 nie mona uy jednoczenie F i e
0X0G1 G nie jest cyfr szesnastkow
17777s s nie jest prawidowym kwalifikatorem
15,000 w staych nie mog wystpowa przecinki

4-5
d = d

4-7
#include <stdio.h>

int main (void)
{
double result;

result = (3.31e-8 * 2.01e-7) / (7.16e-6 + 2.01e-8);
printf ("result = %g\n", result);
return 0;
}



Rozdzia 5

5-3
#include <stdio.h>

int main (void)
{
int n, triangularNumber;

printf ("TABLICA LICZB TRJKTNYCH\n\n");
printf (" n Suma od 1 do n\n");
printf ("--- ---------------\n");

for ( n = 5; n <= 50; n += 5) {
triangularNumber = n * (n + 1) / 2;
printf ("%2i %i\n", n, triangularNumber);
}

return 0;
}

5-5
#include <stdio.h>

int main (void)
{
int n, two_to_the_n;

printf ("TABELA POTG DWJKI\n\n");
printf (" n 2 do potgi n\n");
printf ("--- ----------\n");

two_to_the_n = 1;

for ( n = 0; n <= 10; ++n ) {
printf ("%2i %i\n", n, two_to_the_n);
two_to_the_n *= 2;
}

return 0;
}

5-7
Kropka dziesitna w polu powoduje, e przed cyframi wywietlone zostan
wiodce zera.
Szczegowo omawiamy to w rozdziale 16. W tym wypadku, jeli liczba centw
bdzie mniejsza od 10, zostanie poprzedzona zerem (na przykad $29.05).

5-9
// Program 5.2

/* Program wyliczajcy 200- liczb trjktn
Wprowadzenie do instrukcji for */

#include <stdio.h>

int main (void)
{
int n, triangularNumber;

triangularNumber = 0;
n = 1;

while ( n <= 200 ) {
triangularNumber = triangularNumber + n;
n = n + 1;
}

printf ("Dwusetna liczba trjktna to %i\n", triangularNumber);

return 0;
}

// ---------------------------------------------------
// Program 5.3

// Program generujcy tabel liczb trjktnych

#include <stdio.h>

int main (void)
{
int n, triangularNumber;

printf ("TABELA LICZB TRJKTNYCH\n\n");
printf (" n Suma od 1 do n\n");
printf ("--- ---------------\n");

triangularNumber = 0;
n = 1;

while ( n <= 10 ) {
triangularNumber += n;
printf (" %i %i\n", n, triangularNumber); 
++n;
}

return 0;
}


// ---------------------------------------------------
// Program 5.4

#include <stdio.h>

int main (void)
{
int n, number, triangularNumber;

printf ("Jaka liczba trjktna ci interesuje? ");
scanf ("%i", &number);

triangularNumber = 0;
n = 1;

while ( n <= number ) {
triangularNumber += n;
++n;
}

printf ("Liczba trjktna numer %i to %i\n", number, triangularNumber);

return 0;
}


// ---------------------------------------------------
// Program 5.5

#include <stdio.h>

int main (void)
{
int n, number, triangularNumber, counter;

counter = 1;

while ( counter <= 5 ) {
printf ("Jaka liczba trjktna ci interesuje? "); 
scanf ("%i", &number);

triangularNumber = 0;
n = 1;

while ( n <= number ) {
triangularNumber += n;
++n;
}

printf ("Liczba trjktna numer %i to %i\n\n", number, triangularNumber);

++counter;
}

return 0;
}

5-11
// Program sumujcy cyfry liczby

#include <stdio.h>

int main (void)
{
int number, right_digit, sum = 0;

printf ("Podaj liczb: ");
scanf ("%i", &number);

while ( number != 0 ) {
right_digit = number % 10;
sum += right_digit;
number /= 10; 
}

printf ("Suma cyfr to %i\n", sum);

return 0;
}



Chapter 6

6-3
#include <stdio.h>

int main (void)
{
int n1, n2;

printf ("Podaj dwie liczby cakowite: ");
scanf ("%i%i", &n1, &n2);

if (n2 == 0)
printf ("Dzielenie przez zero.\n");
else
printf ("Wynik dzielenia %i / %i to %.3f\n", n1, n2, (float) n1 / n2);

return 0;
}

6-5
Jeli w programie 5.9. podana zostanie liczba ujemna, wszystkie cyfry bd
prezentowane jako liczby ujemny. 
Jeli na przykad podane zostanie -123, wynik bdzie wyglda nastpujco:
-3-2-1
Oto poprawiona wersja programu:

// Program odwracajcy cyfry w liczbie (wersja poprawiona)

#include <stdio.h>
#include <stdbool.h>

int main (void)
{
int number, right_digit;
bool isNegative = false;

printf ("Podaj liczb\n");
scanf ("%i", &number);

/* jeli podana liczba jest ujemna, zamieniamy j 
na dodatni, cho nie zapominamy o jej znaku */

if ( number < 0 ) {
number = -number;
isNegative = true;
}

do {
right_digit = number % 10;
printf ("%i", right_digit);
number = number / 10;
}
while ( number != 0 );

if (isNegative == true)
printf ("-");

printf ("\n");
return 0;
}

6-7
// Program generujcy tablic liczb pierwszych (wersja poprawiona)

#include <stdio.h>
#include <stdbool.h>

int main (void)
{

int p, d;
bool isPrime;

// na pocztek wiemy, e 2 jest liczb pierwsz

printf ("2 ");

// sprawdzanie liczb nieparzystych zaczynamy od 3

for ( p = 3; p <= 50; p +=2 )
{
isPrime = true;

// tylko dzielniki nieparzyste

for ( d = 3; d < p && isPrime == true; d += 2 )
if ( p % d == 0 )
isPrime = false;

if ( isPrime != false )
printf ("%i ", p);
}

printf ("\n");
return 0;
}



Rozdzia 7

7-3
// Zmodyfikowany program 7.2 -- z wykorzystaniem instrukcji break

#include <stdio.h>

int main (void)
{
int ratingCounters[11], i, response;

for ( i = 1; i <= 10; ++i )
ratingCounters[i] = 0;

printf ("Podawaj odpowiedzi\n");
printf ("Na koniec wpisz 999\n");

while (1) {
scanf ("%i", &response);

if (response == 999)
break;

if ( response < 1 || response > 10 )
printf ("Nieprawidowa odpowied: %i\n", response);
else
++ratingCounters[response];
}

printf ("\n\nOcena liczby odpowiedzi\n");
printf ("------ -------------------\n");

for ( i = 1; i <= 10; ++i )
printf ("%4i%14i\n", i, ratingCounters[i]);

return 0;
}

Niektrzy wol nie uywa instrukcji break, gdy narusza ona normalny,
sewkencyjny przebieg programu. Mona program ten zmodyfikowa tak, aby
nie uywa instrukcji break; naley wtedy zamieni w nim instrukcj ptli
while nastpujco:

do
{
scanf ("%i", &response);

if (response != 999)
if ( response < 1 || response > 10 )
printf ("Nieprawidowa odpowied: %i\n", response);
else
++rating_counters[response];
}
while ( response != 999 );

7-5
Kady element tablicy jest wyliczany jako suma elementw poprzednich.
W ten sposb otrzymujemy nastpujce wyniki:

1 1 2 4 8 16 32 64 128 256

7-7
// Liczby pierwsze wygenerowane Sitem Erastotenesa

int main (void)
{
int P[151], i, j;
int n = 150;

for (i = 2; i <= n; ++i)
P[i] = 0;

i = 2;

while (i <= n) {
if (P[i] == 0)
printf ("%i ", i);

j = 1;

while (i * j <= n) {
P[i * j] = 1;
++j;
}

++i;
}

return 0;
}


Rozdzia 8

8-3
Oto zmodyfikowana funkcja square_root, przykadowa funkcja main wywoujca
obliczanie pierwiastka kwadratowego z trzema rnymi wartociami epsilon oraz
wyniki tych wywoa.

// Funkcja wyliczajca pierwiastek kwadratowy

#include <stdio.h>

float squareRoot (float x, float epsilon)
{
float guess = 1.0;

while ( absoluteValue (guess * guess - x) >= epsilon )
guess = ( x / guess + guess ) / 2.0;

return guess;
}

int main (void)
{
printf ("%f\n", squareRoot (3.0, .1));
printf ("%f\n", squareRoot (3.0, .01));
printf ("%f\n", squareRoot (3.0, .001));
printf ("%f\n", squareRoot (3.0, .0001));

return 0;
}

1.750000
1.732143
1.732143
1.732051

8-5
float square_root (float x)
{
float guess = 1.0;
float epsilon = .00001;

while ( absoluteValue((guess * guess) / x - 1.0) >= epsilon )
guess = ( x / guess + guess ) / 2.0;

return guess;
}

8-7
long int x_to_the_n (int x, int n)
{
long int result = 1;

while (n > 0)
{
result *= x;
--n;
}

return result;
}

8-9
int lcm (int u, int v)
{
int gcd (int u, int v);

if ( u < 0 || v < 0 )
return 0;
else
return u * v / gcd (u, v);
}

8-11
long int array_sum (int values [], int n)
{
int i;
long int sum = 0;

for ( i = 0; i < n; ++i )
sum += values[i];

return sum;
}

8-13
// Sortowanie tablicy liczy cakowitych
// sortowanie malejce (order == -1) lub rosnce (order == 1)

#include <stdio.h>

void sort (int a[], int n, int order)
{
int i, j, temp;

for ( i = 0; i < n - 1; ++i )
for ( j = i + 1; j < n; ++j )
if ( (order == -1 && a[i] < a[j]) ||
(order == 1 && a[i] > a[j]) )
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}

int main (void)
{
int i;
int array[16] = { 34, -5, 6, 0, 12, 100, 56, 22,
44, -3, -9, 12, 17, 22, 6, 11 };
void sort (int a[], int n, int order);

printf ("Tablica przed sortowaniem:\n");

for ( i = 0; i < 16; ++i )
printf ("%i ", array[i]);

printf ("\n\nTablica posortowana rosnco:\n");

sort (array, 16, 1);

for ( i = 0; i < 16; ++i )
printf ("%i ", array[i]);

printf ("\n\nTablica posortowana malejco:\n");

sort (array, 16, -1);

for ( i = 0; i < 16; ++i )
printf ("%i ", array[i]);

printf ("\n");
return 0;
}

8-15
Zmodyfikownaa funkcja getNumberAndBase. Reszta programu pozostaje niezmieniona.

void getNumberAndBase (void)
{
printf ("Konwertowana liczba? ");
scanf ("%li", &numberToConvert);

do {
printf ("Podaj warto midzy 2 a 16: ");
scanf ("%i", &base);
}
while ( base < 2 || base > 16 );
}



Rozdzia 9

9-3
#include <stdio.h>

struct time
{
int hour;
int minutes;
int seconds;
};

// obliczanie, ile czasu upyno (zakadamy, e t2 jest pniej ni t1)

struct time elapsed_time (struct time t1, struct time t2)
{

struct time result = { 0, 0, 0 };

// najpierw odejmujemy sekundy

result.seconds = t2.seconds - t1.seconds;

// jeli seconds < 0, trzeba "poyczy" minut

if (result.seconds < 0) {
result.seconds += 60;
--t2.minutes;
}

// teraz odejmujemy minuty

result.minutes = t2.minutes - t1.minutes;

// jeli minutes < 0, trzeba "poyczy" godzin

if (result.minutes < 0) {
result.minutes += 60;
--t2.hour;

}

// odejmujemy godziny

result.hour = t2.hour - t1.hour;

// jeli hour < 0, "trzeba "poyczy" dzie (minlimy pnoc)

if (result.hour < 0)
result.hour += 24;

return result;
}

int main (void)
{
struct time elapsed_time (struct time t1, struct time t2);
struct time t1 = { 3, 45, 15 }, t2 = { 9, 44, 03 },
t3 = {22, 50, 59 }, t4 = { 7, 30, 0 };
struct time result;

result = elapsed_time (t1, t2);
printf ("Czas pomidzy %.2i:%.2i:%.2i a %.2i:%.2i:%.2i "
"to %.2i:%.2i:%.2i\n",
t1.hour, t1.minutes, t1.seconds, t2.hour, t2.minutes, 
t2.seconds, result.hour, result.minutes, result.seconds);

result = elapsed_time (t2, t1);
printf ("Czas pomidzy %.2i:%.2i:%.2i a %.2i:%.2i:%.2i "
"to %.2i:%.2i:%.2i\n",
t2.hour, t2.minutes, t2.seconds, t1.hour, t1.minutes, 
t1.seconds, result.hour, result.minutes, result.seconds);

result = elapsed_time (t3, t4);
printf ("Czas pomidzy %.2i:%.2i:%.2i a %.2i:%.2i:%.2i "
"to %.2i:%.2i:%.2i\n",
t3.hour, t3.minutes, t3.seconds, t4.hour, t4.minutes, 
t4.seconds, result.hour, result.minutes, result.seconds);

return 0;
}

Oto przykadowe wyniki dziaania programu:

Czas pomidzy 03:45:15 a 09:44:03 to 05:58:48
Czas pomidzy 09:44:03 a 03:45:15 to 18:01:12
Czas pomidzy 22:50:59 a 07:30:00 to 08:39:01

9-5
struct dateAndTime clockKeeper (struct dateAndTime dt)
{
struct time timeUpdate (struct time now);
struct date dateUpdate (struct date today);

dt.stime = timeUpdate (dt.stime);

// sprwadmy, czy musimy przechodzi do nastpnego dnia

if ( dt.stime.hour == 0 && dt.stime.minutes == 0 &&
dt.stime.seconds == 0 )
dt.sdate = dateUpdate (dt.sdate);

return dt;
}

// Oto przykadowa funkcja main i wyniki dziaania programu

int main (void)
{
struct dateAndTime dt1 = { { 12, 31, 2004 }, { 23, 59, 59 } };
struct dateAndTime dt2 = { { 2, 28, 2008 }, { 23, 59, 58 } };

printf ("Aktualna data i czas to %.2i/%.2i/%.2i " 
"%.2i:%.2i:%.2i\n",
dt1.sdate.month, dt1.sdate.day, dt1.sdate.year, 
dt1.stime.hour,
dt1.stime.minutes, dt1.stime.seconds);

dt1 = clockKeeper (dt1);

printf ("Poprawiona data i czas to %.2i/%.2i/%.2i " 
"%.2i:%.2i:%.2i\n\n",
dt1.sdate.month, dt1.sdate.day, dt1.sdate.year,
dt1.stime.hour, dt1.stime.minutes, dt1.stime.seconds);

printf ("Aktualna data i czas to %.2i/%.2i/%.2i " 
"%.2i:%.2i:%.2i\n",
dt2.sdate.month, dt2.sdate.day, dt2.sdate.year,
dt2.stime.hour, dt2.stime.minutes, dt2.stime.seconds);

dt2 = clockKeeper (dt2);

printf ("Poprawiona data i czas to %.2i/%.2i/%.2i " 
"%.2i:%.2i:%.2i\n\n",
dt2.sdate.month, dt2.sdate.day, dt2.sdate.year,
dt2.stime.hour, dt2.stime.minutes, dt2.stime.seconds);

printf ("Aktualna data i czas to %.2i/%.2i/%.2i " 
"%.2i:%.2i:%.2i\n",
dt2.sdate.month, dt2.sdate.day, dt2.sdate.year,
dt2.stime.hour, dt2.stime.minutes, dt2.stime.seconds);

dt2 = clockKeeper (dt2);

printf ("Poprawiona data i czas to %.2i/%.2i/%.2i " 
"%.2i:%.2i:%.2i\n\n",
dt2.sdate.month, dt2.sdate.day, dt2.sdate.year,
dt2.stime.hour, dt2.stime.minutes, dt2.stime.seconds);

return 0;
}


Aktualna data i czas to 12/31/2004 23:59:59
Poprawiona data i czas to 01/01/2005 00:00:00

Aktualna data i czas to 02/28/2008 23:59:58
Poprawiona data i czas to 02/28/2008 23:59:59

Aktualna data i czas to 02/28/2008 23:59:59
Poprawiona data i czas to 02/29/2008 00:00:00


Rozdzia 10

10-3
Problem mona rozwiza na wiele rnych sposobw. W tym wypadku zastpiono
funkcj alphabetic funkcj wordchar, ktra za czci sowa uznaje nie tylko
litery, ale take apostrofy. Dodano te funkcj numchar uznajc za cz
liczby cyfry, kropk dziesitn, przecinki i znaki minus. Definicje te 
nie s doskonae, ale s do dobre, aby program zachowywa si rozsdnie
bez jego zbytniego komplikowania.

// Funkcja sprawdzajca, czy znak jest czci sowa

bool wordchar (const char c)
{
if ( (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '\'' )
return true;
else
return false;
}

// Funkcja sprawdzajca, czy znak jest czci liczby

bool numchar (const char c)
{

if ( (c >= '0' && c <= '9') || c == '.' || c == ',' || c == '-' )
return true;
else
return false;
}

// Funkcja zliczajca sowa w acuchu

int countWords (const char string[])
{
int i, wordCount = 0;
bool lookingForWord = true, wordchar (const char c), numchar (const char c);

for ( i = 0; string[i] != '\0'; ++i )
if ( wordchar (string[i]) || numchar (string[i]) ) {
if ( lookingForWord ) {
++wordCount;
lookingForWord = false;
}
}
else
lookingForWord = true;

return wordCount;
}

// Oto przykadowa funkcja main i uzyskane z niej odpowiedzi

int main (void)
{
char text1[] = "The sum of $552,227 and $-1,204.50 is $551,002.50";
char text2[] = "It isn't that I don't understand you.";
int countWords (const char string[]);

printf ("%s -- words = %i\n", text1, countWords (text1));
printf ("%s -- words = %i\n", text2, countWords (text2));
}

The sum of $552,227 and $-1,204.50 is $551,002.50 -- words = 8 
It isn't that I don't understand you. -- words = 7

10-5
// znajd s1 w source; zwr indeks lub -1, jeli szukanie nie powiedzie si

int findString (const char source[], const char s[])
{
int i, j, foundit = false;

// sprawdzanie kadego znaku source

for ( i = 0; source[i] != '\0' && !foundit; ++i ) {
foundit = true;

// teraz sprawdzamy, czy pasuj kolejne znaki z s

for ( j = 0; s[j] != '\0' && foundit; ++j )
if ( source[j + i] != s[j] || source[j + i] == '\0' )
foundit = false;

if (foundit)
return i;
}

return -1;
}

10-7
/* wstawienie acucha s do acucha source zaczynajc
od znaku i. Funkcja korzysta z funkcji stringLength 
zdefiniowanej w tym rozdziale.

Uwaga: funkcja zakda, e source jest dostatecznie due,
aby pomieci cay nowy acuch (niebezpieczne dziaanie!) */

void insertString (char source[], char s[], int i)
{
int j, lenS, lenSource;

/* najpierw, sprawdmy, jak dugie s nasze acuchy */

lenSource = stringLength (source);
lenS = stringLength (s);

/* na wszelki wypadek -- zauwamy, e i == lenSource
faktycznie docza s na koniec source */

if (i > lenSource)
return;

/* teraz musimy przej przez znaki z source, a do punktu
wstawiania, aby zrobi miejsce na s.
Zauwamy, e kopiujemy acuch poczynajc od koca, aby unikn 
nadpisania znakw z source.
Kopiujemy te kocowy znak null (j zaczyna si od lenS), gdy
wynik musi koczy si znakiem null. */

for ( j = lenSource; j >= i; --j )
source [lenS + j] = source [j];

/* mamy ju miejsce, teraz kopiujemy s do source */

for ( j = 0; j < lenS; ++j )
source [j + i] = s[j];
}

10-9
bool replaceString (char source [], char s1[], char s2[])
{
int index;

// najpierw szukamy s1 w source

index = findString (source, s1);

if ( index == -1 )
return false;

// usuwamy s1 z source

removeString (source, index, stringLength (s1));

// wstawiamy nowy acuch

insertString (source, s2, index);

return true;
}

10-11
#include <stdbool.h>

int strToInt (const char string[]) 
{
int i = 0, intValue, result = 0;
int negative = false;

// sprawdzamy, czy wystpuje wiodcy minus

if ( string[0] == '-') {
negative = true;
i = 1;
}

while ( string[i] >= '0' && string[i] <= '9' ) {
intValue = string[i] - '0';
result = result * 10 + intValue;
++i;
}

if ( negative )
result = -result;

return result;
}

10-13
void uppercase ( char str[] )
{
int i;

for ( i = 0; str[i] != '\0'; ++i )
if ( str[i] >= 'a' && str[i] <= 'z' )
str[i] = str[i] - 'a' + 'A';
}



Rozdzia 11

11-3
Problem mona rozwiza przygotowujc "zbdn" zmienn struktury,
listHead, na przykad:
struct entry listHead;

Nastpnie mona j tak ustawi, aby wskazywaa gow listy; naley
przypisa listHead tak, aby wskazywaa pierwsz pozycj z listy:

listHead.next = &entry1;

Teraz wstawiamy now pozycj newEntry na pocztek listy:

insertEntry (&new_entry, &list_head);

11-5
struct dentry
{
int value;
struct dentry *next;
struct dentry *prev;
};

int main (void)
{
struct dentry n1, n2, n3, *lptr;
int i;

n1.value = 100;
n2.value = 200;
n3.value = 300;

n1.next = &n2;
n2.next = &n3;
n3.next = (struct dentry *) 0;

n1.prev = (struct dentry *) 0;
n2.prev = &n1;
n3.prev = &n2;

// przeszukanie listy wprzd:

lptr = &n1;

while ( lptr != 0 ) {

printf ("%i ", lptr->value);
lptr = lptr->next;
}

printf ("\n");

// przeszukanie listy wstecz:

lptr = &n3;

while ( lptr != 0 ) {
printf ("%i ", lptr->value);
lptr = lptr->prev;
}

printf ("\n");
return 0;
}

Oto wynik dziaania programu testowego:

100 200 300
300 200 100

11-7
/* Sortowanie tablicy liczb cakowitych rosnce
(wersja oparta na wskanikach) */

void sort (int *a, int n)
{
int *aptr1, *aptr2, temp;

for ( aptr1 = a; aptr1 < a + n - 1; ++aptr1 )
for ( aptr2 = aptr1 + 1; aptr2 < a + n; ++aptr2 )
if ( *aptr1 > *aptr2 ) {
temp = *aptr1;
*aptr1 = *aptr2;
*aptr2 = temp;
}
}

11-9
/* Funkcja wczytujca wiersz tekstu z terminala 
(wersja wskanikowa) */

void readLine (char *buffer)
{
char character;

do {
character = getchar ();
*buffer++ = character;
}
while ( character != '\n' );

*(buffer - 1) = '\0';
}

11-11
/* Funkcja wyliczajca jutrzejsz dat
(wersja wskanikowa) */

void dateUpdate (struct date *today)
{
int numberOfDays (struct date d);

if ( today->day != numberOfDays (*today) )
++today->day;
else if ( today->month == 12 ) { /* end of year */
today->day = 1;
today->month = 1;
++today->year;
}
else { /* koniec miesica */
today->day = 1;
++today->month;
}
}



Rozdzia 12

12-3
int int_size (void)
{
unsigned int bits;
int size = 0;

bits = ~0;

while ( bits ) {
++size;
bits >>= 1;
}

return size;
}

12-5
/* badamy bit n w sowie, aby sprawdzi, czy jest
on ustawiony; zakadamy, e sowa maj 32 bity */

int bit_test (unsigned int word, int n)
{
if ( n < 0 || n > 31 )
return 0;

if ( (word >> (31 - n)) & 0x1 )
return 1;
else
return 0;
}

unsigned int bit_set (unsigned int word, int n)
{
if ( n < 0 || n > 31 )
return 0;

return word | (1 << (31 - n));
}

12-7
// pobieramy count bit zaczynajc od wartoci bitu n

unsigned int bitpat_get (unsigned int value, int n, int count)
{
int word_size, i;

word_size = int_size (); // z wiczenia 3

if ( n < 0 || n > word_size || count < 0 || count + n > word_size )
return 0;

// najpeirw przesuwamy warto w lewo

value <<= n;

// teraz przesuwamy w prawo, bity po lewo bd zerowane

return value >> word_size - count;
}



Rozdzia 13

13-3
#define MIN(x, y) (((x) < (y)) ? (x) : (y))

13-5
#define SHIFT(value, n) (((n) > 0) ? ((value) << (n)) \
: ((value) >> -(n)))

13-7
#define IS_ALPHABETIC(c) (IS_LOWER_CASE (c) || IS_UPPERCASE (c))

13-9
#define ABSOLUTE_VALUE(x) (((x) < 0) ? -(x) : (x))


Rozdzia 14

14-1
typedef int (*FnPtr) (void);

14-3
Wyraenie  Typ  Warto

f + i float 101
l / d double 33.3333
i / l + f float 1.0
l * i long 50000
f / 2 float 0.5
i / (d + f) double 6.25
l / (i * 2.0) double 2.5
l + i / (double) l double 501.0


Rozdzia 16

16-3
// Program kopiujcy jeden plik na drugi

#include <stdio.h>

/* zamiana maych liter na wielkie */

#define TO_UPPER(c) ((c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c)

int main (void)
{
char inName[64], outName[64];
FILE *in, *out;
int c;

printf ("Podaj nazw kopiowanego pliku: ");
scanf ("%63s", inName);
printf ("Podaj nazw pliku wynikowego: ");
scanf ("%63s", outName);

if ( (in = (FILE *) fopen (inName, "r")) == NULL ) {
fprintf (stderr, "Otwarcie pliku %s do odczytu niemoliwe.\n", inName);
return 1;
}
else if ( (out = fopen (outName, "w")) == NULL ) {
fprintf (stderr, "Otwarcie pliku %s do zapisu niemoliwe.\n", outName);
return 2;
}

while ( (c = getc (in)) != EOF )
putc (TO_UPPER (c), out);

printf ("Plik zosta skopiowany.\n");

return 0;
}

16-5
/* Program pobierajcy kolumny z kadego wiersza pliku
(analogiczny to polecenia cut systemu UNIX) */

#include <stdio.h>

int main (void)
{

char inName[64];
FILE *in;
int m, n, curcol, c;

printf ("Podaj nazw pliku: ");
scanf ("%63s", inName);
printf ("Podaj numery kolumny pocztkowej i kocowej: ");
scanf ("%i%i", &m, &n);

if ( (in = fopen (inName, "r")) == NULL ) {
fprintf (stderr, "Nie mona otworzy pliku %s do odczytu.\n", inName);
return 1;
}
else {
curcol = 1;

while ( (c = getc (in)) != EOF ) {
if ( c == '\n' ) {
putchar ('\n');
curcol = 0;
}
else if ( curcol >= m && curcol <= n )
putchar (c);

++curcol;
}
}
}

? 2003-2004 by Kochan-Wood.com, Inc. Wszelkie prawa zastrzeone.
