меню на си через switch
C Урок 10. Оператор switch
Очень часто при составлении исходного кода будущей программы мы сталкиваемся с ситуацией, когда дальнейший ход нашей программы зависит от конкретного значения какой-то переменной либо выражения, причём когда выбор таких значений, мягко говоря, немаленький. Мы, конечно же в данном случае можем воспользоваться условными конструкциями if, else, else if, но в данном случае это будет не совсем удобно и читабельно. Для этой ситуации существует такая конструкция, чтобы было очевидно, что мы выбираем какие-то конкретные варианты значений одной переменной или одного выражения.
И таким оператором и служит switch, который также можно отнести к оператору ветвления. Также данный оператор очень часто называют оператором вариантов. Ещё в народе его зовут переключателем в соответствии с его переводом на русский.
switch – оператор, который сравнивает последовательно значение переменной, находящейся в скобках со всеми вариантами значений, находящимися после каждого ключевого слова case. При совпадении данных значений выполняется код, следующий за case. Затем, если встретится ключевое слово break либо закрывающая фигурная скобка, произойдет выход из конструкции switch. Если со значением переменной не совпадет ни одно из значений, выполнится код после необязательной инструкции default
Оператор break в ветвях case является необязательным. Если его не будет в какой-то из ветвей, то выхода из тела оператора не произойдёт и код продолжит выполнение дальше внутри тела. Причём, если дальше встретится следующая ветвь case, то её код выполнится независимо от сравниваемого значения. Приём без break используется как правило для того, чтобы выполнить ту или иную ветвь в зависимости не от одного, а от нескольких вариантов значения переменной (выражения), находящейся(гося) в скобках. Выглядеть такая ветвь будет примерно вот так
Ветвь default, как было указано выше, также необязательна и при её отсутствии в случае несовпадения значения переменной или выражения ни с одним значением в вариантах ничего не делается, то есть ни один участок кода, находящийся в теле оператора switch, не будет выполнен.
Также нелишним будет заметить что ветви case и default можно располагать в любом порядке, хотя мы привыкли, что ветвь default, которая, кстати быть должна только одна, всегда в конструкции switch расположена в самом низу тела.
Если вы вдруг что-то не поняли или недопоняли из объяснения выше, то, надеюсь, смысл оператора switch будет понятен из практической части. Также данным оператором в будущих уроках мы будем очень часто пользоваться и вы непременно к нему привыкнете.
И давайте теперь перейдём к нашей практической части. Я постараюсь дать такой простой пример, который будет понятен каждому. Пусть он не пригодится в будущем, но сейчас самое важное для нас то, чтобы мы уяснили, как именно работает конструкция switch.
Создадим новый проект из проекта прошлого занятия с именем MYPROG09 и присвоим ему имя MYPROG10.
Откроем файл main.c и в функции main(), как обычно, удалим весь код тела кроме возврата нуля, останется от него вот это
int main()
return 0 ; //Return an integer from a function
Добавим код, в котором программа попросит пользователя ввести целое число из предложенных вариантов. Затем мы введённое пользователем число с помощью оператора switch, с которым мы познакомились выше, обработаем соответствующим образом. В свою очередь, ввод числа и конструкцию switch мы также обернём в бесконечный цикл, чтобы нас после каждого ввода числа не выбрасывало из программы
Меню на си через switch
Разделы
Реализация меню на switch конструкции.
В моем понимании меню – это часть интерфейса осуществляющего взаимодействие между пользователем и устройством. В обязанности этого интерфейса входит обработка нажатий кнопок, вывод информации на дисплей и выполнение различных действий инициированных пользователем. Меню имеет графическое отображение, которое представляет из себя одноуровневую или многоуровневую иерархическую структуру и часть этой структуры обычно видна на дисплее.
Вариант реализации меню, который я здесь предлагаю, основан на switch конструкции. В языке Си switch – это один из операторов ветвления. Он позволяет осуществлять выбор между несколькими заданными альтернативами. Поскольку ноги Си растут из ассемблера, в ассемблере можно реализовать точно такой же оператор, ну а точнее конструкцию. Пример ассемблерного варианта switch приведен ниже.
Switch:
Case1:
cpi r16, 1
brne Case2
rcall func1
ret
Case2:
cpi r16, 2
brne Case3
rcall func2
ret
Case3:
cpi r16, 3
brne Default
rcall func3
ret
Default:
rcall func4
ret
//@0 – константа с которой происходит сравнение,
//@1 – подпрограмма вызываемая в данной ветви
.MACRO Case
cpi r16, @0
brne ExitCase
rcall @1
ret
ExitCase:
.ENDMACRO
Case 1, func1
Case 2, func2
Case 3, func3
Default:
rcall func4
ret
……
Навигация по меню и запуск каких-то действий в микроконтроллерном девайсе осуществляется с помощью кнопок. Поэтому программа микроконтроллера имеет подпрограммы обрабатывающие их нажатия (обработчики). Собственно на switch конструкции и построен обработчик нажатия одной кнопки.
Проще всего разобраться в его работе на примере. Допустим, у нас есть одноуровневое меню из трех пунктов, которые имеют нумерацию 1, 2, 3. Есть кнопка Up, нажатие которой вызывает перемещение вверх по пунктам меню. Вот как будет выглядеть обработчик этой кнопки.
.def CurrentState = r16
.equ pCurrentState = 0x60
HandlerUpButton:
lds CurrentState, pCurrentState
Case1:
cpi CurrentState, 1
brne Case2
rcall func1
ldi CurrentState, 1
rjmp ChangeState
Case2:
cpi CurrentState, 2
brne Case3
rcall func2
ldi CurrentState, 1
rjmp ChangeState
Case3:
cpi CurrentState, 3
brne ExitHandler
rcall func3
ldi CurrentState, 2
rjmp ChangeState
ExitHandler:
ret
ChangeState:
sts pCurrentState, CurrentState
ret
pCurrentState – это адрес в оперативной памяти микроконтроллера. По этому адресу хранится номер пункта меню, в котором мы находимся в данный момент. В начале обработчика микроконтроллер считывает это значение и записывает его в переменную CurrentState. Далее начинается последовательный обход switch конструкции, каждая ветвь которой выполняет обработку нажатия кнопки Up в конкретном пункте меню. Как только микроконтроллер находит нужную ветвь, он вызывает подпрограмму. Потом записывает в переменную CurrentState номер пункта меню, в который мы должны перейти после завершения работы обработчика, переходит на метку ChangeState и сохраняет значение CurrentState в ОЗУ. Если микроконтроллер не найдет нужную ветвь, то он просто выйдет из подпрограммы HandlerUpButton.
А вот какая логика работы будет у меню. Если мы находимся в первом пункте – нажатие кнопки Up вызывает выполнение подпрограммы func1, но не вызывает перехода. Если мы находимся во втором пункте меню – нажатие Up вызывает переход в первый пункт и вызывает выполнение подпрограммы func2. И наконец, если мы находимся в третьем пункте – нажатие Up вызывает переход во второй пункт меню и выполнение подпрограммы func3.
Вообще запись обработчика в таком виде довольно громоздка и не наглядна. Исправить положение можно с помощью макроса.
.def CurrentState = r16
.equ pCurrentState = 0x60
.MACRO Case
cpi CurrentState, @0
brne ExitCase
rcall @2
ldi CurrentState, @1
rjmp ChangeState
ExitCase:
.ENDMACRO
Case – макрос одной ветви конструкции switch, где @0 – номер пункта меню, @1 – константа задающая переход, @2 – подпрограмма
Вот как будет выглядеть обработчик кнопки Up с использованием макросов.
HandlerUpButton:
lds CurrentState, pCurrentState
Case 1, 1, func1
Case 2, 1, func2
Case 3, 2, func3
ret
ChangeState:
sts pCurrentState, CurrentState
ret
.def tmp = r16
.equ pButtonBuf= 0x61
Main:
//проверяем кнопочный буфер
lds tmp, pButtonBuf
cpi tmp, 0
breq Main
cpi tmp, 5
brsh ClearBufButtons
//вычисляем адрес
//и прыгаем на него
dec tmp
lsl tmp
ldi ZL, Low(CheckButtons)
ldi ZH, High (CheckButtons)
add ZL, tmp
ijmp
CheckButtons:
rcall HandlerUpButton
rjmp ClearBufButtons
rcall HandlerDownButton
rjmp ClearBufButtons
rcall HandlerEnterButton
rjmp ClearBufButtons
rcall HandlerCancelButton
//rjmp ClearBufButtons
//очищаем кнопочный буфер
//возвращаемся на Main
ClearBufButtons:
clr tmp
sts pButtonBuf, tmp
rjmp main
Действую от обратного, мы разобрали идеологию реализации меню на switch конструкции. Не спрашивайте, почему я излагал материал именно так – я и сам не знаю. Просто в таком порядке мысли выливались на бумагу.
Теперь можно собрать все вышеизложенное воедино в виде блок схемы.
Оператор switch (C)
Операторы switch и case помогают управлять сложными условными операциями и операциями ветвления. Оператор switch передает управление в оператор внутри своего тела.
Синтаксис
selection-statement :
switch ( expression ) statement
labeled-statement :
case constant-expression : statement
default : statement
Примечания
Значения expression и значение каждого constant-expression должны иметь целочисленный тип. Выражение constant-expression должно иметь однозначное константное целочисленное значение во время компиляции.
Оператор switch обычно используется следующим образом:
Выражения switch expression и case constant-expression должны быть целочисленного типа. Значение каждого case constant-expression в теле оператора должно быть уникальным.
В следующих примерах кода показаны операторы switch :
Специально для систем Майкрософт
В Microsoft C расширения Майкрософт по умолчанию (default) включены. Используйте параметр компилятора /Za для отключения этих расширений.
Как создать меню на C или C++
Время чтения: 5 минут
Порой, чтобы продемонстрировать работу консольной программы бывает удобно воспользоваться меню — элементом пользовательского интерфейса, позволяющим выбрать одну из нескольких перечисленных опций программы. Иногда же наличие меню является обязательным условием задания по программированию.
Рассмотрим создание меню для консольной программы на примере следующей задачи: имеется список товаров, состоящих из наименования, цены и количества данного товара. Написать программу, позволяющую находить наименьшую и наибольшую цену. Взаимодействие с пользователем организовать с помощью меню.
Разбиваем программу на пункты
Прежде чем добавлять меню в программу, следует разбить программу на процедуры, которые должны будут выполняться при выборе соответствующих пунктов меню. Нашу задачу можно разбить на следующие пункты:
Выводим пункты меню на экран
Чтобы вывести меню на экран, очистим его и затем просто напечатаем с помощью printf или cout номер пункта и то, что он должен делать:
Вариант для C:
Вариант для C++
Считываем введённый пункт меню
В самом простом случае достаточно всего лишь считать число, однако правильнее будет защитить программу от некорректного ввода с помощью считывания строки и проверки ввода на корректность.
Вариант для C:
Вариант для C++:
Обработка выбранного пункта меню
Создадим для каждого пункта свой обработчик в виде процедуры, выполняющей указанное действие:
Чтобы выполнить действие в зависимости от введённого пункта воспользуемся оператором switch-case :
Полный листнинг кода
Демонстрация работы программы
Понятнее не стало?
Программист, соосновательница programforyou.ru, рукодельница, всегда готова придти на помощь и помочь во всём разобраться
Языки программирования: Python, C, C++, Pascal
Выпускница МГТУ им. Н.Э. Баумана
Programforyou — это сообщество, в котором Вы можете подтянуть свои знания по программированию, узнать, как эффективно решать те или иные задачи, а также воспользоваться нашими онлайн сервисами.
Как стать программистом
Обучение основам программирования на C для чайников.
Страницы
Последние новости
YoungCoder теперь и на Stepikе. Записывайтесь: https://vk.cc/75rISy
Чтобы записаться на курс, необходимо зарегистрироваться на Степике: https://vk.cc/75rIC4
Это моя личная ссылка-приглашение на Stepik для вас. Регистрируясь по этой ссылке, записываясь на курсы и решая задачи, Вы помогаете автору данного сайта принять участие в конкурсе платформы Stepik! Подробности конкурса здесь: https://vk.cc/75rKuS
воскресенье, 6 ноября 2011 г.
Занятие 6. Оператор множественного выбора switch. Уроки программирования для чайников.Язык Си.
Прочитайте улучшенную версию этого урока «Оператор выбора switch».
Если Вам понравился этот урок, расскажите о нем вашим друзьям. В этом Вам могут помочь кнопки основных социальных сетей, расположенные ниже. Вам остается всего лишь кликнуть по любой из них.
96 комментариев :
int main(void)
<
float a,b,d;
char s;
printf(«Vvedite dva chisla i znak deistviya: «);
scanf(«%f %f %c», &a,&b,&s);
switch (s)
<
case ‘+’: d=a+b, printf(«\n%f+%f=%f\n «,a,b,d); break;
case ‘-‘: d=a-b, printf(«\n%f-%f=%f\n «,a,b,d); break;
case ‘*’: d=a*b, printf(«\n%f*%f=%f\n «,a,b,d); break;
case ‘/’: d=a/b, printf(«\n%f/%f=%f\n «,a,b,d); break;
default: printf(«\nERROR\n»); break;
>
return (0);
>
Dispose, хорошо, только соблюдайте формат вывода. В данном случае надо вывести только результат операции, а не полную её запись.
#include
int main(void)
<
float a,b,c;
char s;
printf(«primer vvoda:2*2\n»);
scanf(«%f %c %f»,&a,&s,&b);
switch (s) <
case ‘+’:printf(«=%f\n»,c=a+b);break;
case ‘-‘:printf(«=%f\n»,c=a-b);break;
case ‘/’:printf(«=%f\n»,c=a/b);break;
case ‘*’:printf(«=%f\n»,c=a*b);break;
default:printf(«unknown command\n»);break;
>
return(0);
Добрый день Камиль. Неправильно. Соблюдайте формат входных и выходных данных.
#include «stdio.h»
int main(void)
<
float a,b;
char s;
scanf(«%f %f %c»,&a,&b,&s);
switch(s) <
case’+’:printf(«=%f\n»,a+b);break;
case’-‘:printf(«=%f\n»,a-b);break;
case’*’:printf(«=%f\n»,a*b);break;
case’/’:printf(«=%f\n»,a/b);break;
default:printf(«ERROR\n»);break;
>
return(0);
>
а как можно начать обучение?
Читайте уроки с первого, разбирайтесь. Если что-то непонятно спрашивайте. Постараюсь помочь.=)
/*спасибо за хорошие уроки)))
P.S от Сергея*/
Нет, не верно. Соблюдайте формат входных и выходных данных. =)
Спасибо за отличные уроки! =)
printf(«\nvvedite dva 4isla i znak deistvia\n»);
scanf(«%f %f %c», &a,&b,&c);
switch (c)
<
case ‘-‘ : printf(«\n%f\n», a-b); break;
case ‘+’ : printf(«\n%f\n», a+b); break;
case ‘*’ : printf(«\n%f\n», a*b); break;
case ‘/’ : printf(«\n%f\n», a/b); break;
default: printf(«\nERROR\n»);
return(0);
>
int main() <
float a,c;
char b;
printf(«Vvedite dannue i dejstvie: «);
scanf(«%f%f%c», &a, &c, &b);
Работает верно, но неправильный формат.Учитесь делать то, что вас просят. =)
Спасибо за уроки, очень хорошо все изложенно.
Почему-то текст программы сбивается в кашу при попыке выложить его на стну ((
Странно. У всех же нормально получается.
Порой испытываю те же проблемы. Приходится скидывать код по частям(((
#include
int main(void)
<
float a,b,x;
char c;
printf(«Vvedite komandu: «);
scanf(«%f %f %c», &a,&b,&c);
switch (c) <
case ‘+’: x=a+b; printf(«x=%.2f\n», x);break;
case ‘-‘: x=a-b; printf(«x=%.2f\n»,x);break;
case ‘*’: x=a*b; printf(«x=%.2f\n»,x);break;
case ‘/’: x=a/b; printf(«x=%.2f\n»,x);break;
default: printf(«ERROR»);
>
Верно. НО прошу вас, соблюдайте формат. И переменная х тут лишняя, можно и без неё. =)
Спасибо вам «Автор» за такой хорошо изложенный материл. лучше этого я НЕ встречал. вы молодец. спасибо вам большое, и всего самого лучшего.
Георгий.
Пожалуйста. Стараюсь. Спасибо за добрые слова. Мне очень приятно, что всё не зря.=)
//Урок 6 Задание 1 КАЛЬКУЛЯТОР
#include
int main (void)
<
float a,b,x;
char c;
printf(«Vvedite dva chesla i znak deystviya cherez probel:\n\n»);
scanf(«%f %f %c»,&a,&b,&c);
switch (c)
<
case ‘+’: x=a+b; printf(«\n%f\n»,x); break;
case ‘-‘: x=a-b; printf(«\n%f\n»,x); break;
case ‘*’: x=a*b; printf(«\n%f\n»,x); break;
case ‘/’: printf(«\n%f\n»,a/b); break
Я старался упростить, поэтому написал так. На самом деле, там не обязательно должна быть переменная, а любое выражение, которое дает необходимый нам тип на выходе. Т.е. Камиль вместо переменной вещественного типа, записал сразу выражение, которое в результате дает вещественный тип.
#include
#include
int main(void)
<
float a,b,c;
char d;
printf(«Vvedi dva chisla i znak deistviya\n»);
scanf(«%f %f %c»,&a,&b,&d);
switch(d) <
case ‘+’:c=a+b; printf(«%f\n»,c);break;
case ‘-‘:c=a-b; printf(«%f\n»,c);break;
case ‘/’:c=a/b; printf(«%f\n»,c);break;
case ‘*’:c=a*b; printf(«%f\n»,c);break;
default: printf(«ERROR\n»);break;
>
return(0);
Незнаю, как там ввести 2 цифры и знак в програму КАМИЛЯ и других, чтобы оно что то сосчитало. Всегда выводит «ERROR», хотя сама программа работает без ошибок.
#include «stdio.h»
int main(void)
<
printf(«Vvedite cherez probel 2 chisla i komandu «);
float a,b,x;
char c;
scanf(«%f%f%c»,&a,&b,&c);
switch (c)
<
case ‘+’: x=a+b, printf(«\Otvet:%f\n»,x); break;
case ‘-‘: x=a-b, printf(«\nVlevo\n»); break;
case ‘*’: x=a*b, printf(«\nVniz\n»); break;
case ‘/’: x=a/b, printf(«\nVpravo\n»); break;
default: printf(«\nNeizvestnaya komanda\n»); break;
>
return (0);
>
ой, забыл в скобках дописать на вычитание, умножение, деление. Но сути это не меняет.
double a,b;
char c;
printf(«pervoe chislo»);
scanf(«%f»,&a);
printf(«deistvie»);
scanf(«%c»,&c);
printf(«vtoroe chislo»);
scanf(«%f»,&b);
switch (c) <
case ‘+’: printf(«%f»,a+b);break;
case ‘-‘: printf («%f»,a-b);break;
default: printf(«Error!»);
>
return 0;
что здесь неверно?после ввода первого числа выводится сразу deistvievtoroe chislo и дальше уже независимо от того что будет введено дальше,выйдет Error!
помогите.
#include
int main()
<
float a, b;
char c;
printf(«Vvedite dva chisla cherez probel i znak deistviya: «);
scanf(«%f%f %c», &a,&b,&c);
switch(c)
<
case ‘+’: printf(«\n%f\n», (a+b)); break;
case ‘-‘: printf(«\n%f\n», (a-b)); break;
case ‘*’: printf(«\n%f\n», (a*b)); break;
case ‘/’: printf(«\n%f\n», (a/b)); break;
default: printf(«\nERROR\n»); break;
>
>
Этот комментарий был удален автором.
Подскажите,пожалуйста,как в операторе множественного выбора задавать вопросы?Мне нужно сделать программу-тест, а я не знаю,как в Switch задавать вопросы вместо выражения
error C2297: &: недопустимо, правый оператор имеет тип «float»
#include
int main(void)
<
float a,b,;
char d;
a=getchar();
b=getchar();
d=getchar();
scanf(«%f %f %c»&a,&b,&d);
switch (d) <
case ‘*’: printf («=%f»,a*b);break;
case ‘/’: printf («=%f»,a/b);break;
case ‘-‘: printf («=%f»,a-b);break;
case ‘+’: printf («=%f»,a+b);break;
default :printf(«ERROR»);
>
В вашей программе, не порядок в запятых. Вы в одном месте поставили лишнюю, а в другом забыли. Из-за этого и повыскакивали эти ошибки. ))
Да и вообще, много лишнего.
Спасибо большое за Ваши уроки
int main(void)
<
float a,b,x;
char i;
printf(«Vvedite 2 chisla i znak deisviya cherez probel: «);
scanf(«%f %f %c»,&a,&b,&i);
switch (i)
<
case ‘*’: x=a*b, printf(«\n%f\n»,x); break;
case ‘+’: x=a+b, printf(«\n%f\n»,x); break;
case ‘-‘: x=a-b, printf(«\n%f\n»,x); break;
case ‘/’: x=a/b, printf(«\n%f\n»,x); break;
default: printf(«\nERROR\n»); break;
>
system(«pause»);
А как можно зациклить программу чтобы после вывода результата снова вернуться к вводу чисел?
Валерий.
Добрый день!
Спасибо, мне приятны хорошие отзывы.
Код вроде бы правильный, не компилировал. Думаю вы и сами это сделали. Замечаний общих нет.
Чтобы зациклить программу можно воспользоваться циклом do while. ) Я
int main(void) <
int a,b;
char c;
printf(«Vvedite dva chisla i znak :\n»);
scanf(«%d %d %c»,&a,&b,&c);
switch (c) <
case ‘+’: printf(«\n=%d\n»,a+b); break;
case ‘-‘: printf(«\n=%d\n»,a-b); break;
case ‘*’: printf(«\n=%d\n»,a*b); break;
case ‘/’: printf(«\n=%d\n»,a/b); break;
default: printf(«\nEROREEEEEEEEEEEE\n»);
>
return (0);
>
немного подсмотрел, но патом разобрался что к чему )
у меня вопрос )
«char c;
printf(«Vvedite komandu: «);
c=getchar();
#include
int main()
<
float a,b;
char x;
printf(«Vvedite trebuemoe deistvie:\nPrimer vvoda: a+b:\n»);
scanf(«%f%c%f»,&a,&x,&b);
switch(x)
<
case ‘+’:printf(«%.4f\n»,a+b);break;
case ‘-‘:printf(«%.4f\n»,a-b);break;
case ‘*’:printf(«%.4f\n»,a*b);break;
case ‘/’:printf(«%.4f\n»,a/b);break;
default:printf(«Error\n»);break;
>
return 0;
>
Как обычно, формат хромает. Вам нужно попробовать порешать задачки с проверяющей системой. Вы бы и одной задачи не решили, с таким подходом. )))
Есть такое. что именно лишнее и чего не хватает?!Буду рад за подсказки)
А где найти такие задачки?!Не знаю как сформировать вопрос в гугл?!
int main(void) <
float a,b;
char c;
printf(«Vvedite dva chisla i znak deistvia:\n «);
scanf(«%f%f%», &a,&b);
c=getchar();
switch (c) <
case ‘*’: printf(«\nX=%f\n», a*b);break;
case ‘/’: printf(«\nX=%f\n», a/b);break;
case ‘+’: printf(«\nX=%f\n», (a+b));break;
case ‘-‘: printf(«\nX=%f\n», (a-b));break;
default: printf(«\nError\n»);break;
>
return (0);
>
Хорошо все, кроме формата вывода.
#include
int main()
<
float a, b;
char c;
if (b==0)
<
printf(«ERROR\n»);
>
else
<
switch (c)
<
case ‘+’ : printf(«%f\n», a+b); break;
case ‘-‘ : printf(«%f\n», a-b); break;
case ‘*’ : printf(«%f\n», a*b); break;
case ‘/’ : printf(«%f\n», a/b); break;
float a,b,d;
char s;
printf(«Vvedite 2 cisla \n»);
scanf(«%f%f»,&a,&b);
printf(«%f %f \n»,a,b);
а вы добавьте в scanf \n ))) Должно помочь.))
#include
int main(void)
<
float a,b;
char c;
printf(«vvedite dva chisla i znak cherez probel\n»);
scanf(«%f %f %c», &a,&b,&c);
switch (c) <
case ‘+’: a+=b; printf(«% f\n», a); break;
case ‘-‘: a-=b; printf(«% f\n», a); break;
case ‘*’: a*=b; printf(«% f\n», a); break;
case ‘/’: a/=b; printf(«% f\n», a); break;
default: printf(«eror\n»); break;
>
return (0);
>
это работает.
объясните пожалуйста, почему это не работает?-
#include
int main(void)
<
float a,b;
char c;
printf(«vvedite chisla \n»);
scanf(«%f %f», &a, &b);
printf(«Vvedite komandu: «);
c=getchar();
switch (c) <
case ‘+’: a+=b; printf(«% f\n», a); break;
case ‘-‘: a-=b; printf(«% f\n», a); break;
case ‘*’: a*=b; printf(«% f\n», a); break;
case ‘/’: a/=b; printf(«% f\n», a); break;
default: printf(«eror\n»); break;
>
return (0);
>
Смотрите, вы скорее всего вводите так
4 Энтер 2 энтер
или так
4 пробел 2 энтер.
И у вас сразу пишется введите команду и error.
Дело вот в чем. Смотрите как выглядит поток stdin для первого примера
4\n2\n
это то, что вы введи с клавиатуры. Смотрим что считывает scanf()
т.е. она считает
4\n2
а в потоке еще останется последнее \n.
далее следует команда printf, на экран выводится надпись
Vvedite komandu:
дальше выполняется getchar().
Она читает очередной символ из потока это наш оставшийся там \n т.е. энтер.
Ну а дальше я думаю уже все понятно. ))) Сможете самостоятельно теперь исправить свой код? ))
Спасибо.С большего доходит. Вот так работает:
#include ((stdio.h))
int main(void)
<
float a,b;
char c;
printf(«vvedite chisla i znak cherez probel ili enter\n»);
scanf(«%f %f «, &a, &b);
c=getchar();
switch (c) <
case ‘+’: a+=b; printf(«% f\n», a); break;
case ‘-‘: a-=b; printf(«% f\n», a); break;
case ‘*’: a*=b; printf(«% f\n», a); break;
case ‘/’: a/=b; printf(«% f\n», a); break;
default: printf(«eror\n»); break;
>
return (0);
>
#include «stdio.h»
#include «iostream»
int main()
<
setlocale(LC_ALL, «Russian»);
int a,b,d;
char c;
printf(«Введите выражение:\n»);
scanf(«%d%c%d»,&a,&c,&b);
switch (c) <
case ‘*’:d=a*b,printf(«%d»,d);break;
case ‘/’:d=a/b,printf(«%d»,d);break;
case ‘+’:d=a+b,printf(«%d»,d);break;
case ‘-‘:d=a-b,printf(«%d»,d);break;
default:printf(«ERROR»);break;
>
printf(«\n»);
system(«pause»);
return 0;
>
Сначала два числа, потом знак действия!
int main(void) <
float a,b;
char c;
printf(«Vvedite primer: «);
scanf(«%f %f %c, &a,&b,&c»);
switch (c)
<
case ‘+’: printf(«\n%f5c%f\n», a+b); break;
case ‘-‘: printf(«\n%f%c%f\n», a-b); break;
case ‘*’: printf(«\n%f%c%f\n», a*b); break;
case ‘/’: printf(«\n%f%c%f\n», a/b); break;
default: printf(«\nERROR\n»); break;
>
return (0);
>
Есть ошибка, при считывании данных.
int main()
<
float a,b,d;
char c;
printf(«vvedite dva zelih chisla i comandu na vipolnenie\n»);
scanf(«%d, %d, %c»,&a,&b,&c);
switch (c)
<
case’+’: d=a+b; printf(«\nsumma ravna %f\n»,d); break;
case’-‘: d=a-b; printf(«\nraznost ravna %f\n»,d); break;
case’*’: d=a*b; printf(«\nproizvedenie ravno %f\n»,d); break;
case’/’: d=a/b; printf(«\nchasnoe ravno %f\n»,d); break;
default: printf(«\nERROR\n»); break;
>
return (0);
Нет, не работает у меня.
int main()
<
float a,b,d;
char c;
printf(«vvedite dva zelih chisla i comandu na vipolnenie\n»);
scanf(«%f %f %c»,&a,&b,&c);
switch (c)
<
case’+’: d=a+b; printf(«\nsumma ravna %f\n»,d); break;
case’-‘: d=a-b; printf(«\nraznost ravna %f\n»,d); break;
case’*’: d=a*b; printf(«\nproizvedenie ravno %f\n»,d); break;
case’/’: d=a/b; printf(«\nchasnoe ravno %f\n»,d); break;
default: printf(«\nERROR\n»); break;
>
return (0);
Только формат не соблюдаете, а так все верно. А можете переписать программу так, чтобы не использовалась переменная d?
Добрый день. Вот так.
int main()
<
float a,b;
char c;
printf(«vvedite dva zelih chisla i comandu na vipolnenie\n»);
scanf(«%f %f %c»,&a,&b,&c);
switch (c)
<
case’+’: printf(«\nsumma ravna %f\n»,a+b); break;
case’-‘: printf(«\nraznost ravna %f\n»,a-b); break;
case’*’: printf(«\nproizvedenie ravno %f\n»,a*b); break;
case’/’: printf(«\nchasnoe ravno %f\n»,a/b); break;
default: printf(«\nERROR\n»); break;
>
return (0);
#include
int main(void)
<
float a, b, c;
char s;
printf («\nVevite 2 chisla b znak 2+2\n»);
scanf(«%f %c &f»,&a,&s,&b);
switch(s)
<
case ‘+’:c=a+b; printf(«=%f\n», c);break;
case ‘-‘:c=a-b; printf(«=%f\n», c);break;
case ‘*’:c=a*b; printf(«=%f\n», c);break;
case ‘/’:c=a/b; printf(«=%f\n», c);break;
default:printf(«\nERROR\n»);break;
>
scanf(«%f %c &f»,&a,&s,&b); вот тут. Посмотрите внимательно на формат-строку.)
int main(void) <
float a,b,d;
char c;
printf(«Vvedite dva chisla i znak: «);
scanf(«%f %f %c», &a, &b, &c);
switch (c) <
case ‘*’:
d=a*b;
printf(«\nRezyltat %f\n», d); break;
case ‘/’:
if(b>0)
<
d=a/b;
printf(«\nRezyltat %f\n», d); break;
>
else
printf(«\n ERROR \n»); break;
case ‘+’:
d=a+b;
printf(«\nRezyltat %f\n», d); break;
case ‘-‘:
d=a-b;
printf(«\nRezyltat %f\n», d); break;
default: printf(«\n ERROR \n»); break;
>
return (0);
>
Делить нельзя только на нуль, а а отрицательные числа делить можно. А в вашей программе нельзя)
Программу писал не заглядывая в комментарии, но после их просмотра я нигде не увидел проверки в кодах программ на недопустимость арифметических операций. У меня такая проверка есть))
#include
#include
int main(void)
<
float a,b;
char c;
printf(«Vvedite dannye i znak deistviya\n»);
scanf(«%f %f %c»,&a,&b,&c);
Неправильно. =)) Хорошо, что вы подумали о делении на ноль. Но что будет, если я введу не знак действия, а что-то другое совсем?
И чем вам не нравится умножение на нуль?
Исправил как вы сказали) так правильно?)
#include
int main(void)
<
float a,b;
char c;
printf(«Vvedite dannye i znak deistviya\n»);
scanf(«%f %f %c»,&a,&b,&c);
switch (c)
<
case ‘+’:printf(«Summa = %f\n»,a+b); break;
case ‘-‘:printf(«Raznost = %f\n»,a-b); break;
case ‘*’:printf(«Proizvedenie = %f\n»,a*b); break;
case ‘/’: if ((a!=0)&&(b!=0))
default: printf(«ERROR\n\a»);
>
return(0);
>
при делении достаточно проверить, чтобы знаменатель не равнялся нулю. Проверка числителя излишняя осторожность. А так все хорошо. )
#include
int main(void)
<
float a,b;
char c;
scanf(«%f,%f,%c»,&a,&b,&c);
switch (c)
<
case ‘+’: printf(«%f\n»,a+b);break;
case ‘-‘: printf(«%f\n»,a-b);break;
case ‘*’: printf(«%f\n»,a*b);break;
case ‘/’: printf(«%f\n»,a/b);break;
default: printf(«\nERROR\n»);break;
>
return(0);
>
Проверьте пожалуйста и скажите где я ошибся) заранее благодарен)
#include
int main(void)
<
float a, b;
char c;
printf(«Vvedite chisla i deistvie, primer 27 901.14 +\n»);
scanf(«%f %f %c», &a, &b, &c);
if (a/b&&b==0)
printf(«ERROR\n»);
else <
switch (c) <
case ‘+’: printf(«=\n%0.3f\n», a+b); break;
case ‘/’: printf(«=\n%0.3f\n», a/b); break;
case ‘-‘: printf(«=\n%0.3f\n», a-b); break;
case ‘*’: printf(«=\n%0.3f\n», a*b); break;
default: printf(«\nERROR\n»); break;
>
>
return (0);
>
int main ()<
double a, b;
char c;
printf («Это простой калькулятор\nДействие:»);
scanf («%c»,&c);
printf («a:»);
scanf(«%lf»,&a);
printf («b:»);
scanf («%lf»,&b);
switch (c)<
case ‘+’:printf(«%.1lf+%.1lf=%.0lf\nОтвет округлён до целых\n»,a, b, a+b);break;
case ‘-‘:printf(«%.1lf-%.1lf=%.0lf\nОтвет округлён до целых\n»,a, b, a-b);break;
case ‘/’:printf(«%.1lf/%.1lf=%.0lf\nОтвет округлён до целых\n»,a, b, a/b);break;
case ‘*’:printf(«%.1lf*%.1lf=%.0lf\nОтвет округлён до целых\n»,a, b, a*b);break;
default :printf(«ERROR\n»);break;>
return 0;>
#include
#include
int main(void)
<
int a, b, c;
char s;
printf(«Vvedite dva chisla i znak: «);
scanf(«%i %i %c», &a, &b, &s);
switch (s)<
case ‘+’: printf(«\n%i+%i=%i\n», a,b,c); break;
case ‘-‘: printf(«\n%i-%i=%i\n», a,b,c); break;
case ‘*’: printf(«\n%i*%i=%i\n», a,b,c); break;
case ‘/’: if (b!=0) <
printf(«\n%i/%i=%i\n», a,b,c);>
else
default: printf(«\nNichego ne viidet, glupaya\n»); break;
>
getch();
return 0;
>
Вот, что вышло. И вопрос: что делать с точностью? Например, чтобы считало десятичные дроби без округления, но и при подсчете обычных целочисленных не выдавало кучу ненужных нулей. Помогите девушке, пожалуйста (:
#include
int main (void)
<
float a,b;
char d;
printf(«Vvedite dva chisla i znak\n»);
scanf_s(«%f %f %c»,&a,&b,&d);
switch(d)
<
case’+’:printf(«=%f\n», a+b);break;
case’-‘:printf(«=%f\n», a-b);break;
case’*’:printf(«=%f\n», a*b);break;
case’/’:
<
if (b!=0)
printf(«=%f\n», a/b);
else
printf(«ERROR\n»);
break;
>
default: printf(«ERROR\n»);
>
return(0);
>
не пойму почему всегда ERROR выводит(((
Странно, написано всё верно. И у меня работает правильно. Я только что проверил. А вы в чем пишете?
microsoft vicual c++ 2008 express edition
пробовал загонять код Камиля, первый раз нормально прогнал, потом тоже начал ERror выдавать, скорей всего дело в компиляторе, либо не правильно проект создаю(((
Получилось решить проблему?
Странно, но какой бы из готовых вариантов я не пробовала ничего не выдает. ввожу в консоли «число знак число» нажимаю энтер, но ничего не происходит(((
Поздравляю, хоть и с опозданием. )))
#include
#include
int main (void)
<
float a, b;
char c;
printf(«Vvedite dva chisla u znak deystviya: «);
scanf(«%f %f %c», &a, &b, &c);
switch (c)
<
case ‘+’: printf(«\nOtvet %.2f\n», a+b); break;
case ‘-‘: printf(«\nOtvet %.2f\n», a-b); break;
case ‘*’: printf(«\nOtvet %.2f\n», a*b); break;
case ‘/’: printf(«\nOtvet %.2f\n», a/b); break;
default: printf(«\nERROR\n»); break;
>
return(0);
>
Добрый вечер, Александр.
Скажите, а зачем у вас два include? Один stdio.h, а какой второй?
Это с прошлых уроков остался math.h.
Доброго времени суток. Вот собственно и домашнее задание:
# include ;
int main (void) <
float a, b;
char c;
printf («Vvedite chislo A\nVvedite deystvie C\nVvedite chislo B\n»);
scanf («%f %c %f», &a, &c, &b);
switch (c) <
case ‘*’: a=a*b; printf («\n A= %f \n», a); break;
case ‘/’: a=a/b; printf («\n A= %f \n», a); break;
case ‘+’: a=a+b; printf («\n A= %f \n», a); break;
case ‘-‘: a=a-b; printf («\n A= %f \n», a); break;
default : printf («\n Error\n»); break;
>
return (0); >
В начале пытался сделать задачу при помощи функции getchar. Знаете еще по прошлым урокам заметил, что частенько пытаюсь применить ее там где она вовсе не нужна. В общем то в ходе размышлений и назрел у меня к вам уважаемый KaDeat вопрос, а можно ли при помощи getchar считать из потока данных дробь? И если можно, хотелось бы увидеть пример, так как пробовал и ничегошеньки у меня вышло.
С помощью getchar можно считать только один символ, и ничего более. Она используется не так часто, но иногда бывает удобна. В основном для ввода данных используют scanf.