Cauchy - Szkoła Myślenia www.cauchy.pl//programy/c++/najwiekszy-wspolny-dzielnik/     |     Dodaj do ulubionych23 lipiec 2019

Łamigłówki podstawowa

|

Przedszkolaki

|

Kolorowanki

|

Rebusy

|

Krzyżówki

|

Wykreślanki

|

Algorytmy

|

Zabawy

Korepetycje, korepetycje z języka polskiego

Poprzednie PoprzednieDo góry, menu nadrzędne, lista zadań Lista wszystkich tematówPierwsze Pierwsze

Największy Wspólny dzielnik

Przykłady programów i funkcji w jężyku C++

Program obliczający Największy Wspólny Dzielnik
Poniżej kod programu obliczający Największy Wspólny Dzielnik liczb podanych w wierszu poleceń. W treści kodu szczegółowe komentarze. Na dole strony znajdziesz krótkie omówienie zależności między procedurami oraz link do plików zawierających kod programu, sposób kompilacji i uruchomienia programu.
Funkcje programu obliczającego Największy Wspólny Dzielnik
 #include <iostream>
 #include <conio.h>
 #include <string.h>
 using namespace std;
 
 
 int NWD (int argc, char *argv[]);
 int NWD (int liczba1, int liczba2);
 int CharToInt (char *liczba_char);
 void UporzadkujLiczbyRosnaco (int &liczba1, int &liczba2);
 
 
 int main (int argc, char *argv[]) {
    char *informacja_na_ekran_za_malo_danych = "Podales za malo danych.";
    char *informacja_na_ekran_poprawne_wywolanie_programu = 
 	    "Przyklad poprawnego wywolania programu: NWD 12 15 21";
    //Jesli argc ma wartosc 1 to program nie ma zadnych argumentow 
    //(jest tylko nazwa programu)
    //Jesli argc ma wartosc 2 to program ma 1 argument + nazwa programu
    //Jesli argc < 3 to program nie ma dwoch argumentow i konczy dzialanosc
    if (argc < 3) {
       cout << informacja_na_ekran_za_malo_danych << endl;
       cout << informacja_na_ekran_poprawne_wywolanie_programu << endl;
       getch();
       return 1;
    }
 
    //Zwiekszamy wartosc wskaznika na tablice argumentow programu by
    //pominac pierwszy element tablicy ktorym jest nazwa programu
    ++argv;
    //Skoro pominelismy jeden alement w tablicy to musimy liczbe elementow 
    //tej tablicy zmniejszyc o 1
    --argc;
 
    //Obliczamy Najwiekszy Wspolny Dzielnik tablicy liczb w formie znakowej 
    //(argv) o dlugosci argc
    int nwd = NWD(argc, argv);
 
    //Wypisujemy na ekranie wynik
    cout << "NWD liczb:" << endl;
    cout << "   ";
    for (int i=0; i<argc; ++i) {
       cout << argv[i];
       if (i != (argc-1) )
          cout << ", ";
    }
    cout << endl;
    cout << "wynosi:" << endl;
    cout << "   " << nwd << endl;
 
    getch();
    return 0;
 }
 
 
 //Funkcja zwraca Najwiekszy Wspolny Dzielnik liczb znajdujacych sie w 
 //tablicy tablica_liczb_char
 //Kazdy elemnet tablicy tablicy tablica_liczb_char jest typu znakowego
 //char* i jest zamieniany na typ calkowity int przy pomocy wlasnej 
 //funkcji CharToInt
 //Dlugosc tablicy tablica_liczb_char okresla zmienna liczba_elementow
 //Funkcja wykorzystuje funkcje NWD (int liczba1, int liczba2)
 //obliczajaca Najwiekszy Wspolny Dzielnik dwoch liczb calkowitych
 //Jesli liczba argumentow funkcji NWD jest mniejsza niz 2 to funkcja NWD
 //zwraca 0
 //Jesli ktorykolwiek z argumentow funkcji NWD wynosi 0 to funkcja NWD
 //zwraca 0
 int NWD (int liczba_elementow, char *tablica_liczb_char[]) {
    //Jesli argumentow jest mniej niz 2 to nie da sie obliczyc NWD i
    //wowczas zwracamy 0
    if (liczba_elementow < 2)
       return 0;
    int aktualna_liczba;
    //Na poczatku nwd jest rowne pierwszej liczbie w tablicy
    int nwd = CharToInt(tablica_liczb_char[0]);
    for (int i=1; i<liczba_elementow; ++i) {
       aktualna_liczba = CharToInt(tablica_liczb_char[i]);
       //Jesli jedna z liczb jest rowna 0 to zwracamy 9 jako nwd
       if (aktualna_liczba == 0)
          return 0;
       //Nowa wrtosc nwd, to NWD starej wartosci nwd i kolejnej liczby
       //w tablicy
       nwd = NWD(nwd, aktualna_liczba);
    }
    return nwd;
 }
 
 
 //Funkcja zwraca Najwiekszy Wspolny Dzielnik dwoch liczb calkowitych
 //typu int
 //Jesli jedna z liczb jest zerem to funkcja zwraca 0
 int NWD (int liczba1, int liczba2) {
    //Jesli jedna z liczb jest zerem to zwracamy 0
    if ( (liczba1 == 0) || (liczba2 == 0) )
       return 0;
    //Zapewniamy sobie, ze liczba1 < liczba2 co zmniejsza liczbe operacji
    UporzadkujLiczbyRosnaco (liczba1, liczba2);
    //Przyjmujemy, ze nwd to mniejsza z liczb. W petli zmniejszamy nwd co 1
    //Gdy nwd podzieli sie przez obie liczby to jest wlasnie naszym
    //szukanym nwd
    for (int nwd=liczba1; nwd>0 ; --nwd)
       //Jesli nwd jest dzielnikiem liczba1 i liczba2 to jest szukana 
       //liczba - najwiekszym dzielnikiem obu liczb
       if ( (liczba1%nwd == 0) && (liczba2%nwd == 0) )
          return nwd;
    //Istrnukcja pro-froma, by nie miec warningu kompilatora.
    //Ponizsza instrukcja nigdy nie zostanie wykonana gdyz powyzsza petla 
    //zakonczy sie w najgorszym wypadku na nwd=1 (przez 1 dziela sie 
    //wszystkie liczby)
    return 0;
 }
 
 
 //Funkcja zamienia otrzymany ciąg znaków (zmienna liczba_char typu
 //char*) na liczbe calkowita (zmienna liczba_int typu int). Zmienna 
 //liczba_int jest zwracana do funkcji nadrzednej.
 //Funkcja rozroznia liczby ujmene - pierwszy znak zmiennej liczba_char
 //musi byc '-'
 //Jesli funkcja napotka inny znak niz od '0' do '9' to zwraca 0
 int CharToInt (char *liczba_char) {
    //Dlugosc ciagu znakowego definiujacego liczbe
    int dlugosc_liczby_char = strlen(liczba_char);
    //Deklaracja liczby calkowitej odpowiadajacej ciagowi znakowemu
    //liczba_char
    int liczba_int = 0;
    //Znak zmiennej liczba_int (domyslnie dodatni)
    int znak = 1;
    int aktualna_cyfra;
 
    for (int i=0; i<dlugosc_liczby_char; i++) {
       //Jesli pierwszy element zmiennej liczba_char jest '-' to znaczy,
       //ze liczba jest ujemna i przechodzimy do kolejnego znaku
       if ( (i==0) && (liczba_char[i]=='-') ) {
          znak = -1;
          continue;
       }
       //Jesli aktualny element zmiennej liczba_char nie jest cyfra to
       //zwracamy 0
       if ( (liczba_char[i]<'0') || (liczba_char[i]>'9') )
          return(0);
       //Wiemy, ze mamy doczynienia z cyfra
       //Odejmujac od cyfry w kodzie ascii (liczba_char[i]) kod ascii 0 
       //(czyli '0') otrzymamy wartosc liczbowa aktualnej cyfry
       aktualna_cyfra = liczba_char[i] - '0';
       //Dopisujac cyfre na koncu zwiekszamy dziesieciokrotnie liczbe
       //oraz dodajemy dopisana cyfre
       liczba_int = 10*liczba_int + aktualna_cyfra;
    }
 
    //Uwzgledniamy wczesniej zapisany znak
    liczba_int *= znak;
    //Zwracam skonwertowana do typu calkowitego wartosc (liczba_int)
    return liczba_int;
 }
 
 
 //Procedura otrzymuje dwie liczby typu całkowitego liczba1 i liczba2 
 //przekazane przez adres
 //Procedura UporzadkujLiczbyRosnaco po zakonczeniu dzialania powoduje,
 //ze liczba1 < liczba2
 void UporzadkujLiczbyRosnaco (int &liczba1, int &liczba2) {
    //Jesli liczba2 >= liczba1 to kolejnosc liczb jest wlasciwa i koniec
    if (liczba2 >= liczba1)
       return;
 
    //Definiujemy zmienna pomocnicza
    int mniejsza_liczba;
    //liczba2<liczba1 (inaczej nie bylibysmy w tym miejscu programu)
    //Zapamietujemy zmienna liczba2 w zmiennje pomocniczej
    mniejsza_liczba = liczba2;
    //liczba2 przyjmuje wartosc wiekszej z liczb
    liczba2 = liczba1;
    //liczba2 przyjmuje wartosc mniejszej z liczb
    liczba1 = mniejsza_liczba;
 }
 
Krótki opis programu
Program pobiera z linii komend argumenty programu i oblicza ich Największy Wspólny Dzielnik. W programie są dwie funkcje NWD (funkcja NWD ma przeciążone argumenty):
  • int NWD (int liczba1, int liczba2) - obliczająca i zwracająca Największy Wspólny Dzielnik dwóch liczb całkowitych
  • int NWD (int liczba_elementow, char *tablica_liczb_char[]) - obliczająca i zwracająca Największy Wspólny Dzielnik tablicy liczb przedstawionych w formie znakowej (char *)
Główną funkcja jest funkcja NWD (int liczba_elementow, char *tablica_liczb_char[]). Konwertuje ona kolejne ciągi znakowe w tablicy tablica_liczb_char na typ całkowitoliczbowy i oblicza Największy Wspólny Dzielnik wszystkich liczb z tablicy. Największy Wspólny Dzielnik jest obliczany funkcją NWD (int liczba1, int liczba2) gdzie liczba1 to dotychczasowy Największy Wspólny Dzielnik, zaś liczba2 to kolejna liczba z tablicy tablica_liczb_char (zamieniona na typ całkowitoliczbowy int).

PoprzednieDo góry, menu nadrzędne, lista zadańPierwsze
PoprzednieLista wszystkich tematówPierwsze


Nie znalazłeś szukanej treści?
Poszperaj w serwisie cauchy.pl lub w sieci.
Google
 
Tabliczka mnożenia - tapeta
 
Tapeta ze wzorami dotyczącymi logarytmów i funkcji logarytmicznej
 
Internetowe kursy maturalne z matematyki
 
Matury z lat 2002 - 2005. Zadania, rozwiązania zadań, schemat punktacji
 
(C) 2010 Szkoła Myślenia im. A. L. Cauchy        Napisz Napisz        Praca     Reklama
   korepetycje z fizyki