Osetreni vstupu/vystupu u prvocisel – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Osetreni vstupu/vystupu u prvocisel – C / C++ – Fórum – Programujte.comOsetreni vstupu/vystupu u prvocisel – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
HellWell0
Duch
27. 9. 2013   #1
-
0
-

Hezky vecer preju.

V C++ jsem naprosty zacatecnik, to jen na okraj ;)

Rad bych vytvoril program na rozpoznani prvocisel s tim, ze pri spatnem vstupu me to vyzve k zadani nove hodnoty. Stejne tak na vystupu pokud se nejedna o prvocislo, rad bych, aby se to vypsalo a vyzvalo me to k zadani dalsi hodnoty. Neco jsem nastudoval, neco jsem vytvoril, ale pri spusteni se mi to zacykli a.... a uz mi to za posledni dva dny bloumani co, jak kde leze usima :D Timto bych vas zde chtel poprosit o takove vetsi nakopnuti a nasmerovani spravnym smerem.

#include <iostream>
#include <cmath>
using namespace std;

int main()

{
    int x, k, T, o;
    
    while (1)
    {
        
        {
        cout << "Zadej cislo: " << endl;
            cin >> x;
            
        while(cin.fail())
        {
          cout << "Chybny vstup, zkus to znovu." << endl;
            cin.clear();
            
        }
        
        }
            
        T=x;
        o = 0;
        
        while (T > 0)
        {
            k = x % T;
            
            if (k == 0)
            {
                o++;
            }
            T--;
        }
            if (o == 2)
            {
                cout << "Dane cislo je prvocislem." << endl;
            }
        
        }
        return 0;
    
}

Vystup slozenych cisel na nemam vubec. Zkousel jsem to prostrednictvim if, ale vzdy mi to delalo neco co nechci.

Pri vstupu jsem pak musel napsat a odentrovat 3 hodnoty abych teprve dostal vystup. V dalsim pripade mi to zase delalo paseku pri zadani spatne hodnoty, kdy pri "n" chybnych znacich mi to hodilo stejne "n" zadosti o novou hodnotu.

Nahlásit jako SPAM
IP: 77.48.31.–
Doomista+1
Stálý člen
27. 9. 2013   #2
-
0
-

 http://www.cplusplus.com/forum/beginner/2957/ zde doporučuji jít na poslední příspěvěk, je zde alternativní způsob testování vstupu. A vzhledem k tomu, že cin.fail()==true zanechává buffer ve streamu, tak zkus cin.clear() nahradit voláním cin.get() a nebo cin.ignore().
Tip: nepotřebuješ nutně proměnnou k. Do if můžeš rovnou napsat x%T==0 ;)

Co se týče testování prvočísel: mělo by stačit testovat zda dělení proměnné x přirozenými čísly na intervalu <2, sqrt(x) ) nevrací nulu a pokud ne, pak je číslo prvočíslem.

Závěrečný if:
 

if(o==2){
cout << "Cislo " << x << " je prvocislo." << endl;
}
else{
cout << "Cislo " << x << " neni prvocislo." << endl;
}
Nahlásit jako SPAM
IP: 90.176.176.–
Na vše stačí iostream...
HellWell0
Duch
30. 9. 2013   #3
-
0
-

Dekuju.

Mam to tedy nejak takto:


#include <iostream>
#include <cmath>
#include <cctype>
using namespace std;

int main()
{
    
    int o = 0, x;
    
    while (1)
    {
        cout << "Zadej cislo: " << endl;
        cin >> x;
        
        if(!cin.good())
        {
            cout << "Chybny vstup." << endl;
            cin.clear();
            cin.ignore(std::numeric_limits<int>::max(),'\n');
            continue;
        }
        
        for ( int y = 1; y <= x; y++)
            
            if ( x % y == 0)
            {
                o++;
            }
        if ( o == 2)
        {
            cout << "Zadane cislo je prvocislo" << endl;
        }
        else
        {
            cout << "Zadane cislo neni prvocislo" << endl;
        }
        return 0;
    }
}
Nahlásit jako SPAM
IP: 77.48.31.–
Radek Chalupa
~ Redaktor
+1
Super člen
30. 9. 2013   #4
-
+1
-
Zajímavé

#3 HellWell
Nebude kantorovi vadit že to zbytečně dělíš číslem až do hodnoty <= x?

Koukám že pro dnešní mladou generaci "programátorů" je optimalizace sprosté slovo :-)

Radek Chalupa 
- vývoj software na zakázku 
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC) 
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
HellWell0
Duch
30. 9. 2013   #5
-
0
-

#4 Radek Chalupa
Pokud bych parafrazoval kus jedne prednasky z dnesniho dne, asi by to tak mnohym vyznelo ^^ Nicmene ja se uprave nebranim, ba naopak. Ono pokud si dobre vzpominam na vyklad z jine prednasky, tak prikaz sqrt taky neni uplne nenarocny.

Necham se rad poucit ;)

Nahlásit jako SPAM
IP: 77.48.31.–
KIIV
~ Moderátor
+43
God of flame
30. 9. 2013   #6
-
0
-

#5 HellWell
tak nemusis nutne pouzivat sqrt ... muzes mit podminku:  y*y <= x

krom toho kdyz zacnes rovnou od 2 tak pri prvnim vyskytu muzes cyklus prerusit.. nema smysl hledat dal - nic nenajdes... taky nemusis zkouset nasobky 2 ... staci rychlej test jestli to neni delitelne 2... a pak jet od 3 kazdy dva...

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Radek Chalupa
~ Redaktor
+1
Super člen
30. 9. 2013   #7
-
0
-

#5 HellWell
Jde o to, že optimalizace je zásadní při časově náročných hodnotách vstupu. Samozřejmě pokud jde o nějaké desítky či stovky, může to sqrt i zpomalit. Ale když porovnáváš (z hlediska uživatele) odezvu programu tak rozdíl mezi desetinou a setinou sekundy (tj. desetinásobný) je zanedbatelný, ale při porovnání zda čekáš na výsledek 1 nebo 10 minut/hodin (tj. opět desetinásobný rozdíl), tak to už je hodně podstatné, no a při odezvách od (desítek) sekund výše je jedno volání sqrt zcela zanedbatelné.

Radek Chalupa 
- vývoj software na zakázku 
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC) 
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
Řešení
HellWell0
Duch
5. 10. 2013   #8
-
0
-
Vyřešeno Nejlepší odpověď

   

#include <iostream>
#include <cmath>
#include <cctype>
using namespace std;

bool je_prvocislo(int x)
{
    if (x < 0)
        return false;
    if (x == 1)
        return false;
    int sqrtx = sqrt(x);
    for ( int y = 2; y <= sqrtx; y+=1)
        
        if ( x % y == 0)
        {
            return false;
        }
    
    return true;
}

int main()
{
    
    int x;
    while (1)
    {
        cout << "Zadej cislo: " << endl;
        cin >> x;
        
        if(!cin.good())
        {
            cout << "Chybny vstup." << endl;
            cin.clear();
            cin.ignore(std::numeric_limits<int>::max(),'\n');
            continue;
        }
        
        if ( je_prvocislo(x) )
        {
            cout << "Zadane cislo je prvocislo" << endl;
        }
        else
        {
            cout << "Zadane cislo neni prvocislo" << endl;
        }
    }
    return 0;
}
Nahlásit jako SPAM
IP: 77.48.31.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 42 hostů

Podobná vlákna

Ošetření vstupu. — založil Wades

Ošetření vstupu — založil Kenvelo

Ošetření vstupu — založil Erlesh

Ošetření vstupu — založil Troy585

Ošetření vstupu — založil Koja

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý