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.
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;
}
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.
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;
}
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';
}
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ć.
Przecież... nie używam niczego czego sam nie używasz. wtf
Nawet sama linijka 1 to już za dużo, tu leży problem, muszę to napisać bez żadnych udziwnień :(
Użycie funkcji to udziwnienie? :D
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
Sam używasz.
Ach typowe zadanie ze szkoły. Wręcz śmieszne że chcą ograniczać ucznia. No ale cóż poradzić takie życie :)
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.
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;
}
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.
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;?
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.
Na pewno chcesz liczyc liczba%10
?
Juz bardziej liczba.back() - '0'
ale to tez dookola.