Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] zwracanie wartości przez funkcję

Ostatnio zmodyfikowano 2015-01-03 22:17
Autor Wiadomość
dott94
Temat założony przez niniejszego użytkownika
[C++] zwracanie wartości przez funkcję
» 2015-01-03 16:03:49
witam. Tworzę program, którego zadaniem jest dodawanie i odejmowanie liczb o dowolnej wielkości i dowolnej dokładności, liczby wczytywane są z zewnętrznego pliku tekstowego. Postanowiłem te działania wykonać z użyciem łańcuchów znaków string, ale natrafiam na pewne problemy... tak wygląda ten problematyczny fragment kodu:
C/C++
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<string>
#include<sstream>
using namespace std;

void wczytywanie( string a, string b, char c );
// (...)
int main()
{
    string liczba1, liczba2;
    char znak;
    wczytywanie( liczba1, liczba2, znak );
    // (...)
}
void wczytywanie( string a, string b, char c )
{
    fstream plik;
    char file_name[ 100 ];
    cout << "Podaj nazwe pliku: ";
    cin >> file_name;
    plik.open( file_name, ios::in );
    if( !plik ) { cout << "Nieudane otwarcie pliku " << file_name;
        exit( 1 ); }
    system( "cls" );
    plik >> a >> b >> c;
    if( c == '+' ) { cout << "DODAWANIE" << endl; cout << "---------" << endl; }
    else { cout << "ODEJMOWANIE" << endl; cout << "-----------" << endl; }
    cout << "  " << a << endl;
    cout << c << " " << b << endl;
    plik.close();
}
moim problemem jest to, że po wczytaniu danych z pliku, chciałbym, aby one dalej w programie funkcjonowały jako zmienne "liczba1", "liczba2" itd. (ponieważ, żeby policzyć to chcę podzielić wczytaną liczbę [w pliku wygląda to tak np. 11111.1111] na część całkowitą i część ułamkową, a następnie każde z nich dodać/odjąć "pisemnie" i znów połączyć w jednego stringa... co robię nie tak? źle deklaruję funkcję "wczytywanie"? jakieś wskazówki? z góry dzięki za pomoc.
P-123936
dott94
Temat założony przez niniejszego użytkownika
» 2015-01-03 16:06:11
tak dla ścisłości przykładowy wygląd pliku tekstowego:

xxxxx.xxxxx //pierwsza liczba
yyyyyy.yyyyy //druga liczba
+ //znak działania, które chcę wykonać
P-123937
lectre
» 2015-01-03 16:19:47
Po pierwsze stwórz sobie zmienne typu zmiennoprzecinkowego np float. Funkcją afof() możesz "przenieść" liczbę ze stringu do zmiennej liczbowej.

Co do obliczania z dokładnością, w googlach jest bardzo dużo na ten temat. Wykorzystaj operator modulo.
P-123940
dott94
Temat założony przez niniejszego użytkownika
» 2015-01-03 16:25:43
a co gdy użytkownik w pliku poda liczbę wychodzącą poza ramy float'ów, itp. ? liczby mogą mieć przecież dowolną liczbę cyfr zarówno przed przecinkiem, jak i za nim...
P-123941
GolemXIV
» 2015-01-03 17:02:40

a co gdy użytkownik w pliku poda liczbę wychodzącą poza ramy float'ów, itp. ?

To jest oczywiście kwestia decyzji na temat wymagań funkcjonalnych, ale zawsze musisz się liczyć z ograniczeniami. A co zrobisz, jak plik będzie miał cztery gigabajty cyfr i go nie wczytasz?

Taki na przykład typ double ma zakres 1.7e+/-308. Największą liczbę, jaką potrafię nazwać jest gugol. 1e60. Trochę mniej, niż zakres double. Dokładność double i long double też daje radę.

Nie żebym zniechęcał. Ćwiczenie z arytmetyką "pod kreskę" jest całkiem ciekawe samo w sobie, i może doprowadzić do interesujących rozwiązań algorytmicznych.

---------

A w przykładzie - pewnie chciałbyś zwrócić wartość parametrów "a" i "b". Referencja albo wskaźnik się przyda.
P-123948
lectre
» 2015-01-03 17:03:29
Jeśli chodzi o to co jest po przecinku, to użyj long double (o ile twój kompilator zareaguje na specyfikator long w stosunku do double). A jeśli nie, samo double. Wyjdzie na jedno. Tutaj cyfr po przecinku jest więcej. A jeśli taka dokładność to dla ciebie nadal za mało no to pomyśl jak chcesz to rozwiązać. Albo wyświetlić jakąś informację o dokładności, albo zaokrąglić, no masz już wolną rękę.
P-123949
Kaikso
» 2015-01-03 17:05:30
Nie lepiej stworzyć klasę typu dynamicznego i przeciążyć operatory, a dane możesz przetrzymywać w tablicy
unsigned char
. Na dodatek możesz wykorzystać literały do umieszczania takich liczb w kodzie. A i możesz stworzyć metodę wczytującą liczbę w postaci tekstu.
P-123950
Monika90
» 2015-01-03 17:08:03
C/C++
void wczytywanie( string a, string b, char c );
przkazuj przez refencje, czyli tak

C/C++
void wczytywanie( string & a, string & b, char & c );

Albo zwróć z funkcji krotkę, czyli tak:
C/C++
tuple < string, string, char > wczytywanie();
P-123951
« 1 » 2
  Strona 1 z 2 Następna strona