[c++] test funkcji

Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[c++] test funkcji

Post autor: alchem »

Mam napisać funkcje, która sprawdza czy pierwszy ułamek jest mniejszy od drugiego,
Mam podany przykładowy test do przejścia:

Kod: Zaznacz cały

auto test_mniejsze(void) -> void
  {
  assert(mniejsze( 1, 3, 1, 2));
  assert(mniejsze(-1,-3,-1,-2));
  assert(mniejsze(-1, 2, 1, 3));
  assert(mniejsze(-1, 2,-1,-3));
  assert(mniejsze( 1,-2, 1, 3));
  assert(mniejsze( 1,-2,-1,-3));
  }
Tylko że nie wiem jak ta funkcja działa ani na czym polega ten test, gdzie taki kod trzeba umieścić itd....
Może ktoś mi przybliżyć na czym to polega?
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

[c++] test funkcji

Post autor: lukequaint »

Styl wygląda znajomo, być może mijamy się na korytarzu ;-).

Zadanie
Masz napisać funkcję

Kod: Zaznacz cały

auto mniejsze(int a, int b, int c, int d) -> bool;
Która zwraca wartość true, gdy \(\displaystyle{ \frac{a}{b} < \frac{c}{d}}\) oraz false w przeciwnym przypadku (no chyba że w innej kolejności podajemy argumenty, ale wydaje mi się, że tylko taka interpretacja pasuje do testów).

Działanie funkcji test_mniejsze
Funkcja test_mniejsze sprawdza jej poprawność poprzez "wywoływanie funkcji" (tak naprawdę jest to makro preprocesora: ) assert.

Działa ona w bardzo prosty sposób:
  • jeśli wartość, którą otrzyma jako argument to true (bądź inna, która konwertuje się do true, np. niezerowa wartość typu int), nic się nie dzieje
  • jeśli jednak przekazana jej zostanie wartość false, przerywa ona działanie programu na wierszu z jej "wywołaniem".
Przykład
W pierwszym wierszu

Kod: Zaznacz cały

assert(mniejsze( 1, 3, 1, 2));
"wywoływana" jest funkcja assert dla wartości zwróconej przez wywołanie funkcji mniejsza dla argumentów 1, 3, 1, 2, czyli sprawdzane jest, czy napisana przez Ciebie funkcja "stwierdzi', że \(\displaystyle{ \frac{1}{3} < \frac{1}{2}}\) (zakładam, że tak ma działać ta funkcja, ale równie dobrze najpierw mogłyby być podawane liczniki, póżniej mianowniki, czyli to wywołanie mogłoby znaczyć \(\displaystyle{ \frac{1}{1}<\frac{3}{2}}\)).

Jeśli napisana przez Ciebie funkcja stwierdzi, że to nieprawda, program się zatrzyma z komunikatem podobnym do poniższego:

Kod: Zaznacz cały

c: c.cpp:10: void test_mniejsze(): Assertion `mniejsze( 1, 3, 1, 2)' failed.
[1]    16404 abort (core dumped)  ./c
Miejsce w kodzie
Funkcja mniejsze powinna być widoczna w funkcji test_mniejsze. Zakładając, że piszesz wszystko w jednym pliku, znaczy to tyle, że:
  • albo powinieneś zdefiniować funkcję mniejsze przed funkcją test_mniejsze
  • albo tylko zadeklarować tę funkcję przed funkcją test_mniejsze, a jej ciało napisać w dowolnym miejscu po tej deklaracji (np. na końcu pliku)
Poza tym powinieneś wywołać funkcję test_mniejsze w funkcji main (lub pośrednio, przez jakąś inną funkcję.

Szkielet programu

Kod: Zaznacz cały

#include <cassert>

// deklaracja funkcji mniejsze, by funkcja ta byla widoczna
// w funkcji test_mniejsze
auto mniejsze(int a, int b, int c, int d) -> bool;

auto test_mniejsze(void) -> void
{
    assert(mniejsze( 1, 3, 1, 2));
    assert(mniejsze(-1,-3,-1,-2));
    assert(mniejsze(-1, 2, 1, 3));
    assert(mniejsze(-1, 2,-1,-3));
    assert(mniejsze( 1,-2, 1, 3));
    assert(mniejsze( 1,-2,-1,-3));
    // dodatkowy test, który sprawdza, czy
    // -1/-3 *nie* jest mniejsze od 1/-2, czyli:
    // -1/-3 >= 1/-2
    // (zwroc uwage na wykrzyknik - logiczna negacje)
    assert(!mniejsze( -1,-3,1,-2));
}

int main()
{
    // wywolujemy test
    test_mniejsze();
    return 0;
}

auto mniejsze(int a, int b, int c, int d) -> bool
{
    // tutaj trzeba wpisac wlasciwy kod funkcji mniejsze
    return false;
}
Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[c++] test funkcji

Post autor: alchem »

Zrobiłem takie coś:

Kod: Zaznacz cały

#include <iostream>
#include <cassert>

using namespace std;


double mniejsze(double l1,double m1,double l2,double m2)
 {
     double a;
     double b;

     if(m1 == 0 || m2 == 0) cout << "w mianowniku nie moze pojawic sie zero" << endl;

     a=l1/m1;
     b=l2/m2;

     if(a<=b)
     bool mniejsze(l1,m1,l2,m2) = true;
     else
     bool mniejsze(l1,m1,l2,m2) = false;
}

 void test_mniejsze(void)
  {
  assert(mniejsze( 1, 3, 1, 2) == true);
  assert(mniejsze(-1,-3,-1,-2) == true);
  assert(mniejsze(-1, 2, 1, 3) == true);
  assert(mniejsze(-1, 2,-1,-3) == true);
  assert(mniejsze( 1,-2, 1, 3) == true);
  assert(mniejsze( 1,-2,-1,-3) == true);
  assert(!mniejsze(-1,-3,1,-2) == false);
  }


int main()

{

    return 0;
}

Ale w 18 linii wywala mi błąd, jeśli zamiast \(\displaystyle{ mniejsze(l1,m1,l2,m2)}\) zrobie \(\displaystyle{ mniejsze}\) błędu nie ma ale programu i tak nie pokazuje komunikatu o błędzie (w 32 linii specjalnie zrobiłem błąd).
W ogólne dobrze użyłem zmiennej\(\displaystyle{ bool}\)?
Nie miałem z nią jeszcze styczności

-- 10 mar 2016, o 13:19 --

Okej w głównej funkcji nie wywołałem

Kod: Zaznacz cały

test_mniejsze();
, teraz program pokazuje błąd.
Tylko że ten błąd to : "Assertion failed: mniejsze (1,3,1,2) == true" a to z tego co mi się wydaje program powinien zapisać jako prawdę.-- 10 mar 2016, o 13:40 --Kombinując doszedłem do wniosku że bool mniejsze = true, przypisuje zmiennej mniejsze wartość true, tak samo jak int m =2;, więc to tak być nie może, pokombinuje dalej.
liu
Użytkownik
Użytkownik
Posty: 1330
Rejestracja: 10 paź 2004, o 13:30
Płeć: Mężczyzna
Lokalizacja: Suchedniów
Pomógł: 104 razy

[c++] test funkcji

Post autor: liu »

Ten kod nie ma sensu. Funkcja mniejsze zwraca w Twoim kodzie typ double (jest zadeklarowana jako

Kod: Zaznacz cały

double mniejsze(...)
a nie bool. Jak sprawisz, zeby zwracała boola, to tego ostatniego ifa możesz zastąpić po prostu przez

Kod: Zaznacz cały

return a <= b;
.

Nie bardzo rozumiem również, co ma oznaczać to:

Kod: Zaznacz cały

bool mniejsze(l1,m1,l2,m2) = true;
Pomijając to, że po lewej stronie masz r-wartość i kompilator zwróci błąd (nawet bez bool), to gdyby to nawet miało zadziałać, to nastąpiło by wywołanie rekurencyjne funkcji \(\displaystyle{ mniejsze}\). Chyba, że w C++ 11 wprowadzono jakąś nowość;)

Twoja funkcja (nawet po poprawieniu zwracanego typu) nie ma również właściwej sygnatury, miała przyjmować liczby całkowite, przyjmuje zmiennoprzecinkowe.

Jak zmienisz sygnaturę na właściwą, to dalej nie będzie działać, bo wejdzie Ci dzielenie całkowite zamiast zmiennoprzecinkowego.

Co prawda sprawdzasz sytuację dzielenia przez zero, ale po wyrzuceniu komunikatu na ekran nic sobie z tego nie robisz, i próbujesz podzielić przez zero. Szczęśliwie na testach nie wyjdzie, bo są mało wyczerpujące.
Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[c++] test funkcji

Post autor: alchem »

Kod: Zaznacz cały

#include <iostream>
#include <cassert>
using namespace std;

bool mniejsze(double l1,double m1,double l2,double m2)
{
     double a;
     double b;



     a=l1/m1;
     b=l2/m2;

     return a<b;

     if(m1 == 0 || m2 == 0)
        a>=b;



}

 void test_mniejsze(void)
  {
  assert(mniejsze( 1, 0, 1, 2));
  assert(mniejsze(-1,-3,-1,-2));
  assert(mniejsze(-1, 2, 1, 3));
  assert(mniejsze(-1, 2,-1,-3));
  assert(mniejsze( 1,-2, 1, 3));
  assert(mniejsze( 1,-2,-1,-3));
  assert(!mniejsze(-1,-3,1,-2));
  }


using namespace std;

int main()
{
    test_mniejsze();

    return 0;
}
Zrobiłem takie coś i o dziwo działa, tylko nie wiem jak zapisać ten warunek z zerem w mianowniku, ponieważ na to co ja zapisałem program nie reaguje.

-- 10 mar 2016, o 20:19 --

Analizując kod

Kod: Zaznacz cały

if(m1 == 0 || m2 == 0)
        a>=b;
wpisałem przed

Kod: Zaznacz cały

return a<b
i teraz nawet z zerem kod sobie radzi.-- 10 mar 2016, o 20:35 --Tylko pytanie, można zrobić coś aby program zanim się wywali pokazał komunikat że w mianowniku wystąpiło zero?
ODPOWIEDZ