Jezyk_ANSI_C_Programowanie_cwiczenia_Wydanie_II_cwjans.pdf

(233 KB) Pobierz
Jêzyk ANSI C. Programowanie.
Æwiczenia. Wydanie II
Autorzy: Clovis L. Tondo, Scott E. Gimpel
T³umaczenie: Pawe³ Koronkiewicz
ISBN: 978-83-246-2591-8
Format: 158 × 235, stron: 168
Ksi¹¿ka „Jêzyk ANSI C. Programowanie. Wydanie II” to jedna z najlepszych dostêpnych
na rynku pozycji do nauki tego jêzyka, zaliczana do klasyki literatury informatycznej
i ciesz¹ca siê niemalej¹c¹ popularności¹. Przejrzyście opisana teoria, liczne przyk³ady
oraz zbiór æwiczeñ to atuty doceniane przez kolejne pokolenia programistów.
Niniejsza ksi¹¿ka zawiera rozwi¹zania wszystkich æwiczeñ zawartych w „Jêzyku ANSI
C. Programowanie. Wydanie II”. Oprócz dzia³aj¹cego i przetestowanego kodu znajdziesz
w niej komentarze do specyficznych konstrukcji i samego sposobu rozwi¹zywania zadañ.
Po³¹czenie teorii z praktyk¹ pozwoli Ci b³yskawicznie przyswoiæ wiedzê na temat jêzyka
C, a nastêpnie wykorzystaæ j¹ w praktyce. Ponadto czêśæ rozwi¹zañ z pewności¹ przyda
siê w codziennej pracy, dlatego te¿ ksi¹¿ka ta sprawdzi siê zarówno w rêkach adepta
jêzyka C, jak i zawodowego programisty.
1098166032.010.png 1098166032.011.png
 
Spis treci
Wstp
5
Rozdzia 1. Wprowadzenie
7
Rozdzia 2. Typy, operatory i wyraenia
37
Rozdzia 3. Sterowanie wykonywaniem programu
49
Rozdzia 4. Funkcje i struktura programu
57
Rozdzia 5. Wskaniki i tablice
77
Rozdzia 6. Struktury
121
Rozdzia 7. Wejcie i wyjcie
135
Rozdzia 8. Interfejs systemu UNIX
149
Skorowidz
161
1098166032.012.png 1098166032.001.png 1098166032.002.png 1098166032.003.png 1098166032.004.png 1098166032.005.png 1098166032.006.png 1098166032.007.png 1098166032.008.png
 
Rozdzia 4.
Funkcje
i struktura programu
wiczenie 4.1 (str. 89)
Napisz funkcj strrindex(s,t) , która zwraca pozycj ostatniego wystpienia t w s lub -1 ,
jeeli wyszukiwany cig nie zosta znaleziony.
/* strrindex: zwraca index ostatniego wystpienia t w s lub –1, jeeli nie wystpuje */
int strrindex(char s[], char t[])
{
int i, j, k, pos;
pos = -1;
for (i = 0; s[i] != '\0'; i++) {
for (j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++)
;
if (k > 0 && t[k] == '\0')
pos = i;
}
return pos;
}
Funkcja strrindex jest podobna do strindex , przedstawionej w podrozdziale 4.1 pod-
rcznika K&R. Gdy funkcja strindex znajduje dopasowany podcig, zwraca jego pozycj,
która jest pozycj pierwszego wystpienia t w s . Funkcja strrindex nie zwraca pozycji
znalezionego podcigu, ale kontynuuje wyszukiwanie, poniewa jej zadaniem jest okre-
lenie pooenia ostatniego wystpienia t w s :
if (k > 0 && t[k] == '\0')
pos = i;
 
Jzyk ANSI C. Programowanie. wiczenia
Ten sam problem mona rozwiza take nastpujco:
#include <string.h>
/* strrindex: zwraca index ostatniego wystpienia t w s lub –1, jeeli nie wystpuje */
int strrindex(char s[], char t[])
{
int i, j, k;
for (i = strlen(s) – strlen(t); i >= 0; i--) {
for (j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++)
;
if (k > 0 && t[k] == '\0')
return i;
}
return -1;
}
Jest to rozwizanie efektywniejsze. Przegldanie cigu rozpoczyna si od koca cigu
s minus dugo cigu t . Brak dopasowania powoduje przesunicie wyszukiwania o jedn
pozycj w stron pocztku cigu. Gdy tylko funkcja znajduje t w s , zwraca biec
pozycj, i . Jest to ostatnie wystpienie t w s .
wiczenie 4.2 (str. 91)
Dodaj do funkcji atof moliwo obsugi notacji wykadniczej, postaci:
123.45e-6
gdzie po liczbie zmiennoprzecinkowej moe wystpi litera e lub E i wykadnik, z opcjo-
nalnym znakiem.
#include <ctype.h>
/* atof: konwertuje cig znaków s na liczb double */
double atof(char s[])
{
double val, power;
int exp, i, sign;
for (i = 0; isspace(s[i]); i++) /* pomi biae znaki */
;
sign = (s[i] == '-') ? -1 : 1;
if (s[i] == '+' || s[i] == '-')
i++;
for (val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '0');
if (s[i] == '.')
i++;
for (power = 1.0; isdigit(s[i]); i++) {
58
1098166032.009.png
 
Rozdzia 4. • Funkcje i struktura programu
val = 10.0 * val + (s[i] - '0');
power *= 10;
}
val = sign * val / power;
if (s[i] == 'e' || s[i] == 'E') {
sign = (s[++i] == '-') ? -1 : 1;
if (s[i] == '+' || s[i] == '-')
i++;
for (exp = 0; isdigit(s[i]); i++)
exp = 10 * exp + (s[i] – '0');
if (sign == 1)
while (exp-- > 0) /* wykadnik dodatni */
val *= 10;
else
while (exp-- > 0) /* wykadnik ujemny */
val /= 10;
}
return val;
}
Pierwsza cz funkcji to powtórzenie funkcji atof z podrozdziau 4.2 podrcznika K&R.
Funkcja pomija biae znaki, zapisuje znak i oblicza liczb. Pobieranie liczby z kropk
dziesitn wymaga identycznej procedury niezalenie od tego, czy w dalszej czci
pojawi si wykadnik.
Druga cz funkcji odpowiada za konwersj opcjonalnego wykadnika. Jeeli ta cz
liczby nie wystpuje, funkcja zwraca warto zapisan w val . Jeeli wykadnik jest obecny,
to jego znak zostaje zapisany w zmiennej sign , po czym warto zostaje obliczona
i zapisana w zmiennej exp .
Kocowa operacja
if (sign == 1)
while (exp-- > 0)
val *= 10;
else
while (exp-- > 0)
val /= 10;
modyfikuje liczb odpowiednio do ustalonej wczeniej wartoci wykadnika. Jeeli
wykadnik jest dodatni, liczba zostaje pomnoona exp razy przez 10. Jeeli wykadnik
jest ujemny, liczba zostaje podzielona exp razy przez 10. W zmiennej val zostaje za-
pisany wynik, który jest zwracany do programu wywoujcego funkcj.
Zmienna val jest dzielona przez 10, a nie mnoona przez 0.1 , poniewa liczba 0,1 nie
jest w zapisie binarnym dokadna. Na wikszoci komputerów warto 0,1 jest repre-
zentowana jako nieco mniejsza ni 0,1. W efekcie mnoenie 10.0*0.1 rzadko daje
wynik 1.0 . Powtarzanie dzielenia przez 10 jest wic lepszym rozwizaniem ni po-
wtarzanie mnoenia przez 0,1, cho utrata dokadnoci wci wystpuje.
59
 
Zgłoś jeśli naruszono regulamin