• Nie Znaleziono Wyników

Zadania z Języka C dla grup 7. i 9. Informacje uzupełniające

N/A
N/A
Protected

Academic year: 2021

Share "Zadania z Języka C dla grup 7. i 9. Informacje uzupełniające"

Copied!
2
0
0

Pełen tekst

(1)

Zadania z Języka C dla grup 7. i 9.

Informacje uzupełniające - styczeń 2017

Parametry opcjonalne funkcji main. W wielu sytuacjach bardzo użyteczna oka- zuje się możliwość wywołania programu z parametrami opcjonalnymi. Zakładamy, że pewne parametry powinny mieć swoje domyślne wartości, które najprawdopodobniej będą często używane (a zatem nie jest wskazane pytanie o nie przy każdorazowym wy- wołaniu programu), jednak użytownik powinien mieć możliwość stosunkowo łatwej ich modyfikacji. Rozwiązaniem przyjętym dla komend systemów typu Unix jest podawa- nie takich parametrów ze znakiem “-”, po którym następuje jednoliterowy identyfikator parametru, a dalej (bez odstępu) jego wartość. (Przykładowo, najwyższy poziom opty- malizacji kompilowanego programu uzyskujemy wpisując: gcc -O3).

Implementację parametrów opcjonalnych zilustrujemy na przykładzie programu obli- czającego silnię metodą rekurencyjną lub iteracyjną. Zakładamy, że domyślna jest me- toda rekurencyjna (metoda == 1), użytkownik może jednak wybrać metodę iteracyjną, wpisując np. ./silnia.out -M2 5, aby obliczyć 5! = 120. Funkcja main programu może wówczas wyglądać następująco:

int main(int narg, char *argv[]) {

int n,c,metoda;

double silnia;

metoda = 1; // Domyslna metoda rekurencyjna //

while (--narg>0 && (*++argv)[0]==’-’) { if (c=*++argv[0]) {

switch (c) { case ’M’:

sscanf(++argv[0],"%d",&metoda);

break;

default:

printf("Nieznana opcja: -%c\n",c);

return 1;

}

// Zakladamy, ze <n> jest argumentem obowiazkowym //

if (narg<1) {

printf("> ./silnia [-Mmetoda] <n>\n");

return 2;

}

sscanf(++argv[0],"%d",&n);

if (metoda==1) {

(2)

silnia = silnia_rekurencyjnie(n);

}

else if (metoda==2) {

silnia = silnia_iteracyjnie(n);

} else {

printf("Nieznana metoda: %d\n",metoda);

return 3;

}

// Wydruk wynikow: //

printf("Wynik: %d! = %g\n",n,silnia);

return 0;

}

gdzie funkcje

double silnia_rekurencyjnie(int);

oraz

double silnia_iteracyjnie(int);

trzeba zdefiniować dodatkowo. Proszę zwrócić uwagę na obsługę blędów wywołania programu poprzez zwracanie wartości 1, 2, lub 3, w zależności od rodzaju błędu.

Program można bardzo łatwo zmodyfikować, aby np. po użyciu argumentu opcjonal- nego -N10000 silnia była obliczana (wybraną metodą) 10000 razy, co powinno umożliwić pomiar czasu trwania obliczeń w praktyce.

Cytaty

Powiązane dokumenty

Proszę napisać funkcje, która mnoży dwie liczby typu unsigned (albo unsigned long), a wynik zapamiętuje w dwóch innych zmiennych, z których jedna przechowuje najmłodsze bity

W przypadku funkcji generującej liczby losowe metodą Boxa-Mullera, można zadbać o to, aby przy nieparzystym wywołaniu była wykonywana cała pro- cedura począwszy od losowania liczb x

Napisać program, który czyta ciąg liczb ze standardowego wejścia aż do wystąpie- nia znaku końca pliku (kombinacja klawiszy Ctrl–D na klawiaturze), a następnie oblicza

, n−1, dla każdej permutacji określa liczbę punktów stałych k, oraz wylicza, ile razy w ciągu N permutacji mamy k = 0.. Ułamek N/N k=0 stanowi oszacowanie

Zasada indukcji strukturalnej orzeka, iż własność kategorii syntaktycznej może być udowodniona indukcyjnie poprzez analizę struktury jej definicji: dla każdego przypadku ba-

Kąt nachylenia przekątnej ściany bocznej graniastosłupa prawidłowego trójkątnego do sąsiedniej ściany bocznej przedstawiono na

Bernoulli wykorzystał nieliniowe równania różniczkowe ze współczynnikami charakteryzującymi właściwości choroby zakaźnej i opisał wpływ szczepienia krowianką (wirusem

Podczas gdy Immanuel Kant stawiając pytanie „czym jest człowiek?” starał się człowieka — światowego obywatela, który jest obywatelem dwóch światów, uczynić