» »

Logični podatkovni tip

Logični podatkovni tip

black ice ::

Napisal sem program v C++, ki preveri praštevilskost 3 vnesenih števil. Program uspešno prešteje število deliteljev, zatakne se mi pri logičnih vrednostih.

//Program prebere tri števila in ugotovi ali so praštevila
#include <iostream>
using namespace std;

//Funkcija prebere in vrne število
//IZHOD: število
int PreberiStevilo()
{
    int stevilo;
    cout << "Vnesi stevilo: " << endl;
    cin >> stevilo;
    return stevilo;
}

//Funkcija preveri, če je število praštevilo
//IZHOD: števec/število deliteljev
int PreveriStevilo(int stevilo)
{
    int stevec=0;
    
    //Preverjanje števila deliteljev
    for (int i=1; i<=stevilo; i++)
    {
        if(stevilo%i==0)
        stevec++;
    }   
        if (stevec<=2)
        bool prastevilo=true;
        else 
        bool prastevilo = false;
    
    cout << "Stevilo deliteljev stevila " << stevilo << " je: " << stevec << endl;    
    return stevec;
}
    
int main()
{
    int prvo = PreberiStevilo();
    int drugo = PreberiStevilo();
    int tretje = PreberiStevilo();
     
    cout << "Prvo stevilo je: " << prvo << endl;
    cout << "Drugo stevilo je: " << drugo << endl;
    cout << "Tretje stevilo je: " << tretje << endl;
    
    PreveriStevilo(prvo);
    PreveriStevilo(drugo);
    PreveriStevilo(tretje);
    
    if (prastevilo)
    cout << "Vsa stevila so prastevila " << endl;
    else 
    cout << "Vsa stevila niso prastevila " << endl;
    
    system ("PAUSE");
    return 0;
}

AndrejS ::

Zakaj imaš funkcijo PreveriStevilo tipa INT ? Bolje bi bilo da bi bilo tipa bool... in bi funkcija vrnila true v primeru (stevec manjsi ali enak 2)

Potem bi napisal pogoj takole : if (Prastevilo(prvo) and Prastevilo(drugo) and Prastevilo(tretje).


* Že dolgo nisem delal v c++ zato so možne napake v sintaksi.

black ice ::

Najlepša hvala, na to rešitev nisem pomislil.
cout << "Stevilo deliteljev stevila " << stevilo << " je: " << stevec << endl;    

Problem mi dela le še ta stavek. Zakaj mi izpiše (stevilo +1) - krat? Zapisal sem ga izven zanke, tako da bi se moral izpisati samo enkrat.

EDIT: Sem že uredil.
Rešitev: Razbil sem funkcijo PreveriStevilo na dve funkciji in sicer: funkcija, ki preveri število deliteljev in funkcijo, ki preveri če je število praštevilo (delitelj == 2).

Zgodovina sprememb…

dolenc ::

Kaj te tle heca ne vem, poskusi določit še oklepaje za if stavke, če ga mogoče kej sheca.

Drugače pa zgoraj lahko še tako narediš, da daš "bool prastevilo = false;" kot globalno spremenljivko in v tist pogoj samo
"if (stevec < =2)
prastevilo=true;"

S tem lahko preverjaš n- števil če katero vmes ni praštevilo, pa še potem nerabiš števila and-at ampak v primeru, da je prastevilo = true, veš da eden izmed njih ni praštevilo. Malo poenostaviš :)

Spura ::

dolenc je izjavil:

da daš "bool prastevilo = false;" kot globalno spremenljivko

Jst mam se boljso idejo: kaj ce se raje s ceglom po jajcih useka in ne dela globalnih spremenljivk tm k mu ni treba? Ce imas globalno spremeljivko, ki ni konstanta, potem 99% delas nekaj narobe.

dolenc ::

To moreš pa njega uprašat če je prpravlen

c3p0 ::

En hint za pohitritev preverjanje praštevil: nobeno sodo število razen 2 ni praštevilo.

Spura ::

bool preveriStevila(int[] stevila, int n) {

    for (int i = 0;i < n;i++) {
        if (stevila[i] % 2 == 0) {
            return false; // en ze ni prastevilo
        }
        for (int j = 3;j*j <= stevila[i];j += 2) {
            if (stevila[i] % j == 0) {
                return false;
            }
        }
    }
    return true;
}

Ne vem sicer ce je to pravilna C koda ker ze res dolgo nisem Cja delal. Ampak you got the idea. Ceprav bi bilo bolj smiselno, da bi funkcija preverjala samo eno stevilo.

black ice ::

Hvala za koristne nasvete.
Zgornji program sem malo preuredil in tako za pokušino stestiral kako dolgo šteje praštevila med 2 in 1000000. Rezultat se giblje okrog 42 sekund.
Je ta rezultat dober ali slab?

Spura ::

ce hoces steti prastevila je hitrejsi algoritem eratostenovo sito (tega smo tudi v osnovni al srednji soli delal za stevila do 100).

Tole kar imas zdaj ali pa tudi sito lahko tudi vrzes v vec niti. Ce imas Core i7 ki je quad core s hyperthreadingom naredis 8 niti in racunas v vseh hkrati.

Zgodovina sprememb…

  • spremenil: Spura ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

(težava) long long v C

Oddelek: Programiranje
5932 (688) technolog
»

[c#] Optional parameters must appear....

Oddelek: Programiranje
6781 (688) lambda
»

VC# čitanje iz datoteke in shranjevanje v polje

Oddelek: Programiranje
91168 (981) iceurb
»

[C++][Naloga_polja]MIN in MAX polja, izpis za x.100 stevil

Oddelek: Programiranje
222940 (2751) snow
»

[C++] Optimizacija funkcije za izračun prafaktorjev

Oddelek: Programiranje
92339 (2224) Thomas

Več podobnih tem