Используя код C ++ в VIsual C ++, никаких ошибок, но некоторая часть кода просто игнорируется - PullRequest
0 голосов
/ 22 октября 2010

Я абсолютный новичок в программировании и просто делаю упражнения для начала.

Прежде всего, я использую Visual C ++ 2010 для компиляции C-кода.Я просто создаю новый проект и выбираю пустое консольное приложение.После этого я создаю файл ресурсов с именем test.c и изменяю в свойствах файла тип элемента на C / C ++ Compiler и компилирую как код C ++, чтобы я мог использовать #include <iostream> для команды std::cin.get().Теперь код:

#include <stdio.h>
#include <iostream>

int main() 
{
   int number1, number2;
   int sum;

   puts("Enter number 1 please:");
      scanf_s("%d",&number1);
   puts("Enter number 2 please:");
      scanf_s("%d",&number2);

   std::cin.get();
   std::cin.get();  //(1)

   sum = number1 + number2;
      printf("The average is %f\n", sum/2);

return 0; 
}

Теперь моя проблема в том, что команда "std :: cin.get ()" просто игнорируется.После ввода двух чисел программа просто останавливается, и окно консоли закрывается.

Есть идеи, где проблема?

У меня есть еще один вопрос, пожалуйста.

Поскольку моя проблема с удержанием консоли открытой решена (1), теперь мой printf () выдает мне только нули в качестве вывода.Я хочу иметь число с плавающей точкой в ​​качестве вывода, но независимо от того, что я печатаю как числа 1 и 2, я всегда получаю «0,000000».

Так как я все еще работаю над моей маленькой программой, чтобы проверить вводпрежде чем он будет принят, у меня есть другой вопрос, пожалуйста.

Я хочу использовать следующий код только для проверки ввода.

#include <stdio.h>
#include <iostream>
#include <ctype.h>

int main() 
{
   int number1, number2;
   int sum;

   puts("Enter number 1 please:");
      scanf_s("%d",&number1);

   if (isdigit(number1)) 
   {
   puts("Enter number 2 please:");
      scanf_s("%d",&number2);
   }
   else 
   {
   puts("Your input is not correct. Enter a number please.");
   }

   std::cin.get();
   std::cin.get();

   /*



   sum = number1 + number2;
      printf("The average is %f\n", sum/2);  */

return 0; 
}

Ну, это не работает.Я набираю цифру, и мой ответ "Ваш ввод не ...".Я воспользовался поиском и обнаружил следующее: Проверьте, вводит ли пользователь букву или цифру в C .К сожалению, предложения не помогают мне.

Ответы [ 4 ]

11 голосов
/ 22 октября 2010

Это не игнорируется. Когда вы набираете второй номер, а затем нажимаете ввод, он помещает ваш номер плюс символ новой строки в поток ввода. scanf удаляет номер, но оставляет символ новой строки один. Когда вы вызываете cin.get (), так как в потоке есть символ, он не ждет вашего ввода.

0 голосов
/ 22 октября 2010

Чтобы ответить на ваш измененный вопрос: вы используете формат %f printf() с int, и это не работает. Если вы хотите распечатать с плавающей точкой, вам нужно передать double. Вы можете распечатать (double)sum / 2 или даже sum / 2.0, оба из которых дают double с. (Нет, float не работает так же для функции с переменными числами, как printf().) На самом деле вы передаете то, что, вероятно, является четырехбайтовым типом, и говорите printf(), что трактуете его как восьмерку. -байтового типа другого формата, поэтому неудивительно, что вы не получите ожидаемых результатов.

В качестве альтернативы, вы можете переключиться на C ++ iostreams, что избавит вас от проблем с соответствием типов и знанием промо-акций по умолчанию. Вы все равно получили бы целое число от sum/2, и это уменьшило бы любую половину, но это был бы правильный результат.

0 голосов
/ 22 октября 2010

В ответ на ваш измененный вопрос это потому, что вы используете целые числа для деления. Измените int sum на float sum и все должно быть в порядке.

0 голосов
/ 22 октября 2010

PigBen уже дал вам хорошее объяснение того, где вы ошиблись. Однако у меня есть несколько замечаний по поводу вашей программы, которые не вписываются в комментарий:


Вы смешиваете ввод C и C ++.Зачем?Что не так с std::cin >> number1?
Когда вы изменяете number1 на удвоение, вы должны запомнить и изменить строку форматирования в scanf(), в то время как с IOВ потоковом режиме компилятор все выяснит за вас.С потоками и строками C ++, контейнерами и другими структурами данных гораздо сложнее делать что-то, что компилируется, но вызывает страшное неопределенное поведение во время выполнения.


Также обратите внимание, что вы не проверяете, успешно ли выполнялись ваши операции ввода .Что произойдет, если я вызову вашу программу и вместо того, чтобы передавать ей цифры, я буду вводить не цифры? Никогда не используйте ввод от пользователей, файлов или других внешних источников, не проверенных.
В случае потоков ввода-вывода оператор ввода >> возвращает (ссылку на) поток, и вы можете использовать потоки, как если бы онибыли логическими значениями, поэтому вы можете проверить

if(std::cin >> number1)
  // input succeeded

или

if( !(std::cin >> number2) )  // note the negation operator !
  // input error

.

Потоки внутренне переходят в плохое состояние после ошибок ввода / вывода.Любые дальнейшие операции ввода-вывода завершатся с ошибкой в ​​потоке.Поэтому, если вы хотите, вы можете отложить проверку ввода до тех пор, пока не будут выполнены все операции ввода:

std::cout << "Enter number 1 please:";
std::cin >> number1;
std::cout << "Enter number 2 please:";
std::cin >> number2;

if(!std::cin) 
  // input error

Однако, не забывайте всегда проверять ввод перед первым его использованием .

Обратите внимание, что я не проверял вывод на наличие ошибок.Это потому, что трудно представить, что что-то идет не так с выводом на консоль.(И что бы вы сделали с этим? Распечатать сообщение об ошибке?) Однако, если вы записываете в файл, не забудьте проверить вывод , тоже.Для файловой операции легко пойти не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...