Я хочу, чтобы мой код печатал «ваша машина припаркована в секции А», когда я ввожу любое число от 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;
}
}
Если входная переменная представляет собой int
, нет необходимости сравнивать значения ASCII.
48 и 57 — это коды ascii для 0 и 9 соответственно. Тем не менее, это сравнение будет работать только если, ваша система использует кодировку ascii (не гарантируется), и вы сравнивали с char. Но даже тогда это сбивает с толку. if (value >= '0' && value <= '9') будет много более четким (опять же, если для сравнения с char). Сохранив его в переменной int, вы можете напрямую проверить 0 и 9.
При сравнении персонажи предпочтительнее использовать символьные константы. Например: if (value < '0' && value <= '9')
. Это упрощает чтение и отладку вашего кода, а также делает его более переносимым (на некоторых платформах могут использоваться кодировки, отличные от ASCII).
вы путаете получение 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'
для получения цифры довольно идиоматично С++.
'A' + value
не является переносимым и, к сожалению, портит этот хороший ответ.
@ Вирсавия, пожалуйста, объясните, почему c - '0'
переносим, а '0' + c
нет ;-) возможно, вы неправильно прочитали ;-)
@bruno, в любой кодировке, поддерживаемой C++ (и C, если уж на то пошло), символы 0, 1, ..., 9 должны быть смежными и в таком порядке. Чего нельзя сказать об альфа-символах.
'0' + c
является переносимым, пока c
находится в диапазоне [0, 9]. Это 'A' + value
, которого нет.
@Bathsheba из факта за 35 лет у меня никогда был компилятор / библиотека ac/c++, где 'B' - 'A' не равно 1 и т. д., пожалуйста, не могли бы вы дать мне ссылку на норму C/C++, в которой говорится, что 0..9 являются смежные, но не A..Z и т.д.?
@bruno: В качестве контрпримера посмотрите на кодировку EBCDIC.
@ Вирсавия, ты не отвечаешь на мой вопрос ^^
Потому что это в разделе комментариев, а у меня дневная работа. По крайней мере, один инвестиционный / корпоративный банк в Лондоне имеет C, скомпилированный на машинах с кодировкой EBCDIC.
@bruno У меня есть еще один вопрос. Скажем, я хочу использовать числа больше 9, скажем, от 10 до 20. Тогда я не могу использовать логику ascii, верно? так что мы там делаем? использовать числа, такие как «если переменная <= '10' && переменная >= '20'», сделать это и т. д. и т. д. как это?
@scypx '10' недействителен. Обратите внимание, что в своем вопросе вы вводите число, а не символ. Если вы хотите больше 9, но достаточно, чтобы указать от A до Z, тест просто нужно изменить на if (value >= 0 && value <= 'Z' - 'A')
@scypx, почему вы хотите прочитать целое число, а не букву между A и Z?
на самом деле я хочу, чтобы мой код печатал «ваша машина находится в разделе «это», где «это» может быть A, B или C в зависимости от серийного номера автомобиля. если это 1-10, то он должен быть в разделе A. если это в 11-20, то в разделе B. Я пытаюсь использовать логику if else, но не работает. Он печатает раздел A, даже если я ввожу числа больше 10
@scypx ах, хорошо, это не часть вопроса ;-) и вы спрашиваете, говорите о Z, так что предел C или Z?
@scypx Я отредактировал, чтобы разрешить от A до Z, просто измените «Z» на нужную букву, если это не Z
@bruno Z — это просто тег раздела, как на автомобильных парковках. больше ничего :-)
@scypx Я не уверен, что понимаю, но мое предыдущее замечание работает, поэтому, если только A и B меняют «Z» на «B» в коде в конце моего ответа
@scypx Я добавил полную программу с компиляцией/выполнением
@Bathsheba Я отредактировал, чтобы удалить гипотезу о коде символа и факте, что A..Z идут подряд ;-)
@scypx Я снова отредактировал, я пропустил удаление 1 до значения, прежде чем делить на 10, извините
«от 0 до 9» против
if (value >= 48 && value <= 57)
… неужели вы не видите разницы?