CCbolt Temat założony przez niniejszego użytkownika |
Lekcja 2.16 » 2016-07-15 21:21:43 Przy tym temacie się zapętliłem ( while u mnie nie wystąpił ) temat zrozumiałem ale nie mogłem napisać kodu więc użyłem czyjegoś ( teraz to wydaje się śmieszne ale mam problemy przy tworzeniu własnych pomysłów ) postanowiłem go uzdatnić ale nie do końca mi to wyszło. W pierwotnym kodzie było tak że program jako strzały sumował wszystko, wpisywane litery i nietrafione liczby. U mnie pojawia się informacja że litera to nie liczba i tego nie dodaje do strzałów. Teraz mam zagwozdkę jak napisać program aby nie zliczał strzałów z poza zakresu liczb dozwolonych oraz jak zabezpieczyć program aby poprawnie wypisywał komunikat że litera to nie liczba. Wpisując małą literę wszystko jest ok program daje stosowną informację, wpisując dużą literę wczytywany jest drugi if "liczba jest za mała" oraz nie miał problemu ze znakami specjalnymi. Druga sprawa jak napisać program aby sumował strzały ale tylko z zakresu licz dozwolonych. Podaj liczbe od 1 do 10: Podaj liczbe: # Litery to nie liczby Podaj liczbe: $ Liczba jest za mala Podaj liczbe: ! Litery to nie liczby Podaj liczbe: & Liczba jest za mala #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { int liczba, strzaly, losowanie; bool A; srand( time( NULL ) ); cout << "Podaj liczbe od 1 do 1000: " << endl; strzaly = 0; losowanie =( rand() % 1000 ) + 1; cin.clear(); cin.sync(); do { cout << "Podaj liczbe: "; cin >> liczba; A = cin.good(); cin.clear(); cin.sync(); strzaly++; if( A == false ) do { cout << "Litery to nie liczby" << endl; cout << "Podaj liczbe: "; cin >> liczba; cin.clear(); cin.sync(); } while( A == true ); if( liczba < 1 || liczba > 1000 ) cout << "Liczba jest niewlaciwa" << endl; if( liczba < losowanie ) cout << "Liczba jest za mala" << endl; if( liczba > losowanie ) cout << "Liczba jest za duza" << endl; } while( !( liczba == losowanie ) ); cout << "Wylosowana liczba to: " << liczba << endl; cout << "Ilosc strzalow wynosi: " << strzaly << endl; return 0;
|
|
carlosmay |
» 2016-07-15 22:17:32 Skorzystaj z nowszych rozwiązań. rand() to przestarzała technologia, poczytaj o <random>. Zastosowałem w przykładzie. Używaj sensownych nazw. Napisałem bez podziału na funkcje, bo jeszcze ich nie znasz, więc czytelność taka sobie. Przykład: #include <iostream> #include <limits> #include <random> using namespace std;
int main() { random_device rd; mt19937 generator( rd() ); int rangeMin = 1; int rangeMax = 10; uniform_int_distribution < int > distance( rangeMin, rangeMax ); int randomedNumber = distance( generator ); cout << randomedNumber << "\n\n"; cout << "Podaj liczbe z zakresu od " << rangeMin << " do " << rangeMax << '\n'; int searchNumber; int counter = 0; do { while( !( cin >> searchNumber ) || searchNumber < rangeMin || searchNumber > rangeMax ) { cout << "Wprowadzono niepoprawne dane. Sprobuj ponownie\n"; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); } ++counter; if( searchNumber < randomedNumber ) { cout << "Szukana liczba jest wieksza\n"; } else if( searchNumber > randomedNumber ) { cout << "Szukana liczba jest mniejsza\n"; } else { cout << "Trafiono szukana liczbe " << randomedNumber << " w " << counter << " probach"; } } while( searchNumber != randomedNumber ); }
Program prosi o podanie liczb, póki użytkownik nie wprowadzi poprawnej wartości. Program zlicza tylko poprawnie wprowadzone wartości. |
|
Anonim47 |
» 2016-07-15 22:27:08 Skożystaj z poniszego kodu. Zobacz jak ja zabezpieczam liczby przed literami. #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { int liczba_losuj, liczba, i = 1, proba = 0; srand( time( NULL ) ); (( rand() % 1000 ) + 1 ); liczba_losuj =(( rand() % 1000 ) + 1 ); cout << "Podaj liczbe i zgadni co to za liczba z zakresu od 1 do 1000" << endl; do { do { cin.clear(); cin.sync(); cout << "Podaj liczbe:"; cin >> liczba; if( !cin.good() ) cout << "\n"; else { cin.clear(); cin.sync(); } } while( cin.fail() ); proba++; if( liczba == liczba_losuj ) { cout << "WYGRALES! liczba to:" << liczba_losuj << " Twoja Proba To:" << proba; exit( 0 ); } else if( liczba < liczba_losuj ) cout << "Twoja liczba jest za MALA twoja proba to:" << proba << endl; else cout << "Twoja liczba jest za DUZA twoja proba to:" << proba << endl; } while( i == 1 ); return 0; }
|
|
CCbolt Temat założony przez niniejszego użytkownika |
» 2016-07-16 01:39:59 @carlosmay Twój kod przyjemnie się czyta ale w codeblock nie chce mi działać sypie błędami. W tej chwili wolę przerobić kurs tak jak wygląda a gdy przejdę do symfoni zasugeruję się tym co napisałeś.
#ifndef _CXX0X_WARNING_H #define _CXX0X_WARNING_H 1
#if __cplusplus < 201103L #error This file requires compiler and library support for the \ ISO C++ 2011 standard. This support is currently experimental, and must be \ enabled with the -std=c++11 or -std=gnu++11 compiler options. #endif
#endif
@Anonim47 Nasze programy działają podobnie, twój program sumuje liczby z poza przedziału w tym ujemne, szukam teraz jak nie liczyć liczb niedozwolonych ( może w kolejnych lekcjach to będzie, kolejny punkt w liście do zrobienia) Pominięcie liter jest dobre też o tym myślałem ale wyszedłem z założenia że warto wrzucić komunikat o nieobsługiwanych literach tylko że jak to u mnie wszystko chcę sprawdzić i znaki specjalne oraz duże litery mnie już dobijają. if( !cin.good() ) cout << "\n"; else { cin.clear(); cin.sync(); }
O czymś takim nie pomyślałem ale bardzo mi się spodobało, pewnie nie raz wykorzystam, przynajmniej w tych kursach. Za co odpowiada twój int i = 1 ? To jest pierwszy kod (wycinek) którego nie rozumiem. I kolejny błąd który mnie intryguje ( przy wprowadzaniu błędnych danych ) raz "b" jest litera raz liczbą, gdy jest liczbą jest podliczany do liczby strzałów. Podaj liczbe od 1 do 1000: Podaj liczbe: 500 Liczba jest za mala Podaj liczbe: 750 Liczba jest za duza Podaj liczbe: 670 Liczba jest za duza Podaj liczbe: 600 Liczba jest za mala Podaj liczbe: 630 Liczba jest za mala Podaj liczbe: 650 Liczba jest za mala Podaj liczbe: 660 Liczba jest za duza Podaj liczbe: a Litery to nie liczby Podaj liczbe: b Liczba jest niewlaciwa Liczba jest za mala Podaj liczbe: b Litery to nie liczby Podaj liczbe: b Liczba jest niewlaciwa Liczba jest za mala Podaj liczbe: b Litery to nie liczby Podaj liczbe: b Liczba jest niewlaciwa Liczba jest za mala Podaj liczbe: 655 Liczba jest za mala Podaj liczbe: 657 Liczba jest za mala Podaj liczbe: 658 Liczba jest za mala Podaj liczbe: 659 Wylosowana liczba to: 659 Ilosc strzalow wynosi: 14
. |
|
karambaHZP |
» 2016-07-16 05:03:03 w codeblock nie chce mi działać sypie błędami |
Kompilator nie ma włączonej obsługi standardu C++11. Randomowe klasy tego wymagają. Kod wygląda OK. Rozejrzyj się za czymś nowszym. Prata pisze już o C++11 i chyba nawet C++14. Do tego porządny podręcznik opisujący bibliotekę standardową C++11 plus dokumentacja internetowa "cppreference" i "cplusplus". |
|
carlosmay |
» 2016-07-16 10:06:29 W tej chwili wolę przerobić kurs tak jak wygląda |
W kodzie nie ma nic nadzwyczajnego. Jedynie losowanie liczby jest z nowszej epoki. uniform_int_distribution wydaje mi się bardziej intuicyjny (podajesz zakres) niż wyliczanie zakresu w rand. Włącz C++11. To ci się przyda. |
|
CCbolt Temat założony przez niniejszego użytkownika |
» 2016-07-16 12:19:52 @karambaHZP Symfonia już leży w mojej bibliotece całe dwa tomy więc ją przerobię. @carlosmay Włączyłem, działa. Dopytam się jeszcze, wiesz jak w tym kodzie który mam zabezpieczyć się przed błędami jakie podałem? |
|
Anonim47 |
» 2016-07-16 13:04:43 @CCbolt Int i = 1 odpowiada za pętle Zrobiłem to jako nieskończoną pentle. Możesz też użyć zamiast tego pętli |
|
« 1 » 2 |