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

[Lekcja 21] Jak zabezpieczyć przed nieskończoną pętlą?

Ostatnio zmodyfikowano 2013-02-27 17:53
Autor Wiadomość
Unknown22
Temat założony przez niniejszego użytkownika
[Lekcja 21] Jak zabezpieczyć przed nieskończoną pętlą?
» 2013-02-27 00:18:17
Zadanie z tego rozdziału polegało na: 1. Napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń. Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje.

Napisałem coś takiego:

C/C++
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void wczytanie( int t[] )
{
    int i = 0;
    do
    {
        cout << "Podaj " << i + 1 << " liczbe: ";
        do
        {
            cin.clear();
            cin.sync();
            cin >> t[ i ];
            if( cin.good() != 1 )
            {
                cout << "Zla liczba. Sprobuj jeszcze raz: ";
            }
        } while( cin.good() != 1 );
       
        i++;
    } while( i < 3 );
   
}

int losowanie( int t[] )
{
    int a;
    a = rand() % 3;
    return t[ a ];
}

bool czyBylo( int tab[], int losowa, int i )
{
    if( i == 0 )
    {
        return false;
    }
    else
    {
        do
        {
            if( losowa == tab[ i - 1 ] )
            {
                return true;
            }
            i--;
        } while( i > 1 );
       
        return false;
    }
}

void wypisz( int t[], int m )
{
    int i = 0;
    if( m == 0 )
    {
        do
        {
            cout << t[ i ] << " ";
            i++;
        } while( i < 2 );
       
    }
    else
    {
        cout << "Nie mozna wypisac liczb bez powtorzen." << endl;
    }
}

int main()
{
    srand( time( NULL ) );
    int tab[ 3 ];
    int losowe[ 2 ];
    int i = 0;
    int m = 0;
   
    wczytanie( tab );
    do
    {
        losowe[ i ] = losowanie( tab );
        if( czyBylo( losowe, losowe[ i ], i ) != 1 )
        {
            i++;
        }
    } while( i < 2 );
   
    wypisz( losowe, m );
   
    return 0;
}


Wszystko jest w porządku pod warunkiem, że użytkownik wpisze conajmniej 2 różne liczby czyli np. 1,2,3 albo 1,1,2. Ale problem pojawia się jeśli zostaną wpisane wszystkie 3 takie same liczby. Jak zabezpieczyć wtedy przed nieskończoną próbą wylosowania drugiej liczby?
Dla jasności to m jest przygotowane już na to zabezpieczenie, że jeżeli właśnie będzie miała się ta pętla zrobić, to żeby zmieniła się wartość m na np. 1 i wtedy bez wypisywania żadnej liczby poda tylko odpowiedni komunikat.
P-77192
Arturr300
» 2013-02-27 16:55:20
Zrób sobie tablicę o 3 polach. I zrób coś takiego:
if( tab[ 0 ] = tab[ 1 ] || tab[ 0 ] = tab[ 2 ] ) cout << "Podano takie same liczby" << endl;
Jeżeli źle zrozumiałem, to sorry :)
P-77226
Unknown22
Temat założony przez niniejszego użytkownika
» 2013-02-27 17:53:39
Rozwiązane ;) Dzięki za pomoc :)

C/C++
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void wczytanie( int t[] )
{
    int i = 0;
    do
    {
        cout << "Podaj " << i + 1 << " liczbe: ";
        do
        {
            cin.clear();
            cin.sync();
            cin >> t[ i ];
            if( cin.good() != 1 )
            {
                cout << "Zla liczba. Sprobuj jeszcze raz: ";
            }
        } while( cin.good() != 1 );
       
        i++;
    } while( i < 3 );
   
}

bool czyBylo( int tab[], int losowa, int i )
{
    if( i == 0 )
    {
        return false;
    }
    else
    {
        do
        {
            if( losowa == tab[ i - 1 ] )
            {
                return true;
            }
            i--;
        } while( i > 1 );
       
        return false;
    }
}

void wypisz( int t[] )
{
    int i = 0;
    do
    {
        cout << t[ i ] << " ";
        i++;
    } while( i < 2 );
   
}

bool test( int t[] )
{
    if( t[ 0 ] == t[ 1 ] && t[ 0 ] == t[ 2 ] )
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    srand( time( NULL ) );
    int tab[ 3 ];
    int losowe[ 2 ];
    int i = 0;
    int a;
   
    wczytanie( tab );
   
    if( test( tab ) == 1 )
    {
        cout << "Nie mozna wybrac roznych liczb.";
        getchar();
        getchar();
        return 0;
    }
   
    i = 0;
   
    do
    {
        a = rand() % 3;
        losowe[ i ] = tab[ a ];
        if( czyBylo( losowe, losowe[ i ], i ) != 1 )
        {
            i++;
        }
       
    } while( i < 2 );
   
    wypisz( losowe );
   
    getchar();
    getchar();
    return 0;
}


A jeszcze takie pytanie. Dlaczego muszę pisać podwójnie getchar()? Jeżeli napiszę tylko raz to zamyka program od razu po wykonaniu tak jakby tego jednego getchar() nie było a dopiero przy dwóch czeka aż użytkownik cokolwiek naciśnie by się zamknąć.
P-77235
« 1 »
  Strona 1 z 1