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: #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. |
|
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ć |
|
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. |
|
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... |
|
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. |
|
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ę. |
|
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. |
|
Monika90 |
» 2015-01-03 17:08:03 void wczytywanie( string a, string b, char c );
przkazuj przez refencje, czyli tak void wczytywanie( string & a, string & b, char & c );
Albo zwróć z funkcji krotkę, czyli tak: tuple < string, string, char > wczytywanie();
|
|
« 1 » 2 |