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

obliczanie sumy i średniej w tablicy

Aruba Cloud - Virtual Private Server VPS
0 głosów
1,051 wizyt
pytanie zadane 17 marca 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)
#include <stdio.h>
#include <stdlib.h>

int read_vector_float(float *vec, int size, float stop_value)
{
    int zmienna = 0;
    float n = 0;
    if(size <= 0)
    {
        return -1;
    }
        do
        {
            if(scanf("%f", &n) != 1)
            {
                return -2;
            }
            if(n == stop_value)
            {
                break;
            }
            else
            {
                *vec = n;
                zmienna++;
            }
        }
        while(zmienna < size);

    return zmienna;
}

int main()
{
    float tab[101] = {0};
    float *ptab = tab;
    int size = 0;
    float srednia = 0;
    float *psrednia = &srednia;
    
    printf("Wpisz liczby: ");
    
    size = read_vector_float(ptab, 101, 0);
    
        float srednia = 0;
        for(int i = 0; i <= size; i++)
        {
            srednia = srednia + *(tab + i);
        }
        printf("%f", srednia);
    
        float srednia = 0;
        for(int i = 0; i <= size; i++)
        {
            srednia = srednia + *(tab + i);
        }
        printf(" %f", srednia/size);
    

    
    return 0;
}

Funkcja read vector pobiera od użytkownika ciąg liczb i zwraca ilość pobranych liczb. Mój problem polega na tym że nie wiem dlaczego program zamiast zsumować liczby to wypisuje pierwszą podaną liczbę przez co zamiast średniej jest wypisana ta liczba podzielona przez ilość pobranych liczb. Zatem gdzie tkwi błąd przy sumowaniu?

komentarz 18 marca 2020 przez mokrowski Mędrzec (158,200 p.)

Może najpierw usuń błędy które zgłasza kompilator:

prog.c:18:18: warning: comparing floating point with == or != is unsafe [-Wfloat-equal]
            if(n == stop_value)
               ~ ^  ~~~~~~~~~~
prog.c:45:15: error: redefinition of 'srednia'
        float srednia = 0;
              ^
prog.c:38:11: note: previous definition is here
    float srednia = 0;
          ^
prog.c:50:22: warning: implicit conversion increases floating-point precision: 'float' to 'double' [-Wdouble-promotion]
        printf("%f", srednia);
        ~~~~~~       ^~~~~~~
prog.c:52:15: error: redefinition of 'srednia'
        float srednia = 0;
              ^
prog.c:38:11: note: previous definition is here
    float srednia = 0;
          ^
prog.c:57:30: warning: implicit conversion increases floating-point precision: 'float' to 'double' [-Wdouble-promotion]
        printf(" %f", srednia/size);
        ~~~~~~        ~~~~~~~^~~~~
3 warnings and 2 errors generated.

A jak nie zgłasza, dodaj przełączniki ostrzeżeń do swojego procesu kompilacji.

komentarz 18 marca 2020 przez ResCrove Obywatel (1,700 p.)
Z jakiego korzystasz kompilatora? Visual Studio Code nie zgłosił mi takich błędów
komentarz 18 marca 2020 przez mokrowski Mędrzec (158,200 p.)
Bo nie włączyłeś ostrzeżeń. Używam g++ oraz clang++. Tego ostatniego możesz użyć w Visual Studio.

1 odpowiedź

0 głosów
odpowiedź 17 marca 2020 przez pionas0407 Gaduła (4,620 p.)
wybrane 18 marca 2020 przez ResCrove
 
Najlepsza
Hej, pierwsz sprawa:

Nie powinno się inicjalizować zmiennych tego samego typu, z tą samą nazwą, mój kompilator przykładowo, wgl tego nie przepuścił ;) Ale to tylko taka uwaga i sugestia..

Co do Twojego problemu: proponuję ci użyć Debuggera, i dać breakpointa na linii 24, wgl. ta linia musi cię zainteresować, daj znać jak Ci poszło ;)
komentarz 17 marca 2020 przez pionas0407 Gaduła (4,620 p.)
    do
    {
        if (scanf("%f", &n) != 1)
        {
            return -2;
        }
        if (n == stop_value)
        {
            break;
        }
        else
        {

            *(vec + zmienna) = n;
            zmienna++;
        }
    } while (zmienna < size);

    cout << "\nDisplaying address using pointers: " << endl;

    for (int i = 0; i < zmienna; ++i)
    {
        cout << "vec + " << i << " = " << *(vec + i) << endl;
    }

zwróć uwagę jak to teraz działa, zastanów się co było źle? Zauważ, że za każdym razem nadpisywałeś to samo miejsce w pamięci! Dlatego wynik wychodził Ci w taki a nie inny sposób, kolejna kwestia jest taka, że tablica musi być globalna.

 

Powodzenia ;)

komentarz 18 marca 2020 przez ResCrove Obywatel (1,700 p.)
Dzięki, teraz zadziałało, domyślam się że źle zapisywałem wskaźnik w funkcji

Podobne pytania

0 głosów
1 odpowiedź 870 wizyt
0 głosów
2 odpowiedzi 396 wizyt
pytanie zadane 26 stycznia 2022 w C i C++ przez maxkolanko1998 Gaduła (3,230 p.)
0 głosów
1 odpowiedź 462 wizyt

93,327 zapytań

142,323 odpowiedzi

322,396 komentarzy

62,657 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...