Suma cyfr C++

K8
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:9
0

Mam takie oto zadanie:
Dla każdej liczby z pliku liczby.txt oblicz sumę jej cyfr. Podaj wszystkie liczby, których suma cyfr jest większa od 30, w kolejności, w jakiej występują w tym pliku. Ponadto podaj sumę wszystkich cyfr użytych do zapisu wszystkich liczb z pliku liczby.txt
Czy jest w stanie ktoś pomóc? Przynajmniej zliczaniem sumy cyfr za pomocą podstawowych funkcji, męczę się i nic nie wychodzi.

K8
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:9
0

Zrobiłem takie coś, żeby policzyć samą sumę cyfr wszystkich liczb, wyskakuje błąd w linii 16.

Kopiuj
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char** argv) 
{
	string liczba;
	int wynik = 0;
	ofstream file;
	ifstream wyniki5;
	wyniki5.open("wyniki5.txt");
	file.open("liczby.txt");
while (!file.eof())
{
	file>>liczba;
while (liczba > 0)
	{
	wynik += liczba%10;
	liczba /= 10;
	}
}
wyniki5<< "Suma cyfr podanej liczby wynosi: " << wynik;
wyniki5.close();
liczby.close();
	return 0;
}
edytowany 1x, ostatnio: kq
P1
Używaj klamer oznaczających kod. W prawym górnym rogu jest możliwość wstawienia kodu. Pozdraiwam
Tasmanian Devil
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.9998594)
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:3 miesiące
  • Postów:179
0

Witam.

Jeżeli masz jakiś kod to go wklej. Łatwiej będzię pomóc.
Również przykładowy wygląd takiego pliku liczby.txt to było by super.
Masz kod który pozwoli ci przekształcić tekst na liczbę. *Jeżeli ktoś będzie miał zastrzeżenia do mojego kodu to proszę pisać śmiało. Sam chętnie zobaczę *

Kopiuj
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    int suma=0;
    string tekst;
    cin>>tekst;
    suma=(int)log10(atoi(tekst.c_str()))+1;
    cout<<suma<<endl;
    return 0;
}

Życzę miłego dnia.

edytowany 1x, ostatnio: pestka12
Zobacz pozostałe 4 komentarze
P1
kq
Bo to nie ma sensu? Suma cyfr 100 i 999 to odpowiednio 1 i 27, a nie 2 i 2
P1
Ja tego systemu używam do wyliczania ilości liczb z inta i działa.
kq
Spoko, ale wiesz że "liczba" i "suma" to różne słowa o różnym znaczeniu?
P1
Wiem. Nie do końca wiedziałem o co chodzi. Dopiero jak plik zobaczyłem to się skapłem
K8
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:9
0

Tu kod(wyskakuje błąd (file>>liczba;), załączam liczby

Kopiuj
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char** argv) 
{	ofstream file;
	ifstream file2;
	file2.open("wyniki5.txt");
	file.open("liczby.txt");
	string liczba;
	int wynik = 0;
while (!file.eof())
{
	file>>liczba;
while (liczba > 0)
	{
	wynik += liczba%10;
	liczba /= 10;
	}
}
file2<< "Suma cyfr podanej liczby wynosi: " << wynik;
file2.close();
liczby.close();
	return 0;
}
edytowany 3x, ostatnio: Konrad83
kq
używaj ```cpp```
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Szczecin
0

Przesadnie się męczysz. Wczytuj stringa, w nim sumuj cyfry (znak - '0' to wartość cyfry).

Cały program można zmieścić w jednej pętli i kilku linijkach:

Kopiuj
size_t sum_of_digits(std::string const& s)
{
    size ret = 0;
    for(char c : s)
        ret += c - '0';
    return ret;
}

int main()
{
    std::string s;
    size_t total = 0;
    std::ifstream f("plik.txt");
    while(f >> s) {
        size_t this_word = sum_of_digits(s);
        total += this_word;
        if(this_word > 30)
            std::cout << s << '\n';
    }
    std::cout << "total: " << total << '\n';
}

K8
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:9
0
kq napisał(a):

Przesadnie się męczysz. Wczytuj stringa, w nim sumuj cyfry (znak - '0' to wartość cyfry).

Cały program można zmieścić w jednej pętli i kilku linijkach:

Kopiuj
size_t sum_of_digits(std::string const& s)
{
    size ret = 0;
    for(char c : s)
        ret += c - '0';
    return ret;
}

int main()
{
    std::string s;
    size_t total = 0;
    std::ifstream f("plik.txt");
    while(f >> s) {
        size_t this_word = sum_of_digits(s);
        total += this_word;
        if(this_word > 30)
            std::cout << s << '\n';
    }
    std::cout << "total: " << total << '\n';
}

Powiem szczerze, sam coś skubałem z std:: etc. lecz gość nie akceptuje od nas takich rozwiązań, on chce same podstawy, stąd tyle roboty, żeby jakoś inaczej to zrobić.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Szczecin
0

Przecież... nie używam niczego czego sam nie używasz. wtf


K8
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:9
0

Nawet sama linijka 1 to już za dużo, tu leży problem, muszę to napisać bez żadnych udziwnień :(

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Szczecin
0

Użycie funkcji to udziwnienie? :​D


K8
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:9
0
kq napisał(a):

Użycie funkcji to udziwnienie? :​D

Mówiąc z wielkim bólem serca, nie może być użyta przestrzeń nazw :P

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Szczecin
0

Sam używasz.


P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:3 miesiące
  • Postów:179
0

Ach typowe zadanie ze szkoły. Wręcz śmieszne że chcą ograniczać ucznia. No ale cóż poradzić takie życie :)

K8
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:9
0
kq napisał(a):

Sam używasz.

Mój błąd, wybacz, zawsze używałem zapisu using namespace std; stąd ten błąd, głupio mi, niestety tak już jest na początkach.

K8
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:9
0

Podsumowując, czy jest szansa, abyś pomógł mi zrobić korektę w tym kodzie?

Kopiuj
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char** argv) 
{	ofstream file;
	ifstream file2;
	file2.open("wyniki5.txt");
	file.open("liczby.txt");
	string liczba;
	int wynik = 0;
while (!file.eof())
{
	file>>liczba;
while (liczba>0)
	{
	wynik =+ liczba%10;
	liczba /= 10;
	}
}
file1.close();
file2<< "Suma cyfr podanej liczby wynosi: " << wynik;
file2.close();
	return 0;
}
enedil
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Postów:1027
0

Na początku warto sobie sformatować kod:

Kopiuj
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char** argv) 
{   
    ofstream file;
    ifstream file2;
    file2.open("wyniki5.txt");
    file.open("liczby.txt");
    string liczba;
    int wynik = 0;
    while (!file.eof()) {
        file >> liczba;
        while (liczba>0) {
            wynik =+ liczba%10;
            liczba /= 10;
        }
    }
    file1.close();
    file2 << "Suma cyfr podanej liczby wynosi: " << wynik;
    file2.close();
    return 0;
}

Jak już zmienisz typ zmiennej liczba na faktyczną liczbę (a nie ciąg znaków), to będzie widać co jest źle - ta linijka jest błędna:

Kopiuj
wynik =+ liczba%10;

Teraz Twoim zadaniem jest zastanowić się dlaczego.

edytowany 2x, ostatnio: enedil
K8
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:9
1
enedil napisał(a):

Na początku warto sobie sformatować kod:

Kopiuj
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char** argv) 
{   
    ofstream file;
    ifstream file2;
    file2.open("wyniki5.txt");
    file.open("liczby.txt");
    string liczba;
    int wynik = 0;
    while (!file.eof()) {
        file >> liczba;
        while (liczba>0) {
            wynik =+ liczba%10;
            liczba /= 10;
        }
    }
    file1.close();
    file2 << "Suma cyfr podanej liczby wynosi: " << wynik;
    file2.close();
    return 0;
}

Jak już zmienisz typ zmiennej liczba na faktyczną liczbę (a nie ciąg znaków), to będzie widać co jest źle - ta linijka jest błędna:

Kopiuj
wynik =+ liczba%10;

Teraz Twoim zadaniem jest zastanowić się dlaczego.

Powinno być wynik += liczba%10;?

enedil
tak, to co napisałeś znaczy wynik = (+ liczba % 10).
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Szczecin
0

imo łatwiej to na stringu liczyć, i konwersji mniej. Dostałeś działający pełny przykład, bardzo zbliżony do twojego kodu. Porównaj różnice, zastanów się co i dlaczego zmieniłem i popraw.


enedil
Zgodzę się, ale jednak powiedziałbym, że wersja z intem jest znacznie bliższa do kodu OPa.
vpiotr
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
0

Na pewno chcesz liczyc liczba%10?
Juz bardziej liczba.back() - '0' ale to tez dookola.

edytowany 1x, ostatnio: vpiotr

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.