Jezyk_ANSI_C_Programowanie_cwiczenia_Wydanie_II_cwjans.pdf

(217 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
Tytu³ orygina³u:
The C Answer Book, (2nd Edition)
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.
Spis tre ci
WstÚp
Rozdziaï 1. Wprowadzenie
Rozdziaï 2. Typy, operatory i wyra enia
Rozdziaï 3. Sterowanie wykonywaniem programu
Rozdziaï 4. Funkcje i struktura programu
Rozdziaï 5. Wska niki i tablice
Rozdziaï 6. Struktury
Rozdziaï 7. Wej cie i wyj cie
Rozdziaï 8. Interfejs systemu UNIX
Skorowidz
5
7
37
49
57
77
121
135
149
161
Rozdziaï 4.
Funkcje
i struktura programu
mwiczenie 4.1
(str. 89)
Napisz funkcjÚ
strrindex(s,t)
, która zwraca pozycjÚ
ostatniego
wystÈpienia
t
w
s
lub
-1
,
je eli wyszukiwany ciÈg nie zostaï znaleziony.
/* strrindex: zwraca index ostatniego wyst pienia t w s lub –1, je eli nie wyst puje */
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-
rÚcznika K&R. Gdy funkcja
strindex
znajduje dopasowany podciÈg, zwraca jego pozycjÚ,
która jest pozycjÈ pierwszego wystÈpienia
t
w
s
. Funkcja
strrindex
nie zwraca pozycji
znalezionego podciÈgu, ale kontynuuje wyszukiwanie, poniewa jej zadaniem jest okre-
lenie poïo enia ostatniego wystÈpienia
t
w
s
:
if (k > 0 && t[k] == '\0')
pos = i;
J zyk ANSI C. Programowanie. ûwiczenia
Ten sam problem mo na rozwiÈzaÊ tak e nastÚpujÈco:
#include
<string.h>
/* strrindex: zwraca index ostatniego wyst pienia t w s lub –1, je eli nie wyst puje */
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 rozwiÈzanie efektywniejsze. PrzeglÈdanie ciÈgu rozpoczyna siÚ od koñca ciÈgu
s
minus dïugo Ê ciÈgu
t
. Brak dopasowania powoduje przesuniÚcie wyszukiwania o jednÈ
pozycjÚ w stronÚ poczÈtku ciÈgu. Gdy tylko funkcja znajduje
t
w
s
, zwraca bie ÈcÈ
pozycjÚ,
i
. Jest to ostatnie wystÈpienie
t
w
s
.
mwiczenie 4.2
(str. 91)
Dodaj do funkcji
atof
mo liwo Ê obsïugi notacji wykïadniczej, postaci:
123.45e-6
gdzie po liczbie zmiennoprzecinkowej mo e wystÈpiÊ litera
e
lub
E
i wykïadnik, z opcjo-
nalnym znakiem.
#include
<ctype.h>
/* atof: konwertuje ci g 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 biaáe 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
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)
/* wykáadnik dodatni */
val *= 10;
else
while (exp-- > 0)
/* wykáadnik ujemny */
val /= 10;
}
return val;
}
Pierwsza czÚ Ê funkcji to powtórzenie funkcji
atof
z podrozdziaïu 4.2 podrÚcznika K&R.
Funkcja pomija biaïe znaki, zapisuje znak i oblicza liczbÚ. Pobieranie liczby z kropkÈ
dziesiÚtnÈ wymaga identycznej procedury niezale nie od tego, czy w dalszej czÚ ci
pojawi siÚ wykïadnik.
Druga czÚ Ê funkcji odpowiada za konwersjÚ opcjonalnego wykïadnika. Je eli ta czÚ Ê
liczby nie wystÚpuje, funkcja zwraca warto Ê zapisanÈ w
val
. Je eli wykïadnik jest obecny,
to jego znak zostaje zapisany w zmiennej
sign
, po czym warto Ê zostaje obliczona
i zapisana w zmiennej
exp
.
Koñcowa operacja
if (sign == 1)
while (exp-- > 0)
val *= 10;
else
while (exp-- > 0)
val /= 10;
modyfikuje liczbÚ odpowiednio do ustalonej wcze niej warto ci wykïadnika. Je eli
wykïadnik jest dodatni, liczba zostaje pomno ona
exp
razy przez 10. Je eli wykïadnik
jest ujemny, liczba zostaje podzielona
exp
razy przez 10. W zmiennej
val
zostaje za-
pisany wynik, który jest zwracany do programu wywoïujÈcego funkcjÚ.
Zmienna
val
jest dzielona przez 10, a nie mno ona przez
0.1
, poniewa liczba 0,1 nie
jest w zapisie binarnym dokïadna. Na wiÚkszo ci komputerów warto Ê 0,1 jest repre-
zentowana jako nieco mniejsza ni 0,1. W efekcie mno enie
10.0*0.1
rzadko daje
wynik
1.0
. Powtarzanie dzielenia przez 10 jest wiÚc lepszym rozwiÈzaniem ni po-
wtarzanie mno enia przez 0,1, choÊ utrata dokïadno ci wciÈ wystÚpuje.
59
Zgłoś jeśli naruszono regulamin