Autor Wątek: Funkcja zwracajaca wartosc, problem poczatkujacego.  (Przeczytany 1473 razy)

Offline _user

  • Użytkownik

# Marzec 13, 2015, 23:20:03
Czesc wszystkim

Jestem w trakcie internetowego kursu c++ i zatrzymalem sie na koncu jednego tematu, nie wiem, cos musialem przegapic albo nie wiem, stanalem w jednym punkcie i nie wiem jak dalej pojsc, dlatego skierowalem sie tu po pomoc, a mianowicie, potrzebuje zrobic dwie rzeczy:

1.Napisac funkcję, która będzie wczytywała liczby ze standardowego wejścia i zwracała wczytaną wartość. Funkcja ma zagwarantować, że zwracana liczba zawsze jest poprawna. Oznacza to, że funkcja będzie musiała pytać użytkownika o wprowadzenie liczby dopóki nie poda poprawnej.

napisalem program ktory wczytuje liczby a potem je wypisuje, ale jak zabezpieczyc przed niechcianymi ? przed ulamkowymi albo slowami ?

2.Zmodyfikowac wczesniej zrobiony przeze mnie kalkulator tak zeby uzywal funkcji... A oto moj stary kalkulator:

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
  int wybor;
  do
  {
  cout << " --Kalkulator-- " << endl;
  cout << "|==============|" << endl;
  cout << "|Dodawanie[1]  |" << endl;
  cout << "|Odejmowanie[2]|" << endl;
  cout << "|Mnozenie[3]   |" << endl;
  cout << "|Dzielenie[4]  |" << endl;
  cout << "|              |" << endl;
  cout << "|Wyjscie[0]    |" << endl;
  cout << "|==============|" << endl;
  cout << "Wybor: ";
  cin >> wybor;
 
 if(wybor == 0 )
    {
      cout << "Koniec" << endl;
      return 0;
    }
 
    switch(wybor)
      {
    case 1:
      {
    double a1, a2;
      cout << "Podaj pierwsza liczbe: ";
      cin >> a1;
      cout << "Podaj druga liczbe: ";
      cin >> a2;
      cout << "Wynik to: " << a1 + a2 << endl;
      break;
           }
      case 2:
    {
    double b1, b2;
    cout << "Podaj pierwsza liczbe: ";
    cin >> b1;
    cout << "Podaj druga liczbe: ";
    cin >> b2;
    cout << "Wynik to: " << b1 - b2 << endl;
      break;
      }
      case 3:
    {
    double c1, c2;
    cout << "Podaj pierwsza liczbe: ";
    cin >> c1;
    cout << "Podaj druga liczbe: ";
    cin >> c2;
    cout << "Wynik to: " << c1 * c2 << endl;
        break;
      }
 case 4:
   {
   double d1, d2;
   cout << "Podaj pierwsza liczbe: ";
   cin >> d1;
   cout << "Podaj druga liczbe: " << endl;
   cin >> d2;
   if(d1 == 0 || d2 ==0)
     {
       cout << "Probujesz podzielic zero albo przez zero..." << endl;
       break;
     }
   else;
   {
     cout << "Wynik to: " << d1 / d2 << endl;
     break;
 
   }
   }
      }
  }while(wybor > 4 && wybor != 0);
}


Tak zeby uzywal takiej funkcji:
#include <iostream>
int wczytajLiczbe()
{
    //TODO: tu Twój kod
}
 
int main()
{
    std::cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    std::cout << "Podales liczbe: " << liczba << std::endl;
    return 0;
}


No to na tym sie juz calkowicie zatrzymalem, nie wiem jak to zrobic, probowalem ale ciagle errory przy debugowaniu i wgl ;c Licze na jakies wasze naprowadzenie mnie zebym mogl ruszyc dalej juz z tym kursem.

pozdrawiam :)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xender

  • Użytkownik

# Marzec 14, 2015, 00:48:57
Rozważ, czy warto uczyć się C++ na początku zabawy z programowaniem.
Alternatywa: https://docs.python.org/3/tutorial/

Kod: (C++) [Zaznacz]
int wczytajLiczbe()
{
    int num;
    std::cin >> num;
    return num;
}


Najlepiej nie zabezpieczać programu przed złym wejściem.
Nie na tym etapie tutoriala.
Samo w sobie nie jest to trywialne, a API C++-owej biblioteki iostream nie należy wcale do najprzyjemniejszych.
No i najważniejsze - nie posunie Cię to do przodu z tym, co jest ważne w programowaniu.

Uwaga estetyczna:
Przepuść swój kod przez autoformatter.
Jeśli używasz IDE jak Code::Blocks czy Eclipse (czy Dev-C++ - wtedy najpierw przesiądź się na Code::Blocks), to jest gdzieś w menu, jeśli używasz terminala, to użyj np. astyle.
Zobacz, jaka jest czytelność kodu przed i po.
Wraz z wprawą nauczysz się pisać czytelny kod (taki, który estetycznie podoba się Tobie i jest akceptowany przez innych) bez pomocy autoformattera.

Na wstępie wspomniałem w Pythonie.
Wprawdzie sam zaczynałem programowanie od C++, ale nie sądzę, że to najlepszy wybór na start.
Python zarówno ma opinię przyjaznego dla nowicjuszy (dla porównania: C++ jest najeżony pułapkami), jak i jest językiem popularnym, współczesnym i dającym spore możliwości.
To nie tak, że któryś język jest lepszy. Oba mają swoje zastosowania.
I tak żeby być dobrym programistą, musisz dość dobrze poznać więcej, niż jeden (i pewnie więcej, niż dwa).
Kolejność dowolna, ale może utrudnić lub ułatwić Ci drogę.

Powodzenia. :)

Offline wozix

  • Użytkownik

# Marzec 14, 2015, 00:51:23
Osobiście użyłbym poczciwego "scanf". Dla Ciebie może wydawać się toporne w porównaniu do strumieni, ale jest naprawdę przydatne.
W skrócie i na tacy:
scanf zwraca liczbę większą od zera (co dokładnie oznacza to już sobie doczytaj, bo to istotne) jeśli odczyt się powiódł. Wygląda ona z grubsza tak:
int scanf(const * char format, T* varA)przykładowo możesz użyć tego tak:
int a;
int result = scanf("%d", &a );
if(result == 1)
{
 cout << "dane poprawne";
}
else
{
 cout << "dane bledne";
}
Co to wszystko oznacza odnajdziesz w dokumentacji, na przykład tutaj: http://www.cplusplus.com/reference/cstdio/scanf/
Jak czegoś nie rozumiesz to pytaj, chętnie pomogę.

EDIT:
Oczywiście samo to nie rozwiązuje wszystkich problemów, bo choćby chcąc dostać integera i wpisując "2.5" w zmiennej dostaniesz "2" i nie będzie żadnego błędu. Tak jak już Xender mówił - to wcale takie trywialne nie jest, a szczególnie dla początkującego.
« Ostatnia zmiana: Marzec 14, 2015, 00:58:47 wysłana przez wozix »

Offline _user

  • Użytkownik

# Marzec 14, 2015, 00:58:30
@wozix - Wiele nie zrozumialem, oprocz samego conf nie rozumiem tez argumentow ktore mu dales w nawiasach, a nie chce sie teraz tego uczyc, moze bedzie to poruszone w kursie jak nie to sie dowiem tego po nim, narazie chce tylko brnac przez niego i przyswajac material tylko stamtad, zeby za duzo nie bylo ;p
Takze zapraszam do pomocy z tymi funkcjami w kalkulatorze

Offline wozix

  • Użytkownik

# Marzec 14, 2015, 01:01:37
@wozix - Wiele nie zrozumialem, oprocz samego conf nie rozumiem tez argumentow ktore mu dales w nawiasach, a nie chce sie teraz tego uczyc, moze bedzie to poruszone w kursie jak nie to sie dowiem tego po nim, narazie chce tylko brnac przez niego i przyswajac material tylko stamtad, zeby za duzo nie bylo ;p
Takze zapraszam do pomocy z tymi funkcjami w kalkulatorze
Wyrażenie "%d" jest typu "const *char", wyrażenie &a jest typu "int*". Żeby to ogarnąć trzeba wiedzieć czym są wskaźniki i dobrze by było wiedzieć czym są referencje. "T" w zapisie oznacza pewną dowolność, może to być double, float, char, int, etc.
Co do modyfikacji programu... To na pewno było w tutorialu, więc gotowca Ci nie dam. Ewentualnie pokaż co masz i co nie działa.

Offline aphity

  • Użytkownik

# Marzec 14, 2015, 01:05:46
Probowales sam ja napisac, czy od razu stwierdziles ze nie wiesz od czego zaczac? Jesli masz juz jakis kod, nawet bledny, to go pokaz - bedziemy mogli wskazac gdzie tkwi problem w Twoim rozumowaniu. Bez tego jedyne co mozemy to napisac to za Ciebie, ale w ten sposob nic sie przeciez nie nauczysz.

Offline _user

  • Użytkownik

# Marzec 14, 2015, 19:13:59
Probowales sam ja napisac, czy od razu stwierdziles ze nie wiesz od czego zaczac? Jesli masz juz jakis kod, nawet bledny, to go pokaz - bedziemy mogli wskazac gdzie tkwi problem w Twoim rozumowaniu. Bez tego jedyne co mozemy to napisac to za Ciebie, ale w ten sposob nic sie przeciez nie nauczysz.

No napisalem ze stanalem w miejscu i nie wiem jak sie ruszyc ;p zgubilem sie

Offline _user

  • Użytkownik

# Marzec 15, 2015, 02:45:53
- przepraszam za double -
Okej, uporalem sie z tematem :)
do zobaczenia przy nastepnym problemie ;d
« Ostatnia zmiana: Marzec 15, 2015, 02:47:31 wysłana przez _user »