6742


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



Wyszukiwarka

Podobne podstrony:
6742
07 Uwzględnienie wpływów dynamicznych w konstrukcjach budowlanychid 6742 ppt
6742
6742
6742
6742
6742
6742
6742

więcej podobnych podstron