Перейти к содержимому

Фото
- - - - -

[C++] организация ввода


  • Вы не можете создать новую тему
  • Please log in to reply
21 ответов в этой теме

#1 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 04 октября 2004 - 14:40

Мне надо чтоб при нажатии клавиши печаталось на экране допустим ПРИВЕТ!
прбовал сделать так:
#include <iostream>

using std::cin;
using std::cout;

int main()
{
   int grame;
     while ( (grame=cin.get() ) != EOF)
      {
           switch (grame)
               {
                  case 'a' :
                  case 'A' :
                    cout << "ПРИВЕТ!"<<endl;
                  default :
                    cout << "ПОКА !"<<endl;
               }
      }
return 0;
}  
вроде норма, но для получения реакции от проги надо ентер жать, что мне не надо вовсе!
как такое можно сделать другим путем, и вообще почему он ввода ждет, ведь должен сразу на со стандартного потока брать! :huh:
  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#2 dronius

dronius
  • Пользователь
  • 153 сообщений

Отправлено 04 октября 2004 - 19:10

#include <conio.h>
char c = getch();

Для С++ есть cin.get() или getchar() но они требуют энтера (по крайней мере на винде)
  • 0

#3 tomatensaft

tomatensaft

    Samurai Jack

  • Пользователь
  • 449 сообщений
  • Откуда:Tallinn

Отправлено 04 октября 2004 - 21:31

Клавиши ввода они требуют везде. Это стандартное поведение для чтения из потоков. Эту фичу, насколько мне известно, можно реализовать только платформенными библиотечными функциями, которые предоставляют интерфейс к непосредственно консоли (как тот же набор функций C <conio.h> в DOS/Win). Стандартные библиотеки С и С++ таких функий не предоставляют...

В Linux с Glibc этим заведует <termios.h> : http://www.gnu.org/s.....canon Example

Сообщение изменено: tomatensaft (04 октября 2004 - 21:40 )

  • 0
"This is all I want'd t' say 'bout dat..." © Forest Gump

#4 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 05 октября 2004 - 13:28

Это все понятно, а почему вот код
 while(1){
  ch=getchoice();
  if (ch!=0) state=ch;
  if (ch == ' '){
  	printf("Stop\n");
  	robi_setdata(fd,0);
  	usleep(500*1000);
  }
  if (ch == 'q'|| ch == 'x'){
  	printf("Quit\n");
  	break;
  }

  if (state=='1'){
  	/*right */
  	printf("ДАТА 1 строб!\n");
  	data1(fd);
  }
  if (state=='2'){
  	/*left */
  	printf("DATA 2 strobe!\n");
  	data2(fd);
  }
  if (state=='3'){
  	printf("DATA 3 strobe\n");
  	data3(fd);
  }
  if (state=='4'){
          printf("DATA 4 strobe\n");
  	data4(fd);
  }
  if (state=='5'){
          printf("DATA 5 strobe\n");
  	data5(fd);
  }
  if (state=='6'){
  	printf("DATA 6 strobe\n");
  	data6(fd);
  }
  if (state=='7'){
  	printf("DATA 7 strobe\n");
  	data7(fd);
  }
  if (state=='8'){
  	printf("DATA 8 strobe\n");
  	data8(fd);
  }  
	}
работает как надо, без ввода ?
  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#5 geek

geek

    кулхацкер млин :)

  • Пользователь
  • 153 сообщений
  • Откуда:Мустамяэ

Отправлено 05 октября 2004 - 15:12

libricon, это ты отсюда взял?

http://www.linuxfocu...rticle205.shtml

Тогда обрати внимание на функцию set_terminal(). В ней происходит то же самое, что и в примере, который tomatensaft давал.
  • 0

#6 DEREWO

DEREWO
  • Постоялец
  • 1 954 сообщений

Отправлено 05 октября 2004 - 17:24

esli mo#no bez potokov, to samqi prostoi variant

#include <conio.h>

#include <stdio.h>



int main(void)

{

char key;	

	while ( key != 27 )

	{  

     key = getch();

  switch( key )

  {

  	case 72:

  	case 'a':

  	{

    printf("Knopa4ka %c\n",key);

    break;

  	}

  	

  }	

   }

}

  • 0

The only thing you can't predict with any accuracy is people's capacity for stupidity.


#7 V^v

V^v
  • Пользователь
  • 316 сообщений

Отправлено 05 октября 2004 - 19:08

и этот самый простой вариант работает только там, где есть conio.h, то есть на DOS/Windows.

а почему вот код работает как надо, без ввода

потому что этот код - обработка ввода, сам ввод здесь:
ch=getchoice();

покажи функцию getchoice();
  • 0
int main(void)

#8 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 06 октября 2004 - 16:29

функция в студию:

int getchoice()
{
	int c;
	char s[20];
	
	if (fgets(s,20,stdin)){
  c=s[0];
  switch ( c ){
  	
  	case ' ':
  	case '1':
  	case '2':
  	case '3':
  	case '4':
  	case '5':
  	case '6':
  	case '7':
  	case '8':
    break;
  	default:
    c=0;
  }
  return ( c );
	}
	return(0);
}

Сообщение изменено: tomatensaft (06 октября 2004 - 22:53 )

  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#9 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 06 октября 2004 - 16:31

geek , ты совершенно прав, только оа переделана, посылает на каждый из потоков data0,data1,data3 . по стробы при нажатии 1,2,3,4, и тд
чето я не догоняю как делать надо, ту ссылк , каторую дал томат, непойму че там написано, псевдокод какой-то :(

а вот не опйму зачем заголовок <termios.h>

Сообщение изменено: libricon (06 октября 2004 - 16:33 )

  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#10 tomatensaft

tomatensaft

    Samurai Jack

  • Пользователь
  • 449 сообщений
  • Откуда:Tallinn

Отправлено 06 октября 2004 - 22:57

Это ANSI C, libricon... :) Рабочий код С. Твой код, кстати, тоже на С -- С++ там даже и не пахнет...

Ты хочешь сказать, что fgets(s, 20, stdin) обеспечивает тебе ввод из стандартного ввода без нажатия на "Enter"?.. Нет, это не работает, по крайней мере, у меня... Зато код в примере, предложенном мной, сработал. :)

(отредактировано)

Сообщение изменено: tomatensaft (06 октября 2004 - 23:10 )

  • 0
"This is all I want'd t' say 'bout dat..." © Forest Gump

#11 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 06 октября 2004 - 23:03

аха , аха , хотя не знаю как, просто жму клавиши, а лампоки сами мигают, про точто это с я в курсе, это пример из файла pprobi.c ( помним?)
но не важно , вроде разобрался, только не понял
In noncanonical input processing mode, characters are not grouped into lines, and ERASE and KILL processing is not performed. The granularity with which bytes are read in noncanonical input mode is controlled by the MIN and TIME settings. See Noncanonical Input.

че такое MIN ? ( этот режим контролируется при помощи min и настройки времени) :)
сори, не увидел
int VMIN Macro
This is the subscript for the MIN slot in the c_cc array. Thus, termios.c_cc[VMIN] is the value itself.

The MIN slot is only meaningful in noncanonical input mode; it specifies the minimum number of bytes that must be available in the input queue in order for read to return.

Сообщение изменено: libricon (06 октября 2004 - 23:04 )

  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#12 tomatensaft

tomatensaft

    Samurai Jack

  • Пользователь
  • 449 сообщений
  • Откуда:Tallinn

Отправлено 06 октября 2004 - 23:09

Ну вот и хорошо, что разобрался. :) Вот, кстати, немного измененная программа:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
     
/* Use this variable to remember original terminal attributes. */
     
struct termios saved_attributes;
     
void
reset_input_mode (void)
{
  tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes);
}
     
void
set_input_mode (void)
{
  struct termios tattr;
  char *name;
     
  /* Make sure stdin is a terminal. */
  if (!isatty (STDIN_FILENO))
    {
      fprintf (stderr, "Not a terminal.\n");
      exit (EXIT_FAILURE);
    }
     
  /* Save the terminal attributes so we can restore them later. */
  tcgetattr (STDIN_FILENO, &saved_attributes);
  atexit (reset_input_mode);
     
  /* Set the funny terminal modes. */
  tcgetattr (STDIN_FILENO, &tattr);
  tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
  tattr.c_cc[VMIN] = 1;
  tattr.c_cc[VTIME] = 0;
  tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
}
     
int
main (void)
{
  char c;
  int i = 0;
     
  set_input_mode ();
     
  while (1)
    {
      read (STDIN_FILENO, &c, 1);
      i++;
      //putchar (c);
      fprintf(stderr, "%c : 0x%02X\n", c, c);
    }
     
  return EXIT_SUCCESS;
}

Она наглядно показывает, что действительно считываются практически все клавиши, даже управление курсором, ESC и Home,End,Del,Ins... Также, выводит их коды.

Сообщение изменено: tomatensaft (06 октября 2004 - 23:24 )

  • 0
"This is all I want'd t' say 'bout dat..." © Forest Gump

#13 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 06 октября 2004 - 23:20

;) аха, но все равно возьму , да и вставлю пример в текст :) плагеат?
  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#14 tomatensaft

tomatensaft

    Samurai Jack

  • Пользователь
  • 449 сообщений
  • Откуда:Tallinn

Отправлено 06 октября 2004 - 23:25

Public domain. С этим кодом, в принципе, можно делать все, что угодно.
  • 0
"This is all I want'd t' say 'bout dat..." © Forest Gump

#15 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 06 октября 2004 - 23:29

классно, класную ссылку дал, кстати а как производную найти, как вообще организовать ввод? придется строго задать кол-во переменных, или через какую-нибуть рекурсивную функйцию, или что-то типо, ввдеите х, теперь его степень, введите еще х и его степень .
  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#16 tomatensaft

tomatensaft

    Samurai Jack

  • Пользователь
  • 449 сообщений
  • Откуда:Tallinn

Отправлено 07 октября 2004 - 07:15

А чего собственно тебе нужно добиться в конечном итоге? Какова цель ввода данных?
  • 0
"This is all I want'd t' say 'bout dat..." © Forest Gump

#17 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 07 октября 2004 - 15:30

да нее, производна, это я просто рыскал по математическим функциям, а ввод мне нужет все для тех же целец, что и в файле pprobi.c , только мне а) надо все сделать самому
б) на с++ и немного другие задачи.
  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#18 tomatensaft

tomatensaft

    Samurai Jack

  • Пользователь
  • 449 сообщений
  • Откуда:Tallinn

Отправлено 07 октября 2004 - 22:57

Математическую производную некоей математической функции на компьютере найти довольно-таки сложно. Это алгебра, а ее компьютеры не так хорошо умеют "хрумкать" (там нет чисел, одна лишь логика). Подробнее про производную: http://en.wikipedia....wiki/Derivative

Основная формула: Размещенное изображение
В русских учебниках вместо h используют "Delta x". Словами -- это предел отношения изменения функции к изменению ее аргумента, при стремящемся к нулю изменении аргумента. Например, производной функции a^x будет a ln x.

б) на с++ и немного другие задачи.


А какие задачи? Если тебе нужен командный интерфейс на основе консоли, то возьми на вооружение readline или даже ncurses. Простой командный интерфейс можно сделать и самому с помощью стандартной библиотеки, за полчаса-час. По сути, командный интерфейс как правило реализуется в виде цикла с считыванием ввода в начале и обработкой в остальной части блока.

Если нужен красивый объектно-ориентированный код, то сначала подумай о метафорах, которые будут фигурировать в программе. Потом о классах, их методах, взаимосвязях...

Какого рода ввод тебе нужен? Это же может быть ввод простых символов и немедленная реакция на них (как в играх), ввод каких-то команд, или вообще, ввод некоевого кода на каком-то скриптовом макроязыке...

Опиши поподробнее свою задачу.

Сообщение изменено: tomatensaft (07 октября 2004 - 23:11 )

  • 0
"This is all I want'd t' say 'bout dat..." © Forest Gump

#19 Sergio

Sergio
  • Постоялец
  • 3 051 сообщений

Отправлено 07 октября 2004 - 23:11

классно, класную ссылку дал, кстати а как производную найти, как вообще организовать ввод? придется строго задать кол-во переменных, или через какую-нибуть рекурсивную функйцию, или что-то типо, ввдеите х, теперь его степень, введите еще х и его степень .

Просмотреть сообщение

libricon, ты вообще про документацию слышал когда-нибудь? Если хочешь научиться программировать, то привыкай читать документацию в больших количествах. Конечно, ничего плохого в том, чтобы спрашивать нет, на то и форум. Просто для тебя же лучше будет, если ты сам дойдешь до того, как сделать это и то. Так ты запомнишь надолго. И будешь опытнее. И не бойся эксперементировать.:)
  • 0

#20 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 08 октября 2004 - 14:40

учту,
андрей, мне надо немедленная реакция на нажатие

кстати я в манах не нашел ничего подобного, вот и решил к вам обратиться, а теперь я ссылочку знаю, ттомат дал, так теперь... УУУГУГУ :)

только вот чето я не поуму, а как с валютой работать?

Сообщение изменено: libricon (08 октября 2004 - 14:43 )

  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!

#21 tomatensaft

tomatensaft

    Samurai Jack

  • Пользователь
  • 449 сообщений
  • Откуда:Tallinn

Отправлено 09 октября 2004 - 06:32

Как с числами с фиксированной точкой (long, например, подойдет), или, если ты делаешь биржевую программу, то как с числами с плавающей точкой (float, double). Лучше (с точки зрения ООП) создать базовый класс данных Валюта (Currency), который будет представлять число с плавающей точкой в более красивом виде. Такой класс скорее всего будет содержать методы по преобразованию из разных числовых и строковых типов в значения твоего класса, методы красивого ввода/вывода этих значений в потоках ввода-вывода (перегруженные операторы << и >>), по базовой валютной арифметике и другое. Далее, для каждой валюты ты можешь создавать дочерние классы (CurrencyUSD, CurrencyEUR, CurrencyEEK, CurrencyRUR, CurrencyJYI, ...), которые будут иметь значения относительно некоегого основного индекса. Лучшим подходм может, однако, оказаться введение нового класса в программу -- класса "Валютной Биржи", которая будет содержать соотношения всех валют для численных преобразований...
  • 0
"This is all I want'd t' say 'bout dat..." © Forest Gump

#22 libricon

libricon
  • Постоялец
  • 572 сообщений
  • Откуда:Маарду

Отправлено 09 октября 2004 - 18:21

да, а если скажет число 2.653 , я его обрежу до 2.65 и число 2.347 я обрежу до 2.34, то комп слогая их даст 5 , а пользователь 2.99 , короче у меня в учебнике написано, что не надо использовать уисла с плавающей точкой , для работы с валютой: там сказано для этого есть специальный библиотеки, чето не видел их,

не подбросит кто-нибуть мне ссылки , подобной той, каторую дал томат, гдеб было все расписано про программирование в gui ?
  • 0
Пингвин птица гордая, пока не пнешь, не полетит!!!