• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zamiana string na int - zmniejsza o jedną jednostkę

0 głosów
481 wizyt
pytanie zadane 9 marca 2020 w C i C++ przez TheFandorn Nowicjusz (140 p.)

Cześć, napisałem sobie funkcję zamieniającą wczytanie z pliku stringi na inty. Program wczytuje z pliku linię i po jednej liczbie (jedności, dziesiątki, setki itd...) zamienia stringa na inta przez dodawanie właśnie tych liczb podniesionych przez notacje wykładniczą do odpowiedniej potęgi.

Problem polega na tym, że w liczbach o długości powyżej dwóch cyfr program ucina jedności.

Na przykład plik zawiera liczby:
6
66
666

Program wtedy zwraca:
6
66
665

Nie mogę znaleźć przyczyny. Da radę ktoś to rozszyfrować? Z góry dzięki - kod poniżej

#include <iostream>
#include <fstream>
#include <string>
#include <math.h>

using namespace std;

int main()
{
    fstream plik;

    plik.open("test.txt");
    string linia;
    int l;

    do
    {
        getline(plik,linia);

            int n=0;
            for(int a=0; a<linia.size(); a++)
            {
                if(a!=0)
                    l = l + (linia[linia.size()-1-a]-48)*pow(10,n) ;
                else
                    l = (linia[linia.size()-1-a]-48);

                    n++;
            }

            cout << endl;
            cout << l << endl;

    }while(!plik.eof());
}

 

komentarz 9 marca 2020 przez TheFandorn Nowicjusz (140 p.)
przy podaniu w pliku liczby "666666666" kolejne powtórzenia pętli wyglądają następująco

6
66
665
6665
66664
666664
6666664
66666663
666666662

2 odpowiedzi

0 głosów
odpowiedź 9 marca 2020 przez Great Stary wyjadacz (12,660 p.)
edycja 9 marca 2020 przez Great

Nie wiem czemu Twój kod nie działa, ale możesz uprościć kod i pozbyć funkcji pow:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    fstream plik("test.txt");
    string linia;
    int liczba = 0;

    while (getline(plik, linia));
    {
        for (size_t a = 0; a < linia.size(); a++)
        {
            liczba = liczba * 10 + (linia[a] - '0');
        }

        cout << endl << liczba << endl;
    } 
}

PS. std::stoi

komentarz 9 marca 2020 przez TheFandorn Nowicjusz (140 p.)
wiem o istnieniu std::stoi, ale chodziło mi o napisanie tego "ręcznie". Dzięki, Twoja wersja działa, ale czemu moja nie nadal pozostaje zagadką. Ktoś wie?
1
komentarz 9 marca 2020 przez TheFandorn Nowicjusz (140 p.)

@Great, jednak nie działa, powinno być liczba = liczba * 10 + (linia[a] - '0');

0 głosów
odpowiedź 9 marca 2020 przez Aisekai Nałogowiec (42,190 p.)
Zakładam, że błąd prawdopodobnie wynika z tego, że:

1. Pow nie zwraca Ci dokładnej wartości, ze względu na fakt że funkcja obsługuje zarówno typu double (double^double nie policzysz tak łatwo jak int^int)

2. Ze względu na system binarny, zlstaje zwrócony przybliżony wynik, który potem zostaje obcięty ze względu że zmienna jest typu int.

Wywal pow, zastosuj zwykle mnożenie *10.
komentarz 9 marca 2020 przez TheFandorn Nowicjusz (140 p.)
tak zrobiłem, dzięki. Szkoda, że ta funkcja jest w taki sposób """upośledzona""", bo to bardzo ukraca jej funkcjonalność. Pamiętam, że kiedyś mialem z nią podobny problem
komentarz 9 marca 2020 przez Aisekai Nałogowiec (42,190 p.)
Nie jest upośledzona, tylko to wynika z dwóch faktów. Po pierwsze z reprezentacji binarnej, po drugie algorytmów do liczenia (a raczej przybliżania wartości) pierwiastków/potęg. Funkcjonalności też nie ukraca, bo robi to co powinna tylko z niewielkim błędem (prawdopodobnie jakbyś zmienił sobie z typu int na double, to na końcu zamiast 666666662, otrzymałbyś wynik 666666665.9999997 albo zbliżony do niego).

Podobne pytania

+1 głos
2 odpowiedzi 360 wizyt
0 głosów
0 odpowiedzi 1,527 wizyt
0 głosów
1 odpowiedź 1,367 wizyt
pytanie zadane 25 listopada 2020 w C i C++ przez rinsu Nowicjusz (170 p.)

93,604 zapytań

142,529 odpowiedzi

322,997 komentarzy

63,092 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...