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

Zwracanie wskaźnika do elementu za ostatnim elementem tablicy.

Object Storage Arubacloud
0 głosów
372 wizyt
pytanie zadane 9 października 2016 w C i C++ przez makkor Początkujący (310 p.)

Witam!
Uczę się programowania w C++ już od jakiegoś czasu. 
Dziś jednak dotarłem do ściany, której nie mogę zburzyć, a oto opis problemu.
Mam program, który już wcześniej zrobiłem, lecz teraz zadaniem jest zamiana funkcji w taki sposób, by każda z nich używała dwóch wskaźników określających zakres.
Dodatkowo, funkcja "fill_array()" zamiast zwracać aktualną liczbę zapisanych elementów, powinna zwracać wskaźnik elementu znajdującego się za ostatnim wypełnionym elementem.
Inne funkcje powinny używać tego wskaźnika jako drugiego parametru pozwalającego wykryć koniec danych.

Dodaję czysty kod zadania, gdyż myślę, że mój tok myślenia jest w tej sprawie trochę ograniczony i zbędne jest dodawanie moich prób zdziałania czegokolwiek.

Proszę o pomoc :)

 

#include <iostream>

const int Max = 5;

// prototypy funkcji
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()
{
    using namespace std;
    double properties[Max];

    int size = fill_array(properties, Max);
    show_array(properties, size);
    if (size > 0)
    {
        cout << "Podaj czynnik zmiany wartości: ";
        double factor;
        while (!(cin >> factor)) //gdy nieliczbowa wartosc 
        {
            cin.clear();
            while (cin.get() != '\n')
                continue;
            cout << "Niepoprawna wartość; podaj liczbę: ";
        }
        revalue(factor, properties, size); //zmiana wartosci
        show_array(properties, size);
    }
    cout << "Gotowe.\n";
    cin.get();
    cin.get();
    return 0;
}

int fill_array(double ar[], int limit)
{
    using namespace std;
    double temp;
    int i;
    for (i = 0; i < limit; i++)
    {
        cout << "Podaj wartość nr " << (i + 1) << ": ";
        cin >> temp;
        if (!cin)    // błędne dane
        {
            cin.clear();
            while (cin.get() != '\n')
                continue;
           cout << "Błędne dane, wprowadzanie danych przerwane.\n";
           break;
        }
        else if (temp < 0)     // nakaz zakończenia
            break;
        ar[i] = temp;
    }
    return i;
}


void show_array(const double ar[], int n)
{
   using namespace std;
   for (int i = 0; i < n; i++)
    {
        cout << "Nieruchomość nr " << (i + 1) << ": ";
        cout << ar[i] << endl;
    }
}

// mnoży każdy element tablicy ar[] przez r(przez wspolczynnik)
void revalue(double r, double ar[], int n)
{
    for (int i = 0; i < n; i++)
        ar[i] *= r;
}

 

1 odpowiedź

+1 głos
odpowiedź 9 października 2016 przez criss Mędrzec (172,590 p.)
wybrane 10 października 2016 przez makkor
 
Najlepsza

No to na tej zasadzie:

int * fillWithZeroes(int * _beg, int * _end)
{
   for(; _beg <= _end; _beg++)
      // whatever, np.:  *_beg = 0;
   return _end + 1;
}

To zakładając, że funkcja wypełnia od _beg do _end włącznie.

komentarz 10 października 2016 przez makkor Początkujący (310 p.)

Dziękuję Ci bardzo za pomoc! smiley
Lakonicznie, ale wystarczyło by nakierować mnie na odpowiednią drogę.

Poniżej kod tego co zrobiłem.

#include <iostream>
const int Max = 5;

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

//zrobione by od poczatku zrozumiec zwracanie wskaznika
/*
double * zwracanie (double * begin, double * end);
void showarray(double * begin, double * end);
*/

int main()
{
    using namespace std;
    double tablica1 [Max];
    double * pd = fill_array(tablica1, tablica1 + Max);
    cout << "Adres pd: " << pd << ", wartosc pd to: " << *pd <<endl;

                    /*
                        double * pt = zwracanie (tablica1, tablica1 + Max);
                        cout << "Adres pt: " << pt << ", wartosc pt to: " << *pt <<endl;
                        showarray(tablica1, tablica1 + Max);
                    */

    show_array(tablica1, pd);
    if (*pd > 0)
    {
        cout << "Podaj czynnik zmiany wartosci: ";
        double factor;
        while (!(cin >> factor)) // nieliczbowa wartość na wejściu
        {
            cin.clear();
            while (cin.get() != '\n')
                continue;
            cout << "Niepoprawna wartosc; podaj liczbę: ";
        }
       revalue(factor, tablica1, pd);
       show_array(tablica1, pd);
    }


    cout << "Gotowe.\n";
    cin.get();
    cin.get();
    return 0;
}

//powtorzenie i nauka
/*
double * zwracanie (double * begin, double * end)
{
    using namespace std;
    double * wskaznik = 0;
    int i = 1;

    for (wskaznik = begin; wskaznik != end; wskaznik++, i++)
    {
        cout << "Podaj " << i << " liczbe: ";
        cin >> *wskaznik;
    }
    cout << endl << "Pokaz ostatni element: " << *(end -1) << endl;

    return (end - 1);
}

void showarray(double * begin, double * end)
{
    using namespace std;

    double * wskaznik;

    for (wskaznik = begin; wskaznik != end; wskaznik++)
    {
        cout << "Zapisano: " << *wskaznik << endl;
    }
}
*/



double * fill_array(double * begin, double * end)
{
    using namespace std;
    double temp;
    double * wskaznik;
    int i = 1;

    for (wskaznik = begin; wskaznik != end; wskaznik++, i++)
    {
        cout << "Podaj wartosc nr " << i<< ": ";
        cin >> temp;
        if (!cin)    // błędne dane
        {
            cin.clear();
            while (cin.get() != '\n')
                continue;
            cout << "Bledne dane, wprowadzanie danych przerwane.\n";
            break;
        }
        else if (temp < 0)     // nakaz zakończenia
            break;
        *wskaznik = temp;
    }
    return (end - 1);
}

// funkcja otrzymuje wskaznik na poczatek i wskaznik na ostatni element tablicy
void show_array(const double * begin, double * pg)
{
    using namespace std;
    const double * wskaznik;
    int i = 1;
    for (wskaznik = begin; wskaznik <= pg; wskaznik++, i++)
    {
        cout << "Nieruchomosc nr " << i << ": ";
        cout << *wskaznik << endl;
    }
}

// mnoży każdy element tablicy przez r
void revalue(double r, double * begin, double * pg)
{
    double * wskaznik;
    int i = 1;
    for (wskaznik = begin; wskaznik <= pg; wskaznik++, i++)
        *wskaznik *= r;
    //for (int i = 0; i < n; i++) // stary kod
    //     ar[i] *= r;
}

 

Podobne pytania

0 głosów
2 odpowiedzi 1,139 wizyt
pytanie zadane 23 października 2016 w C i C++ przez Kasztan Dyskutant (8,080 p.)
0 głosów
1 odpowiedź 580 wizyt
pytanie zadane 2 czerwca 2017 w C i C++ przez mibdbz Gaduła (4,300 p.)
0 głosów
2 odpowiedzi 3,713 wizyt
pytanie zadane 17 listopada 2016 w C i C++ przez intensick Początkujący (420 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

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

...