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

C++, kursy Mirosława Zelenta, lekkie rozwiniecie lekcji o wskaznikach ale coś nie działa.

0 głosów
186 wizyt
pytanie zadane 7 lipca 2018 w C i C++ przez Kuszauke Nowicjusz (120 p.)

Cześć jako, że to mój pierwszy post to najpierw się przedstawię. Jestem Mikołaj, skończyłem technikum informatyczne jakieś 2 lata temu i oczywiście nie mogę znaleźć pracy nawet w serwisie, a na studia nie ma czasu i pieniędzy(bo praca...) więc stwierdziłem, że zdobędę umiejętności na własną rękę, dlatego przypomniałem sobie z jakich kursów próbowali nam coś wpoić w technikum, wziąłem sie za siebie i teraz w wolnych chwilach staram się coś z tych kursów wyciągnąć, bo wiadomo, że uwaga na lekcji przepełnionej uczniami klasy TI skupiała się raczej na graniu w CS-a albo przeglądaniu 4chana bez celu. 

Uczę się właśnie Cpp z kursu Mirosława Zelenta, jestem przy lekcji o wskaźnikach. Ogólnie w oryginalnym kodzie z odcinka program liczył w jakim czasie komputer odnajdzie w RAMie komórki przy użyciu wskaźników . Chciałem pójść o krok dalej i napisać do tego ćwiczenia coś od siebie(praktyka czyni mistrza).

Mój dodatkowy kod, który umieściłem w funkcji "okwt" miał poprosić użytkownika o dodanie danych do zmiennej "ile" oraz "pierwsza" i na podstawie tych danych wyznaczyć ilość komórek jakie tablica o nazwie "tablica" ma zarezerwować w RAMie, oraz w każdej z tych komórek wpisać wartości o jeden większe niż w poprzedniej komórce, a w pierwszej powinna znajdować się wartość ze zmiennej "pierwsza".

Tutaj kod oryginalny z kursu:

 

#include <iostream>

using namespace std;

float srednia(float *tab, int ile)
{

    float suma=0;

    for(int i=0; i<=ile; i++)
    {

        suma+=*tab;
        *tab = 999;
        tab++;

    }

    return suma/ile;

}



int main()
{
    int ile_adresow;
    float tablica[ile_adresow];
    float pierwsza;
    
    cout<<"Podaj liczbe adresow: "; cin>>ile_adresow; cout<<endl;
    cout<<"Podaj pierwsza liczbe: "; cin>> pierwsza; cout<<endl;
    cout<<"Srednia wynosi: "<<srednia(tablica,ile_adresow);

}

A tutaj mój kod:

#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <time.h>
#include <stdio.h>
#include <cstdlib>
#include <conio.h>
#include <fstream>
#include <algorithm>
#include <string>

using namespace std;

float okwt(float *tabli, int ia, float p);
float srednia(float *tab, int ile);

int main()
{
    int ile;
    float tablica[ile=0];
    float pierwsza;

    cout<<"Podaj liczbe adresow: ";
    cin>>ile; cout<<endl;
    cout<<"Podaj pierwsza liczbe: ";
    cin>> pierwsza; cout<<endl;
    okwt(tablica,ile,pierwsza);
    cout<<endl;
    cout<<"Srednia obliczen wynosi: "<<srednia(tablica,ile);


    return 0;
}

float okwt(float *tabli, int ia, float p)
{

    for(int i=0; i<=ia; i++)
    {

        tabli[i]=p+1;
        i++;
        cout<<i<<". Wpis w tablicy to: "<<tabli[i]<<endl;

    }

    return 0;

}

float srednia(float *tab, int ile)
{

    float suma=0;

    for(int i=0; i<=ile; i++)
    {

        suma+=*tab;
        *tab = 999;
        tab++;

    }

    return suma/ile;

}

Oraz wynik mojego programu:

Do zmiennej "ile" powędrowało 12, a do zmiennej "pierwsza" powędrowało 1, więc według tego co chce osiągnąć powinno wyświetlić liczby od 1 do 12... no i się wykrzaczył na końcu, nie robi tego za każdym razem na szczęście.

Bądźcie proszę wyrozumiali bo dopiero zaczynam przygodę z programowaniem, jedyne co wcześniej robiłem to kodowanie w lua jakiś małych skryptów do modyfikacji multiplayer do Gothica II.

2 odpowiedzi

+1 głos
odpowiedź 7 lipca 2018 przez niezalogowany
edycja 7 lipca 2018

1. Po co Ci te wszystkie biblioteki? Samo <iostream> wystarczy...

2. 

void okwt(float *tabli, int ia, float p)
{
 
    for(int i=0; i<=ia; i++)
    {
 
        tabli[i]=p+1;
        i++;
        cout<<i<<". Wpis w tablicy to: "<<tabli[i]<<endl;
 
    } 
}

Jeżeli funkcja ma zwracać 0 i coś wypisywać, to lepiej, żeby nic nie zwracała i była voidem.

3. Jaki cel ma funkcja powyżej?  Do CO DRUGIEJ komórki w tablicy zapisujesz wartość p + 1, a w ostatnim wywołaniu tablicy próbujesz dostać się do indexu, który jest poza granicami tablicy. Dlaczego? Niepotrzebnie inkrementujesz iterator pętli wewnątrz samej pętli (i++;).

4. Efekt, który chchiałeś uzyskać:

void okwt(float *tabli, int ia, float p)
{
 
    for(int i=0; i<ia; i++)
    {
 
        tabli[i]=p+i;
        cout<<i<<". Wpis w tablicy to: "<<tabli[i]<<endl;
 
    }
}

5. Deklarujesz tablice o rozmiarze 0 -> float tablica[ile=0];

komentarz 7 lipca 2018 przez Kuszauke Nowicjusz (120 p.)
Dziękuje również za drugą odpowiedź. Chciałem to przerobić na Voida jeśli by działało albo dopisać dla treningu jeszcze jednego Voida. W pisaniu obu rodzajów funkcji, które znam chciałem się podszkolić a zwyczajna funkcja, nie Void była dla mnie łatwiejsza do zrozumienia bo jest analogiczna do funkcji w Lua, tam podobnie się to robiło dlatego zacząłem od tego rodzaju funkcji, nie wiem czy mają jakąś nazwę tak jak się nazywa Voida Voidem...

A biblioteki są bo kopiuje sobie wszystkie do kolejnych kodów, bo nie pamiętam jeszcze co jest w jakiej bibliotece więc staram się po prostu nie zdziwić nagle, że coś nie działa bo pewnie bym się nie domyślił, że chodzi o bibliotekę, a nawet jeśli to nie domyślił bym się jaką a myślę, że przy takich małych programach doczytanie tych kilku bibliotek więcej dużo nie zmienia.

Edit: Oczywiście powędrował głos +
+1 głos
odpowiedź 7 lipca 2018 przez 10kw10 Pasjonat (22,890 p.)
int *tablica = new int[rozmiar];

Tak musisz zadeklarowac tablice. Napewno była o tym mowa na filmie. Jesli zadeklarujesz 0 komorek, potem zmienisz wartosc zmiennej 'rozmiar' to i tak rozmiar tablicy dalej bedzie rowny 0.

Reasumujac:

// deklaracja zmiennej rozmiar
// pobranie wartosci do rozmiar
// deklaracja tablicy za pomoca new o rozmiarze rozmiar ( raczej nie deklaracja ale wiadomo o co chodzi) ;d

 

komentarz 7 lipca 2018 przez Kuszauke Nowicjusz (120 p.)
Podziękował, akurat wyskoczyłem na miasto, ale zakładam, że będzie działać dlatego od razu daje plusika. Jeszcze raz dzięki za pomoc.
komentarz 7 lipca 2018 przez 10kw10 Pasjonat (22,890 p.)

Jeszcze masz pare bledow np to polecenie

wpisać wartości o jeden większe niż w poprzedniej komórce, a w pierwszej powinna znajdować się wartość ze zmiennej "pierwsza".

slowo kluczowe: poprzedniej ;d

Jakby cos to pisz ;)

Podobne pytania

0 głosów
1 odpowiedź 102 wizyt
+14 głosów
12 odpowiedzi 5,315 wizyt
pytanie zadane 25 października 2017 w Offtop przez niezalogowany
0 głosów
3 odpowiedzi 495 wizyt
pytanie zadane 21 listopada 2018 w HTML i CSS przez Byczek_ Bywalec (2,570 p.)

87,916 zapytań

136,502 odpowiedzi

304,327 komentarzy

58,290 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...