Wyświetlenie tekstu przy dwóch wartościach równych 0 - przerobienie funkcji

0

Witam, jak mogę przerobić ten kod żeby przy podaniu 2 wartości jako 0 wyświetlał się napis "operation not permited" dla danego wiersza wynikowego? Konieczne jest wykonanie 4 funkcji "add" "substract" "multiply" "divide" i żadnej innej.

#include <stdio.h>

float add(float a, float b)
{
    float add = a + b;
    return add;
}

float subtract(float a, float b)
{
    float subtract = a - b;
    return subtract;
}

float multiply(float a, float b)
{
    float multiply = a * b;
    return multiply;
}

float divide(float a, float b)
{
    float divide = a / b;

    return divide;
}

int main(void)
{
    int spr = 0;
    float a1 = 0, b1 = 0;
    printf("Podaj pierwsza liczbe: ");

    spr = scanf("%f", &a1);
    if (spr == 0) {
        printf("incorrect input");
        return 1;
    }

    printf("\nPodaj druga liczbe: ");

    spr = scanf("%f", &b1);
    if (spr == 0) {
        printf("incorrect input");
        return 1;
    }

    printf("%f\n%f\n%f\n%f", add(a1, b1), subtract(a1, b1), multiply(a1, b1), divide(a1, b1));

    return 0;
}
0

Użyj pętli do{}while

do{
 wczytujesz wartości zmiennych
}while(pierwszaZmienna==0 || drugaZmienna==0)
2

Sam jesteś dość blisko rozwiązania @Mariusz Daroch. Ale to czego pewnie nie wiesz, to jak scanf się zachowuje w przypadku podania nieprawidłowych danych, np. oczekujesz floata, a dowcipny użytkownik wpisze ci "dupa". Zatem poprawna konstrukcja spełniająca twoje wymagania, i nie dająca się położyć dowcipnisiom wygląda tak:

    do
    {
        printf("Podaj pierwsza liczbe: "); 

        if (scanf("%f", &a1) == 0) 
        {
            //pic polega na tym, że scanf kiedy nie może przekonwertować zawartości stdin na podany typ owszem zwraca 0, ALE NIE CZYŚCI BUFORA, i przy kolejnym przejściu pętli znowu próbuje skonwertować, znowu oczywiście mu się to nie udaje, i tak w koło Macieju.
            printf("Niepoprawne dane, oczekiwano liczby!\n");
            int c;
            while ((c = getchar()) != '\n' && c != EOF);//dlatego bufor stdin trzeba wyczyścić samemu, a najlepiej pogóglać za alternatywami dla scanf.
            continue;
        }
        if (a1 == 0)
        {
            printf("Liczba nie moze byc zerem!\n");
        }
    }
    while (a1 == 0);

nie od rzeczy byłoby sobie to opakować w funkcję float getNumber(const char *promptForNumber);

3

raczej chodziło o coś innego i prostszego:

printf("%f\n%f\n%f\n", add(a1, b1), subtract(a1, b1), multiply(a1, b1));
if (b1 != 0) {
    printf("%f\n", divide(a1, b1));
} else {
    printf("operation not permited\n");
}
0

MarekR22 dokładnie o to chodziło, jak wiadomo proste rozwiązania nie przychodzą do głowy tak łatwo

0

Niestety nawet jeśli b1==0 to i tak musi zostać wywołana funkcja divide która zwróci "operation not permitted", program w formie jaką posiadam działa jednak to są testy automatyczne sprawdzane przez system :/

0

Wątpię by automat sprawdzał jaką funkcję wywołałeś.
Jeśli sędzia dostępny jest publicznie to zapodaj linka, będzie bardziej jasne jaki masz problem (albo wklej dokładną teść zadania).

0

Właśnie system jest dość skrupulatny co utrudnia trochę, wszystko jest w załączniku.

2

Ok widzę, że sprawdzarka sama też wywołuje twoje funkcje.
W treści zadanie jest opisane co powinna fukcja zrobić.
Mało tego sędzia wyraźnie ci mówi co masz źle i łątwo zrozumieć co trzeba poprawić:

Przepuszczone przez OCR i poprawione:

### Testy jednostkowe ###
TEST_1: Sprawdzanie poprawności działania funkcji add

#####START##########END#####
Wynik: SUKCES

TEST_2: Sprawdzanie poprawności działania funkcji subtract
#####START##########END#####
Wynik: SUKCES

TEST_3: Sprawdzanie poprawności działania funkcji multiply
#####START##########END#####
Wynik: SUKCES

TEST_4: Sprawdzanie poprawności działania funkcji divide
#####START##########END#####
Wynik: PORAŻKA: Funkcja divide() powinna zwrócić -1, a zwróciła -inf:
     Sprawdź funkcję testującą TEST4(vcid) z pliku unit_test_v2.c, w linii 187
Wynik: PORAŻKA: Funkcja divide() powinna zwrócić -1, a zwróciła -nan
     Sprawdź funkcję testującą TEST4(vcdcp z pliku unit_test_v2.c, w linii 193

### RLDebug :: Analiza wycieku zasobów ###
Wszystkie bloki pamięci zostały pomyślnie zwolnione - brak wycieków.
Wszystkie pliki zostały zamknięte.
Nie wykryto uszkodzenia sterty.

### Podsumowanie ###
   Testy dostępne: 4 (AVAIL)
         Wykonane: 5 (DONE)
   Testy poprawne: 3 (PASSED)
Testy niepoprawne: 2 (FAILED)
      Ostrzeżenia: 0 (WARNINGS)
  Wycieki zasobów: 0 (LEAKS)

Pogram zakończony; kod bledu=0 (Ok)
Test został przerwany; TESTY: Nie wszystkie testy zostały uruchomione (avail != done)

Czyli przy TEST_4 masz wypisane dokładnie co jest źle. Nie rozumiem, czemu masz z tym problem.
Kwestia dopisania jednego if-a.

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