Suma cyfr C++

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.

0

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

#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;
}
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ę *

#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.

0

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

#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;
}
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:

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';
}
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:

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ć.

0

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

0

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

0

Użycie funkcji to udziwnienie? :​D

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

0

Sam używasz.

0

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

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.

0

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

#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;
}
0

Na początku warto sobie sformatować kod:

#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:

wynik =+ liczba%10;

Teraz Twoim zadaniem jest zastanowić się dlaczego.

1
enedil napisał(a):

Na początku warto sobie sformatować kod:

#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:

wynik =+ liczba%10;

Teraz Twoim zadaniem jest zastanowić się dlaczego.

Powinno być wynik += liczba%10;?

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.

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1