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

Szkola programowania Stephen Prata rozdzial 8 zadanie 5.

Object Storage Arubacloud
0 głosów
370 wizyt
pytanie zadane 29 stycznia 2019 w C i C++ przez look Użytkownik (520 p.)

Witam,

Nie chce wypisywac calej tresci zadania aczkolwiek mam pewien problem z szablonem, moj kod wyglada tak.

Szablon prototyp:

template <class T>
T max5(T tab[]);

a do tego tresc:

T max5(T tab[])
{
    const int ArSize = 5;
    T Max = tab[i];
    for(int i = 0; i < ArSize; i++)
    {
        if(tab[i] < tab[i+1])
        {
            T Max = tab[i+1];
        }
        else continue;
    }
    return Max;
}

No i gdy kompiluje calosc ktora wyglada tak:

#include <iostream>

using namespace std;

template <class T>
T max5(T tab[]);

int main()
{
    int tab[] = {0, 1, 2, 3, 4};
    cout << max5(tab);

    double tab2[] = {1.5, 2.5, 3.5, 4.5, 5.5};
    cout << max5(tab2);
    return 0;
}

T max5(T tab[])
{
    const int ArSize = 5;
    T Max = tab[i];
    for(int i = 0; i < ArSize; i++)
    {
        if(tab[i] < tab[i+1])
        {
            T Max = tab[i+1];
        }
        else continue;
    }
    return Max;
}

dostaje cos takie przy probie kompilacji:

error: 'T' does not name a type

Cos zepsulem przy szablonie czy o co chodzi?indecision

1 odpowiedź

+1 głos
odpowiedź 30 stycznia 2019 przez niezalogowany
edycja 30 stycznia 2019
  1. error: 'T' does not name a type
    template <typename T>
    T max5(T tab[])
  2. error: 'i' was not declared in this scope
       22 |     T Max = tab[i];
    Zmienna 'i' nie została zadeklarowana w scope. Prawdopodobnie chciałeś przypisać zmiennej Max pierwszy element:
    T Max = tab[0];
  3. Tworzysz kolejną zmienną Max, która nie zostanie użyta:
    warning: unused variable 'Max' [-Wunused-variable]
       27 |             T Max = tab[i+1];
    Usuń typ T, aby wykonać tylko przypisanie do istniejącej zmiennej:
    Max = tab[i+1];
  4. Przy głębszej analizie można zauważyć, że niektóre wyniki mogą być błędne. Dzieje się to dlatego, że wychodzisz poza zakres tablicy i algorytm jest błędny. Problem pierwszy omówię później. Jeżeli dwie liczby nie są równe to nie oznacza to, że od razu są wartością maksymalną w tablicy. Wystarczy porównywać z aktualnie największą spotkaną liczbą:
    for(int i = 1; i < ArSize; i++) 
        {
            if(Max < tab[i])
            {
                Max = tab[i];
            }
        }
    
  5. else continue jest zbędne.

Poprawny kod (ze wszystkimi zmianami):

#include <iostream>
 
using namespace std;
 
template <class T>
T max5(T tab[]);
 
int main()
{
    int tab[] = {0, 1, 2, 3, 4};
    cout << max5(tab) << "\n";
 
    double tab2[] = {1.5, 2.5, 3.5, 4.5, 5.5};
    cout << max5(tab2) << "\n";
    return 0;
}
 
template <typename T>
T max5(T tab[])
{
    const int ArSize = 5;
    T Max = tab[0];
    for(int i = 0; i < ArSize; i++)
    {
        if(Max < tab[i])
        {
            Max = tab[i];
        }
    }
    return Max;
}

Wracając do wychodzenia poza zakres tablicy. Załóżmy, że mamy taki program:

#include <iostream>
 
int main()
{
    const int arr_size = 5;
    int array[arr_size] {1, 4, 1, 2, 3};
    
    int count = 0;
    for (int i = 0; i < arr_size; ++i) 
    {
        if (array[i] + array[i + 1] == 5)
        {
            count++;
        }
    }
    std::cout << count << "\n";
}

Szuka on ile jest sąsiednich par liczb których suma jest równa 5. Gdy i = 4 to i + 1 będzie równe 5 (poza tablicą). Więc żeby tego uniknąć należy zmienić warunek pętli na:

i < arr_size - 1
komentarz 30 stycznia 2019 przez look Użytkownik (520 p.)
Dziekuje za wyjasnienie i odpowiedz, wiele wyjasnia. :)

Podobne pytania

0 głosów
2 odpowiedzi 374 wizyt
0 głosów
1 odpowiedź 407 wizyt
pytanie zadane 9 września 2017 w C i C++ przez Modferno Początkujący (400 p.)
0 głosów
4 odpowiedzi 845 wizyt

92,576 zapytań

141,426 odpowiedzi

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

...