• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Średnia ważona

+1 głos
587 wizyt
pytanie zadane 14 stycznia 2018 w C i C++ przez VinVix Nowicjusz (240 p.)

Witam!

Bazując na wskaźnikach chciałem stworzyć kod, który będzie wyliczał średnią, ważoną jednak kod nie działa. Sprawdzałem i kod niepoprawnie sumuje oceny i nie mam pojęcia czemu. Dodam, że dopiero zacząłem używać wskaźników, więc możliwe, że nie do końca rozumiem zasadę ich działania. 

#include <iostream>

using namespace std;

float srwaga(float *marks, int *wag, int ilosc )
{
    int sumawag = 0;
    float sumaocen = 0;
        for(int i=0; i<ilosc;i++)
        {
            sumaocen+=*marks**wag;
            sumawag+=*wag;
            marks++;
            wag++;



        }
        return sumaocen/sumawag;




}




int main()
{
 int ile;

  cout<<"podaj ile ocen: ";
 cin>>ile;


 float *oceny;
 oceny = new float[ile];
 int *wagi;
 wagi=new int[ile];



 for(int i=0;i<ile;i++)
 {

     cout<< "podaj ocene i wage "<<i+1<<" : ";
     cin>>*oceny>>*wagi;
     oceny++;
     wagi++;


 }

 cout<<srwaga(oceny,wagi,ile);


delete [] oceny;
delete [] wagi;



    return 0;
}

Dodatkowo, czy postawienie obok siebie dwóch gwiazdek tj. od wskaźnika oraz mnożenia nie koliduje ze sobą?
Pozdrawiam i z góry dziękuję za pomoc :)

1 odpowiedź

+2 głosów
odpowiedź 14 stycznia 2018 przez k222 Nałogowiec (30,150 p.)
wybrane 14 stycznia 2018 przez VinVix
 
Najlepsza

Moja rada jest taka - jak dopiero zaczynasz ze wskaźnikami to nie porywaj się od razu na tablice dynamicznie alokowane, tylko może najpierw poużywaj samych wskaźników - myślą że jak chcesz coś ze wskaźnikami porobić to pobaw się listą (łańcuchem odsyłaczowym) stosem, kolejką, drzewem, itp bo te struktury opierają się tylko na wskaźnikach, jest mnóstwo operacji które można na nich wykonać i przy okazji jak te struktury ogarniesz to wskaźniki nie będą miały przed tobą tajemnic (takie jest moje zdanie - najpierw same wskaźniki a potem struktury, dynamiczna alokacja pamięci gdzieś dalej), ale co do programu to wystarczy zmienić:

 cin>>*oceny>>*wagi;
 oceny++;
 wagi++;

na:

cin>>oceny[i]>>wagi[i];

 

komentarz 14 stycznia 2018 przez VinVix Nowicjusz (240 p.)
Dzięki, działa :) Oraz dziękuje za radę :)
komentarz 14 stycznia 2018 przez Jakub 0 Pasjonat (23,120 p.)

@k222

Hej, wiem że to nie ja założyłem ten temat ale mam małe pytanie, czemu właściwie zapis:

cin>>*oceny>>*wagi;
oceny++;
wagi++;

powoduje problemy?...  też chciałem udzielić odpowiedzi, zmieniłem ten zapis na tablicowy i wszystko działało, wolałem jednak nie pomagać gdyby miał być zapytany czemu to trzeba było zmienić :/  Z góry dziękuje za wyjaśnienie i pozdrawiam

komentarz 14 stycznia 2018 przez VinVix Nowicjusz (240 p.)
Hmm dobre pytanie, też chciałbym wiedzieć ;)
1
komentarz 14 stycznia 2018 przez nik Obywatel (1,640 p.)
Wydaje mi się, że ma to związek z tym, że nazwa wskaźnika ma adres pierwszego elementu tablicy. I teraz jak używasz oceny++; to nazwa wskaźnika reprezentuje drugi element tablicy. Czyli jak dojdziesz do końca to nazwa wskaźnika pokazuje na adres komórki pamięci która nie została wcześniej zarezerwowana dlatego wychodzą niepoprawne dane.
1
komentarz 14 stycznia 2018 przez nik Obywatel (1,640 p.)

Jeżeli chcesz żeby działało tak jak to zrobiłeś to dodaj coś takiego :

int main()
{
	int ile;

	cout << "podaj ile ocen: ";
	cin >> ile;


	float *oceny;
	oceny = new float[ile];
	int *wagi;
	wagi = new int[ile];

	//To dodajesz 
	float* a = oceny;
	int* b = wagi;

	for (int i = 0; i<ile; i++)
	{

		cout << "podaj ocene i wage " << i + 1 << " : ";
		cin >> *oceny >> *wagi;
		oceny++;
		wagi++;


	}
	//Tutaj wskaźnik pokazuje "od nowa" na pierwszy element
	oceny = a;
	wagi = b;
	
	cout << srwaga(oceny, wagi, ile);

	cin.ignore();
	delete[] oceny;
	delete[] wagi;



	return 0;
}

 

komentarz 14 stycznia 2018 przez Jakub 0 Pasjonat (23,120 p.)
To ma sens :) nie pomyślałem o tym

Podobne pytania

0 głosów
1 odpowiedź 736 wizyt
0 głosów
1 odpowiedź 754 wizyt

93,691 zapytań

142,610 odpowiedzi

323,216 komentarzy

63,218 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...