Dlaczego program zwraca tą liczbę?

0

Witam mam prace domową z programowania w języku c i program powinien zwracać true albo false a zwraca np true4. czy ktoś może mi powiedzieć dlaczego tak się dzieje i jak to naprawić.

#include <stdio.h>
#include <math.h>

int leap(int rok){
    if(rok%4==0){
            if(rok%100==0 && rok%400!=0){
              printf("true");
            }else {
            printf("false");
            }

    }else {
    printf("false");
    }

}

int main(){
    int r;
    scanf("%i" , &r);
    //printf("%i" , leap(rok));

    return printf("%i" , leap(r));
}

treść zadania: Według kalendarza gregoriańskiego przestępne są lata podzielne przez 4 z wyjątkiem lat podzielnych przez 100 ale niepodzielnych przez 400. Napisz funkcję leap, która przyjmuje rok i zwraca prawdę jeśli jest on przestępny albo fałsz w przeciwnym razie. Korzystając z tej funkcji napisz program leap, który czytuje ze standardowego wejścia rok i wypisuje na standardowe wyjście true jeśli jest on przestępny albo false w przeciwnym wypadku.

2

Masz w kodzie UB, funkcja leap nic nie zwraca, pomimo, że powinna.

0

Dlaczego leap zwraca int skoro tylko wypisuje? Poza tym miałeś zrobić tak żeby leap zwracała true / false i obsłużyć to w programie.

0

Problem polega na tym, że Ty wypisujesz true/false, a ich nie zwracasz. W ten sposób tego programu na pewno nie oddasz ;)

Po uwzględnieniu powyższych uwag (zwracanie bool, który daje true/false) powinieneś zrobić tak

bool leap(int rok){
    if(rok%4==0) {
        if(rok%100==0 && rok%400!=0){
              return true;
        } 
        else {
            return false;
        }
    } 
    else {
        return false;
    }
}

Dodatkowo Twoje ify można uprościć, ale to już raczej zadanie dla Ciebie. Polecam poczytać dowolny kurs c++, nawet ten o tutaj:
http://www.cplusplus.com/doc/tutorial/
http://www.cplusplus.com/doc/tutorial/functions/

1

To zadziwiające, jak ludzie potrafią skomplikować prosty kod:

bool
leap(int rok)
{
    if (rok % 4 == 0 && rok % 100 != 0 || rok % 400 == 0))
        return true;
    return false;
}

Edit: cała logika tego programu jest zjebana. 1996 jest rokiem przestępnym, a mówisz, że nie jest.

1

Dlaczego program zwraca "true4" (na przykład): http://en.cppreference.com/w/c/io/fprintf:

printf, fprintf, sprintf, snprintf, printf_s, fprintf_s

(...)

Return value

1,2) number of characters transmitted to the output stream or negative value if an output error or an encoding error (for string and character conversion specifiers) occurred
(...)

Podkreśliłem fragment, który, jak myślę, odnosi się do Twojego programu. Należy pamiętać, że prawdopodobnie jest to undefined behaviour, jak napisał @kq (prawdopodobnie, bo ja C i C++ dawno się uczyłem), a wtedy można jedynie domniemywać, skąd taki wynik.

PS. Więc najpierw funkcja "leap" wypisuje odpowiedź ("true"), a następnie zwraca jej długość (czyli "4"). Funkcja "printf" w funkcji "main" dodaje tę czwórkę do standardowego wyjścia, gdzie już siedzi ciąg znaków "true".

1

Cały kod jeszcze raz, bo autorowi się wszystko tak miesza, że dramat:

#include <stdbool.h>
#include <stdio.h>
#include <math.h>

static bool
leap(int year)
{
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
        return (true);
    return (false);
}

int
main()
{
    int year;

    scanf("%d" , &year);
    printf("Rok %s przestępny\n", leap(year) ? "jest" : "nie jest");
    return (0);
}
0
kapojot napisał(a):

Cały kod jeszcze raz, bo autorowi się wszystko tak miesza, że dramat:

#include <stdbool.h>
#include <stdio.h>
#include <math.h>

static bool
leap(int year)
{
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
        return (true);
    return (false);
}

int
main()
{
    int year;

    scanf("%d" , &year);
    printf("Rok %s przestępny\n", leap(year) ? "jest" : "nie jest");
    return (0);
}

Dzięki działa tylko printf jakiego potrzebowałem powinien wyglądać tak

printf(leap(year) ? "true" : "false");

dlatego mam pytanie czy ? "x" : "y" to jakiś rodzaj if-a odnoszącego się do poprzedzającej funkcji?
no i przepraszam za moją niewiedzę, jestem początkujący a to jest chyba mój 5 kod który próbuję napisać

1
Zizoko napisał(a):

(...)
dlatego mam pytanie czy ? "x" : "y" to jakiś rodzaj if-a odnoszącego się do poprzedzającej funkcji?
no i przepraszam za moją niewiedzę, jestem początkujący a to jest chyba mój 5 kod który próbuję napisać

Jest to (w wolnym tłumaczeniu) operator warunkowy, czyli w sumie "rodzaj ifa", http://en.cppreference.com/w/cpp/language/operator_other#Conditional_operator

1 użytkowników online, w tym zalogowanych: 0, gości: 1