Konwersja char do int w visual c++.

0

Owszem. Jest odpowiedź w faq'u, ale ona nie dotyczy kompilowania w visual c++. Poza tym, ja nie szukam gotowej odpowiedzi, lecz pomysłu jak zrobić, żeby w switch'u dorzucić opcję w stylu "żadnych liter". Normalnie, wiem już jak to się robi i jest to proste, ale w przypadku switch'a trzeba chyba dokonać konwersji z int do char albo coś podobnego.

Opcja default dotyczy wyłącznie liczb.

Wie ktoś może w jaki sposób to zrobić?

0

Dobra. Poradziłem sobie z problemem pt."żadnych liter", ale tym razem wrzucam kod,bo nie rozumiem dlaczego program nie do końca robi to, co bym chciał. Gdy wpisuje literę, menu się ponownie wyświetla, ale gdy wpisuje LICZBĘ z poza zakresu (1-5), to już menu mi nie wyświetla. Czemu?

int main()
{
char znak=0;
bool exit = false;
for (;;)
{
int choice = menu();
switch (choice)
{
case (1):
DoTaskOne();
break;
case (2):
DoTaskMany(2);
break;
case (3):
DoTaskMany(3);
break;
case (4):
continue;
break;
case (5):
exit=true;
break;
default:
while (!(cin>>choice))
{ cin.clear();
cin.sync();
cout<<"to nie moze byc litera: \n";
if ((choice<=0) | (choice>5)) cout <<"prosze wybrac ponownie: \n";
break;
}

  		//cout <<"prosze wybrac ponownie: "<<endl;
  			//break;
  		
  		
  		
  		
  }
  if (exit) break;

}

return 0;
}

0

Ale po co w ogóle skupiasz się na literach? Przecież istnieje prawidłowy wybór i błędny wybór. Nie ma co się roztrząsać nad tym czy błędny wybór jest literą, czy cyfrą czy innym znakiem lub napisem.

bool GetChoice(int *ret, int count)
{
    std::string line;
    std::getline(std::cin, line);
    bool is_num = std::istringstream(line) >> *ret;
    return is_num && *ret >= 1 && *ret <= count;
}

int main()
{
    bool exit = false;

    do {
        int choice;
        do {
            PrintMenu();
        }
        while (!GetChoice(&choice, 5));

        switch (choice) {
            case 1: ...
            case 2: ...
            case 3: ...
            case 4: ...
            case 5: ...
        }
    }
    while (!exit);
}
0
bool GetChoice(int *ret, int count)
{
    /* Pobieramy linijkę tekstu z 'cin'. */
    std::string line;
    std::getline(std::cin, line);

    /* Tworzymy nowy strumień podobny do 'cin' czy 'ifstream'. W przypadku 'cin'  
     * zawartością strumienia jest to co wpiszemy w konsoli. W przypadku
     * 'ifstream' zawartością jest treść pliku. Zawartością naszego strumienia
     * będzie podany łańcuch znaków (string). Do takich strumieni służy klasa
     * 'istringstream'. Zawartością niech będzie przed chwilą wczytana linia. */
    std::istringstream iss(line);

    /* Wczytujemy z naszego strumienia liczbę. */
    iss >> *ret;
    
    /* Sprawdzamy, czy wczytanie się powiodło (podobnie jak przy if(!cin)...). */
    bool is_num = iss;
    
    /* Dodatkowo sprawdzamy, czy liczba mieści się w rządanym zakresie. */
    return is_num && *ret >= 1 && *ret <= count;
}
0

Sęk w tym, że ten kod nie działa tak, jak powinien. Chodzi o to, że komunikat błędu pojawia się za każdym razem, niezależnie od tego czy wpisuję wartość poprawną czy nie. Dla urozmaicenia dodałem cin.clear() i cin.sync() z komunikatem.

int main()
{
char znak=0;
bool exit = false;

do {
int choice;
do
{
menu();
} while (!GetChoice(&choice, 5));
switch (choice)
{
case (1):
DoTaskOne();
break;
case (2):
DoTaskMany(2);
break;
case (3):
DoTaskMany(3);
break;
case (4):
continue;
break;
case (5):
exit=true;
break;
}
}
while (!exit);

return 0;
}
bool GetChoice(int *ret, int count)
{
cin.clear();
cin.sync();
cout <<"to nie moze byc ani litera ani liczba z poza 1-5 \n";
string line;
getline(cin, line);
bool is_num = istringstream(line) >> *ret;
return is_num && *ret >= 1 && *ret <= count;
}

0

Komunikat jest wypisywany za każdym razem, bo umieściłeś go w złym miejsce - zaraz przed pobraniem "wyboru" od użytkownika. Pokaż komunikat dopiero po tym jak funkcja GetChoice pobierze "wybór" i sprawdzi, czy jest prawidłowy. Jakbyś jeszcze nie załapał, to funkcja ta zwraca true lub false w zależności od tego, czy wybór jest prawidłowy, czy błędny.

No a tak poza tym wszystko jest OK -> http://ideone.com/RKpbG
Może w menu są jakieś kwiatki?

0

Gdzieś musi być błąd u mnie w jakimś drobiazgu. Bez cin.clear() oraz bez cin.sync() program się nie zatrzymuje i pętla się robi nieskończona. Główkuje na tym od kilku dni i już na prawdę nie wiem.

#include "stdafx.h"
#include <iostream>
using namespace std;
int menu();
void DoTaskOne();
void DoTaskMany(int);
bool GetChoice(int *ret, int count);
int main()
{
char znak=0;
bool exit = false;

do {
int choice;

  do	{
  		menu();
  	} while (!GetChoice(&choice, 5));
  switch (choice)
  	{
  	case (1): 
  		DoTaskOne();
  		break;
  	case (2):
  		DoTaskMany(2);
  		break;
  	case (3):
  		DoTaskMany(3);
  		break;
  	case (4):
  		continue;
  		break;
  	case (5):
  		exit=true;
  		break;
  		}
  
  	

}
while (!exit);

return 0;
}
int menu()
{
int choice;
cout <<"Menu;-)))"<<endl;
cout <<" 1 opcja"<<endl;
cout <<"2 opcja"<<endl;
cout <<"3 opcja"<<endl;
cout <<"Ponownie wyswietl menu"<<endl;
cout <<"wyjscie"<<endl;
cout <<": "<<endl;
cin >> choice;
return choice;
}

void DoTaskOne()
{
cout <<"opcja pierwsza"<<endl;
}
void DoTaskMany(int which)
{
if (which==2)
cout <<"opcja druga"<<endl;
else cout <<"opcja trzecia"<<endl;
}
bool GetChoice(int *ret, int count)
{
cin.clear();
cin.sync();

string line;
getline(cin, line);
bool is_num = istringstream(line) >> *ret;

is_num = is_num && *ret >= 1 && *ret <= count;

if (!is_num) cout <<"nie moze byc ani litera ani liczba z poza 1-5 \n";
return is_num;
}

0

cin >> choice;
a to do czego służy?

Btw. używaj tagów <code> np.
<code class="cpp">tu jakiś kod c++</code>
Dla niektórych języków istnieją "szybkie" tagi np. dla c++ wystarczy
<code class="cpp">tu jakiś kod c++</code>

0
adf88 napisał(a):

cin >> choice;
a to do czego służy?

Btw. używaj tagów <code> np.
<code class="cpp">tu jakiś kod c++</code>
Dla niektórych języków istnieją "szybkie" tagi np. dla c++ wystarczy
<code class="cpp">tu jakiś kod c++</code>

Co tu dużo mówić, dzięki;-) Tak się zastanawiam, czy ja się kiedyś nauczę szybciej myśleć?;-))

1 użytkowników online, w tym zalogowanych: 0, gości: 1