[Lekcja 21] Jak zabezpieczyć przed nieskończoną pętlą?
Ostatnio zmodyfikowano 2013-02-27 17:53
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: #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. |
|
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 :) |
|
Unknown22 Temat założony przez niniejszego użytkownika |
» 2013-02-27 17:53:39 Rozwiązane ;) Dzięki za pomoc :) #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ąć. |
|
« 1 » |