logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak działa program znajdujący dzielniki liczby całkowitej?

bardzociekawski 21 Mar 2006 21:10 2784 12
REKLAMA
  • #1 2441994
    bardzociekawski
    Uczeń
    Posty: 63
    nie rozumiem programu znajdującego dzielniki liczb całkowitych dodatnich:

    //program znajduje dzielniki danej liczby; "liczba"-podaje ją użytkownik;
    //"dzielnik" - dzielnik liczby podawanej przez użytkownika;
    //"pierwsza"-liczba pierwsza-dzieli sie przez 1 i samą siebie
    #include<stdio.h>
    #include<conio.h>
    #define NIE 0
    #define TAK 1
    int main ()
    {
    int liczba, dzielnik, pierwsza;
    printf ("Podaj dodatnia liczbe calkowita, ktorej dzielniki maja zostac znalezione.\n");
    printf ("Wpisz q aby zakonczyc program.\n");
    while (scanf("%d", &liczba)==1)
    {

    for(dzielnik=2, pierwsza=TAK; (dzielnik*dzielnik)<=liczba; dzielnik++)
    {

    if(liczba%dzielnik==0)
    {
    if((dzielnik*dzielnik)!=liczba)
    printf("%d dzieli sie przez %d i %d.\n",
    liczba, dzielnik, liczba/dzielnik);
    else
    printf("%d dzieli sie przez %d.\n", liczba, dzielnik);
    pierwsza=NIE;

    }

    }
    printf("dzieli sie przez 1 i %d.\n", liczba);
    if (pierwsza==TAK)
    printf("%d jest liczba pierwsza.\n", liczba);
    printf("Podaj nastepna liczbe dodatnia calkowita, ktorej dzielniki maja zostac znalezione.\n");
    printf("Wpisz q aby zakonczyc program.\n");
    }
    return 0;
    getch ();
    }



    1. mam ten program i nie rozumiem - while (scanf("%d", &liczba)==1) to znaczy że program działa tak długo dopuki wczytana wartość od użytkownika równa się 1 - NIE ROZUMIEM !!!!!!!!!! :(

    2. czy może istnieje jakaś prostsza wersja tego programu do zrozumienia - żeby ta petla while była bardziej zrozumiała i tę drugą pętlę for żeby jakoś zastąpić też while - pomóżcie :( bo ja dopiero zaczynam programować :(

    3. I gdzie mam wstawić:

    if (liczba<0)
    {
    printf("blad");
    getch ();
    return 0;
    }
    if (liczba==0)
    {
    printf("to nie jest liczba pierwsza-dzieli sie przez kazda liczbe calkowita dodatnia z wyjatkiem 0");
    getch ();
    return 0;
    }
    if (liczba==1)
    {
    printf("to nie jest liczba pierwsza-dzieli sie tylko przez 1");
    getch ();
    return 0;
    }

    bo we wszystkich sensownych wg mnie miejscach gdzie nalezy to wstawić to, np. dla "1" pojawia się i owszem komunikat: "to nie jest liczba pierwsza-dzieli sie tylko przez 1" po czym jeszcze: "1 dzieli się przez 1 i 1" :( ?
  • REKLAMA
  • #2 2442202
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Ad1. zobacz co zwraca funkcja scanf
    Ad2. ale przecież ta wersja jest dość prosta, zamieniając for na while tylko utrudnisz sobie zrozumienie
    Ad3. programów się nie pisze metodą kopiuj-wklej, tylko wg algorytmów

    Generalnie Twoje pytania brzmią jakbyś nie miał zielonego pojęcia o pisaniu programów, a do tego awersje do czytania wszelkiego rodzaju dokumentacji i specyfikacji.
  • REKLAMA
  • #3 2443173
    bardzociekawski
    Uczeń
    Posty: 63
    pf....... ale sie dowiedziałem............
  • REKLAMA
  • #4 2443185
    wiso
    Poziom 15  
    Posty: 92
    Pomógł: 12
    Ocena: 2
    czego mozna tu nierozumieć, sprecyzuj pytanie

    - nie rozumiesz jak działa petla for
    - nie rozumiesz jak działa petla while
    - nie rozumiesz jak dziala printf i scanf
    - nie rozumiesz zasady dzialania algorytmu
    - nie wiesz po co jest ten kod do wstawienia
    - nie wiesz na czym polegaja wyrazenia warunkowe

    acha i wyglada ze to na jakies laborki jest, zakladam Borlan C++ 3.1 ;-)
  • #5 2443330
    bardzociekawski
    Uczeń
    Posty: 63
    nie rozumiem: while (scanf("%d", &liczba)==1) - tego kompletnie nie rozumiem - wg mnie to oznacza: "czyń co następuje dopóki liczba wczytana od użytkownika jest równa jeden" - ale to bez sensu - ja dopiero zaczynam programować i wolę narazie proste pętle typu while(a==b) a tu w tej bętli pojawia się "scanf" - do tej pory scanf używałem wewnątrz pętli a nie w niej samej - pomocy :( da się to jakoś rozpisać bardziej zrozumiale?
  • #6 2443576
    wiso
    Poziom 15  
    Posty: 92
    Pomógł: 12
    Ocena: 2
    bardzociekawski napisał:
    nie rozumiem: while (scanf("%d", &liczba)==1) - tego kompletnie nie rozumiem - wg mnie to oznacza: "czyń co następuje dopóki liczba wczytana od użytkownika jest równa jeden" - ale to bez sensu - ja dopiero zaczynam programować i wolę narazie proste pętle typu while(a==b) a tu w tej bętli pojawia się "scanf" - do tej pory scanf używałem wewnątrz pętli a nie w niej samej - pomocy :( da się to jakoś rozpisać bardziej zrozumiale?


    http://www.cplusplus.com/ref/cstdio/scanf.html

    scanf zwraca liczbe wczytanych elemntów (zmiennych), czyli

    while (scanf("%d", &liczba)==1)

    oznacza że dopóki uzytkownik będzie podawał z kosoli jakieś dane (tu mamy do czynienia z liczbami, stąd symbol %d) a dokładnie jedną liczbę to pętla będzie się wykonywać, gdy natomiast nic nie poda a wcisnie ENTER pętla się zakończy

    Dodano po 16 [minuty]:

    poniżej moja wersja, jak to mogłoby działać:

    // wiso: z takim formatowaniem lepiej widac co kod robi ;-)
    // to tak na przyszlosc, wazne jest tez jak kod jest sformatowany
    // zreszta sa rozne szkoly ale to inny juz temat
    
    // wiso: nie kompilowalem tego, wiec moga byc bledy ;-)
    
    // program znajduje dzielniki danej liczby; "liczba"-podaje ją użytkownik;
    // "dzielnik" - dzielnik liczby podawanej przez użytkownika;
    // "pierwsza" - liczba pierwsza-dzieli sie przez 1 i samą siebie
    
    #include <stdio.h>
    #include <conio.h>
    
    #define NIE 0
    #define TAK 1
    
    int main ()
    {
        int liczba, dzielnik, pierwsza;
    
        printf("Podaj dodatnia liczbe calkowita, ktorej dzielniki maja zostac znalezione.\n");
        printf("Wpisz q aby zakonczyc program.\n");
    
        while(scanf("%d", &liczba) == 1)
        {
            // wiso: sprawdzanie czy wpisano q
            if(liczba == 'q')
            {
                printf("nacisnij cokolwiek aby zakonczyc program");
                getch();
                return 0; // wiso: zakoncz program
            }
    
            // wiso: zdaje sie ze ten kod to tu powinien byc
            // jest to sprawdzanie poprawnosci wprowadzonej liczby
            // sprawdz czy liczba jest ujemna
            // jesli tak to wyswietl napis blad
            if(liczba < 0)
            {
                printf("blad");
                getch();
                return 0; // wiso: zakoncz program
            }
    
            // wiso: sprawdzanie czy podana liczba rowna sie zero
            if(liczba == 0)
            {
                printf("to nie jest liczba pierwsza-dzieli sie przez kazda liczbe calkowita dodatnia z wyjatkiem 0");
                getch ();
                return 0;
            }
    
            // wiso: sprawdzanie czy podana liczba rowna sie jeden
            if(liczba == 1)
            {
                printf("to nie jest liczba pierwsza-dzieli sie tylko przez 1");
                getch ();
                return 0;
            }
    
            for(dzielnik = 2, pierwsza = TAK; (dzielnik * dzielnik) <= liczba; dzielnik++)
            {
                // wiso: jesli reszta z dzielenia liczby przez dzielnik wynosi zero to
                if((liczba % dzielnik) == 0)
                {
                    // wiso: wykonaj ponizszy kod
    
                    if((dzielnik * dzielnik) != liczba)
                        printf("%d dzieli sie przez %d i %d.\n", 
                            liczba, dzielnik, liczba/dzielnik);
                    else
                        printf("%d dzieli sie przez %d.\n", liczba, dzielnik);
    
                    // wiso: ta liczba nie jest liczba pierwsza, wiadomo dlaczego ;-)
                    pierwsza = NIE;
                }
    
                // wiso: jesli nie to sprawdz kolejny dzielnik
            }
    
            printf("dzieli sie przez 1 i %d.\n", liczba);
    
            if(pierwsza == TAK)
                printf("%d jest liczba pierwsza.\n", liczba);
    
            printf("Podaj nastepna liczbe dodatnia calkowita, ktorej dzielniki maja zostac znalezione.\n");
            printf("Wpisz q aby zakonczyc program.\n");
        }
    
        // wiso: zmienilem kolejnosc i dodalem fajny napis ;-)
        printf("nacisnij cokolwiek aby zakonczyc program");
        getch();
        return 0; // wiso: zakoncz program
    }
    


    Nie udzielam żadnej gwaracji na ten kod ;-)
  • #7 2443769
    bardzociekawski
    Uczeń
    Posty: 63
    aha :) czyli while (scanf("%d", &liczba)==1)
    oznacza tyle, że pętla będzie wykonywana tak długo dopóki wartość wczytana od użytkownika będzie POJEDYNCZĄ LICZBĄ tak ? pojedyncza liczba - to takie proste ???? :D
  • Pomocny post
    #8 2443794
    wiso
    Poziom 15  
    Posty: 92
    Pomógł: 12
    Ocena: 2
    bardzociekawski napisał:
    aha :) czyli while (scanf("%d", &liczba)==1)
    oznacza tyle, że pętla będzie wykonywana tak długo dopóki wartość wczytana od użytkownika będzie POJEDYNCZĄ LICZBĄ tak ? pojedyncza liczba - to takie proste ???? :D


    tak jedną liczbę, najlepiej to sprawdzić testując ten kod, spróbuj ustawić inną wartość niż jeden, tak też można się czegoś dowiedzieć o działaniu, testowanie to podstawa w programowaniu, najlepiej ustaw sobie breakpointa na tej linii i i uruchom program, zobaczysz jak to naprawdę działa ;-)
  • #9 2443811
    bardzociekawski
    Uczeń
    Posty: 63
    kurcze dzięki to ja się doszukiwałem jakiegoś skomplikowanego znaczenia while (scanf("%d", &liczba)==1) a tu się okazuje, że to znaczy tyle co "wykonuj dopóki wartość podana przez użytkownika jest pojedynczą liczbą" - dzięki dzięki dzieki - jesteś wielki - dam ci punkty :D
  • #10 2443856
    wiso
    Poziom 15  
    Posty: 92
    Pomógł: 12
    Ocena: 2
    bardzociekawski napisał:
    kurcze dzięki to ja się doszukiwałem jakiegoś skomplikowanego znaczenia while (scanf("%d", &liczba)==1) a tu się okazuje, że to znaczy tyle co "wykonuj dopóki wartość podana przez użytkownika jest pojedynczą liczbą" - dzięki dzięki dzieki - jesteś wielki - dam ci punkty :D


    dzięki

    tak na przyszłość to nie należy się przejmować się ogromem programu, tylko analizować po kawałeczku

    na początku sprawdź co każda funkcja wykonuje, jakie argumenty może przyjąć co zwraca, co oznaczają użyte wyrażenia warunkowe a wtedy nie będzie to czarna magia ;-) i tak metodą małych kroczków do przodu, no ale to tyle, reszta to praktyka
  • #11 2445870
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    wiso napisał:
    http://www.cplusplus.com/ref/cstdio/scanf.html
    scanf zwraca liczbe wczytanych elemntów (zmiennych), czyli
    while (scanf("%d", &liczba)==1)
    oznacza że dopóki uzytkownik będzie podawał z kosoli jakieś dane (tu mamy do czynienia z liczbami, stąd symbol %d) a dokładnie jedną liczbę to pętla będzie się wykonywać, gdy natomiast nic nie poda a wcisnie ENTER pętla się zakończy
    Nie dość ze podajesz link do dokumentacji, to jeszcze błędnie ją tłumaczysz, a główny zainteresowany nawet nie próbując doczytać samemu to przytakuje, jak ktoś podał mu na tacy rozwiązanie.
    Scanf zwraca liczbe dopasowanych symboli dla wzorca. Jeśli symbol jest %d to dopasuje tylko liczbe, jeśli wpisze się cokolwiek innego niż liczbe i naciśnie enter (nie przyjmuje samego ENTER!!!) to zwróci wartość 0, jeśli coś co da się zinterpretować jako liczbe to zwróci 1.
  • REKLAMA
  • #12 2446666
    bardzociekawski
    Uczeń
    Posty: 63
    ty supermoderator - jak ty coś napiszesz to nie da się tego zrozumieć
    wisio mi bardzo dobrze i zrozumiale napisał, że while (scanf("%d", &liczba)==1) że to znaczy tyle co "wykonuj dopóki wartość podana przez użytkownika jest pojedynczą liczbą"
    a to co program zwróci gdy nic nie wpiszę lub wpiszę dwie liczby wyjdzie już w trakcie działania programu - pozmieniałem tak program, że wyskakuje napis błąd jak poda się np. 2 liczby itd.
    najważniejsze to to, że while (scanf("%d", &liczba)==1) znaczy tyle co "wykonuj dopóki wartość podana przez użytkownika jest pojedynczą liczbą"
    i wyjaśnienie tego przez wisio było najważniejsze a ty jakoś nie potrafiłeś tego wyjaśnić a teraz piszesz jakieś nie wiadomo co
  • #13 2446792
    wiso
    Poziom 15  
    Posty: 92
    Pomógł: 12
    Ocena: 2
    elektryk napisał:
    wiso napisał:
    http://www.cplusplus.com/ref/cstdio/scanf.html
    scanf zwraca liczbe wczytanych elemntów (zmiennych), czyli
    while (scanf("%d", &liczba)==1)
    oznacza że dopóki uzytkownik będzie podawał z kosoli jakieś dane (tu mamy do czynienia z liczbami, stąd symbol %d) a dokładnie jedną liczbę to pętla będzie się wykonywać, gdy natomiast nic nie poda a wcisnie ENTER pętla się zakończy
    Nie dość ze podajesz link do dokumentacji, to jeszcze błędnie ją tłumaczysz, a główny zainteresowany nawet nie próbując doczytać samemu to przytakuje, jak ktoś podał mu na tacy rozwiązanie.
    Scanf zwraca liczbe dopasowanych symboli dla wzorca. Jeśli symbol jest %d to dopasuje tylko liczbe, jeśli wpisze się cokolwiek innego niż liczbe i naciśnie enter (nie przyjmuje samego ENTER!!!) to zwróci wartość 0, jeśli coś co da się zinterpretować jako liczbe to zwróci 1.


    Cytat:

    Return Value.
    The number of items succesfully read. This count doesn't include any ignored fields with asteriskitemss (*).
    If EOF is returned an error has occurred before the first assignation could be done.


    items - ciekawe co to znaczy, symbole - chyba nie co, a tak w ogóle to jedna liczba to jest jeden element, czyli jedna zmienna i tak dalej, a symbole to raczej znaki, więc wychodzi że jeśli wczyta jedną liczbę to scanf zwróci jeden (1)

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy wyjaśnienia działania programu w języku C, który znajduje dzielniki dodatniej liczby całkowitej podanej przez użytkownika. Głównym problemem było zrozumienie konstrukcji pętli while z warunkiem while (scanf("%d", &liczba) == 1). Wyjaśniono, że funkcja scanf zwraca liczbę poprawnie wczytanych elementów (tu pojedynczej liczby całkowitej), a pętla wykonuje się dopóki użytkownik wprowadza pojedynczą liczbę. Podkreślono, że scanf zwraca 1, gdy wczyta jedną liczbę, 0 gdy dane nie są liczbą, a pętla kończy się, gdy nie ma poprawnego wejścia. Zwrócono uwagę na znaczenie testowania kodu i analizowania go krok po kroku, aby zrozumieć działanie funkcji i wyrażeń warunkowych. Wskazano także, że program nie powinien być rozumiany jako całość, lecz przez analizę poszczególnych elementów, takich jak pętle for i while, funkcje scanf i printf oraz warunki logiczne. Dyskusja zawierała także uwagi dotyczące poprawnego formatowania kodu i unikania kopiuj-wklej bez zrozumienia algorytmu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA