Reklama
Pokazuje wyniki od 1 do 9 z 9

Temat: Pomoc z c++

  1. #1

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny Pomoc z c++

    Jako iż jutro mam kolokwium z podstaw programowania... do tego poprawkowe, chwytam się każdej deski ratunku ;D
    W przykładowym kolokwium znalazłem taki program, a raczej funkcję do napisania
    Tworzaca nowa tablice (nazwijmy ja np. B) na podstawie tablicy (nazwijmy ja np. A) wg
    nastepujacego wzoru:
    B[i]=A[0] + A[1]/1 + A[2]/(1-2) + A[3]/(1-2+3)+..A[i]/(1-2+3-..i)
    Niby wiem jak to powinno wyglądać, ale program zwraca mi nie zawartość tablicy a adresy...
    Zerknalby ktos gdzie jest błąd?

    #include <iostream>
    using namespace std;
    void newtab(float t1[], float t2[], int ile);
    main ()
    {
    float A[5];
    float B[5]={1,2,3,4,5};

    newtab(A, B, 5);

    for (int i=0; i<5; i++)
    {
    cout << A[i] << endl;
    }
    }

    void newtab(float tnew[], float told[], int ile)
    {
    int i;
    float wyr=0;
    int s=0;
    for (i=1; i<ile; i++)
    if(i%2==0)
    {
    s=s-1;
    }
    else
    {
    s=s+1;
    }
    wyr = told[i]/s;
    tnew[i] = told[i-1] + wyr;

    }

  2. #2
    Avatar Tibiarz
    Data rejestracji
    2008
    Położenie
    Tibiantis
    Wiek
    4
    Posty
    16,026
    Siła reputacji
    27

    Domyślny

    Program zwraca wartości, a nie adresy. Tyle, że te wartości to są śmieci, bo funkcja jest źle. W mainie zamiast "float A[5];" daj "float A[5]={0};". Zobaczysz, że po wywołaniu newtab program i tak wypisze same 0, czyli wypisze wartości, ale one nie będą zmienione.
    Ostatnio zmieniony przez Tibiarz : 16-01-2013, 18:16

  3. Reklama
  4. #3
    Avatar bercik
    Data rejestracji
    2005
    Położenie
    Rojca
    Wiek
    35
    Posty
    406
    Siła reputacji
    20

    Domyślny

    Kod:
    for (i=1; i<ile; i++)
    if(i%2==0)
    {
    s=s-1;	
    }
    else
    {
    s=s+1;
    }
    o co chodzi z tym forem? gdzie ma sie zaczynac a gdzie konczy?

  5. #4
    Avatar zakius
    Data rejestracji
    2008
    Położenie
    The Internets
    Wiek
    33
    Posty
    11,075
    Siła reputacji
    24

    Domyślny

    to ten if
    jeśłi pod forem czy ifem jest 1 linijka to może nie być klamerek
    ale
    OP: lepiej jak są
    popraw i wklej kod na nowo w code, żeby taby zachować
    Problem z komputerem? Instrukcja diagnostyczna
    Cytuj Vegeta napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Baby maja wymagania jak windows vista, takze nigdy nie wiesz.
    Cytuj Dzzej napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Moje posty to esencja głupoty.
    "Don't worry, I'm just a pervert"

  6. #5
    Avatar Thrawn
    Data rejestracji
    2005
    Posty
    232
    Siła reputacji
    20

    Domyślny

    Jeżeli chcesz modyfikować zawartość zmiennych w procedurze to przekazując je użyj &.

  7. #6

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    fakt, zapomniałem o {}.

    for (i=0; i<ile; i++)
    {
    if(i%2==0)
    {
    s=s-1;
    }
    else
    {
    s=s+1;
    }
    wyr = told[i]/s;
    tnew[i] = told[0] + wyr;
    }
    zmieniłem też pare rzeczy w środku i program wyświetla jakieś dane w miare normalne, dokładnie:
    0
    1. #INF
    -2
    1. #INF
    -4

    nawet jakby te INF pominąc(co to w ogole znaczy?) to i tak wyniki się nei zgadzają...
    w sumie jakby teraz przeanalizować, to na końcu za nową tabelę daje starą z indeksem 0 + wyraz. W następnym przebiegu funkcji znów dodaję indeks 0 i nowy wyraz, a powinien tylko nowy wyraz dodać...
    Ostatnio zmieniony przez hefalump : 16-01-2013, 18:29

  8. #7
    Avatar Tibiarz
    Data rejestracji
    2008
    Położenie
    Tibiantis
    Wiek
    4
    Posty
    16,026
    Siła reputacji
    27

    Domyślny

    spróbuj rekurencyjnie
    tak na szybko:
    A - podstawowa tablica
    B - nowa tablica

    B[0] = A[0]
    B[i] = B[i-1]+A[i]/x(i)
    x(1) = 1
    x(i) = jeśli i parzyste to: -i/2, jeśli i nieparzyste to: x(i-1)+i

    powinno być ok

    edit.
    masz kod, sprawdź czy dobre wyniki wychodzą
    Kod:
    #include <iostream>
    
    using namespace std;
    
    int x(int i) {
        if(i == 1) return 1;
        else if(i%2 == 0) return -i/2;
        return x(i-1)+i;
    }
    
    void newTab(float A[], float B[], int n) {
        B[0] = A[0];
        for(int i = 1; i < n; i++) {
           B[i] = B[i-1]+A[i]/x(i);
        }
    }
    
    
    int main() {
        
        float A[5] = {1,2,3,4,5};
        float B[5] = {0};
        int n = 5;
        
        newTab(A, B, n);
        for(int i = 0; i < n; i++) {
           cout << B[i] << endl;
        }
    
        return 0;
    }
    A w twoim kodzie, z tego co widzę, to w forze zwiększasz cały czas i o 1, po czym sprawdzasz czy i jest parzyste czy nieparzyste. Jeśli jest parzyste, to zmniejszasz s o 1, w przeciwnym razie zwiększasz o 1, w związku z czym s przyjmuje (na zmianę) tylko wartości 0 i 1. Dalej masz dzielenie przez s, więc przy co drugim wyrazie masz dzielenie przez 0, dlatego wyskakuje ci nieskończoność w co drugim wyniku.
    Ostatnio zmieniony przez Tibiarz : 16-01-2013, 20:28

  9. #8

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    Działa, dzięki, ale mam 1 pytanie...

    if(i == 1) return 1; // gdy i=1 zwraca 1 ?
    else if(i%2 == 0) return -i/2; // gdy i=np 2 zwraca -2/2 = -1 ? i co to daje?
    return x(i-1)+i; // i tutaj, jak to rozumieć? Nie bardzo potrafię to rozkminić...

  10. #9
    Avatar Tibiarz
    Data rejestracji
    2008
    Położenie
    Tibiantis
    Wiek
    4
    Posty
    16,026
    Siła reputacji
    27

    Domyślny

    Cytuj hefalump napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Działa, dzięki, ale mam 1 pytanie...

    if(i == 1) return 1; // gdy i=1 zwraca 1 ?
    else if(i%2 == 0) return -i/2; // gdy i=np 2 zwraca -2/2 = -1 ? i co to daje?
    return x(i-1)+i; // i tutaj, jak to rozumieć? Nie bardzo potrafię to rozkminić...
    To x(i) to jest to, co masz pod kreskami ułamkowymi tam w poleceniu. Czyli kolejno: 1, (1-2), (1-2+3), (1-2+3-4) i tak dalej. A i jest indeksem. W zerowym wyrazie (i=0), czyli tam gdzie masz A[0], nie ma dzielenia. W pierwszym wyrazie (i=1) masz A[1]/1, czyli dzielisz przez 1. W drugim wyrazie (i=2) masz A[2]/(1-2), czyli dzielisz przez -1. W trzecim wyrazie (i=3) masz A[3]/(1-2+3), czyli dzielisz przez 2 i tak dalej. Funkcja x(i) po prostu oblicza przez co będziemy dzielić w i-tym wyrazie.

    Tak, gdy i=1 to dzielimy przez 1, nie musimy tego obliczać, funkcja od razu zwróci wartość.
    Jeśli i jest różne od 1, to musimy obliczyć przez co będziemy dzielić. To, przez co dzielimy, w uproszczeniu wygląda tak: (1-2)+(3-4)+(5-6)+(7-8)+..., jak widzisz w każdym nawiasie jest -1, a tych nawiasów będzie i/2. Czyli dzielimy przez (i/2) * (-1). Tak by było, gdyby i było parzyste. Musimy rozdzielić przypadki gdy i jest parzyste i nieparzyste, bo jeśli będzie nieparzyste, to wygląda to np. tak: (1-2)+(3-4)+(5-6)+7, czyli 3 nawiasy po -1 i jeszcze plus 7. Te 3 nawiasy po -1, to jest wartość x(6), więc x(7) = x(6) + 7. W c++ funkcja może wywoływać samą siebie, ale zamiast tego można było zapisać po prostu (i-1)/2 * (-1) + i.
    Tam gdzie jest i%2 to jest oczywiście co ma zwracać, gdy i będzie parzyste, a w linijce niżej gdy i nieparzyste. W tej ostatniej linijce nie muszę już pisać "else" ani "else if(i%2 == 1)", bo do tej linijki program dochodzi tylko jeśli pozostałe 2 warunki nie były spełnione (bo jeśli by były, to wszedłby w tego ifa i tam trafiłby na return, który oznacza zwrócenie wartości i zakończenie wykonywania funkcji).
    Ostatnio zmieniony przez Tibiarz : 16-01-2013, 20:24

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Odpowiedzi: 7
    Ostatni post: 26-02-2012, 23:05

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •