Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Cout, a wynik programu

Ostatnio zmodyfikowano 2016-03-04 13:05
Autor Wiadomość
Mikeros
Temat założony przez niniejszego użytkownika
Cout, a wynik programu
» 2016-03-04 10:40:00
Czołem, jest to mój pierwszy post na tym forum. Przychodzę z problemem - jeśli taki już kiedyś się tutaj pojawił, to przepraszam. W C++ jestem początkujący. Przerabiam zadania maturalne. Jestem aktualnie na zadaniu 5. a) z arkusza w linku - http://cke.edu.pl/images​/stories/mat3_07/inf_pr_cz2.pdf. Problem jest taki, że napisałem cały program, wszystko okej, z tym że wynik zmienia się w zależności od tego, czy w programie pojawia się cout (linia 76 - cout << "q3";), czy nie. Np. podając na samym początku wyznaczony w poleceniu przedział <2;1000>, z coutem wychodzi mi 51 (w przypadku pierwszego przedziału powinno być 50, ale to nieistotne), bez couta 130, podobnie z innymi podanymi przedziałami. Dodam, że piszę w najnowszym Dev C++.


Przepraszam za takie nazwy zmiennych i słabe formatowanie, ale pisząc dla siebie nie uważam na to.

C/C++
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;
int pierwsza( int i1 )
{
    int s, j, pierwiastek, c, l = 0;
   
   
    pierwiastek = sqrt( i1 );
    for( j = 2; j <= pierwiastek; j++ )
    {
        c = i1 % j;
        if( c == 0 )
             l = l + 1;
       
    }
   
    if( l == 0 )
    {
        s = 1;
    }
    return s;
}
int sumapierwsza( int m )
{
    int suma = 0;
    double n;
   
    do
    {
       
        n = m / 10;
        m = m % 10;
        suma = suma + m;
        m = n;
    } while( n >= 1 );
   
    return suma;
}
int sumabin( int x )
{
    int sumab = 0, y = 1, l = 0, w, i;
    do
    {
        y = y * 2;
        l = l + 1;
    } while( y <= x );
   
    for( i = l - 1; i >= 0; i-- )
    {
        w = x - pow( 2, i );
        if( w >= 0 )
        {
            sumab++;
            x = w;
        }
       
    }
    return sumab;
}

int main()
{
    int p, k, q1, q2, q3, w, e, qqq, q4;
    cin >> p;
    cin >> k;
    for( int i = p; i <= k; i++ )
    {
        q1 = 0;
        q2 = 0;
        q3 = 0;
        qqq = 0;
        q1 = pierwsza( i );
        w = sumapierwsza( i );
        q2 = pierwsza( w );
        e = sumabin( i );
        q3 = pierwsza( e );
        cout << "q3";
        qqq = q1 + q2 + q3;
        if( qqq == 3 )
        {
           
            q4++;
        }
    }
    cout << q4;
   
   
    return q4;
}
P-145533
mateczek
» 2016-03-04 11:28:48
Nie masz zadeklarowanej początkowej wartości q4.

Funkcja pierwsza zwraca losowe wartości gdy nie znajdzie liczby pierwszej (chyba o to chodzi) !!!! funkcja powinna zwracać True lub false??
czasami zwraca śmieci.

C/C++
bool czyPierwsza( int liczba ) {
    if( liczba == 1 ) return false;
   
    int max = sqrt( liczba );
    bool pierwsza = true;
    for( int i = 2; i <= max; i++ ) { if( liczba % i == 0 ) { pierwsza = false; break; } }
    return pierwsza;
}


Masz poprawiony kod choć nie wszystko poprawiłem

C/C++
#include <iostream>
#include <cmath>
using namespace std;

bool czyPierwsza( int liczba ) {
    if( liczba == 1 ) return false;
   
    int max = sqrt( liczba );
    bool pierwsza = true;
    for( int i = 2; i <= max; i++ ) { if( liczba % i == 0 ) { pierwsza = false; break; } }
    return pierwsza;
}

int sumaCyfr( int liczba, int base )
{
    int suma = 0;
    int cyfra;
   
    while( liczba ) {
        cyfra = liczba % base;
        liczba /= base;
        suma = suma + cyfra;
    }
   
    return suma;
}


int main()
{
    int p, k, w, e, q4 = 0;
    cin >> p;
    cin >> k;
    for( int i = p; i <= k; i++ ) {
        w = sumaCyfr( i, 10 ); //system dziesiętny
        e = sumaCyfr( i, 2 ); //system dwójkowy
        if( czyPierwsza( i ) && czyPierwsza( w ) && czyPierwsza( e ) ) q4++;
       
    }
    cout << q4 << endl;
}

}
P-145534
mokrowski
» 2016-03-04 11:29:02
Bardzo proszę, nazwij porządnie zmienne i zrób dobre formatowanie. Jak widać nie piszesz "dla siebie" bo inni także będą czytali kod :-)
P-145535
carlosmay
» 2016-03-04 12:20:25
Jak widać
pisząc dla siebie
 wiedziesz się w pole.
Kiepskie formatowanie i nazywanie zmiennych = utrudnione znalezienie błędu.

Debugger to cudo do znajdowania takich problemów.

P-145536
Mikeros
Temat założony przez niniejszego użytkownika
» 2016-03-04 12:37:47
Nie przewidywałem, że wyjdą jakieś problemy, więc nazywałem zmienne jak leci, a temat wstawiłem trochę na szybko.

Co do początkowej wartości q4 - i z wartością początkową nic się nie zmieniło.

Funkcje:
pierwsza - sprawdza, czy liczba jest liczbą pierwszą
sumapierwsza - sprawdza, czy suma cyfr jest liczbą pierwszą
sumabin - zamienia zapis liczby na binarny i sumuje cyfry z tego zapisu.

Wszystkie funkcje działają poprawnie, sprawdzałem to. Nadal dziwi mnie jednak to, że zwykłe wywołanie tekstu "q3" poprzez cout wpływa na inną zmienną.
P-145537
mateczek
» 2016-03-04 12:49:39
dwa posty wyżej masz poprawiony kod
nie wszystkie funkcje działały prawidłowo !!! właściwie funkcja sprawdzająca liczbę pierwszą mogła by być generatorem liczb pseudolosowych :P
możesz ją sobie sprawdzić na sopju !!! jeśli mi nie wierzysz :P

http://pl.spoj.com/problems​/PRIME_T/
P-145538
Mikeros
Temat założony przez niniejszego użytkownika
» 2016-03-04 12:54:40
Pisałem posta i kiedy wstawiałeś ten kod, więc nie zauważyłem. :)

Problem rozwiązałem już sam, a był nim brak nadania początkowej wartości 0 zmiennej s w funkcji pierwsza. Jak widać, przez taką głupotę nawet zwykły cout powoduje zawalenie całego programu. Z nadaną wartością dla s program działa jak trzeba. Wszystkim dzięki za pomoc i uwagi (do formatowania jednak będę musiał się przekonać :D).
P-145539
mateczek
» 2016-03-04 12:59:58
problem był nie tylko w cout!!! wynik 51 też jest błędny jak sam powiedziałeś powinno być 50 (cout wprowadzał dodatkową losowość)
P-145540
« 1 » 2
  Strona 1 z 2 Następna strona