[c++] test funkcji/pobranie linii tekstu

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/pobranie linii tekstu

Post autor: alchem »

Mam napisać funkcję testująca dla planu spłaty kredytu.
Kod wygląda tak:

Kod: Zaznacz cały

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

std::string napis (float k, float r, float R, int dzien, int miesiac, int rok);

void test_napis(void)
{

 assert(napis(123, 0.01, 1, 10, 10, 2000) == "Takiego kredytu to Ty nigdy nie splacisz!");

}


int main()
{
    test_napis();
    float wys_kredytu, stopa_pro, wys_splaty;
    int dzien, miesiac, rok;
    std::cout << "Podaj wysokosc kredytu: ";
    std::cin  >> wys_kredytu;
    std::cout << "Podaj wysokosci rocznej stopy procentowej "<<std::endl;
    std::cout << "(np dla 3 % wpisz '0.03'): ";
    std::cin  >> stopa_pro;
    std::cout << "Podaj w jakiej kwocie rocznej bedziesz splacal kredyt: ";
    std::cin  >> wys_splaty;
    std::cout << "Podaj date wziecia kredytu"<<std::endl;
    std::cout << "(dd mm rrrr): ";
    std::cin  >> dzien >> miesiac >> rok;
    std::cout << napis (wys_kredytu, stopa_pro, wys_splaty, dzien, miesiac, rok);


    return EXIT_SUCCESS;
}


std::string napis (float k, float r, float R, int dzien, int miesiac, int rok)
{

 k = k*(1+r);
 int i = 0;

 while(k > 0)
 {
   i++;
   if(k - R > k/(1+r))
     {
      return "Takiego kredytu to Ty nigdy nie splacisz!";
     }
   if(k > 0)
          std::cout << "Zadluzenie na dzien: "<<dzien<<"."<< miesiac << "." << rok+i<<" wynosi: "  << k << std::endl;
   if(k >= R )
          std::cout << "Placisz: " << R <<"zl" << std::endl<< std::endl;
   else
          std::cout << "Placisz: " << k <<"zl" << std::endl<< std::endl;

   k = k*(1+r) - R;

 }
  std::cout << "Splaciles wlasnie kredyt!" << std::endl<< std::endl;


return "???????";

}









Nie wiem jednak jak mogę napisać test kiedy kredyt da się spłacić, wtedy funkcja generuje kilka/kilkanaście linii tekstu, myślałem o tablicach typu string, ale to chyba słaby pomysł?
Ma ktoś jakiś pomysł?
Ostatnio zmieniony 28 kwie 2016, o 19:55 przez alchem, łącznie zmieniany 1 raz.
xxmikolajx
Użytkownik
Użytkownik
Posty: 57
Rejestracja: 9 paź 2013, o 21:26
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 28 razy
Pomógł: 1 raz

[c++] test funkcji/pobranie linii tekstu

Post autor: xxmikolajx »

co znaczy, że kredyt da się spłacić?
i co ma robić funkcja testująca? (specyfikacja)
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/pobranie linii tekstu

Post autor: alchem »

Jeśli po spłacie pierwszej raty pozostała kwota do spłacenia będzie wyższa, równa od tej, którą pożyczyliśmy to nigdy go nie spłacimy.

Napisz funkcję, która obliczy napis będący rozpisaniem planu wpłat dla zadanego zadłużenia K, stopy r i raty R. Rozpoznaj sytuację, w której wybrana rata R nie wystarczy do spłaty zadłużenia. Napisz funkcję testującą wygenerowany napis.


Mój napis wygląda mniej więcej tak:


Zadłużenie na dzien 10.10.2001 150 zl
Placisz : 50zl

Zadłużenie na dzien 10.10.2002 110 zl
Placisz : 50zl

.
.
.
Zadłużenie na dzien 10.10.200x 10 zl
Placisz : 10zl

Splaciles wlasnie kredyt!


Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[c++] test funkcji/pobranie linii tekstu

Post autor: Afish »

Zamiast wypisywać bezpośrednio przygotuj najpierw wielki string i zwróć go z funkcji, a wypisz piętro wyżej. Potem w funkcji testującej sprawdzisz cały string.
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/pobranie linii tekstu

Post autor: alchem »

Myślałem o takim 'stringu' ale pojawia się problem jak tam umieścić

Kod: Zaznacz cały

std::cout << "Zadluzenie na dzien: "<<dzien<<"."<< miesiac << "." << rok+i<<" wynosi: "  << k << std::endl;
bo nie mogę sobie tego tak poprostu dopisać do stringu bo wystepuja tam zmienne interaktywne (jeśli można tak to nazwać), do wrzucenia tego nie będzie służyło czasem c_str();??
Używałem to kiedy chciałem podać w konsoli nazwę pliku do otwarcia tzn

Kod: Zaznacz cały

std::ifstream plik (nazwa_pliku.c_str());
Ale nawet jeśli tak to chyba nie za bardzo wiem jak go użyć.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[c++] test funkcji/pobranie linii tekstu

Post autor: Afish »

Użyj stringstreama: ... -tutorial/
A jak nie rozumiesz jakiejś metody, to szukaj w dokumentacji: ... ring/c_str
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/pobranie linii tekstu

Post autor: alchem »

[Edit]

-- 30 kwi 2016, o 20:43 --

Już wiem jak to zrobić, tzn :

Kod: Zaznacz cały

 
   stringstream ss;
    int a = 23;

    ss << 1234 << "tak " << a;
    std::string lol = ss.str();
    std::cout << lol << " tekst";
Tylko dlaczego w moim programie wywala mi błąd??
aggregate 'std::stringstream ss' has incomplete type and cannot be defined

Kod: Zaznacz cały

std::string napis (float k, float r, float R, int dzien, int miesiac, int rok)
{
 std::string liscik;
 k = k*(1+r);
 int i = 0;
 while(k > 0)
 {
   i++;
   if(k - R > k/(1+r))
     {
      return "Takiego kredytu to Ty nigdy nie splacisz!";
     }


   if(k > 0)
        {

          liscik = "Zadluzenie na dzien: ";
          std::stringstream ss;
          ss << dzien;
          liscik = liscik + ss.str();




          std::cout << ".";
          std::cout << miesiac;
          std::cout << ".";
          std::cout << rok+i;
          std::cout << " wynosi: ";
          std::cout << k;
          std::cout << ". " << std::endl;
       }



   if(k >= R )
          std::cout << "Placisz: " << R <<"zl" << std::endl<< std::endl;
   else
          std::cout << "Placisz: " << k <<"zl" << std::endl<< std::endl;
   k = k*(1+r) - R;
 }
  std::cout << "Splaciles wlasnie kredyt!" << std::endl<< std::endl;

return liscik;
}
-- 1 maja 2016, o 11:05 --

Problem rozwiązany.
ODPOWIEDZ