• 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.

VPS Starter Arubacloud
0 głosów
234 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,880 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,880 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ź 366 wizyt
+13 głosów
12 odpowiedzi 6,075 wizyt
pytanie zadane 25 października 2017 w Offtop przez niezalogowany
0 głosów
3 odpowiedzi 627 wizyt
pytanie zadane 21 listopada 2018 w HTML i CSS przez Byczek_ Bywalec (2,570 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 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!

...