Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2011, 22:40   #1
Fleiks
 
Аватар для Fleiks
 
Регистрация: 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 ?
Fleiks вне форума Ответить с цитированием
Старый 13.10.2011, 10:13   #2
Calv
Пользователь
 
Регистрация: 22.07.2011
Сообщений: 16
По умолчанию

%s строка или другими словами массив символов, %с один символ, вот в чем разница
если ты с потока хочешь считать всю сторку сразу то:
Код:
scanf("%s",&ch);
если читаешь посимвольно то так:
Код:
for(...)
    {
     scanf("%c",&ch[i]);
    }
как-то вроде так
Calv вне форума Ответить с цитированием
Старый 13.10.2011, 14:54   #3
Fleiks
 
Аватар для Fleiks
 
Регистрация: 12.10.2011
Сообщений: 6
По умолчанию

Значение %s и %с я понимаю. Думаю здесь другая ошибка была.
Во первых если хочу в переменную типа char вогнать строку, то надо было размер указать:
char ch[40];
Но сделав так, я бы ошибки не избежал т.к. switch со строками не работает, а только с символами. Поэтому здесь %c и только. А если хрень гоню поправьте)

P.S.
За ответ большое спасибо
Fleiks вне форума Ответить с цитированием
Старый 13.10.2011, 15:30   #4
SteAlzzer
Пользователь
 
Аватар для SteAlzzer
 
Регистрация: 11.10.2011
Сообщений: 60
По умолчанию

у тебя при scanf("%s",&ch) будет требоваться [размер слова + 1] размер переменной ch, т.к. каждая строка заканчивается нулем.
А что бы заюзать switch, то можно просто указать, например, ch[0]. Вроде должно сработать, но я не проверял.

И кстати, есть же какая-то сишная функция, которая позволяет ввести всего один символ?
SteAlzzer вне форума Ответить с цитированием
Старый 13.10.2011, 16:45   #5
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
И кстати, есть же какая-то сишная функция, которая позволяет ввести всего один символ?

getchar();
кажется
psycho-coder вне форума Ответить с цитированием
Старый 13.10.2011, 18:53   #6
Fleiks
 
Аватар для Fleiks
 
Регистрация: 12.10.2011
Сообщений: 6
По умолчанию

Цитата:
у тебя при scanf("%s",&ch) будет требоваться [размер слова + 1] размер переменной ch, т.к. каждая строка заканчивается нулем.
А что бы заюзать switch, то можно просто указать, например, ch[0]. Вроде должно сработать, но я не проверял.
проверил работает)
Fleiks вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сумасшедший 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