Najwieksza/najmniejsza suma cyfr liczby z pliku

0

mam plik w ktorym w kazdym wierszu znajduje sie jakas liczba, mam znalezc liczbe ktorej suma cyfr jest najmniejsza lub najwieksza

 
using namespace std;
int main() 
{
	
	
ifstream dane;
ofstream wyniki;
dane.open("cyfry.txt");
wyniki.open("wyniki4a.txt");

int i, suma_cyfr, min, max, liczba, ilosc_wierszy, k;


do
{
	dane>>liczba;
	ilosc_wierszy++;
	
}while (dane.good());

cout<<"ilosc wierszy: "<<ilosc_wierszy<<endl;

int *tab_suma_cyfr = new int [ilosc_wierszy];

liczba=0;
k=0;
do
{
	dane >> liczba;

	do
	{
		suma_cyfr=suma_cyfr	+ liczba%10;
		liczba=liczba/10;
	

	}while(liczba!=0);
	
	
	suma_cyfr=tab_suma_cyfr[k];
	suma_cyfr=0;
	k++;
	

}while (dane.good());

for(i=0; i<ilosc_wierszy; i++)
{
	cout<<tab_suma_cyfr[i]<<endl;
	
}

dane.close();
wyniki.close();

	
	system ("PAUSE");
	return 0;
}

na razie chcialem sobie wypisac wszystkie sumy cyfr tych liczb, niestety na ekranie pokazuja mi sie jakies dziwne liczby, gdzie jest jakis blad? czy wiem tez ze musze uzyc delete [] tej tablicy dynamicznej ale tez dokladnie nie wiem gdzie to napisac zeby bylo dobrze

0

Wyrzuć ten kod, nadaje sie na śmietnik. Naskrobałem na szybko coś takiego. Wypisuje sume liczb z pliku tekstowego, dodaj do tego przypisanie do tablicy a potem to posortuj i zadanie skonczone

#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
using namespace std;
int suma_l(int liczba)
{
    int suma = 0;
    do
    {
        int cyfra = liczba % 10;
        suma += cyfra;
        liczba = (liczba - cyfra) / 10;
    } while (liczba != 0);
    return suma;
}
int main()
{
    ifstream dane;
    dane.open("cyfry.txt");

    string liczby;
    int ilosc_lini = 0;
    vector<int> liczby_i;

    if (dane.good())
    {
        while (getline(dane, liczby))
        {
            liczby_i.push_back(atoi(liczby.c_str()));
            ilosc_lini++;
        }
    }
    cout << ilosc_lini << endl;

    for (int i = 0; i < liczby_i.size(); i++)
    {
        cout << suma_l(liczby_i[i]) << endl;
    }
}
 
0

nie wiem w sumie co zrobiles tam z tym vector, push itp. nie znam jeszcze tych funkcji
moglby ktos powiedziec mi co w moim kodzie jest zle?

0

@Narkan

  1. po co wrzucać do wektora kolejne liczby
  2. po co zamieniać wczytane dane na liczbę, skoro mamy porównać sumę cyfr?
0
  1. Łatwiej mi panować nad danymi, wiem że one tam siedzą i mi nie zaginął :D
  2. Łatwiej obliczyć sume cyfr, sume cyfr w ciągu znaków zajmuje troche więcej linijek.
1

Czy chodzi o to?

Wejście:
5
126767
2
100
88
123

Wyście:
Min: 100 / 1
Max: 126767 / 29

Przy takiej definicji zadania nie potrzeba zbierać wszystkich wierszy w jeden kontener, wystarczy znajdować na biegu min/max.

W pierwotnym kodzie:

  • nie sprawdzasz czy czytasz za dużo wierszy
  • odwróciłeś kolejność argumentów przypisania:
suma_cyfr=tab_suma_cyfr[k];
  • nie znajdujesz min/max, pozostawiasz to użytkownikowi
  • poza tym jest prawie OK, pomijając
system("PAUSE")

, zajrzyj tutaj: http://www.cplusplus.com/articles/iw6AC542/

1
 int ... ilosc_wierszy

ilosc_wierszy jest niezainicjalizowana.

do {
    ....
    do {
       suma_cyfr = suma_cyfr + liczba % 10;
        ...
    } while (liczba != 0);

    suma_cyfr = tab_suma_cyfr[k];
    ....
} while (dane.good());
  1. Dlaczego warunek zakończenia pętli to dane.good()? Przecież nie czytasz z pliku.
  2. W pierwszym obiegu pętli suma_cyfr jest niezainicjalizowana.
  3. Zamiast wczytać sumę do tablicy to przypisujesz do zmiennej suma_cyfr śmieci z tablicy.
0

poprawilem troche kod, na samym koncu wypisalem sobie kilka wartosci z tej tablicy, program wypisuje:

43
0
0
0
0... itd.

na koncu mojego pliku tekstowego jest 98989 (9+8+9+8+9=43) czyli wypisuje sume cyfr tylko ostatniej liczby, przeciez w petli dodaje do k ta jedynke ktora powinna zwiekszac numer tablicy, sami zobaczcie

int i, suma_cyfr=0, min, max, liczba=0, ilosc_wierszy=0, k=0;
 
 
do
{
    dane>>liczba;
    ilosc_wierszy++;
 
}while (dane.good());
 
cout<<"ilosc wierszy: "<<ilosc_wierszy<<endl;
 
int *tab_suma_cyfr = new int [ilosc_wierszy-1];
 

do
{
    dane >> liczba;
 
    do
    {
        suma_cyfr=suma_cyfr    + liczba%10;
        liczba=liczba/10;
 
 
    }while(liczba!=0);
 
 
    tab_suma_cyfr[k]=suma_cyfr;
    suma_cyfr=0;
    k=k+1;
 
 
}while (k!=(ilosc_wierszy-1));
 

    cout<<tab_suma_cyfr[0]<<endl;
 	    cout<<tab_suma_cyfr[1]<<endl;	
 	        cout<<tab_suma_cyfr[2]<<endl;
 	            cout<<tab_suma_cyfr[3]<<endl;
 	                cout<<tab_suma_cyfr[4]<<endl;
 	                    cout<<tab_suma_cyfr[5]<<endl;
 	                        cout<<tab_suma_cyfr[6]<<endl;
 	                            cout<<tab_suma_cyfr[7]<<endl;
0

po co Ci tablica? masz zapamiętać tylko 2 liczby.

int tmp,max,min,sum;
dane>>tmp; //plik nie może być pusty
sum = digitSum;
min = sum;
max = min; 
while(dane>>tmp)
{
  sum = digitSum(tmp);
  if(sum<min) min=tmp;
  if(sum>max) max=tmp;
}

//i osobno metoda do sumowania cyfr digitSum(int)
 
0

wiem ze istnieje sto innych lepszych sposobow zeby zrobic ten program, ja chce wiedziec czemu moj sposob nie dziala, i co zrobic zeby dzialal, bo nie da mi to spokoju ;)

0
grzechup napisał(a):

wiem ze istnieje sto innych lepszych sposobow zeby zrobic ten program, ja chce wiedziec czemu moj sposob nie dziala, i co zrobic zeby dzialal, bo nie da mi to spokoju ;)

Na początku wczytujesz wszystkie liczby i zapisujesz je w...liczba.
A potem próbujesz jeszcze raz przeczytać to samo.
Być może przyda się:

// po: cout<<"ilosc wierszy: "<<ilosc_wierszy<<endl; 
dane.seekg (0, is.beg);
0

nie wiem dokladnie jak z tego korzystac, jak wpisalem to w tym miejscu to byl blad ze "is" nie jest zadeklarowane
ale masz racje, blad pewnie jest w tym ze dwa razy wczytuje dane z tego pliku, jak korzystam ze zwyklej tablicy i wpisuje po prostu ilosc_wierszy taka jaka jest to program dziala

nawet gdy korzystam z dynamicznej, a wczesniej deklaruje ilosc_wierszy normalnie, to program dziala, teraz wystarczy tylko znalezc jakis inny sposob zeby odczytac ilosc wierszy/ilosc tych danych w pliku
lub pokombinowac nad jak uniknac wczesniejszego bledu

0

Zamiast pierwszej pętli:

if (!(dane>>ilosc_wierszy))
  ilosc_wierszy = 0;

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