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

Średnia ważona

Object Storage Arubacloud
+1 głos
296 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ź 418 wizyt
0 głosów
1 odpowiedź 485 wizyt

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...