witam. mam problem z programem przeliczajacym waluty uruchamianym pod VC 2005. pierwotnie ten program byl pisany w natywnym c++ i kompilowany w devie - wszystko dzialalo bez zarzutu. teraz na zajeciach zczelismy pracowac w zarzadzanym c. przerobilem wiec ten program. kompiluje sie ale nie dziala. gdzies jest blad. wydaje mi sie ze cos schrzanilem z konwertowaniem i menu wyboru. bede wdzieczny za uwagi. pozdr
#include "stdafx.h"
using namespace System;
int main(array ^args)
{
double dolar, euro, funt, zlote;
double przel_euro = 6.60;
double przel_funt = 5.06;
double przel_dol = 3.54;
int ktory, wybor;
X:
Console::WriteLine(L"Przelicznik Walut. \n");
Console::WriteLine("Wybierz co chcesz przeliczyć: \n1- Zlote na dolary\n2- Zlote za euro");
Console::WriteLine("3- Zlote na funty \n");
ktory = Convert::ToDouble(Console::ReadKey());
switch(ktory)
{
case 1:
Console::WriteLine(L" ************Zlote na Dolary************** \n\n");
Console::WriteLine(L"Wpisz ilosc zlotych: ");
zlote = Convert::ToDouble(Console::ReadLine());
dolar = zlote * przel_dol;
Console::WriteLine(L"\n {0} zlotych to {1} dolarow.",zlote, dolar);
break;
case 2:
Console::WriteLine(L" *************Zlote na EURO************** \n\n");
Console::WriteLine(L"Wpisz ilosc zlotych: ");
zlote = Convert::ToDouble(Console::ReadLine());
euro = zlote * przel_euro;
Console::WriteLine(L"\n {0) zlotych to {1} euro.",zlote,euro);
break;
case 3:
Console::WriteLine(L" ************Zlote na FUNTY***************** \n\n");
Console::WriteLine(L"Wpisz ilosc zlotych: ");
zlote = Convert::ToDouble(Console::ReadLine());
funt = zlote * przel_funt;
Console::WriteLine(L"\n {0} zlotych to {1} funtow.",zlote,funt);
break;
}
Console::WriteLine(L"\n\n\n Czy chcesz cos przeliczyc jeszcze raz?(wpisz 1 dla tak, lub cos innego by zakonczyc \n");
ktory = Convert::ToInt16(Console::ReadKey());
if(wybor==1)
goto X;
else if(wybor!=1)
return 0;
}
Console::ReadKey pobiera znak i zwraca go jako char(albo wchar_t, nie pamiętam), a więc jest on zapisany jako ASCII/UTF-16. Musisz zmienną “ktory” porównywać z kodami ASCII(w UTF-16 są takie same) by sprawdzić, który klawisz został wciśnięty(zamiast “case 1” będzie “case ‘1’” itd.).
PS. Zamiast ktory = Convert::ToDouble powinno być Convert::ToInt32.
Dzięki za odpowiedź. Zrobiłem tak jak napisałeś. Chyba:)
#include "stdafx.h"
using namespace System;
int main(array ^args)
{
double dolar, euro, funt, zlote;
double przel_euro = 6.60;
double przel_funt = 5.06;
double przel_dol = 3.54;
int ktory, wybor;
X:
Console::WriteLine(L"Przelicznik Walut. \n");
Console::WriteLine("Wybierz co chcesz przeliczyć: \n1- Zlote na dolary\n2- Zlote za euro");
Console::WriteLine("3- Zlote na funty \n");
ktory = Convert::ToInt32(Console::ReadKey());
switch(ktory)
{
case '1':
Console::WriteLine(L" ************Zlote na Dolary************** \n\n");
Console::WriteLine(L"Wpisz ilosc zlotych: ");
zlote = Convert::ToDouble(Console::ReadLine());
dolar = zlote * przel_dol;
Console::WriteLine(L"\n {0} zlotych to {1} dolarow.",zlote, dolar);
break;
case '2':
Console::WriteLine(L" *************Zlote na EURO************** \n\n");
Console::WriteLine(L"Wpisz ilosc zlotych: ");
zlote = Convert::ToDouble(Console::ReadLine());
euro = zlote * przel_euro;
Console::WriteLine(L"\n {0) zlotych to {1} euro.",zlote,euro);
break;
case '3':
Console::WriteLine(L" ************Zlote na FUNTY***************** \n\n");
Console::WriteLine(L"Wpisz ilosc zlotych: ");
zlote = Convert::ToDouble(Console::ReadLine());
funt = zlote * przel_funt;
Console::WriteLine(L"\n {0} zlotych to {1} funtow.",zlote,funt);
break;
}
Console::WriteLine(L"\n\n\n Czy chcesz cos przeliczyc jeszcze raz?(wpisz 1 dla tak, lub cos innego by zakonczyc \n");
ktory = Convert::ToInt32(Console::ReadKey());
if(wybor==1)
goto X;
else if(wybor!=1)
return 0;
}
Dalej jednk nie działa. Wyrzuca komunikat:
An unhandled exception of type 'System.InvalidCastException' occurred in mscorlib.dll
Additional information: Unable to cast object of type 'System.ConsoleKeyInfo' to type 'System.IConvertible'.
i jeszcze:
'e.exe': Loaded 'C:\WINDOWS\SysWOW64\rsaenh.dll', No symbols loaded.
'e.exe' (Managed): Loaded 'C:\Windows\WinSxS\x86_microsoft.vc80.debugcrt_1fc8b3b9a1e18e3b_8.0.50727.42_none_ef74ff32550b5bf0\msvcm80d.dll', No symbols loaded.
'e.exe': Loaded 'C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System\267d4c344058092e6950c11594244f90\System.ni.dll', No symbols loaded.
'e.exe' (Managed): Loaded 'C:\Windows\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll', No symbols loaded.
A first chance exception of type 'System.InvalidCastException' occurred in mscorlib.dll
An unhandled exception of type 'System.InvalidCastException' occurred in mscorlib.dll
Additional information: Unable to cast object of type 'System.ConsoleKeyInfo' to type 'System.IConvertible'.
The thread 'Win32 Thread' (0xfb4) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0xa18) has exited with code 0 (0x0).
The program '[2044] e.exe: Managed' has exited with code 0 (0x0).
The program '[2044] e.exe: Native' has exited with code 0 (0x0).
Czy można jakoś inaczej pobrać znak niż za pomocą " ktory = Convert::ToInt32(Console::ReadKey()); "? Console::Read tez nie działa:(