inny wynik w main niż w funkcji

0

Robie zadanie ze SPOJa (BFN1 - Zabawne Dodawanie Piotrusia). W skrócie należy podać liczbę np.49 i sprawdzić czy nie jest palindromem, jeśli nie dodać do niej liczbę z przestawionymi odwrotnie cyframi czyli 49+94 i sprawdzić, czy suma nie jest palindromem, jeśli nie to ponowić dodawanie dla sumy i tak w kółko aż się uzyska palindrom. Zrobiłem funkcje która dobrze działa ale zwraca do main'a 1 za każdym razem kiedy jest więcej niż jedno powtórzenie. Dla testu polecam wprowadzić liczba t=1 i n 79 albo 78 albo 75. Dla jednego powtórzenia działa, ale jak jest ich więcej to main dostaje zawsze 1. Wstawiłem kilka kontrolnych cout, żeby było łatwiej szukać, ale nie daje rady. Poniżej kod.

#include <iostream>
#include <sstream>
#include <string>
#include<cstdlib>

using namespace std;

funkcja(int n1)


{
    stringstream ss;
    string liczba1;
    string liczba2;
    string liczba3;
    int dlugosc,n2,n3,licznik=0;
    licznik++;


    ss.str("");
    ss<<n1<<endl;
    liczba1=ss.str();
    dlugosc=liczba1.length();
    cout<<"dlugosc liczby1  "<<dlugosc<<endl;
    for (int i=dlugosc-2; i>=0; i--)
    {
        liczba2=liczba2+liczba1[i];
    }
    n2= atoi(liczba2.c_str());
    cout<<"N1  "<<n1<<endl;
    cout<<"N2  "<<n2<<endl;
    n3=n1+n2;
    ss.str("");
    ss<<n3<<endl;
    liczba3=ss.str();
    cout<<"liczba 3:"<<liczba3<<endl;
    dlugosc=liczba3.length();
    cout<<"dlugosc liczby 3  "<<dlugosc<<endl;

    if(liczba3[dlugosc-2]==liczba3[0])
    {
        int wynik;
        cout<<"liczba 3 "<<liczba3<<endl;
        wynik= atoi(liczba3.c_str());
        cout<<"wynik w funkcji "<<wynik<<endl;
        return wynik;
    }
    else
    {
        n1= atoi(liczba3.c_str());
        funkcja(n1);
    }
}

int main()
{
    int dlugosc,n1,n2,n3;
    int t;
    int *licznik;

    do
    {
        cout << "podaj t:" << endl;
        cin>>t;
    }
    while (t>80);
    int n[t];
    for (int i=0; i<t; i++)
        do
        {
            cout<<"podaj n:"<<endl;
            cin>>n[i];
        }
        while ((n[i]<1)||n[i]>80);
    for (int j=0; j<t; j++)
        if (((n[j])<10)||(n[j]%11==0))
        {
            cout<<n[j]<<" 0"<<endl;
        }

        else
        {
            cout<<"wynik w main "<<funkcja(n[j])<<endl;
        }

    return 0;
}
0

Jeśli chcesz, żeby ktoś Ci pomógł to wstaw taki kod, żeby wszystko było czytelne i jasne.

  1. Wstawiony przez Ciebie kod się nie kompiluje.
  2. Co to jest t, co to jest n? Ktoś ma się domyślać? Co zwraca ta funkcja? Ktoś kto ma Ci pomóc ma wszystko wiedzieć co i jak, a nie najpierw robić śledztwo co może być czym.
  3. Kod wrzuciłeś słabo sformatowany, dopiero moderator go poprawił.
  4. Zamiast kontrolnych cout w kodzie, poczytaj o debugowaniu kodu.
0
  1. Kod się u mnie kompiluje, więc nie do końca rozumiem.

  2. t liczba testów, czyli liczb które należy sprawdzić według opisanego w pierwszym poście klucza. Najlepiej żeby nie gmatwać wprowadzić wartość 1, n to liczba do 80 dla której należy przeprowadzić obliczenia, czyli dodawać do niej liczbę uzyskaną po odwrotnym ustawieniu jej cyfr i sprawdzić czy suma nie jest palindromem(czyli np dla 79 wykonać działanie 79+97 i uzyskaną sumę 176 sprawdzić czy nie jest palindromem, jeśli nie, wykonać kolejne działanie 176+671 i tak aż do uzyskania palindromu. Funkcja ma zwracać pierwszą liczbę, która po przeprowadzeniu tych obliczeń będzie palindromem. W funkcji ta liczba jest widoczna, natomiast do main zwracana jest wartość 1 zamiast tej liczby. IFy w main eliminują na wstępie liczby jednocyfrowe oraz podzielne przez 11, które od razu są palindromami. W zadaniu jest też konieczność podania ilości prób, stąd w main zapis:
    if (((n[j])<10)||(n[j]%11==0)) { cout<<n[j]<<" 0"<<endl; }
    czyli n[j] oraz 0 wykonanych działań

  3. Masz racje, następnym razem się bardziej postaram.

  4. Dziękuję za wskazówkę

1

Jak kod gdzie masz funkcję bez zwracanego typu ci się kompiluje?

0

Zwraca jak spełni się if w 44 linijce

0

Mowa o zwracanym typie, a nie instrukcji return, linia 8:
funkcja(int n1)

To że return jest wywoływany tylko przy spełnieniu określonych warunków też jest nieprawidłowe i niektóre kompilatory wyrzucą błąd. Instrukcja return powinna być na końcu funkcji (niezależna od żadnych warunków) i najlepiej tylko jedna.

0

Rozumiem, żę w 8 linii powinno być int funkcja(int n1) . Zamiast return wynik w if-ie; powinno być break; (tylko wtedy mam błąd "break statement not within loop or switch" i nie mogę dojść dlaczego). Na końcu funkcji powinno być return wynik. Program mi się kompilował w moim kompilatorze, dlatego zdziwiłem się, że wg Was nie powinien. Nowy kod wygląda tak i dla jednego wykonania funkcji zwraca do main dobry wynik, a w wypadku konieczności powtórzenia się funkcji (niespełnienie if ) w funkcji wynik jest dobry a w main jest wynik z pierwszego wykonania się funkcji

#include <iostream>
#include <sstream>
#include <string>
#include<cstdlib>

using namespace std;

int funkcja(int n1)


    {
    stringstream ss;
    string liczba1;
    string liczba2;
    string liczba3;
    int dlugosc,n2,n3,licznik=0;
    int wynik;
    licznik++;


    ss.str("");
    ss<<n1<<endl;
    liczba1=ss.str();
    dlugosc=liczba1.length();
    for (int i=dlugosc-2;i>=0;i--)
    {
    liczba2=liczba2+liczba1[i];
    }
    n2= atoi(liczba2.c_str());
    n3=n1+n2;
    ss.str("");
    ss<<n3<<endl;
    liczba3=ss.str();
    dlugosc=liczba3.length();

    if(liczba3[dlugosc-2]==liczba3[0])
        {cout<<"wynik w funkcji "<<atoi(liczba3.c_str())<<endl;
        wynik= atoi(liczba3.c_str());
        }
       else {
            n1= atoi(liczba3.c_str());
            funkcja(n1);
            }
            return wynik;
    }

int main()
{
    int dlugosc,n1,n2,n3;
    int t;
    int *licznik;

    do
    {cout << "podaj t:" << endl;
    cin>>t;}
    while (t>80);
    int n[t];
    for (int i=0;i<t;i++)
        do
    {
        cout<<"podaj n:"<<endl;
        cin>>n[i];
    }
    while ((n[i]<1)||n[i]>80);
    for (int j=0;j<t;j++)
        if (((n[j])<10)||(n[j]%11==0))
         {cout<<n[j]<<" 0"<<endl;}

        else {
            cout<<"wynik  "<<funkcja(n[j])<<endl;
            }

    return 0;
}
0

Na SPOJ'u nie musisz sprawdzać zakresów, jak powiedziano że n w zakresie 1..100 to znaczy że będzie w tym zakresie więc się nie musisz niczego sprawdzać..

1

Podstawowa zasada rozwiązywania zadań na SPOJ i pokrewnych.
Możesz wypisywać na stdout (std::cout) tylko to co jest w specyfikacji zadania! Każdy napis, którego nie ma w specyfikacji zadania spowoduje, że nie zaliczysz zadania! SPOJ stwiedzi WA (wrong anwear).
Czyli nie wolno ci dopytywać się o dane za pomocą napisów: podaj t: albo podaj n: bo to psuje oczekiwaną odpowiedź!

Poza tym:

prog.cc:8:1: error: C++ requires a type specifier for all declarations
funkcja(int n1)
^
prog.cc:51:9: warning: unused variable 'dlugosc' [-Wunused-variable]
    int dlugosc, n1, n2, n3;
        ^
prog.cc:51:26: warning: unused variable 'n3' [-Wunused-variable]
    int dlugosc, n1, n2, n3;
                         ^
prog.cc:51:22: warning: unused variable 'n2' [-Wunused-variable]
    int dlugosc, n1, n2, n3;
                     ^
prog.cc:53:10: warning: unused variable 'licznik' [-Wunused-variable]
    int* licznik;
         ^
prog.cc:51:18: warning: unused variable 'n1' [-Wunused-variable]
    int dlugosc, n1, n2, n3;
                 ^
5 warnings and 1 error generated.

Podpowiedź do zadania: zrób sobie takie małe funkcje:

int decimal_reverse(int x);
int make_palindrome_from(int x);

Każda funkcja nie wyjedzie ci wtedy większa niż 10 linijek (licząc z zapasem).

0

Wiem, że nie pyta się o dane wejściowe, wypisuje to tylko do robienia testów, żeby samemu wiedzieć co mam wpisać. Przed wrzuceniem do spoja kasuje to. Te nieużywane zmienne w main to jakaś pozostałość po początkowych wersjach programu, powinienem usunąć zanim tu wrzuciłem. Program mi się kompiluje i chcę zrozumieć dlaczego do main nie zwraca wartosci z 36 linii w momencie kiedy if jest niespełniony i funkcja musi się powtórzyć. Wiem, że program jest rozwleczony i podziele go na kilka funkcji, ale podstawowe pytanie o problem w zwracaniu do main interesującej mnie wartości. Przy wpisaniu t 1 i n 79 w funkcji zmienna wynik otrzymuje dobrą wartość (palindrom) a do main wysyła wartość wynik z pierwszego wykonania funkcji, zamiast z ostatniego.
Dzięki za wskazówki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1