inny wynik w main niż w funkcji

Odpowiedz Nowy wątek
2019-11-30 21:09
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;
}
edytowany 2x, ostatnio: Ktos, 2019-12-01 09:25

Pozostało 580 znaków

2019-12-01 11:01
zdz
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.
edytowany 1x, ostatnio: zdz, 2019-12-01 11:01

Pozostało 580 znaków

2019-12-01 11:47
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ę

Pozostało 580 znaków

2019-12-01 12:28
1

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

Pozostało 580 znaków

2019-12-01 13:52
0

Zwraca jak spełni się if w 44 linijce

Pozostało 580 znaków

2019-12-01 14:01
zdz
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.

edytowany 1x, ostatnio: zdz, 2019-12-01 14:02
To nie jest prawda. - enedil 2019-12-01 16:53
Znaczy co? - zdz 2019-12-01 17:47
No, błędu nie będzie, co najwyżej warning. - enedil 2019-12-01 17:52
Xcode tego nie przepuści, nie pamiętam co tam za kompilator siedzi - zdz 2019-12-01 17:58
Tam jest clang, i jak najbardziej daje tylko warning. Oczywiście, jeśli dasz opcję -Werror (traktuj ostrzeżenia jako błędy), to nie przepuści. - enedil 2019-12-01 18:18
No to oczywiście, że wszystko może być kwestią ustawień. Mi przy standardowych ustawieniach nie skompilowało tego (nie przy traktowaniu wszystkich ostrzeżeń jako błędów). - zdz 2019-12-01 18:24

Pozostało 580 znaków

2019-12-01 15:22
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;
}
ziomek,bo tego się nie da czytać, użyj tego toola: http://format.krzaq.cc/ - enedil 2019-12-01 16:57

Pozostało 580 znaków

2019-12-01 17:00
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ć..


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2019-12-02 16:07

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).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 4x, ostatnio: MarekR22, 2019-12-02 16:38

Pozostało 580 znaków

2019-12-02 16:57
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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