• 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

Object Storage Arubacloud
0 głosów
754 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 (155,460 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 (155,460 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ź 719 wizyt
0 głosów
2 odpowiedzi 267 wizyt
pytanie zadane 26 stycznia 2022 w C i C++ przez maxkolanko1998 Gaduła (3,230 p.)
0 głosów
1 odpowiedź 309 wizyt

92,566 zapytań

141,420 odpowiedzi

319,604 komentarzy

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

...