|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.10.2011, 22:40 | #1 |
Регистрация: 12.10.2011
Сообщений: 6
|
Объясните в чем заключается ошибка? код на си
Задача: написать программу, которая выводит на экран меню, которая предлагает вывести арифметическую операцию сложения, вычитания, умножения, деления. Получив выбор, программа предлагает ввести два числа, а затем выполняет. Программа должна принимать только предложенный выбор из меню. Она должна предоставлять пользователю повторный ввод, если ему не удалось ввести число.
Код программы: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> float vvod(void); int main(void) { bool good=true; char ch; float chislo1, chislo2; while(good) { printf("Viberite jelaemyu operaciu:\n"); printf("s: Slojenie v: Vichetanie\n"); printf("y: ymnojenie d: delenie\n"); printf("q: vixod\n"); scanf("%s",&ch); switch (ch) { case 's'rintf("Vvedite pervoe chislo\n"); chislo1=vvod(); printf("Vvedite vtoroe chislo\n"); chislo2=vvod(); printf("%f + %f = %f\n",chislo1,chislo2,chislo1+chisl o2); break; case 'y'rintf("Vvedite pervoe chislo\n"); chislo1=vvod(); printf("Vvedite vtoroe chislo\n"); chislo2=vvod(); printf("%f * %f = %f\n",chislo1,chislo2,chislo1*chisl o2); break; case 'v'rintf("Vvedite pervoe chislo\n"); chislo1=vvod(); printf("Vvedite vtoroe chislo\n"); chislo2=vvod(); printf("%f - %f = %f\n",chislo1,chislo2,chislo1-chislo2); break; case 'd'rintf("Vvedite pervoe chislo\n"); chislo1=vvod(); printf("Vvedite vtoroe chislo\n"); while((chislo2=vvod())==0) { printf("Na nol' delitb nel'z9!!! Vvedite ewe raz\n"); continue; } printf("%f / %f = %f\n",chislo1,chislo2,chislo1/chislo2); break; case 'q': good=false; break; default: printf("Vveden nevernii pynkt menu. Poprobyite ewe raz\n"); while(getchar()!='\n') continue; continue; } } printf("Vsego xorowego\n"); system("PAUSE"); return 0; } float vvod(void) { float chislo; while(scanf("%f", &chislo)==0) { printf("Vvedeno ne chislo, Poprobyite ewe raz\n"); while(getchar()!='\n') continue; continue; } while(getchar()!='\n') continue; return chislo; } она работает стабильно если исправить спецификатор scanf("%s",&ch) на scanf("%с",&ch); Вопрос: Объясните почему не работает с спецификатором %s ? |
13.10.2011, 10:13 | #2 |
Пользователь
Регистрация: 22.07.2011
Сообщений: 16
|
%s строка или другими словами массив символов, %с один символ, вот в чем разница
если ты с потока хочешь считать всю сторку сразу то: Код:
Код:
|
13.10.2011, 14:54 | #3 |
Регистрация: 12.10.2011
Сообщений: 6
|
Значение %s и %с я понимаю. Думаю здесь другая ошибка была.
Во первых если хочу в переменную типа char вогнать строку, то надо было размер указать: char ch[40]; Но сделав так, я бы ошибки не избежал т.к. switch со строками не работает, а только с символами. Поэтому здесь %c и только. А если хрень гоню поправьте) P.S. За ответ большое спасибо |
13.10.2011, 15:30 | #4 |
Пользователь
Регистрация: 11.10.2011
Сообщений: 60
|
у тебя при scanf("%s",&ch) будет требоваться [размер слова + 1] размер переменной ch, т.к. каждая строка заканчивается нулем.
А что бы заюзать switch, то можно просто указать, например, ch[0]. Вроде должно сработать, но я не проверял. И кстати, есть же какая-то сишная функция, которая позволяет ввести всего один символ? |
13.10.2011, 16:45 | #5 | |
Участник клуба
Регистрация: 06.04.2009
Сообщений: 1,524
|
Цитата:
getchar(); кажется |
|
13.10.2011, 18:53 | #6 | |
Регистрация: 12.10.2011
Сообщений: 6
|
Цитата:
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сумасшедший Label, или объясните чайнику, в чем фокус | ProESM | Общие вопросы Delphi | 6 | 11.05.2011 19:09 |
объясните в чем ошибка | transformice | Microsoft Office Excel | 6 | 01.11.2010 18:34 |
Объясните код | Neymexa | SQL, базы данных | 1 | 23.03.2010 17:55 |
Объясните код | Neymexa | Общие вопросы по Java, Java SE, Kotlin | 1 | 29.11.2008 02:33 |
объясните код | Rend1 | Общие вопросы Delphi | 18 | 01.02.2008 14:52 |