• 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ę

VPS Starter Arubacloud
0 głosów
215 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,300 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 182 wizyt
0 głosów
0 odpowiedzi 1,078 wizyt
0 głosów
1 odpowiedź 593 wizyt
pytanie zadane 25 listopada 2020 w C i C++ przez rinsu Nowicjusz (170 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...