Laboratorium Podstaw Informatyki
Kierunek Elektrotechnika
Ćwiczenie 1.5
Argumenty wywołania programu.
Kraków 2000
Argumenty wywołania programu
Istnieje możliwość przekazywania argumentów wywoływanemu programowi. Działanie programu rozpoczyna się od wywołania funkcji main z dwoma argumentami. Pierwszy umownie nazwany argc, określa liczbę argumentów wiersza zlecenia wywołującego program; drugi (argv) jest wskaźnikiem do tablicy tekstów zawierającej argumenty, każdy jako osobny tekst.
Odpowiednie deklaracje i sposób postępowania najprościej zilustruje program echo, który jak echo powtarza argumenty swojego wywołania wypisując je w osobnym wierszu, oddzielone odstępami. Jeżeli więc zlecenie miało postać
echo ahoj przygodo
to wynikiem programu będzie wiersz tekstu
ahoj przygodo
Zgodnie z przyjętą konwencją argv[0] jest nazwą programu, a więc argc jest co najmniej równy 1. W przykładzie tym argc równa się 3, a argv[0], argv[1] i argv[2] wskazują odpowiednio teksty "echo", "achoj," i "przygodo". Pierwszym rzeczywistym argumentem jest argv[1], a ostatnim argv[argc-1]. Oto program echo:
#include <stdio.h>
main(int argc, char *argv[ ])
{
int i;
for(i = 1; i < argc ; i++)
printf("%s%c", argv[i], (i < argc - 1) ? ' ' : '\n');
}
Używając wskaźników zamiast indeksowanych tablic program ten można napisać w inny równoważny sposób.
#include <stdio.h>
main(int argc, char *argv[ ])
{
while(--argc>0)
printf("%s%c", *++argv, (argc>1) ? ' ':'\n');
}
argv jest wskaźnikiem do początku tablicy argumentów tekstowych, zwiększając więc go o 1 (++argv) sprawiamy, że wskazuje on na początek argv[1] zamiast na argv[0]. Każde następne zwiększenie przesuwa go do kolejnego argumentu. W tym samym czasie jest zmniejszany licznik argc; gdy stanie się zerem, będzie to oznaczać, że nie ma już więcej argumentów do wypisania.
Zadanie 1:
Wiele programów może zostać wywołane z tzw. przełącznikami. Przełącznikem jest litera poprzedzona znakiem minus (-). Dla przykładu -? lub -h zazwyczaj oznacza żądanie wypisania pomocy dla użytkownika.
1) Napisz program, który będzie akceptował niżej wymienione przełączniki i wypisywał do nich komentarz:
-? -h -r -n
Jeśli wystąpi przełącznik inny niż wyżej podane to program ma wyświetlić stosowny tekst.
Przykład:
switch -r -n -x
Program powinien wypisać
-r przełącznik "revers"
-n przełącznik "nowa linia"
-x przełącznik nieznany
Zadanie 2:
Rozszerz program z zadania 1, tak aby rozpoznawał on te przełączniki i podejmował odpowiednią akcję.
Gdy wystąpią przełączniki -? lub -h należy wypisać odpowiedni tekst pomocy i zakończyć program.
Gdy nie podano żadnego przełącznika wypisać argumenty tak jak program echo.
Gdy wystąpi przełącznik -r należy wypisać argumenty programu, nie będące przełącznikami w odwrotnej kolejności niż wystąpiły w linii komend.
Gdy zostanie podany przełącznik -n wypisać każdy argument nie będący przełącznikiem w osobnej linii.
Przełączniki mogą być podane w dowolnej kolejności i wymieszane z pozostałymi argumentami.
Zadanie 3:
Kalkulator wierszowy.
Napisać program o nazwie licz.exe, który będzie działał jak bardzo prosty 4 działaniowy kalkulator.
Przykładowe uruchomienie może wyglądać tak:
licz.exe 1 + 2 * 3
program powinien wyświetlić = 7.
W naszym przykładzie w tablicy argv[] są umieszczone wskaźniki na takie teksty:
argv[0]->„licz.exe”
argv[1]->„1”
argv[2]->„+”
argv[3]->„2”
argv[4]->„*”
argv[5]->„3”
argv[6]=NULL
Metoda rozwiązania: Poniżej przedstawiony jest szkic rozwiązania. Wydaje się, że najprościej jest użyć funkcji rekurencyjnej, czyli takiej która sama siebie wywołuje. Funkcja ta została nazwana oblicz i ma trzy parametry: tablicę wskaźników na teksty oraz dwa indeksy do niej. Jeden p - początek, oraz k - koniec. Najpierw szukamy operatora o najniższym priorytecie (np. operator mnożenia ma wyższy priorytet niż dodawania). Potem wywołujemy funkcję oblicz aby obliczyła wartość lewego i prawego wyrażenie. Mając te wartości możemy zastosować do nich znaleziony operator. Funkcja kod służy do tłumaczenie tekstowej postaci operatora na kod liczbowy - celem uzyskania większej czytelności programu.
Uwaga: ponieważ zarówno liczby jak i operatory przechowywane są w postaci tekstowej, to do porównywania tekstów używamy funkcji strcmp, a do konwersji tekstu na liczbę funkcji atof.
float oblicz(char *s[ ] , int p, int k)
{
int poz;
if(p==k)
return atof(s[p]);
poz = znajdz_op_o_najniższym_priorytecie(s, p, k);
switch(kod(s[poz])) {
case MINUS:
return oblicz(s, p, poz-1) - oblicz(s, poz+1, k);
case PLUS:
return oblicz(s, p, poz-1) + oblicz(s, poz+1, k);
case MUL:
return oblicz(s, p, poz-1) * oblicz(s, poz+1, k);
case DIV:
return oblicz(s, p, poz-1) / oblicz(s, poz+1, k);
}
return 0;
}
main(int argc, char *argv[ ])
{
printf("wynik = %f ", oblicz(argv, 1, argc-1);
}
Laboratorium Podstaw Informatyki Strona 1
Zakład Metrologii AGH