2013-11-24 2 views
1

Я заинтересован, чтобы найти решение следующей задачи:Читать ИНТ числа от CIN до ESC не будет нажата кнопка C++

я должен прочитать ИНТ номера образуют CIN до тех пор, пока пользователь не нажмет клавишу ESC и вычислить среднее значение положительного и даже целые числа.

Моя проблема: я не совсем уверен, как правильно написать условие остановки.

Вот что я пытался до сих пор (не работает должным образом)

#include<iostream> 
#include<math.h> 

using namespace std; 

void main() 
{ 
    int c, sum=0, i=0; 
cout<<"Insert characters: "; 
while(cin>>c) 
{ 
    i++; 
    if((int)c>=0&&(int)c%2==0){ 
     sum+=(int)c; 
    } 
} 
cout<<"Average: "<<(float)sum/i<<endl; 
system("pause"); 
} 
+0

Я не знаю, как проверить ключ выхода, но вам нужно переместить 'i ++' в условие 'if()', иначе вы будете считать все четные и нечетные целые числа. – Brady

+0

Вы читаете номера, но ESC не является числом, а управляющим кодом. Я думаю, что это даже не будет передано через оператор >>. Для доступа к специальным нажатиям клавиш вам необходимо использовать какую-то функцию чтения в режиме низкого уровня. –

+0

Брэди, это правильно о i ++, но я все еще придерживаюсь условия выхода ... –

ответ

2

побеге символ не является ни цифрой, ни пробелом. Таким образом, если программа получает передается символ в потоке, вы можете просто прочитать целые числа, а поток автоматически прекращает работу, когда ESPACE символы вводятся (только концентрируясь на входной стороне вопроса):

#include<iostream> 

int main() 
{ 
    int c = 0; 
    while (std::cin >> c) { 
     std::cout << "c=" << c << '\n'; 
    } 
} 

: Ли escape-символы пересылаются в поток операционной системой, однако возникает другой вопрос. Например, в UNIX escape-символ будет перенаправлен, но только тогда, когда ввод предоставляется программе, которая по умолчанию - это когда вводится строка. Если программе не нужно ждать ключа возврата, операционная система должна попросить не ждать ключа возврата.

Вопрос, кажется, для Windows, но я не знаю достаточно о Windows, чтобы определить, как изменить настройки терминала там (см. Ниже что-то, что может все еще работать). В UNIX вы очистите флаг ICANON в настройках терминала, используя tcgetattr() и tcsetattr(). Например, вы могли бы использовать это:

#include <iostream> 
#include <termios.h> 

int main() 
{ 
    termios values; 
    tcgetattr(0, &values); 
    values.c_lflag &= ~ICANON; 
    tcsetattr(0, TCSANOW, &values); 

    int c = 0; 
    while (std::cin >> c) { 
     std::cout << "c=" << c << '\n'; 
    } 
} 

Я думаю, что есть getch() на Windows, которые получают вам один символ, не дожидаясь. Это, надеюсь, также включает в себя символ побега. Если это так, вы можете просто создать простой буфер потока вокруг getch() и использовать это вместо того, чтобы:

#include <iostream> 
#include <streambuf> 
#include <whatever-declares-getch> 

struct getchbuf 
    : std::streambuf { 
    static int const end = <getch()-error-value-goes-here>; 
    char buffer; 
    int underflow() { 
     int result(traits_type::eof()); 
     if (this->gptr() == this->egptr() && (result = getch()) != end) { 
      buffer = traits_type::to_char_type(result); 
      this->setg(&buffer, &buffer, &buffer + 1); 
     } 
     return result; 
    } 
}; 

int main() 
{ 
    getchbuf sbuf; 
    std::istream in(&sbuf); 

    int c = 0; 
    while (in >> c) { 
     std::cout << "c=" << c << '\n'; 
    } 
} 

Вы должны залатать выше код, чтобы включить все, что говорит getch() (я думаю, что это <conio.h>, но я не знать) и указать индикатор ошибки getch().

+0

Спасибо за ваши предложения! –

3

Вы можете попробовать это

while((ch = cin.get()) != 27) 
{ 
    i++; 
    if((int)ch>=0&&(int)ch%2==0 
    { 
    sum+=(int)ch; 
    } 
} 

Это должно цикл, пока клавиша esc нажата

+0

не работает неудачно ... консоль застревает с чтением, это не останавливается .. . –

+0

@AdrianOlar Вы имеете в виду, что условие 'while' никогда не является ложным? –

+0

Это будет работать, только если пользователь вводит символ, значение ASCII которого равно 27. – 0x499602D2

Смежные вопросы