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

Niezrozumiały błąd

Object Storage Arubacloud
0 głosów
134 wizyt
pytanie zadane 28 kwietnia 2020 w C i C++ przez Atman Użytkownik (810 p.)

Moim zadaniem jest zadeklarować tablicę i zapełnić ją liczbami z konsoli, potem policzyć z niej średnią, liczbę największą i najmniejszą. I to działa. To samo miałem zrobić dla tablicy gdzie wprowadzone są już konkretne liczby. Program ten wyświetla wszystko poprawnie. Ale przy kompilacji i pokazaniu wyników w konsoli otrzymuję informację że program na jakiś istotny błąd. Nie wiem o co chodzi. Gdy te 2 programy działają jednocześnie jest właśnie ten problem, gdy tylko 1 wszystko jest okej.

#include <iostream>

using namespace std;

float srednia(float* tab, unsigned int ilosc)
{
	float suma=0;
	for (int k=0; k<ilosc; k++)
	{
		suma += tab[k];
	}
	return suma/ilosc;
}

float srednia2(float* tablica) 
{
	float suma2=0;
	for (int v=0; v<10; v++)
	{
		suma2 += tablica[v];
	}
	return suma2/10;
}

float max_value(float* tab, unsigned int ilosc)
{
	float max=tab[0];
	for (int l=0; l<ilosc; l++)
	{
		float x=tab[l];
		if(x>max)
			max=x;
	}
	return max;
}

float max_value2(float* tablica)
{
	float max2=tablica[0];
	for (int p=0; p<10; p++)
	{
		float z=tablica[p];
		if(z>max2)
			max2=z;
	}
	return max2;
}

float min_value(float* tab, unsigned int ilosc)
{
    float min2=tab[0];
	for (int w=0; w<ilosc; w++)
	{
		float y=tab[w];
		if(y<min2)
			min2=y;
	}
	return min2;
} 

float min_value2(float* tablica)
{
    float min2=tablica[0];
	for (int t=0; t<10; t++)
	{
		float q=tablica[t];
		if(q<min2)
			min2=q;
	}
	return min2;
} 

int main()
{
	
unsigned int ilosc;

cout<<"Podaj ile liczb chcesz wprowadzic: ";
cin>>ilosc;
cout<<endl;

float* tab = new float[ilosc];
float tablica[] = {1.5, 4.5, 23.6, 46, 27.0, 0.0, 75.6, 99.4, 79.0, 42.7};

for (int i=0; i<ilosc; i++)
{
	cout<<"Podaj "<<i+1<<" liczbe: ";
	cin>>tab[i];
}

  cout<<"Srednia wprowadzonych liczb wynosi: "<<srednia(tab,ilosc)<<endl;
  cout<<"Najwieksza liczba sposrod podanych to: "<<max_value(tab,ilosc)<<endl;
  cout<<"Najmniejsza liczba sposrod podanych to: "<<min_value(tab,ilosc)<<endl<<endl;

  cout<<"Srednia liczb podanych w tablicy wynosi: "<<srednia2(tablica)<<endl;
  cout<<"Najwieksza liczba sposrod podanych w tablicy to: "<<max_value2(tablica)<<endl;
  cout<<"Najmniejsza liczba sposrod podanych w tablicy to: "<<min_value2(tablica)<<endl;

  delete [] tab; 
  delete [] tablica;
  
  system ("PAUSE");
  return 0;
}

 

komentarz 28 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)

Wychodzisz poza zakres tablicy w funkcjach z numerem dwa. A jak brzmi ten błąd? Bo wszystko się kompiluje. cpp.sh/95d4a

komentarz 28 kwietnia 2020 przez Atman Użytkownik (810 p.)
Nie wiem czemu ale faktycznie u mnie teraz też. A co to znaczy że wychodzę poza zakres tablicy? Na czym to polega?
komentarz 28 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)

Po części taki skrót myślowy. 

float srednia2(float* tablica) 
{
    float suma2=0;
    for (int v=0; v<10; v++)
    {
        suma2 += tablica[v];
    }
    return suma2/10;
}

Mając taką funkcję, dla tablicy 4 elementowej, czytasz 10. Nie wiem, czy jasno to wyjaśniłem. Po prostu mając 4 szuflady na ubrania, szukasz jeszcze w 6 innych, które do Ciebie nie należą, i to co tam znajdziesz, to zagadka(Undefined behavior). 

komentarz 28 kwietnia 2020 przez Atman Użytkownik (810 p.)
Ale dlaczego tablica ma tylko 4 miejsca skoro 10 zdeklarowałem na początku w mainie?
komentarz 28 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)

Moje niedopatrzenie, wysyłasz dwie inne tablice. Akurat tutaj ma to niejako sens, ogólnie raczej powinieneś wysyłać wielkość osobno. Po prostu tracisz na elastyczności i masz dwie funkcję, które robią dokładnie to samo. Co jest naruszeniem zasad. Dodatkowo tablicy tworzonej statycznie, nie musisz usuwać na końcu.  

#include <iostream>

using namespace std;

float srednia(float* tab, unsigned int ilosc = 10)
{
    float suma = 0;
    for (unsigned k = 0; k < ilosc; k++)
    {
        suma += tab[k];
    }
    return suma / ilosc;
}

float max_value(float* tab, unsigned int ilosc = 10)
{
    float max = tab[0];
    for (unsigned l = 0; l < ilosc; l++)
    {
        float x = tab[l];
        if (x > max)
            max = x;
    }
    return max;
}


float min_value(float* tab, unsigned int ilosc = 10)
{
    float min2 = tab[0];
    for (unsigned w = 0; w < ilosc; w++)
    {
        float y = tab[w];
        if (y < min2)
            min2 = y;
    }
    return min2;
}

int main()
{

    unsigned int ilosc;

    cout << "Podaj ile liczb chcesz wprowadzic: ";
    cin >> ilosc;
    cout << endl;

    float* tab = new float[ilosc];
    float tablica[] = { 1.5, 4.5, 23.6, 46, 27.0, 0.0, 75.6, 99.4, 79.0, 42.7 };

    for (unsigned i = 0; i < ilosc; i++)
    {
        cout << "Podaj " << i + 1 << " liczbe: ";
        cin >> tab[i];
    }

    cout << "Srednia wprowadzonych liczb wynosi: " << srednia(tab, ilosc) << endl;
    cout << "Najwieksza liczba sposrod podanych to: " << max_value(tab, ilosc) << endl;
    cout << "Najmniejsza liczba sposrod podanych to: " << min_value(tab, ilosc) << endl << endl;

    cout << "Srednia liczb podanych w tablicy wynosi: " << srednia(tablica) << endl;
    cout << "Najwieksza liczba sposrod podanych w tablicy to: " << max_value(tablica) << endl;
    cout << "Najmniejsza liczba sposrod podanych w tablicy to: " << min_value(tablica) << endl;

    delete[] tab;

    system("PAUSE");
    return 0;
}

Sam kod nie jest najlepszy, ale troszeczkę go uprościłem. Usunąłem dublujące się funkcję, oraz dodałem wartość domyślną dla wielkości tablicy. 

Na koniec dodam byś dbał o formatowanie kodu, ułatwia czytanie http://format.krzaq.cc/

komentarz 28 kwietnia 2020 przez Atman Użytkownik (810 p.)
Teraz to już jest źle. Bo nie mogę przypisać zmiennej ilosc 10. Ona jest różna w zależności jak się wprowadzi z klawiatury.
komentarz 28 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)

Nie jest źle, jest bardziej "elastycznie". Zauważ, że zrobić tak, by argument miał wartość domyślną, jeżeli jej nie zapiszemy będzie taki jak przy stworzeniu funkcji(upraszczając). Jeżeli masz funkcję o takim nagłówku float max_value(float* tab, unsigned int ilosc = 10) możemy wywołać ją na dwa sposoby. Pierwszy max_value(tab) podajemy tylko wskaźnik na początek tablicy, jej długość będzie równa 10, tak mówi wartość domyślna ilosc(i), oraz max_value(tab, 4). W drugim przypadku mamy wskaźnik na początek tablicy tab, oraz jej długość równą 4. 
https://www.geeksforgeeks.org/default-arguments-c/

komentarz 28 kwietnia 2020 przez Atman Użytkownik (810 p.)
Ale długość w żadnym przypadku nie ma być równa 4. W jednym odgórnie 10, w drugim dynamicznie dopiero gdy użytkownik poda ją w konsoli. Więc nie wiem po co i skąd to 4.
komentarz 28 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)
To był przykład... Zostań przy swoim kodzie, po prostu podałem drugie rozwiązanie.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 65 wizyt
0 głosów
1 odpowiedź 239 wizyt
pytanie zadane 8 stycznia 2020 w PHP przez sKodowany Obywatel (1,150 p.)
0 głosów
0 odpowiedzi 168 wizyt
pytanie zadane 22 stycznia 2019 w JavaScript przez Grzegorz Mikina Dyskutant (8,060 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...