Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Wczytywanie tekstu przez referencje


Rekomendowane odpowiedzi

Opublikowano
#include <iostream>
#include <string>

void wczytajOsobe(std::string & imie, std::string & nazwisko, int & wiek)
{

	std::cout << "Podaj imie: ";
	std::cin.clear();
	std::cin.sync();
	std::cin >> imie;

	std::cout << "Podaj Nazwisko: ";
	std::cin.clear();
	std::cin.sync();
	std::cin >> nazwisko;

    do
    {
        std::cout << "Podaj wiek: ";
        std::cin.clear();
        std::cin.sync();
        std::cin >> wiek;
    } while (!std::cin.fail());
}

void wypiszOsobe(std::string imie, std::string nazwisko, int wiek)
{
	std::cout << "Imie i nazwisko: " << imie << " " << nazwisko << ", Wiek: " << wiek << std::endl;
}

int main()
{
	std::string imie[2];
	std::string nazwisko[2];
	int wiek[2];
	for (int i = 0; i < 2; i++)
		wczytajOsobe(imie[i], nazwisko[i], wiek[i]);

	for (int i = 0; i < 2; i++)
		wypiszOsobe(imie[i], nazwisko[i], wiek[i]);

	return 0;
}

Witam mam problem z powyższym kodem :)

 

Ten program działa dobrze tylko i wyłącznie gdy wpisze poprawne dane. Ale gdy wpisze złe dane to jest taki problem i nie potrafie sobie z nim poradzić :/

 

post-1399314-0-44866700-1437654725.png

 

Po wpisaniu błednego wieku przeskakuje "cin >> imie", a pod koniec gdy wpisze poprawny wiek, petla się źle kończy.

 

Jakieś wskazówki dla bardzo początkującego ? :)

Opublikowano
while (std::cin.fail());

To powoduje u mnie, że bez przerwy wyskakuje Podaj wiek, z taką prędkością że nic sie nie da wpisac

Opublikowano

To powoduje u mnie, że bez przerwy wyskakuje Podaj wiek, z taką prędkością że nic sie nie da wpisac

!std::cin.fail()

Zamiast tego zrób zmienną bool, która przechowuje błędną odpowiedź.

pyhvh7E.png


 


Opublikowano
    bool udaloSie;

    std::cout << "Podaj wiek: ";
    std::cin.clear();
    std::cin.sync();
    std::cin >> wiek;

    if (std::cin.fail() == 0)
        udaloSie = 1;
    else if (std::cin.fail() == 1)
        udaloSie = 0;

    if (udaloSie == 0)
    {
        do
        {
            std::cout << "Podaj poprawny wiek: ";
            std::cin.clear();
            std::cin.sync();
            std::cin >> wiek;
        } while (udaloSie == 1);
    }

O to dokładnie chodziło ? Jeśli tak to program działa tak samo :/

Opublikowano
    bool udaloSie;

    std::cout << "Podaj wiek: ";
    std::cin.clear();
    std::cin.sync();
    std::cin >> wiek;

    if (std::cin.fail() == 0)
        udaloSie = 1;
    else if (std::cin.fail() == 1)
        udaloSie = 0;

    if (udaloSie == 0)
    {
        do
        {
            std::cout << "Podaj poprawny wiek: ";
            std::cin.clear();
            std::cin.sync();
            std::cin >> wiek;
        } while (udaloSie == 1);
    }

O to dokładnie chodziło ? Jeśli tak to program działa tak samo :/

 

 

Co Ty odwalasz z tym bool?

#include <iostream>
#include <string>

void wczytajOsobe(std::string & imie, std::string & nazwisko, int & wiek)
{

	std::cout << "Podaj imie: ";
	std::cin.clear();
	std::cin.sync();
	std::cin >> imie;

	std::cout << "Podaj Nazwisko: ";
	std::cin.clear();
	std::cin.sync();
	std::cin >> nazwisko;
 bool czyDobrze;
    do
    {
        std::cout << "Podaj wiek: ";
        std::cin.clear();
        std::cin.sync();
        std::cin >> wiek;
        czyDobrze = std::cin.good();
    } while (!czyDobrze);
}

void wypiszOsobe(std::string imie, std::string nazwisko, int wiek)
{
	std::cout << "Imie i nazwisko: " << imie << " " << nazwisko << ", Wiek: " << wiek << std::endl;
}

int main()
{
	std::string imie[2];
	std::string nazwisko[2];
	int wiek[2];
	for (int i = 0; i < 2; i++)
		wczytajOsobe(imie[i], nazwisko[i], wiek[i]);

	for (int i = 0; i < 2; i++)
		wypiszOsobe(imie[i], nazwisko[i], wiek[i]);

	return 0;
}

Definiujesz bool po za pętlą, deklarujesz w pętli i ustawiasz jako warunek do zakończenia pętli.

pyhvh7E.png


 


Opublikowano

PLcZZCP.png

// IOStreamTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
	int liczba;
	std::cout << "Podaj liczbe: ";
	std::cin >> liczba;
	while (std::cin.fail())
	{
		std::cin.clear();
		std::cin.ignore();
		std::cin.sync();
		std::cout << "Niepoprawna liczba, podaj poprawna: ";
		std::cin >> liczba;
	}
	std::cout << "Zadzialalo, liczba to " << liczba;
	return 0;
}


Użycie std::cin.ignore() było konieczne, inaczej działo się to, co w @3up.

Skończ proszę się kompromitować. Jesteś nikim.

Opublikowano

Najwidoczniej tak.

Możesz też pobawić się funkcją std::stoi, została dodana w c++11.

Rzuca ona wyjątkiem w przypadku błędu.

std::string liczba_s;
std::cin >> liczba_s;
try
{
    int liczba = std::stoi(liczba_s);
    std::cout << liczba;
}
catch (const std::invalid_argument& ex)
{
    std::cout << "Nie podano liczby. " << ex.what();
}
catch (const std::out_of_range& ex)
{
    std::cout << "Liczba poza zakresem. " << ex.what();
}

http://www.cplusplus.com/reference/string/stoi/

Skończ proszę się kompromitować. Jesteś nikim.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...