Это не печать того, что я хочу

Я хочу, чтобы мой код печатал «ваша машина припаркована в секции А», когда я ввожу любое число от 0 до 9. Он принимает ввод, но программа завершается, не переходя в условие if (я думаю)

{  
    int value=0;
    cout<<"Enter car serial number"<<endl;
    cin>>value;
    if (value >= 48 && value <= 57)
    {
        cout<<"your car is parked in section Z"<<endl;
    }
}

«от 0 до 9» против if (value >= 48 && value <= 57)… неужели вы не видите разницы?

463035818_is_not_a_number 09.04.2019 14:23

Если входная переменная представляет собой int, нет необходимости сравнивать значения ASCII.

P.W 09.04.2019 14:26

48 и 57 — это коды ascii для 0 и 9 соответственно. Тем не менее, это сравнение будет работать только если, ваша система использует кодировку ascii (не гарантируется), и вы сравнивали с char. Но даже тогда это сбивает с толку. if (value >= '0' && value <= '9') будет много более четким (опять же, если для сравнения с char). Сохранив его в переменной int, вы можете напрямую проверить 0 и 9.

Borgleader 09.04.2019 14:26

При сравнении персонажи предпочтительнее использовать символьные константы. Например: if (value < '0' && value <= '9'). Это упрощает чтение и отладку вашего кода, а также делает его более переносимым (на некоторых платформах могут использоваться кодировки, отличные от ASCII).

Thomas Matthews 09.04.2019 16:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вы путаете получение int и получение символа

имея

int value
...
cin >> value;

вы читаете инт, поэтому ввод 2 устанавливает стоимость со значением 2, а не с кодом (ascii) символа «2», конечно, если ввод 123, стоимость я устанавливаю со 123 и т. д.

так что конечно

 if (value >= 48 && value <= 57)

неверно, за исключением того, что вы вводите значение между 48 и 57

Делает

 char c;

 cin >> c;

в этот раз, если вы введете 2, с будет установлен с «2», поэтому 50 в ascii


I want my code to print "your car is parked in section A" when I enter any number from 0 to 9.

Я полагаю, что 0 указывает на A, 1 указывает на B и т. д., а не всегда на A

вы можете сделать, например:

{  
    int value=0;
    cout<<"Enter car serial number"<<endl;
    cin>>value;
    if (value >= 0 && value <= 9)
    {
        cout<<"your car is parked in section " << *("ABCDEFGHIJ" + value) << endl; // makes no assumption concerning the alpha codes
    }
}

но лучше проверить, что ввод является допустимым целым числом:

{  
    int value=0;
    cout<<"Enter car serial number"<<endl;
    if (!(cin>>value))
    {
       cerr << "invalid input" << endl;

       cin.clear(); // raz error

       string s;

       if (! (cin >> s)) // fluxh input
         ..EOF do what you want...
    }
    else if (value >= 0 && value <= 9)
    {
        cout<<"your car is parked in section " << *("ABCDEFGHIJ" + value) << endl; // makes no assumption concerning the alpha codes
    }
    else
        cerr << "invalid serial number" << endl
}

Из вашего замечания:

I want my code to print "your car is in section "this" where "this" can be A,B or C depending on the serial number of the car. if it's 1-10, then it should be in section A. if it's in 11-20 then in section B.

{  
    int value=0;
    cout<<"Enter car serial number"<<endl;
    if (!(cin>>value))
    {
       cerr << "invalid input" << endl;

       cin.clear(); // raz error

       string s;

       if (! (cin >> s)) // fluxh input
         ..EOF do what you want...
    }
    else if (value >= 1 && value <= 260)
    {
        cout<<"your car is parked in section " << *("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + (value-1)/10) << endl; // makes no assumption concerning the alpha codes
    }
    else
        cerr << "invalid serial number" << endl
}

Пример :

#include <iostream>

using namespace std;

int main()
{  
  for (;;) {
    int value=0;
    cout<<"Enter car serial number"<<endl;
    if (!(cin>>value))
    {
       cerr << "invalid input" << endl;

       cin.clear(); // raz error

       string s;

       if (! (cin >> s)) // fluxh input
         return -1; // ..EOF do what you want...
    }
    else if (value >= 1 && value <= 260)
    {
        cout<<"your car is parked in section " << *("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + (value-1)/10) << endl; // makes no assumption concerning the alpha codes
        return 0;
    }
    else
        cerr << "invalid serial number" << endl;
  }
}

Компиляция и исполнение:

pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra s.c
pi@raspberrypi:/tmp $ ./a.out
Enter car serial number
-12
invalid serial number
Enter car serial number
0
invalid serial number
Enter car serial number
a
invalid input
Enter car serial number
1
your car is parked in section A
Enter car serial number
10
your car is parked in section A
pi@raspberrypi:/tmp $ ./a.out
Enter car serial number
11
your car is parked in section B
pi@raspberrypi:/tmp $ ./a.out
Enter car serial number
54
your car is parked in section F
pi@raspberrypi:/tmp $ ./a.out
Enter car serial number
250
your car is parked in section Y
pi@raspberrypi:/tmp $ ./a.out
Enter car serial number
251
your car is parked in section Z
pi@raspberrypi:/tmp $ ./a.out
Enter car serial number
260
your car is parked in section Z

... и переносимое преобразование c - '0' для получения цифры довольно идиоматично С++.

Bathsheba 09.04.2019 14:30
'A' + value не является переносимым и, к сожалению, портит этот хороший ответ.
Bathsheba 09.04.2019 14:42

@ Вирсавия, пожалуйста, объясните, почему c - '0' переносим, ​​а '0' + c нет ;-) возможно, вы неправильно прочитали ;-)

bruno 09.04.2019 14:45

@bruno, в любой кодировке, поддерживаемой C++ (и C, если уж на то пошло), символы 0, 1, ..., 9 должны быть смежными и в таком порядке. Чего нельзя сказать об альфа-символах.

Bathsheba 09.04.2019 14:46
'0' + c является переносимым, пока c находится в диапазоне [0, 9]. Это 'A' + value, которого нет.
Bathsheba 09.04.2019 14:47

@Bathsheba из факта за 35 лет у меня никогда был компилятор / библиотека ac/c++, где 'B' - 'A' не равно 1 и т. д., пожалуйста, не могли бы вы дать мне ссылку на норму C/C++, в которой говорится, что 0..9 являются смежные, но не A..Z и т.д.?

bruno 09.04.2019 14:49

@bruno: В качестве контрпримера посмотрите на кодировку EBCDIC.

Bathsheba 09.04.2019 14:50

@ Вирсавия, ты не отвечаешь на мой вопрос ^^

bruno 09.04.2019 14:50

Потому что это в разделе комментариев, а у меня дневная работа. По крайней мере, один инвестиционный / корпоративный банк в Лондоне имеет C, скомпилированный на машинах с кодировкой EBCDIC.

Bathsheba 09.04.2019 14:51

@bruno У меня есть еще один вопрос. Скажем, я хочу использовать числа больше 9, скажем, от 10 до 20. Тогда я не могу использовать логику ascii, верно? так что мы там делаем? использовать числа, такие как «если переменная <= '10' && переменная >= '20'», сделать это и т. д. и т. д. как это?

scypx 09.04.2019 14:52

@scypx '10' недействителен. Обратите внимание, что в своем вопросе вы вводите число, а не символ. Если вы хотите больше 9, но достаточно, чтобы указать от A до Z, тест просто нужно изменить на if (value >= 0 && value <= 'Z' - 'A')

bruno 09.04.2019 14:53

@scypx, почему вы хотите прочитать целое число, а не букву между A и Z?

bruno 09.04.2019 14:58

на самом деле я хочу, чтобы мой код печатал «ваша машина находится в разделе «это», где «это» может быть A, B или C в зависимости от серийного номера автомобиля. если это 1-10, то он должен быть в разделе A. если это в 11-20, то в разделе B. Я пытаюсь использовать логику if else, но не работает. Он печатает раздел A, даже если я ввожу числа больше 10

scypx 09.04.2019 15:03

@scypx ах, хорошо, это не часть вопроса ;-) и вы спрашиваете, говорите о Z, так что предел C или Z?

bruno 09.04.2019 15:08

@scypx Я отредактировал, чтобы разрешить от A до Z, просто измените «Z» на нужную букву, если это не Z

bruno 09.04.2019 15:12

@bruno Z — это просто тег раздела, как на автомобильных парковках. больше ничего :-)

scypx 09.04.2019 15:13

@scypx Я не уверен, что понимаю, но мое предыдущее замечание работает, поэтому, если только A и B меняют «Z» на «B» в коде в конце моего ответа

bruno 09.04.2019 15:15

@scypx Я добавил полную программу с компиляцией/выполнением

bruno 09.04.2019 15:20

@Bathsheba Я отредактировал, чтобы удалить гипотезу о коде символа и факте, что A..Z идут подряд ;-)

bruno 09.04.2019 15:29

@scypx Я снова отредактировал, я пропустил удаление 1 до значения, прежде чем делить на 10, извините

bruno 09.04.2019 15:40

Другие вопросы по теме