PDA

Показать полную графическую версию : помогите разобраться


Harik
06-02-2012, 19:40
Всем доброго времени суток. Совсем недавно начал изучать С++ и вот решил попробовать написать первую программу. Пишу в Code::Blocks 10.05. Сопсно, код:

#include <iostream>
using namespace std;
char keymap [256];

int main()
{
int a=0,b=0,c=0,choice;
cout<<"The calculator"<<endl<<"version 1.0\n"<<endl;
do
{
cout<<"Enter number and press <enter> button: "<<endl;
cin>>a;
cout<<endl<<a<<endl;
cout<<"\nChoose operation: "<<endl<<"+"<<endl<<"-"<<endl<<"*"<<endl<<"/"<<endl<<"="<<endl<<"For exit press 'q' (quit)"<<endl;
cin>>choice;
switch (choice)
{
case '+':
cout<<a<<" + "<<endl<<endl;
cout<<"Enter number and press <enter> button: "<<endl;
cin>>b;
с=a+b;
cout<<endl<<a<<"+"<<b<<"="<<d<<endl;
break;
case '-':
cout<<a<<" - "<<endl<<endl;
cout<<"Enter number and press <enter> button: "<<endl;
cin>>b;
с=a-b;
cout<<endl<<a<<"-"<<b<<"="<<d<<endl;
break;
case '*':
cout<<a<<" * "<<endl<<endl;
cout<<"Enter number and press <enter> button: "<<endl;
cin>>b;
с=a*b;
cout<<endl<<a<<"*"<<b<<"="<<d<<endl;
break;
case '/':
if (a!=0)
{
cout<<a<<" / "<<endl<<endl;
cout<<"Enter number and press <enter> button: "<<endl;
cin>>b;
с=a/b;
cout<<endl<<a<<"/"<<b<<"="<<d<<endl;
}
else
{
cout<<"Zero can not be divided. Enter another number!!\n"<<endl;
}
break;
case '=':
cout<<a<<" = "<<a<<endl<<endl;
break;
}
}
while ('q');
}

Суть в следующем: изначально вводится число1, далее предлагается определить действие (прибавление, вычитание и т.д.). После выбора действия предлагается ввести число2, которое к числу1 будет прибавляться, вычитаться и т.д. соответственно. Результат операции записывается в переменную "с" и программа начинает цикл сначала, пока не будет выбран вариант "Выход".
Но вот какая беда - я не знаю, как заставить С понимать нажатие клавиш. При выборе любой из операций (+,-,*,/,q) программа зацикливается в этом месте до бесконечности...

cout<<"Enter number and press <enter> button: "<<endl;
cin>>a;
cout<<endl<<a<<endl;
cout<<"\nChoose operation: "<<endl<<"+"<<endl<<"-"<<endl<<"*"<<endl<<"/"<<endl<<"="<<endl<<"For exit press 'q' (quit)"<<endl;
cin>>choice;

...пока электричество не закончится.

Подскажите пожалуйста, как мне решить эту простенькую задачку??

lxa85
06-02-2012, 21:36
Объясни, что за
while ('q'); » ?
while q что? Выход почему? Потому что гладиолус? :)
Вспоминай анекдот:
-Приборы!
-15!
-Что 15?!
-Какие приборы?!!!

Выход.
Q!
Что Q? Какое Q? Куда это Q?

Поэтому надо сделать что? Правильно, поставить условие! Q у нас не просто так, а кто-то или что то должно быть ему равно или не равно. Правильно? :) Или не правильно?
Поэтому while <логическое условие> ! А q - это не логическое условие, это с боку бантик. :)

Вот. На ошибку я тебе указал. Дело за малым. Исправишь ее и ты молодец! :)

Harik
07-02-2012, 00:27
пока не совсем понимаю... :(
вариант while (choice!=q); не катит. Понятно, что делаю что-то не правильно, но что... :dont-know

lxa85
07-02-2012, 00:45
Harik, while (choice!=q); »
Перепиши условие еще раз. Что ты, сходу не получилось и опять сюда прибежал. Давай назад, в борозду! :)
(а вот тут серьезно)
Q - это что? Это буква, цифра, длинное слово, логическая переменная?
choice - то же самое. Что это?
Что и с чем ты пытаешься сравнить?
(а тут уже не очень) Уж не крокодилов ли с ежиками? ;)
Понятно, что делаю что-то не правильно, но что... »
Думай, думай! Шевели мозгами! :) (с)

Harik
07-02-2012, 20:07
С той штукой разобрался. Спасибо большое за подсказки :)
Но теперь не могу разобраться с локализацией. Спрашивал у гугла по этому поводу, говорит - дело в консоли (её кодировка). То есть теоретически если в консоли указать нужную кодировку, то всё будет корректно отображаться. А как сделать, чтобы всё правильно отображалось на этапе написания кода. В смысле, не в самом коде, а в результате компиляции, чтобы не приходилось лишний раз лезть в консоль и указывать кодовую страницу..?

Вот, что у меня получилось, просьба не смеяться))


#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

int main()
{
int choice;
setlocale(LC_ALL,"Russian");
double a=0,b=0;
char op,q;
double res;
cout<<"Калькулятор"<<endl<<"версия 1.1\n"<<endl<<endl;
repeat: cout<<"Будем считать?"<<endl<<endl<<"1. Да\n2. Нет"<<endl;
cin>>choice;
if (choice==1)
{
do
{
cout<<"Введите Ваше число и нажмите кнопку <enter>: "<<endl;
cin>>a;
cout<<endl<<a<<endl;
cout<<"\nChoose operation: "<<endl<<"+"<<endl<<"-"<<endl<<"*"<<endl<<"/"<<endl<<"="<<endl<<"For exit press 'q' (quit)"<<endl;
cin>>op;
switch (op)
{
case '+' :
cout<<a<<" + "<<endl<<endl;
cout<<"Введите Ваше число и нажмите кнопку <enter>: "<<endl;
cin>>b;
res=a+b;
cout<<endl<<a<<"+"<<b<<"="<<res<<endl<<endl;
break;
case '-' :
cout<<a<<" - "<<endl<<endl;
cout<<"Введите Ваше число и нажмите кнопку <enter>: "<<endl;
cin>>b;
res=a-b;
cout<<endl<<a<<"-"<<b<<"="<<res<<endl<<endl;
break;
case '*' :
cout<<a<<" * "<<endl<<endl;
cout<<"Введите Ваше число и нажмите кнопку <enter>: "<<endl;
cin>>b;
res=a*b;
cout<<endl<<a<<"*"<<b<<"="<<res<<endl<<endl;
break;
case '/' :
if (a!=0)
{
cout<<a<<" / "<<endl<<endl;
cout<<"Введите Ваше число и нажмите кнопку <enter>: "<<endl;
cin>>b;
}
else if (b!=0)
{
res=a/b;
cout<<endl<<a<<"/"<<b<<"="<<res<<endl<<endl;
}
else (a=0,b=0);
{
cout<<"Нельзя делить на ноль. Введите другое число!!\n"<<endl;
}
break;
/* case 'q' :
return 0;
break;
*/
default:
cout<<"Неверный оператор '"<<op<<"'"<<endl<<endl;
cout<<"Попробуйте ещё раз!\n\nВведите число: ";
break;
}
}
while (op==q);
}
else if (choice!=1,choice!=2)
{
cout<<"Ошибка. Повторите ввод!"<<endl;
goto repeat;
}
else (choice==2);
{
cout<<"До свидания!"<<endl;
return 0;
}
}


Подскажите, куда копать, или что конкретно нужно сделать? Как и прежде, среда разработки - Code::Blocks

Drongo
07-02-2012, 21:39
Спрашивал у гугла по этому поводу, говорит - дело в консоли (её кодировка). То есть теоретически если в консоли указать нужную кодировку, то всё будет корректно отображаться. А как сделать, чтобы всё правильно отображалось на этапе написания кода. В смысле, не в самом коде, а в результате компиляции, чтобы не приходилось лишний раз лезть в консоль и указывать кодовую страницу..? »Кирилица в консоли (http://forum.oszone.net/thread-129824.html) -> я это делаю так (http://forum.oszone.net/post-917350-40.html)

virus8
07-02-2012, 22:25
могу поделиться своим опытом)) по поводу кирилицы вот =

ПИСАТЬ В INT MAIN()
{
setlocale( LC_ALL, "Russian" );
}

Drongo
07-02-2012, 23:56
virus8, это по моему для Visual Studio работает, но в билдере у меня не проходит такой вариант. И, уже было (http://forum.oszone.net/post-1297930-69.html). :)

El Scorpio
14-02-2012, 04:26
while ('q'); »
Команда while выполняет цикл до тех пор, покуда условие является "истинным". "Истинным" является любое целочисленное значение, отличное от нуля.
Значение константы 'q' является целочисленным и равно коду указанного символа. Следовательно условие всегда будет истинным, и цикл будет выполняться бесконечно




© OSzone.net 2001-2012