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

Lekcja 2.16

Ostatnio zmodyfikowano 2016-07-16 21:13
Autor Wiadomość
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


C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    int liczba, strzaly, losowanie;
    bool A; // funkcja A sprawda czy nie podano litery
    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;
P-150011
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:
C/C++
#include <iostream>
#include <limits>
#include <random>
using namespace std;

int main()
{
    // ustawienie generatora liczb;
    random_device rd;
    mt19937 generator( rd() );
   
    // ustawienie przedziału liczb. Równie dobrze może zrobić to użytkownik
    int rangeMin = 1;
    int rangeMax = 10;
    uniform_int_distribution < int > distance( rangeMin, rangeMax );
   
    // losowanie liczby
    int randomedNumber = distance( generator );
    cout << randomedNumber << "\n\n"; // dodane wyświetlanie wylosowanej liczby
   
    // interakcja użytkownika
    cout << "Podaj liczbe z zakresu od " << rangeMin << " do " << rangeMax << '\n';
    int searchNumber;
    int counter = 0;
    do {
        while( !( cin >> searchNumber ) || searchNumber < rangeMin || searchNumber > rangeMax ) {
            // warunek pętli sprawdza powodzenie wczytywania danych oraz czy podana liczba jest z odpowiedniego przedziału
            cout << "Wprowadzono niepoprawne dane. Sprobuj ponownie\n";
            cin.clear();
            cin.ignore( numeric_limits < streamsize >::max(), '\n' );
        }
       
        ++counter;
        // wypisanie stosownego komunikatu
        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 );
    // kończymy, gdy zgadniesz liczbę
}
Program prosi o podanie liczb, póki użytkownik nie wprowadzi poprawnej wartości.
Program zlicza tylko poprawnie wprowadzone wartości.
P-150013
Anonim47
» 2016-07-15 22:27:08
Skożystaj z poniszego kodu.
Zobacz jak ja zabezpieczam liczby przed literami.
C/C++
#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;
    // cout<< liczba_losuj;
    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;
}
P-150014
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ś.

C/C++
/** @file bits/c++0x_warning.h
*  This is an internal header file, included by other library headers.
*  Do not attempt to use it directly. @headername{iosfwd}
*/

#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ą.
C/C++
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.
C/C++
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
.
P-150017
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.

a gdy przejdę do symfoni
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".
P-150018
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.
P-150019
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?
P-150020
Anonim47
» 2016-07-16 13:04:43
@CCbolt Int i = 1 odpowiada za pętle
C/C++
do { //jakis tam kod}
    while( i == 1 );
   
 Zrobiłem to jako nieskończoną pentle.
Możesz też użyć zamiast tego pętli
C/C++
for(;; )
{ //jakis tam kod}
P-150021
« 1 » 2
  Strona 1 z 2 Następna strona