Проблемы с заявлением If на TI-84 Plus C Silver Edition

У меня есть небольшой код в TI BASIC на моем калькуляторе TI-84 Plus C Silver Edition, который определяет правильную дозировку лекарств в зависимости от веса пациента. Например, если аспирин назначается в дозе 5 мг на кг веса пациента (это не так), то код должен указывать мне дать пациенту весом 100 кг 500 мг аспирина. Тем не менее, код решает все возможные наркотики. Вот:

PROGRAM:DRUG1
:Input "PATIENT WEIGHT: ",W
:Input "AGENT NAME: ",A
:If A=IPPI
:Disp "DOSAGE",W*2
:If A=NEVO
:Disp "DOSAGE", W*0.5

Итак, в данном случае это два препарата IPPI и NEVO. Если я дам пациенту вес 100 кг и выберу IPPI, то я ожидаю увидеть

DOSAGE                 200

Однако то, что я вижу,

DOSAGE              200
DOSAGE               50

поэтому, по-видимому, выполняются оба оператора «если», хотя я указал только одно значение (IPPI). [Та же ошибка возникает, когда я устанавливаю A как NEVO].

Я также попытался включить оба оператора If в Then...End, поэтому код будет выглядеть так:

PROGRAM:DRUG1
:Input "PATIENT WEIGHT: ",W
:Input "AGENT NAME: ",A
:If A=IPPI
:Then
:Disp "DOSAGE",W*2
:End
:If A=NEVO
:Then
:Disp "DOSAGE", W*0.5
:End

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


person Fred Barclay    schedule 11.05.2015    source источник


Ответы (3)


Вам нужно изменить вторую команду ввода, чтобы информация сохранялась в виде строки вместо числовой переменной A. Для этой цели калькуляторы серии TI-84 имеют десять строковых переменных в меню [VARS][7].

Также обратите внимание, что вы должны сравнивать строку со строкой «IPPI», а не с последовательностью букв (числовых переменных) IPPI. Таким образом, ваш код может быть:

:Input "PATIENT WEIGHT: ",W
:Input "AGENT NAME: ",Str1
:If Str1="IPPI"
:Disp "DOSAGE: ",W*2
:If Str1="NEVO"
:Disp "DOSAGE: ",W*0.5

или более кратко:

:Input "PATIENT WEIGHT: ",W
:Input "AGENT NAME: ",Str1
:Disp "DOSAGE:"
:If Str1="IPPI"
:Disp 2W
:If Str1="NEVO"
:Disp .5W
person lirtosiast    schedule 12.05.2015
comment
Благодарю вас! Я также добавил строку в начале DelVar Str0 (я использовал Str0 вместо Str1), чтобы предыдущее значение Str0 не переносилось — на всякий случай. - person Fred Barclay; 13.05.2015
comment
В DelVar нет необходимости, потому что можно только пропустить команду ввода с помощью кнопки ON, которая завершает программу. - person lirtosiast; 13.05.2015

Вы пытаетесь использовать имена переменных в виде строк.

:If A=IPPI

Это не сравнение строки с «IPPI», это сравнение числовой переменной A с числовым значением I*P*P*I, которое, как я предполагаю, дает 0 в вашем случае.

Точно так же, когда вы вводите ввод, если вы вводите IPPI, он будет умножать эти переменные и присваивать A этому продукту.

Вам нужно будет использовать строковую переменную и кавычки.

person MattPutnam    schedule 11.05.2015
comment
Спасибо, похоже, это моя проблема. :) Я искал, используя строковую переменную, и все, что я могу найти, это что-то в Equ->String, которое я не могу понять, поэтому, если вы могли бы привести мне пример, я был бы очень признателен. ! Мне просто нужно один раз увидеть, что мне нужно сделать. - person Fred Barclay; 12.05.2015
comment
@FredBarclay, если вы используете STR1 вместо A, вам не нужно ставить кавычки - person Moshe Goldberg; 10.07.2015

Основная проблема с вашей программой заключается в том, что вы знаете, что присваиваете строку переменной, которая поддерживает только числа. Таким образом, новое значение переменной остается логическим значением строки True, которое в случае TI-BASIC является значением 1. Чтобы исправить это, вам нужно присвоить его переменной, которая поддерживает символы в строке, в В этом случае вы можете использовать STR1.

person Private Caller    schedule 05.07.2015
comment
Это не правильно. Строки не преобразуются в логические значения. Если вы введете IPPI в приглашении Input A, числовая переменная A будет содержать IPP*I, как указано в ответе MattPutnam. - person lirtosiast; 26.08.2015
comment
@lirtosiast да, но даже если он исправит это и сделает это, как указано в ответе MattPutnam, эта проблема все равно будет - person Private Caller; 08.12.2016