Acho que descobri o problema!!!
if( idade >= 18 && temCarteira == "S" || temCarteira == "s") {
mostra("Você pode dirigir");
Aqui estou falando que, se a variável idade e a variável temCarteira cumprem os requisitos (>=18 e "S" maiúsculo), então executa a ação. Ou... se apenas a variável temCarteira cumpre o requisito = "s" minúsculo (na segunda parte, após o operador lógico OR).
Então é suficiente com que a var temCarteira cumpra o requisito (= "s") para executar, por isso que não considera o valor colocado no campo idade, pode ser letra, símbolo, tanto faz, apenas considera a var temCarteira == "s"
Então corrigido ficaria assim:
if(idade >= 18 && temCarteira == "S" || idade >=18 && temCarteira == "s") {
mostra("Você pode dirigir");