Funkcja w klasie - nieznana wartosc

0

Witam, mam do napisania program ktory z podanych danych wypisze ich sume w danym przedziale, oraz parametry statystyczne jak modalna, srednia etc. Ale o tamte na razie mniejsza bo obecnie głowie sie nad jedna rzecza.
Otoz po zrobieniu funkcji zliczajacej odpowiednie dane w przedzialach wypisuje ja potem w programie glownym. Niestety funkcja wypisuje jakas liczbe ktora kompletnie niewiem skad sie wziela i jak temu zaradzic.
Daje moj kod:

#include <iostream>

using namespace std;

class Zaklad1 {
    public:
        int tab_Z1[55]={22, 26, 27, 27, 9,
                        11, 29, 33, 27, 28,
                        30, 31, 14, 33, 30,
                        16, 20, 18, 34, 33,
                        34, 30, 29, 24, 29,
                        29, 27, 42, 54, 60,
                        52, 36, 37, 43, 57,
                        39, 40, 36, 50, 44,
                        33, 31, 42, 49, 32,
                        36, 41, 32, 48, 31,
                        26, 36, 38, 37, 38};
        int przedzial_z1();
};

class Zaklad2 {
    public:
        int tab_Z2[65]={38, 37, 22, 31, 64,
                        39, 30, 26, 42, 44,
                        46, 41, 27, 34, 39,
                        16, 46, 60, 37, 36,
                        30, 26, 36, 51, 27,
                        32, 26, 20, 41, 27,
                        40, 44, 26, 19, 18,
                        54, 49, 28, 42, 43,
                        39, 38, 41, 50, 24,
                        33, 38, 36, 18, 53,
                        50, 59, 40, 36, 16,
                        36, 39, 48, 46, 58,
                        33, 43, 37, 44, 40};
        int przedzial_z2();
};


int Zaklad1::przedzial_z1()
{
    int suma_15=0;
    int suma_25=0;
    int suma_35=0;
    int suma_45=0;
    int suma_55=0;
    int suma_65=0;
    for (int i=0;i<55;i++)
    {
        if (tab_Z1[i]<15)
            suma_15=suma_15+1;
        else
            if (tab_Z1[i]<25)
            suma_25=suma_25+1;
        else
            if (tab_Z1[i]<35)
            suma_35=suma_35+1;
        else
            if (tab_Z1[i]<45)
            suma_45=suma_45+1;
        else
            if (tab_Z1[i]<55)
            suma_55=suma_55+1;
        else
            if (tab_Z1[i]<65)
            suma_65=suma_65+1;
    }
    cout<<"Przedzial dla Zakladu I"<<endl;
    cout<<"5 - 15: "<<suma_15<<endl;
    cout<<"15 - 25: "<<suma_25<<endl;
    cout<<"25 - 35: "<<suma_35<<endl;
    cout<<"35 - 45: "<<suma_45<<endl;
    cout<<"45 - 55: "<<suma_55<<endl;
    cout<<"55 - 65: "<<suma_65<<endl;
}

int Zaklad2::przedzial_z2()
{
    int suma_15=0;
    int suma_25=0;
    int suma_35=0;
    int suma_45=0;
    int suma_55=0;
    int suma_65=0;
    for (int i=0;i<65;i++)
    {
        if (tab_Z2[i]<15)
            suma_15=suma_15+1;
        else
            if (tab_Z2[i]<25)
            suma_25=suma_25+1;
        else
            if (tab_Z2[i]<35)
            suma_35=suma_35+1;
        else
            if (tab_Z2[i]<45)
            suma_45=suma_45+1;
        else
            if (tab_Z2[i]<55)
            suma_55=suma_55+1;
        else
            if (tab_Z2[i]<65)
            suma_65=suma_65+1;
    }
    cout<<"Przedzial dla Zakladu II"<<endl;
    cout<<"5 - 15: "<<suma_15<<endl;
    cout<<"15 - 25: "<<suma_25<<endl;
    cout<<"25 - 35: "<<suma_35<<endl;
    cout<<"35 - 45: "<<suma_45<<endl;
    cout<<"45 - 55: "<<suma_55<<endl;
    cout<<"55 - 65: "<<suma_65<<endl;
}



int main()
{
    Zaklad1 zI;
    Zaklad2 zII;
//Wypisuje dane Zakladu I
    cout<<"Zaklad I: ";
    for (int i=0;i<55;++i)
       {
            if (i%5!=0)
            cout<<zI.tab_Z1[i]<<" ";
            else
            {
                cout<<"\n";
                cout<<zI.tab_Z1[i]<<" ";
            }
       }
//Wypisuje dane Zakladu II
    cout<<endl<<endl<<"Zaklad II: ";
    for (int i=0;i<65;++i)
       {
            if (i%5!=0)
            cout<<zII.tab_Z2[i]<<" ";
            else
            {
                cout<<"\n";
                cout<<zII.tab_Z2[i]<<" ";
            }
       }

    cout<<endl<<endl<<endl<<"Podzial na 6 przedzialow od 5 do 65 i zsumowanie wartosci tych przedzialow"<<endl<<endl;
    cout<<zI.przedzial_z1()<<endl<<endl;
    cout<<zII.przedzial_z2()<<endl;


    cout<<endl<<endl;
    return 0;
}

I tak, powinno wypisac wylacznie to co jest w funkcji tzn 5-15: itd, okej wypisuje ale na samym koncu wypisuje 7znakowa liczbe.

Co jest tu nie tak i co nalezaloby poprawic? Bede bardzo wdzieczny za pomoc.

2

Co jest tu nie tak i co nalezaloby poprawic?

Wszystko: duplikacje kodu, mieszanie interfejsu z logika, niezrozumienie idei klas, magiczne cyferki w kodzie, drabinki ifow, drabinki nic nie mowiacych zmiennych, drabinki coutow, nazewnictwo, niekonsekwencje w formatowaniu, masa niepotrzebnych flushowan strumienia.

0

Wszystko: duplikacje kodu, - gdzie niby duplikacja kodu? mam pisac osobna funkcje dla wyswietlenia przedzialow? bez przesady.
mieszanie interfejsu z logika, - czyli?
niezrozumienie idei klas, - rozumiem idee klas :)
magiczne cyferki w kodzie, - nie w kodzie tylko w wyniku pojawiaja sie magiczne cyferki :) czytanie ze zrozumieniem.
drabinki ifow, - to zrob mi podzial danych z tablicy na przedzialy bez drabinki ifow :)
drabinki nic nie mowiacych zmiennych, - pokaz mi te zmienne bo ja ich nie widze :)
drabinki coutow, - zrob to bez drabinki :)
nazewnictwo, - jest takie aby bylo mozna sie polapac co jest co, jesli twoje nazewnictwo polega na x y z to ci wspolczuje
niekonsekwencje w formatowaniu, - czyli?
masa niepotrzebnych flushowan strumienia - czyli?

0

gdzie niby duplikacja kodu?

Widziałeś metody przedzial_z1 oraz przedzial_z2?
Są prawie identyczne, więc po co dwie osobne klasy do tego?

mieszanie interfejsu z logika, - czyli?

Czyli: dlaczego przedzial_z1 oraz ta druga cokolwiek wyświetlają? Powinny tylko zwracać wartość.

to zrob mi podzial danych z tablicy na przedzialy bez drabinki ifow

Mapa oraz druga statyczna tablica 15, 25, 35 (...) albo pojedynczy if. Nasuwa Ci się już rozwiązanie?

niekonsekwencje w formatowaniu, - czyli?

Ponownie zapytam: widziałeś metody przedzial_z1 oraz przedzial_z2?

masa niepotrzebnych flushowan strumienia - czyli?

Chodzi mu o endl, z tego co widzę.

0

2 klasy dla 2 osobnych Zakladow. To jest dopiero poczatek kodu wiec 2 klasy musza byc.
Jesli nie maja wypisywac czegokolwiek tylko zwracac to tu jest moje pytanie - jak? Jesli w programie glownym wtedy wstawie couty przedzialowe z funkcji to jak do danego przedzialu zwrocic po kolei suma_15 suma_25 itd? Probowalem - nie potrafie dlatego zrobilem couty w funkcji.
Co do drabinki ifow nie, nie nasuwa mi wlasnie rozwiazanie...
Chciałbym jeszcze tylko dodać, ze to moje początki z programowaniem na studiach dlatego nic mi nie mowi pojecie mapy ;/

Ale ponownie powiem czytanie ze zrozumieniem, nie chcialem abyscie mi wytykali co gdzie zle tylko dlaczego pokazuje w programie wartosc ktorej wgl nie ma ?

1

Błąd o który Ci chodzi to:

cout<<zI.przedzial_z1()<<endl<<endl;
cout<<zII.przedzial_z2()<<endl;

Nie rób cout tylko je normalnie wywołaj bo w nich wypisujesz.
Coś takiego

zI.przedzial_z1();
zII.przedzial_z2()

Ewentualnie między nie wstaw znak nowej linii.

0

szweszwe dzięki, ze ja na to nie wpadłem ;/. już wszystko jest okej dzieki :)

0

niezrozumienie idei klas, - rozumiem idee klas :)
...
2 klasy dla 2 osobnych Zakladow. To jest dopiero poczatek kodu wiec 2 klasy musza byc.

No czyli nie rozumiesz. Nie powinno się tak projektować klas. Powinna być jedna klasa tego typu, bo obie realizują to samo. Dane powinny być podawane do funkcji/obiektu, a nie trzymane na sztywno w klasie.

drabinki ifow, - to zrob mi podzial danych z tablicy na przedzialy bez drabinki ifow :)
drabinki coutow, - zrob to bez drabinki :)

Wystarczy prosta pętla w tym przypadku.

niekonsekwencje w formatowaniu, - czyli?

głównie wcięcia

duplikacje kodu, - gdzie niby duplikacja kodu? mam pisac osobna funkcje dla wyswietlenia przedzialow?

Troche to ironicznie brzmi, bo właśnie to zrobiłeś w swoim kodzie.

Więcej pokory by ci się przydało

0

na razie obie realizuja to samo, w dalszej czesci kodu czeka nieco wiecej zabawy dlatego mam 2 klasy. Dodatkowo chce oprocz zrobienia samego programu pocwiczyc na nim klasy dlatego nie widze innego rozwiazania.
W przypadku tych ifow jak ta petla powinna wyglad? Osobiscie nic mi do glowy nie przychodzi to jedyny sposob na jaki wpadlem. A co do wciec to niewiem w czym problem? Wciecia robie tak aby kod byl czytelny uwzgledniajac wszystko po kolei, przeciez nie bede pisal wszystko linia pod linia...

Bylbys w stanie mi pokazac jak zrobic ta petle dla ifow i coutow i ewentualnie jak zrobic zwracanie z tych funkcji zamiast wypisywania?

0

gdzie niby duplikacja kodu?

Spojrz na swoje: pola, klasy, metody, main.

niezrozumienie idei klas, - rozumiem idee klas :)

Kod mowi co innego, komu mam uwierzyc?

magiczne cyferki w kodzie

A 65 przy for w main to nie jest magiczna cyferka?

pokaz mi te zmienne bo ja ich nie widze :)

    int suma_15=0;
    int suma_25=0;
    int suma_35=0;
    int suma_45=0;
    int suma_55=0;
    int suma_65=0;

drabinki coutow, - zrob to bez drabinki :)

Prymitywnie badz Nie

nazewnictwo, - jest takie aby bylo mozna sie polapac

zI, i od razu wiadomo co autor mial na mysli.

niekonsekwencje w formatowaniu

Spojrz na for w main i for w metodzie.

masa niepotrzebnych flushowan strumienia - czyli?

W programowaniu, jak i w medycynie, przed uzyciem nalezy skonsultowac sie z trescia ulotki.

nie chcialem abyscie mi wytykali co gdzie zle tylko dlaczego pokazuje w programie wartosc ktorej wgl nie ma

To czemu w Twoim poscie, jest tylko jedno pytanie, ktore mowi o czyms zupelnie innym?

0

Rozumiem idee klas powiem jeszcze raz, ale probuje nauczyc sie jak te klasy dzialaja bo dopiero sie one pojawily na moich zajeciach dlatego chce na nich operowac nawet jesli jest to bez sensu wg was. 65 nie jest magiczna cyferka :) Wystarczy zwrocic uwage na tablice. Co do tych linkow ktore podales to niestety ale tego nie rozumiem...
I tak jak mowisz zI i Od razu wiadomo co autor mial na mysli chyba nie ma w tym nic dziwnego ? :) No i nic dziwnego nie widze w tych forach gdzie tam niby jest zle formatowanie?
A co do zmiennych....wklep to do kompilatora i usun zmienne to zobaczysz czy sa niepotrzebne...

2

Tak na szybko jak to można zrobić mniej więcej obiektowo:

#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;

class RangeCount
  {
   private:
   int first,step;
   unsigned count;
   int *tb;
   public:
   RangeCount(int first,int step,unsigned count):first(first),step(step),count(count),tb(new int[count]) {}
   ~RangeCount() { delete[] tb; }
   void proceed(int data[],unsigned datasize)
     {
      for(unsigned i=0;i<count;++i) tb[i]=0; // ewentualnie memset
      for(unsigned i=0;i<datasize;++i) ++tb[max(0,min((int)count-1,(data[i]-first-1)/step))];
     }
   int operator[](unsigned i)const { return tb[i]; }
   unsigned size()const { return count; }
   int range(unsigned nr)const { return first+step*nr; }
  };

void Analize(RangeCount &rc,const char *What,const char *Stat,int tb[],unsigned size)
  {
   cout<<What<<endl;
   for(unsigned i=0;i<size;++i) cout<<setw(3)<<tb[i]<<("\n"+(i%5<4));   
   rc.proceed(tb,size);
   cout<<endl<<Stat<<endl;
   for(unsigned i=0;i<rc.size();++i) cout<<setw(2)<<rc.range(i)<<" - "<<setw(2)<<(rc.range(i+1)-1)<<": "<<setw(3)<<rc[i]<<endl;
  }

int main()
  {
   int zz1[]=
     {
      22, 26, 27, 27, 9,
      11, 29, 33, 27, 28,
      30, 31, 14, 33, 30,
      16, 20, 18, 34, 33,
      34, 30, 29, 24, 29,
      29, 27, 42, 54, 60,
      52, 36, 37, 43, 57,
      39, 40, 36, 50, 44,
      33, 31, 42, 49, 32,
      36, 41, 32, 48, 31,
      26, 36, 38, 37, 38
     };                  
   int zz2[]=
     {
      38, 37, 22, 31, 64,
      39, 30, 26, 42, 44,
      46, 41, 27, 34, 39,
      16, 46, 60, 37, 36,
      30, 26, 36, 51, 27,
      32, 26, 20, 41, 27,
      40, 44, 26, 19, 18,
      54, 49, 28, 42, 43,
      39, 38, 41, 50, 24,
      33, 38, 36, 18, 53,
      50, 59, 40, 36, 16,
      36, 39, 48, 46, 58,
      33, 43, 37, 44, 40
     };   
   RangeCount rc(5,10,6);
   Analize(rc,"Zaklad I:","Przedzial dla Zakladu I",zz1,sizeof(zz1)/sizeof(*zz1));
   cout<<endl;
   Analize(rc,"Zaklad II:","Przedzial dla Zakladu II",zz1,sizeof(zz2)/sizeof(*zz2)); 
   return 0;
  }
0

Dragon doceniam pomoc ale niestety niezbyt to rozumiem w obecnej chwili :(
Programowanie obiektowe dopiero co zaczałem i wielu rzeczy w twoim kodzie nie rozumiem ale miejmy nadzieje z czasem sie to mieni.
na razie probuje to taka metoda robic.

0

Masz tu zrozumieć to że nie tworzysz klasy metodą Kopiego Pejsta zaś metodą przemyśleń i uniwersalizacji.
Masz zrozumieć że jedyny kto ci tu naprawdę próbował pomóc to @n0name_l a wszystko co on napisał powinieneś wykuć na pamięć.

0

na razie interesuje mnie nauka na biezaco a nie wybieganie sporo do przodu. Dla was moze to byc proste do zrozumienia ja sie dopiero ucze i nie bede wykuwal na pamiec rzeczy ktore mi obecnie nie sa potrzebne albo sa bezsensowne...

0

Patrz na konstrukcje nie implementacje.

0
ulQuiorra napisał(a):

na razie interesuje mnie nauka na biezaco a nie wybieganie sporo do przodu. Dla was moze to byc proste do zrozumienia ja sie dopiero ucze i nie bede wykuwal na pamiec rzeczy ktore mi obecnie nie sa potrzebne albo sa bezsensowne...

Dostałeś program który jest "zakodowany" - dosłownie. Przed użyciem trzeba go sobie rozkodować - patrz niżej.
I nie martw się, programiści pracujący zawodowo po 20 lat też mieliby problem ze zrozumiemiem tego kodu.

Stara wersja:

void proceed(int data[],unsigned datasize)
{
  for(unsigned i=0;i<count;++i) tb[i]=0; // ewentualnie memset
  for(unsigned i=0;i<datasize;++i) ++tb[max(0,min((int)count-1,(data[i]-first-1)/step))];
}

Nowa:

void reset()
{      
   for(unsigned i=0;i<count;++i) tb[i]=0; // ewentualnie memset
}

void proceed(int data[],unsigned datasize)
{
  int incPos;
  int lastPos = count - 1;
  
  reset();      
  
  for(unsigned i = 0; i < datasize; ++i) 
  {
    incPos = (data[i] - first - 1)/step;
    
    if (incPos > lastPos) {
      incPos = lastPos;
    }
    
    if (incPos < 0) {
      incPos = 0;    
    }
    
    ++tb[incPos];
  }
}
0

Tak jak napisales a mi wlasnie chodzi o prostote. Zwlaszcza ze programowanie obiektowe mam od poczatku marca bo jestem dopiero na 1 roku i nie wypada oddac pracy z czyms czego nawet w tym roku miec nie bede :P Twoj kod jednak troche mi juz rozjasnij sytuacje chociaz i tak wole to poki co robic moim sposobem.

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