Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
14 / 14 / 4
Регистрация: 27.07.2011
Сообщений: 162
.NET 4.x

Консольное приложение. Блокировка клавиш

23.08.2011, 00:49. Показов 3336. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет,сразу к делу:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
class Program
{
    static void Main()
    {
   Metka:
        char answer;
        do
        {
            Console.Clear();
            double x, x1, x2;
            Console.WriteLine("Введите a");
            double a = double.Parse(Console.ReadLine().Trim());
            Console.WriteLine("Введите b");
            double b = double.Parse(Console.ReadLine().Trim());
            Console.WriteLine("Введите c");
            double c = double.Parse(Console.ReadLine().Trim());
            double d = ((b * b) - (4 * a * c));
            Console.WriteLine("Дискриминант = " + d);
            if (d < 0)
            {
                Console.WriteLine("Нет корней");
            }
 
            if (d == 0)
            {
                x = (-b / 2 * a);
                Console.WriteLine("1 корень: x = " + Math.Round(x, 2));
            }
 
            if (d > 0)
            {
                double sqrtD = (double)System.Math.Sqrt(d);
                x1 = ((-b + sqrtD) / (2 * a));
                x2 = ((-b - sqrtD) / (2 * a));
                Console.Write("2 корня: x1 = " + Math.Round(x1, 2));
                Console.WriteLine(", x2= " + Math.Round(x2, 2));
            }
 
            Console.WriteLine("Press Enter to continue\nPress Esc to exit");
            answer = Console.ReadKey().KeyChar;
 
        }
        while (answer == 13);
        if (answer != 27)
        {
            goto Metka;
        }
 
    }
}
Сейчас это выглядит так. Хочу спросить,как можно сделать так,чтобы при нажатии сторонних клавиш(кроме Enter и Esc) ничего не срабатывало? Как видно сейчас,стоит обычная метка,но это не гуд и хотелось бы сделать все нормально. Как можно такое реализовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.08.2011, 00:49
Ответы с готовыми решениями:

Консольное приложение. Состояние клавиш клавиатуры
Возможно ли в консольном приложении на C# обеспечить контроль состояния клавиатурных клавиш? Необходимо, чтобы цикл...

Как открыть консольное приложение в .NET через другое консольное приложение .NET
Есть один вопрос. Как открыть консольное приложение .NET через другое консольное приложение .NET, чтобы при этом второе приложение...

Блокировка алфавитных клавиш
Помогите за блокировать буквенную раскладку клавиатуры программно, всех кроме цифр

13
 Аватар для slava_g1
75 / 75 / 32
Регистрация: 06.02.2011
Сообщений: 127
23.08.2011, 00:56
Не плохо бы для начала этот кож в try {} catch(){} заключить
C#
1
2
3
4
5
6
Console.WriteLine("Введите a");
double a = double.Parse(Console.ReadLine().Trim());
Console.WriteLine("Введите b");
double b = double.Parse(Console.ReadLine().Trim());
Console.WriteLine("Введите c");
double c = double.Parse(Console.ReadLine().Trim());
А то при введении например буквы вместо цифры программа будет слетать
0
14 / 14 / 4
Регистрация: 27.07.2011
Сообщений: 162
23.08.2011, 01:08  [ТС]
так,а можно поподробнее,не особо понял концепцию данного исключения.
0
 Аватар для CLEO_ROCK
71 / 71 / 23
Регистрация: 22.05.2011
Сообщений: 528
23.08.2011, 01:30
Цитата Сообщение от slava_g1 Посмотреть сообщение
Не плохо бы для начала этот кож в try {} catch(){} заключить
C#
1
2
3
4
5
6
Console.WriteLine("Введите a");
double a = double.Parse(Console.ReadLine().Trim());
Console.WriteLine("Введите b");
double b = double.Parse(Console.ReadLine().Trim());
Console.WriteLine("Введите c");
double c = double.Parse(Console.ReadLine().Trim());
А то при введении например буквы вместо цифры программа будет слетать
зачем try {} catch(){}? просто double.Parse заменить на double.TryParse
0
14 / 14 / 4
Регистрация: 27.07.2011
Сообщений: 162
23.08.2011, 01:46  [ТС]
"ни одна из перегрузок метода TryParse не принимает 1 аргументов"
0
9 / 9 / 2
Регистрация: 05.08.2011
Сообщений: 18
23.08.2011, 09:33
msdn.microsoft.com очень полезный сайт, советую им пользоваться
C#
1
2
3
4
5
6
7
8
string value;
double number;
Console.WriteLine("Введите число");
value = double.Parse(Console.ReadLine().Trim());
if (Double.TryParse(value, out number))
   Console.WriteLine(number);
else
   Console.WriteLine("{0} не число, либо выходит за границы типа double.", value);
0
14 / 14 / 4
Регистрация: 27.07.2011
Сообщений: 162
23.08.2011, 23:06  [ТС]
а разве string в double преобразуется? правда на первый вопрос я ответа так и не получил... как все-таки сделать выключение только на Esc?
0
15 / 15 / 0
Регистрация: 18.08.2011
Сообщений: 39
24.08.2011, 00:11
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
class Program
{
    static void Main()
    {
    //Metka:
        char answer;
        do 
        {
            Console.Clear();
            double x, x1, x2;
            Console.WriteLine("Введите a");
            double a = double.Parse(Console.ReadLine().Trim());
            Console.WriteLine("Введите b");
            double b = double.Parse(Console.ReadLine().Trim());
            Console.WriteLine("Введите c");
            double c = double.Parse(Console.ReadLine().Trim());
            double d = ((b * b) - (4 * a * c));
            Console.WriteLine("Дискриминант = " + d);
            if (d < 0)
            {
                Console.WriteLine("Нет корней");
            }
 
            if (d == 0)
            {
                x = (-b / 2 * a);
                Console.WriteLine("1 корень: x = " + Math.Round(x, 2));
            }
 
            if (d > 0)
            {
                double sqrtD = (double)System.Math.Sqrt(d);
                x1 = ((-b + sqrtD) / (2 * a));
                x2 = ((-b - sqrtD) / (2 * a));
                Console.Write("2 корня: x1 = " + Math.Round(x1, 2));
                Console.WriteLine(", x2= " + Math.Round(x2, 2));
            }
 
            Console.WriteLine("Press Enter to continue\nPress Esc to exit");
            answer = Console.ReadKey().KeyChar;
 
        }
        while (answer == 13 || answer ==24); // CONTROL+X=24
        //if (answer != 27)
        //{
        //    goto Metka;
        //}
 
    }
}
Может Вы так хотели?
0
14 / 14 / 4
Регистрация: 27.07.2011
Сообщений: 162
24.08.2011, 01:35  [ТС]
Цитата Сообщение от Fsh Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
class Program
{
    static void Main()
    {
    //Metka:
        char answer;
        do 
        {
            Console.Clear();
            double x, x1, x2;
            Console.WriteLine("Введите a");
            double a = double.Parse(Console.ReadLine().Trim());
            Console.WriteLine("Введите b");
            double b = double.Parse(Console.ReadLine().Trim());
            Console.WriteLine("Введите c");
            double c = double.Parse(Console.ReadLine().Trim());
            double d = ((b * b) - (4 * a * c));
            Console.WriteLine("Дискриминант = " + d);
            if (d < 0)
            {
                Console.WriteLine("Нет корней");
            }
 
            if (d == 0)
            {
                x = (-b / 2 * a);
                Console.WriteLine("1 корень: x = " + Math.Round(x, 2));
            }
 
            if (d > 0)
            {
                double sqrtD = (double)System.Math.Sqrt(d);
                x1 = ((-b + sqrtD) / (2 * a));
                x2 = ((-b - sqrtD) / (2 * a));
                Console.Write("2 корня: x1 = " + Math.Round(x1, 2));
                Console.WriteLine(", x2= " + Math.Round(x2, 2));
            }
 
            Console.WriteLine("Press Enter to continue\nPress Esc to exit");
            answer = Console.ReadKey().KeyChar;
 
        }
        while (answer == 13 || answer ==24); // CONTROL+X=24
        //if (answer != 27)
        //{
        //    goto Metka;
        //}
 
    }
}
Может Вы так хотели?

я хотел заблокировать все клавиши,кроме enter и esc в конце приложения,и чтобы оно работало только по двум путям: enter - повтор, esc - выход.
0
15 / 15 / 0
Регистрация: 18.08.2011
Сообщений: 39
24.08.2011, 04:48
Цитата Сообщение от NinGAZ Посмотреть сообщение
я хотел заблокировать все клавиши,кроме enter и esc в конце приложения,и чтобы оно работало только по двум путям: enter - повтор, esc - выход.
В консольном приложении имеется только одно событие CancelKeyPress которое срабатывает при нажатии Control+C, чего крайне недостаточно для решения Вашей проблемы.
У Вас два варианта:
1. Перенести Ваш код в приложение Windows Forms и там обрабатывать событие нажатия неугодных Вам клавиш.
2. Если Вы не собираетесь покидать консольное приложение, тогда Вам придется использовать Win32 API функцию которая перехватит нажатие клавиш, по другому я думаю не получится.

Есть еще 3 вариант: любая клавиша повтор, esc - выход.
0
Заблокирован
24.08.2011, 07:56
Цитата Сообщение от NinGAZ Посмотреть сообщение
чтобы оно работало только по двум путям: enter - повтор, esc - выход.
C#
1
2
3
4
5
6
7
8
9
10
11
            do
            {
                /*
                 * здесь твой код
                 */
               
 
                Console.WriteLine("Для продолжения нажмите Ввод. Для выхода - Esc");
              
 
            } while (Console.ReadKey().Key != ConsoleKey.Escape);
0
 Аватар для Евгений В
912 / 672 / 134
Регистрация: 01.03.2010
Сообщений: 1,279
24.08.2011, 10:10
Rebicon,
Ему нужно, что бы программа, после расчетов, реагировала только на две клавиши а остальные не вызывали отклика и не писались на экране.

NinGAZ Протестируй такой вариант
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 char answer;
           int i = 0;
          do
          {
              i++;
              Console.Clear();
              Console.WriteLine(@"Делаем расчет {0}
            //.................
            //.................
            //................",i);
              Console.WriteLine(@"Расчет закончен
______________________________________________");
 
            Console.WriteLine("Press Enter to continue\nPress Esc to exit");
             do 
             { 
               answer = Console.ReadKey().KeyChar; // вводим символ
               Console.CursorLeft=0;   // смещаем курсор в начало экрана что бы забить введенный символ
               Console.Write(" ");     // забиваем символ
               Console.CursorLeft = 0; // опять смещаем курсор
             }  
             while ((answer != 13) & (answer != 27)); // крутим этот цикл, пока не будет 13 или 27
          }  
          while (answer == 13); // тут answer уже может быть только 13 или 27. Если 27 - то  выход из программы
0
Заблокирован
24.08.2011, 17:13
Цитата Сообщение от Евгений В Посмотреть сообщение
Rebicon,
Ему нужно, что бы программа, после расчетов, реагировала только на две клавиши а остальные не вызывали отклика и не писались на экране.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
       static void Main()
        {
            while (true)
            {
                Console.Clear();
                double x, x1, x2;
                Console.WriteLine("Введите a");
                double a = double.Parse(Console.ReadLine().Trim());
                Console.WriteLine("Введите b");
                double b = double.Parse(Console.ReadLine().Trim());
                Console.WriteLine("Введите c");
                double c = double.Parse(Console.ReadLine().Trim());
                double d = ((b * b) - (4 * a * c));
                Console.WriteLine("Дискриминант = " + d);
                if (d < 0)
                {
                    Console.WriteLine("Нет корней");
                }
 
                if (d == 0)
                {
                    x = (-b / 2 * a);
                    Console.WriteLine("1 корень: x = " + Math.Round(x, 2));
                }
 
                if (d > 0)
                {
                    double sqrtD = (double)System.Math.Sqrt(d);
                    x1 = ((-b + sqrtD) / (2 * a));
                    x2 = ((-b - sqrtD) / (2 * a));
                    Console.Write("2 корня: x1 = " + Math.Round(x1, 2));
                    Console.WriteLine(", x2= " + Math.Round(x2, 2));
                }
 
 
                Console.WriteLine("Для продолжения нажмите Ввод. Для выхода - Esc");
                 ConsoleKey k = Console.ReadKey(true).Key;
 
                 while (k != ConsoleKey.Escape && k != ConsoleKey.Enter)
                 {
                     k = Console.ReadKey(true).Key;
                 }
                if (k == ConsoleKey.Escape) break;
               
            }
        }
0
14 / 14 / 4
Регистрация: 27.07.2011
Сообщений: 162
26.08.2011, 22:11  [ТС]
последнее помогло) хотя try..catch тоже использовал) всем спасибо)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
class Program
{
    static void Main()
    {
        while(true)
        {
            try                                                                 //Обычное выполнение программы.
            {
 
                Console.Clear();
                double x, x1, x2;
                Console.WriteLine("Введите a");
                double a = double.Parse(Console.ReadLine().Trim());             //Вводим значение a
                Console.WriteLine("Введите b");
                double b = double.Parse(Console.ReadLine().Trim());             //Вводим значение b
                Console.WriteLine("Введите c");
                double c = double.Parse(Console.ReadLine().Trim());             //Вводим значение c
               
                double d = ((b * b) - (4 * a * c));                             //Находим Дискриминант и выводим его не экран
                Console.WriteLine("Дискриминант = " + d);
               
                if (d < 0)                                                      //При Дискриминанте меньше нуля выводит "нет корней".
                {
                    Console.WriteLine("Нет корней");
                }
 
                if (d == 0)                                                     //При Дискриминанте равном нулю,считает единственный корень и выводит его.
                {
                    x = (-b / 2 * a);
                    Console.WriteLine("1 корень: x = " + Math.Round(x, 2));     //Операция Math.Round округляет значение аргумента с плавающей точкой до определенного кол-ва знаков после точки. 
                }
 
                if (d > 0)                                                      //При Дискриминанте больше нуля,считает и выводит оба корня уравнения.
                {
                    double sqrtD = (double)Math.Sqrt(d);                        //Вычисляет корень их Дискриминанта
                    x1 = ((-b + sqrtD) / (2 * a));
                    x2 = ((-b - sqrtD) / (2 * a));
                    Console.Write("2 корня: x1 = " + Math.Round(x1, 2));        
                    Console.WriteLine(", x2= " + Math.Round(x2, 2));
                }
 
                     Console.WriteLine("Для продолжения нажмите Ввод. Для выхода - Esc");
                 
 
                }
 
    
            catch (Exception ex)                                                //Выполнение программы при введении неверных символов(например,букв). Вывод ошибки и повтор программы сначала.
 
            {
                Console.WriteLine("ошибка. " + ex.Message);
            }
            
            ConsoleKey k = Console.ReadKey(true).Key;                           //Присвоение k определенного символьного значения(клавиши).
            
            while (k != ConsoleKey.Escape && k != ConsoleKey.Enter)             //тут даже и не знаю,как описать:D
            
            {
            
                k = Console.ReadKey(true).Key;
                
            }
            
            if (k == ConsoleKey.Escape) break;
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.08.2011, 22:11
Помогаю со студенческими работами здесь

блокировка горячих клавиш
Добрый вечер уважаемые Помогите пожалуйста составить код который бы блокировал клавишу Win и все горячие клавиши кроме Shift+Ctrl и...

Консольное приложение
Привет!Напишите плиз программу, кому не сложно, в свое время упустил матрериал, сам виноват! Задание: Составить описание класса для...

Консольное приложение
Здравствуйте. Подскажите Пожалуйта как можно сделать повтор приложения к примеру: int iInteger1, iInteger2; iInteger2 = 10; ...

Консольное приложение
Задача: составить программу вычисления функции.Вывести результат вычисления и величину,от которой зависит выбор условия.

консольное приложение
Помогите реализовать задачу Написать на С# код консольного приложения, реализующий в главной функции ввод с клавиатуры в переменные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru