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

Stephen Prata - wskazniki i funkcje

Object Storage Arubacloud
0 głosów
305 wizyt
pytanie zadane 2 lutego 2019 w C i C++ przez mrKaczorrro13 Użytkownik (560 p.)

Witam!

Mam problem z  takim o to zadaniem: 

"Zmodyfikuj program z listingu 7.7, zamieniając trzy funkcje obsługujące tablice tak, aby każda z nich używała dwóch wskaźników określających zakres. Funkcja fill_array(), zamiast zwracać aktualną liczbę elementów, ma zwrócić wskaźnik elementu znajdującego się za ostatnim wypełnionym elementem. Inne funkcje mają używać tego wskaźnika jako drugiego parametru pozwalającego wykryć koniec danych.

Kod z ksiazki:

#include <iostream>
  
const int Max = 5;
  
int fill_array(double ar[],int limit);
void show_array(const double ar[],int n);
void revalue(double r, double ar[], int n);
  
int main()
{
    double properties[Max];
    int size =fill_array(properties, Max);
    show_array(properties,size);
    if (size>0)
    {
        std::cout<<"Podaj czynnik zmiany wartosci: ";
        double factor;
        while (!(std::cin>>factor))
        {
            std::cin.clear();
            while (std::cin.get() != 'n')
                continue;
            std::cout<<"Niepoprawna wartosc; podaj liczbe: ";
        }
        revalue(factor, properties, size);
        show_array(properties, size);
    }
    std::cout<<"Gotowe.n";
    std::cin.get();
    std::cin.get();
    return 0;
}
  
int fill_array(double ar[],int limit)
{
    double temp;
    int i;
    for (i=0; i<limit; i++)
    {
        std::cout<<"Podaj wartosc nr "<<(i+1)<<": ";
        std::cin>>temp;
        if (!std::cin)
        {
            std::cin.clear();
            while (std::cin.get() != 'n')
                continue;
            std::cout<<"Bledne dane, wprowadzenie danych przerwane.n";
            break;
        }
        else if (temp<0)
            break;
        ar[i]=temp;
    }
    return i;
}
void show_array(const double ar[], int n)
{
    for(int i=0; i<n; i++)
    {
        std::cout<<"Nieruchomosc nr "<<(i+1)<<": ";
        std::cout<<ar[i]<<std::endl;
    }
}
void revalue(double r, double ar[], int n)
{
    for(int i=0; i<n; i++)
        ar[i] *= r;
}

Moj kod ktory przerobilem:

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
const int Max=5;

//prototypy funkcji
void fill_array(double *begin,double *end, double *newResoult);
void show_array(double *begin, double *end);  //nie zmienia danych
void revalue(double r, double *begin, double *end);

int main()
{
    double properties [Max];
    double *beg=&properties[0];
    double *happyEnd=&properties[Max-1];
    double newSize;
    fill_array(beg,happyEnd,&newSize);
    cout<<newSize<<" <--newSize"<<endl;
    show_array(beg,&newSize);
    cout<<newSize<<" <--newSize"<<endl;
    if(sizeof(properties)>0)
    {
        cout<<"Podaj czynnik zmiany wartosci: ";
        double factor;
        while(!(cin>>factor)) //Jesli factor nie jest liczba to wykonuje sie petla while
        {
            //Jesli factor jest liczba to petla sie nie wykonuje i przehcodzi do nastenej instrukcji za petla
            cin.clear();
            while (cin.get()!='\n')
                continue;
            cout<<"Niepoprawna wartosc, podaj liczbe: ";
        }
        revalue(factor, beg,&newSize);
        cout<<newSize<<" <--newSize"<<endl;
        show_array(beg,&newSize);
    }
    cout<<"Gotowe.\n";
    cin.get();
    cin.get();
    return 0;
}

void fill_array(double *begin,double *end, double *newResoult)
{
    double propertyValue;
    double *i;
    int licznik=1;
    for (i =begin; i<=end; i++)
    {
        cout<<"Podaj wartosc nr " <<licznik<< ": ";
        licznik++;
        cin>>propertyValue;
        if(!cin)        //bledne dane
        {
            cin.clear();
            while(cin.get() !='\n')//do momentu napotkania znaku nowego wiersza petla wykonuje sie bez zadnego dzialania.
                continue;
            cout<<"Bledne dane, wprowadzanie danych przerwane.\n";
            break;
            \
        }
        else if (propertyValue<0)    //nakaz zakonczenia
            break;
        *i=propertyValue; //przypisuje danej nieruchomosci wprowadzona wartosc przez uzytkownika.
    }
}
void show_array(double *begin, double *end)
{
    int licznik=1;
    cout<<"SHOW ARRAY\n";
    for(double *i=begin; i<=end; i++)
    {
        cout<<"Nieruchomosc nr " <<licznik<< ": ";
        licznik++;
        cout<<*i<<endl;
    }
}
void revalue(double r, double *begin, double *end)
{
    cout<<"Revalue!\n";
    for(double *i=begin; i<end; i++)
        *i*=r;
}

To zadnie bylo juz przerabiane na tym forum jednak nikt go nie rozwiazal poprawnie ani nie wytlumaczyl dokaldnie tego zadania. 

Probwalem to rozwiazac na kilka sposobow ale zawsze cos nie tak. Tutaj probwalem zwrocic wskaznik z funkcji fill_array tak zeby go przekazac do show_array ale nie dziala poprawnie. JAk odpalam program z tym kodem to nie wiem czemu ale funkcja show_array wyswietla mi az 7 Nieruchomosci mimo tego za sam podaje tylko 5, i do tego dwa ostatnie z jakimis dziwnymi liczbami. wartosc wyswietlana przez newSize tez nie mam pojecia skad sie wziela;/

Nie zalezy mi na podaniu pelnego rozwiazania tylko bardzo prosze o jakas wskazowke. Z gory wielkie dzieki!

 

(wyswietlenia "SHOW ARRAY", cout<<newSize<<" <--newSize"<<endl; i cout<<"Revalue!\n"; sa tylko zebym mogl sie bardziej polapac w kodzie.) 

komentarz 2 lutego 2019 przez sp00ky Obywatel (1,760 p.)
edycja 2 lutego 2019 przez sp00ky

Przeczytaj dokładnie treść zadania. 

Funkcja fill_array(), zamiast zwracać aktualną liczbę elementów, ma zwrócić wskaźnik elementu znajdującego się za ostatnim wypełnionym elementem. 

mała podpowiedź - prototyp funkcji powinien wyglądać tak:

double *fill_array(double* begin, double* end);

 

komentarz 3 lutego 2019 przez mrKaczorrro13 Użytkownik (560 p.)
Dziekuje bardzo za podpowiedz. Owszem program dziala prawie tak jak trzeba, jednak nie do konca. Ze tak powiem "Prawie sie udalo";p

Opisalem z czym mam problem nizej w komentarzu.

1 odpowiedź

0 głosów
odpowiedź 2 lutego 2019 przez adrian17 Ekspert (344,860 p.)

Probwalem to rozwiazac na kilka sposobow ale zawsze cos nie tak. Tutaj probwalem zwrocic wskaznik z funkcji fill_array tak zeby go przekazac do show_array ale nie dziala poprawnie. JAk odpalam program z tym kodem to nie wiem czemu ale funkcja show_array wyswietla mi az 7

Na razie to w fill_array zupełnie nic nie robisz z `newResoult`.

Najpierw zrób tak jak było w treści zadania (zwracaj wartość), wtedy wrzuć nowy kod i zobaczymy co w nim jest nie tak.

aby każda z nich używała dwóch wskaźników określających zakres

BTW, to zazwyczaj oznacza to samo, co napisał niżej - że wskaźnik na koniec zakresu wskazuje na 1 po ostatnim elemencie.

komentarz 3 lutego 2019 przez mrKaczorrro13 Użytkownik (560 p.)

Tutaj jest zmieniony kod: 

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
const int Max=5;

//prototypy funkcji
double *fill_array(double *begin,double *end);
void show_array(double *begin, double *end);  //nie zmienia danych
void revalue(double r, double *begin, double *end);

int main()
{
    double properties [Max];
    double *beg=&properties[0];
    double *happyEnd=&properties[Max-1];
    double *newSize=fill_array(beg,happyEnd);
    cout<<*newSize<<" <--newSize"<<endl;
    show_array(beg,newSize);
    cout<<newSize<<" <--newSize"<<endl;
    if(sizeof(properties)>0)
    {
        cout<<"Podaj czynnik zmiany wartosci: ";
        double factor;
        while(!(cin>>factor)) //Jesli factor nie jest liczba to wykonuje sie petla while
        {
            cout<<"FACTOR\n";
            //Jesli factor jest liczba to petla sie nie wykonuje i przehcodzi do nastenej instrukcji za petla
            cin.clear();
            while (cin.get()!='\n')
                continue;
            cout<<"Niepoprawna wartosc, podaj liczbe: ";
        }
        revalue(factor, beg,newSize);
        cout<<newSize<<" <--newSize"<<endl;
        show_array(beg,newSize);
    }
    cout<<"Gotowe.\n";
    cin.get();
    cin.get();
    return 0;
}

double *fill_array(double *begin,double *end)
{
    double propertyValue;
    double *i;
    int licznik=1;
    for (i =begin; i<=end; i++)
    {
        cout<<"Podaj wartosc nr " <<licznik<< ": ";
        licznik++;
        cin>>propertyValue;
        if(!cin)        //bledne dane
        {
            cin.clear();
            while(cin.get() !='\n')//do momentu napotkania znaku nowego wiersza petla wykonuje sie bez zadnego dzialania.
                continue;
            cout<<"Bledne dane, wprowadzanie danych przerwane.\n";
            break;
        }
        else if (propertyValue<0)    //nakaz zakonczenia
            break;
        *i=propertyValue; //przypisuje danej nieruchomosci wprowadzona wartosc przez uzytkownika.
    }
}
void show_array(double *begin, double *end)
{
    int licznik=1;
    cout<<"SHOW ARRAY\n";
    for(double *i=begin; i<=end; i++)
    {
        cout<<"Nieruchomosc nr " <<licznik<< ": ";
        licznik++;
        cout<<*i<<endl;
    }
}
void revalue(double r, double *begin, double *end)
{
    cout<<"Revalue!\n";
    for(double *i=begin; i<end; i++)
        *i*=r;
}

Kiedy wyswietlam wartosc *newSize wyswietlaja sie jakies dziwne liczby. W zalozeniu mialem tak zeby wyswietala sie konkretna liczba,  ktora moglbym zwrocic do pozostalych funkcji. Musze cos zle robic w funkcji fill_array ale nie wiem na co musze zwrocic uwage. ??

Mam jeszcze problem z tym ze kiedy podam mniej nieruchomosci niz 5 to program mi sie zawiesza. Wedlugo mojego toku rozumowania w funkcji fill_array, instrukcja if( ! cin ) powinna sie wykonac o ile podany cin nie jest liczba. Kiedy podaje jakas litere to ten "if" wcale sie nie wykonuje, tylko zapetla sie wyswietlanie: 

cout<<"Podaj wartosc nr " <<licznik<< ": ";

do duzej liczby az w koncu program sie zawiesza. Podejrzewam ze ma to zwiazek z faktem ze w warunku petli for uzywam wskaznikow, a raczej adresow wskaznikow.

Dziekuje bardzo za pomoc.

komentarz 4 lutego 2019 przez sp00ky Obywatel (1,760 p.)
edycja 4 lutego 2019 przez sp00ky

Funkcja fill_array dalej nic nie zwraca, brakuje return :), dodatkowo linia 49 powinno być i != end. W funkcji show_array brakuje słowa kluczowego const przy argumentach, przecież nie chcesz zmieniać danych. Myślę, że w funkcji main() masz za dużo zmiennych, zastanów się na tym jeszcze raz.

komentarz 5 lutego 2019 przez mrKaczorrro13 Użytkownik (560 p.)

Ok, poprawilem to na co zwrociles uwage. Dziekuje bardzo!

Funkcja fill_array zwraca teraz wartosc (jakas na pewno zwraca, ale czy dobra?;p). Jednak teraz nie dziala mi funkcja show_array. Jako ze dodalem const do parametrow funkcji to teraz kompilator wymaga ode mnie dodania const rowniez w instrukcji petli for. Const sprawia ze dana wartosc jest niezmienna a przeciez  w instrukcji:

for(const double *i=begin; i!=end; i++)

chodzi mi o to zeby "i" sie zmienialo. Podejrzewam ze ma to tez wplyw na to iz jak teraz kompiluje program to mi sie on wysypuje.

Wartosc zwracana przez funkcje fill_array to wskaznik *newSize. Jednak do funkcji show_array kiedy chce przekazac wartosc wskaznika przez operator wyluskania to nie pozwala mi na to kompilator a w takiej postacji jakiej jest teraz to przeciez przekazuje adres a nie wartosc. 

show_array(&properties[0],newSize); 

Z tego co wiem to *newSize wskazuje wartosc a newSize wskazuje adres... Z gory dziekuje za pomoc, wiem ze moze za pytam ale jaka kolwiek mala wskazowka na pewno mi bardzo pomoze. 

Tutaj nowy kod:

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
const int Max=5;

//prototypy funkcji
double *fill_array(double *begin,double *end);
void show_array(const double *begin,const double *end);  //nie zmienia danych
void revalue(double r, double *begin, double *end);

int main()
{
    double properties [Max];
    double *newSize=fill_array(&properties[0],&properties[Max-1]);
    cout<<*newSize<<" <--newSize"<<endl;
    show_array(&properties[0],newSize);
    cout<<newSize<<" <--newSize"<<endl;
    if(sizeof(properties)>0)
    {
        cout<<"Podaj czynnik zmiany wartosci: ";
        double factor;
        while(!(cin>>factor)) //Jesli factor nie jest liczba to wykonuje sie petla while
        {
            cout<<"FACTOR\n";
            //Jesli factor jest liczba to petla sie nie wykonuje i przehcodzi do nastenej instrukcji za petla
            cin.clear();
            while (cin.get()!='\n')
                continue;
            cout<<"Niepoprawna wartosc, podaj liczbe: ";
        }
        revalue(factor, &properties[0],newSize);
        cout<<newSize<<" <--newSize"<<endl;
        show_array(&properties[0],newSize);
    }
    delete newSize;
    cout<<"Gotowe.\n";
    cin.get();
    cin.get();
    return 0;
}

double *fill_array(double *begin,double *end)
{
    double propertyValue;
    double *i;
    double *licznik=new double;
    *licznik=1;
    for (i =begin; i!=end; i++)
    {
        cout<<"Podaj wartosc nr " <<*licznik<< ": ";
        *licznik+=1;
        cin>>propertyValue;
        if(!cin)        //bledne dane
        {
            cin.clear();
            while(cin.get() !='\n')//do momentu napotkania znaku nowego wiersza petla wykonuje sie bez zadnego dzialania.
                continue;
            cout<<"Bledne dane, wprowadzanie danych przerwane.\n";
            break;
        }
        else if (propertyValue<0)    //nakaz zakonczenia
            break;
        *i=propertyValue; //przypisuje danej nieruchomosci wprowadzona wartosc przez uzytkownika.
    }
    return licznik;
}
void show_array(const double *begin,const double *end)
{
    int licznik=1;
    cout<<"SHOW ARRAY\n";
    for(const double *i=begin; i!=end; i++)
    {
        cout<<"Nieruchomosc nr " <<licznik<< ": ";
        licznik++;
        cout<<*i<<endl;
    }
}
void revalue(double r, double *begin, double *end)
{
    cout<<"Revalue!\n";
    for(double *i=begin; i<end; i++)
        *i*=r;
}

 

komentarz 5 lutego 2019 przez sp00ky Obywatel (1,760 p.)

funkcje powinny wyglądać jakoś tak:

double *fill_array(double *begin, double *end)
{
    double propertyValue;
    double *i;
    int licznik = 0;
    for ( i = begin; i != end; i++)
    {
        cout << "Podaj wartosc nr." << (licznik + 1) << ": ";
        cin >> propertyValue;
        licznik++;
        if (!cin)
        {
            cin.clear();
            while (cin.get() != '\n') {}
            std::cout << "Bledne dane, wprowadzanie przerwane!\n";
            break;
        }
        if (propertyValue < 0)
        {
            break;
        }
        *i = propertyValue;
    }
    return i;
}
void show_array(const double *begin, const double *end)
{
    const double *i;
    int licznik = 0;

    cout << "--\n";
    for ( i = begin; i != end; i++)
    {
        cout << "Nieruchomosc nr." << (licznik + 1) << ": " << *i << "\n";
        licznik++;
    }
}
void revalue(double r, double *begin, const double *end)
{
    double *i;
    for (i = begin; i != end; i++)
    {
        *i *= r;
    }
}

Powiem Tobie tak, ja aktualnie też staram się uczyć z tej książki ale jestem niezadowolony. W książce jest zdecydowanie za mało aktualnego c++. Myślę, że w tym zadaniu aż się prosi o wykorzystanie kontenera vector oraz użycie iteratorów.

komentarz 6 lutego 2019 przez mrKaczorrro13 Użytkownik (560 p.)
Dzieki wielkie za podane funkcje. Juz je sobie sam na spokojnie rozloze na czesci pierwsze i ogarne.

Co do ksiazki, uwazam ze niestety nie powstala i raczej nigdy nie powstanie zadna ksiazka o programowaniu ktora bylby idealna dla kazdego. To zadanie jest z rodzialu 7, do iteratorow jeszcze mam troche drogi przed soba. Osobiscie musze powiedziec, ze podoba mi sie ta ksiazka. Racja, sa czasem zadania, ktore nie maja zadnego sensu i tluczesz je tylko po to, zeby wykorzystac to co bylo omowione w danym rozdziale. Wychodze jednak z zalozenia, ze o ile lepiej poznam jakies zagadnienia to tylko sprawi, ze bedzie mi latwiej w daleszych etapach nauki. Koniec koncow na rozwiazywaniu zadan nie strace, za to na pewno zawsze sie rozwine, jezeli nie jako programista to potrenuje swoje nerwy, umiejetnosc nie poddawania sie lub rozwiazywania problemow:) Zycze powodzenia i Tobie i sobie;p

Podobne pytania

0 głosów
1 odpowiedź 370 wizyt
pytanie zadane 29 stycznia 2019 w C i C++ przez look Użytkownik (520 p.)
0 głosów
0 odpowiedzi 501 wizyt
pytanie zadane 11 listopada 2019 w C i C++ przez CleaverMan Nowicjusz (140 p.)
0 głosów
4 odpowiedzi 845 wizyt

92,576 zapytań

141,425 odpowiedzi

319,650 komentarzy

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

...