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

question-closed Zmiana typu zmiennej // edit Problem z tablicą

VPS Starter Arubacloud
0 głosów
356 wizyt
pytanie zadane 31 października 2017 w C i C++ przez PanJaqb Początkujący (360 p.)
zamknięte 31 października 2017 przez PanJaqb

Cześć!
To mój pierwszy post, dlatego witam wszystkich :)
Mój problem powstał w wyniku wykonywania zadania domowego z lekcji  Kurs C++ (#11). Założenie zadania domowego mówi o podaniu 5 liczb z których zostanie policzona średnia, a następnie wybierze liczbę najbardziej zbliżoną do średniej. Otóż zmodyfikowałem założenia i chciałbym aby to użytkownik wybrał ilość liczb wczytanych do programu. Teraz kod źródłowy, a po nim pytania:

#include <iostream>

using namespace std;

int main()
{
    cout << "Ile liczb chcesz wprowadzic? Wpisz: ";

    int ile_liczb;
    cin >> ile_liczb;

    float tablica[float(ile_liczb)];        float *wtablica=&tablica;
    float liczba;                           float *wliczba=&liczba;

    for (int i=0; i<ile_liczb; i++)
    {
        cout << "Wprowadz " << (i+1) << ". liczbe: ";
        cin >> *wliczba;
        *wtablica=*wliczba;
        wtablica++;
     }
    return 0;
}

Oczywiście jest to początek programu, ale mam problem z rzutowaniem zmiennej otóż moja zmienna ile_liczb jest zmienną typu int równocześnie rozmiarem tablicy  tablica typu float, ponieważ liczby wprowadzane do programu będą zmiennoprzecinkowe. Kompilator wyrzuca błąd przy linijce gdzie deklaruje tablicę oraz jej rozmiar, próba zmiany typu zmiennej nie pomaga.

||=== Build: Debug in zadanie (compiler: GNU GCC Compiler) ===|
...\main.cpp||In function 'int main()':|
...\main.cpp|12|error: size of array 'tablica' has non-integral type 'float'|
...\main.cpp|12|error: cannot convert 'float (*)[1]' to 'float*' in initialization|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

W ogóle zastanawia mnie to czemu rozmiar tablicy musi mieć taki sam typ jak tablica. rozmiar zawsze będzie intem?

Wiem, że problem można rozwiązać zmianą typu zmiennej ile_liczb z int na float, ale chciałbym rozwiązać ten problem inaczej, jak poprawnie zmienić typ zmiennej w momencie jej wykorzystania. 
Dziękuje za sugestie :)

komentarz zamknięcia: Dynamiczne alokowanie pamięci rozwiązało problem
komentarz 31 października 2017 przez Aisekai Nałogowiec (42,190 p.)
Rozmiar tablicy nie wiem czy musi, ale powinien być intem. Więc podawanie rozmiaru jako int nie powinien być problemem
komentarz 31 października 2017 przez PanJaqb Początkujący (360 p.)

Jeśli usuną rzutowanie czyli:

int ile_liczb;                              int *wile_liczb;
cin >> *wile_liczb;
float tablica[ile_liczb];                   float *wtablica=&tablica;

to mam błąd

...\main.cpp|3|error: cannot convert 'float (*)[ile_liczb]' to 'float*' in initialization|

1
komentarz 31 października 2017 przez Ditrix Mądrala (5,650 p.)

Dynamiczne alokowanie pamięci, tzw. dynamiczna tablica.

np.

int n;
cin >> n;
float * tab = new float[n];

 

1 odpowiedź

0 głosów
odpowiedź 31 października 2017 przez PanJaqb Początkujący (360 p.)

aktualny kod:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    cout << "Ile liczb chcesz wprowadzic? Wpisz: ";

    int ile_liczb;                              int *wile_liczb=&ile_liczb;
    cin >> *wile_liczb;

    float tablica[*wile_liczb];                 float *wtablica=&tablica;
    float liczba;                               float *wliczba=&liczba;
    float suma=0;                               float *wsuma=&suma;
    int i=0;                                    int *wi=&i;

    for (*wi; *wi<*wile_liczb; wi++)
    {
        cout << "Wprowadz " << (i+1) << ". liczbe: ";
        cin >> *wliczba;
        *wtablica=*wliczba;
        wtablica++;
        *wsuma+=*wliczba;
    }

    float srednia = (*wsuma)/(*wile_liczb);     float *wsrednia=&srednia;
    float roznica=abs(*wsuma*99);               float *wroznica;

    for (*wi=0; *wi<*wile_liczb; wi++)
    {
        if (abs(tablica[*wi]-*wsrednia)<*roznica)
        {
            *wliczba=tablica[*wi];
        }
    }

    cout << "Srednia to: " << *wsrednia << ", liczba najblizej sredniej to: " << liczba;
    return 0;
}

błędy:

...\main.cpp|12|error: cannot convert 'float (*)[*wile_liczb]' to 'float*' in initialization|

Podobne pytania

0 głosów
1 odpowiedź 177 wizyt
0 głosów
2 odpowiedzi 521 wizyt
pytanie zadane 24 października 2019 w C i C++ przez KumberTwo Dyskutant (8,270 p.)
+1 głos
2 odpowiedzi 198 wizyt
pytanie zadane 29 grudnia 2022 w Python przez neo1020 Dyskutant (8,430 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...