Błąd w kodzie związany z tablicami

0

Kod obliczający z n liczb średnią i wypisujący najbliższa liczbę do średniej (z liczb podanych przez użytkownika)
Kod działa dla liczb od 1 do 8 . Następnie od 8 do 10 nie działa (myslałem, ze pokazuje na następny element tablicy który nie został do niczego przypisany czyli na jakis adres ). Ale od 10 znowu działa.

 
#include <iostream>
#include <cmath>
using namespace std;
float* wypelnianie_plus_srednia(int rozmiar,float& srednia)
{
    float* tab = new float [rozmiar];
    cout << "Teraz podaj liczby (po spacji) z ktorych chcesz srednia policzyc ";
    float suma = 0 ;
    for(int i = 0 ; i < rozmiar; i++)
    {
        cout << "\nLiczba nr." << i+1 << " : ";
        cin >> tab[i];
        suma = suma + tab[i];
    }
    srednia = suma / rozmiar;
    cout << "\nSrednia z podanych liczb to : " <<  srednia ;
    return tab;

}

int main()
{
    int n;
    cout << "Program obliczajacy srednia z n liczb oraz przedstawiajacy najblizsza liczbe" << endl;
    cout << "Dla ilu liczb chcesz obliczyc srednia ? : ";
    cin >> n;
    float srednia;
    float* wsk = &srednia;
    float* tab=wypelnianie_plus_srednia(n,srednia);
    float wart_bez[n];
    for(int i = 0 ; i < n ; i++)
    {
        wart_bez[i]=fabs(tab[i]-srednia); //wartosc bezwzgledna
    }
  //delete[]tab;
    // Znalezenie najblizszej liczby
    float najblizsza;
    float blizsza = 0;
    for(int i = 0; i < n ; i++)
    {
       // cout << "\nwart_bez[i] = " << wart_bez[i];
       if(blizsza>=wart_bez[i])
       {

            blizsza=wart_bez[i]; // na takim tez sie psulo blizsza=wart_bez[i+1]; 
            //cout << "\nblizsza czyli tab[i+1] " << blizsza;

            najblizsza=tab[i]; // na takim tez sie psulo najblizsza=tab[i+1];


       }
    }
    cout << "\nNajblizsza liczba do sredniej jest : " << najblizsza;







    return 0;
}

2

Źle ustawiasz poniższą zmienną
float blizsza = 0;
Ustaw ją tak:
float blizsza = FLT_MAX; //blizsza ustawiona na maksymalną wartość

Czasem ci ten kod działa gdy średnia jest akurat liczbą całkowitą i masz tą liczbę w tablicy.

0

Ale to musze wiedziec ktora jest najwieksza liczba podana przez uzytkownika ? i potem przypisac ja do blizsza tak ?

2
#include <iostream>
#include <limits>
using namespace std;

int main() 
{
	cout << numeric_limits<float>::max() << endl;
	return 0;
}

Można też ustawić pierwszą wartość blizsza na różnicę między średnią a pierwszą (dowolną) liczbą z tablicy.

0

Dlaczego na roznice sredniej a liczby ? Od tego mam wartosc bezwzgledna .
Wczesniej mialem takie cos i tez nie dzialalo .

 
   float najblizsza = tab[0];
   float blizsza = wart_bez[0];
    for(int i = 0; i < n ; i++)
    {
       // cout << "\nwart_bez[i] = " << wart_bez[i];
       if(blizsza>=wart_bez[i+1])
       {

            blizsza=wart_bez[i+1];
            //cout << "\nblizsza czyli tab[i+1] " << blizsza;

           najblizsza = tab[i+1];
       }
     }

Nie zauwazylem a z tym fragmentem kod dziala po prostu nie ustawilem sobie float najblizsza = tab[0];

1

Dla i == n-1

wart_bez[i+1]

wychodzi poza tablicę i masz undefined behaviour.

Poza tym taki kod

float wart_bez[n];

jest niezgodny ze standardem, więc lepiej go nie używaj na etapie nauki.

0

W komentarzach pytania :D

 
   float najblizsza = tab[0];
   float blizsza = wart_bez[0];
    for(int i = 0; i < n ; i++)
    {
       // cout << "\nwart_bez[i] = " << wart_bez[i];
       if(blizsza>=wart_bez[i])
       {

            blizsza=wart_bez[i];
            //cout << "\nblizsza czyli tab[i] " << blizsza;

           najblizsza = tab[i];
//i zamiast float wart_bez[n] to zrobic float wart_bez = new float [n] ? Jesli tak to dla czego?
//takie cos  bez i +1 tylko samo i ? blizsza>=wart_bez[i]
// i moze jeszcze jeden warunek if(i>n) to cofnac na poprzedni element tablicy ?
       }
     }
1
float* differences = new float[n];
....
delete[] differences;

Dlatego, że ten kod jest zgodny ze standardem i się skompiluje na każdym normalnym kompilatorze, czego nie można powiedzieć o poprzednim.

takie cos bez i +1 tylko samo i?
Tak.

i moze jeszcze jeden warunek if(i>n) to cofnac na poprzedni element tablicy ?
Po co?

0

Poki co jest wszystko okej . Wielkie dzieki za szybkie odpowiedzi :)

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