Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Problemas con varios operadores lógicos (&&,||) dentro de IF

Estas en el tema de Problemas con varios operadores lógicos (&&,||) dentro de IF en el foro de C/C++ en Foros del Web. Hola, Código: /* La compañía que gestiona la autopista ha decidido cambiar las tarifas de peaje. Estas tarifas dependen del tipo de vehículo (camión o ...
  #1 (permalink)  
Antiguo 01/02/2015, 10:15
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 16 años
Puntos: 5
Pregunta Problemas con varios operadores lógicos (&&,||) dentro de IF

Hola,
Código:
/*
La compañía que gestiona la autopista ha decidido cambiar las tarifas de peaje. Estas tarifas
dependen del tipo de vehículo (camión o automóvil) que desee utilizar la autopista, del número de
pasajeros que lleve y de la hora del día: en las horas de alta congestión los automóviles con tres
pasajeros o más no pagan peaje, los otros pagan 30 euros, los camiones pagan 50 euros; en las
horas menos congestionadas el peaje para los automóviles es de 25 euros y para los camiones es
de 30 euros independientemente del número de pasajeros. Escriba un programa que leyendo el
tipo de vehículo, si la hora es de alta congestión o no y el número de pasajeros, calcule la tarifa
que le debe cobrar a un vehículo.

Datos de entrada: Tipo de vehículo (Camión ó Automóvil), Número de pasajeros, Hora de alta congestión o no
Datos de salida: Tarifa a cobrar
*/

//Declaración de variables
    char lcTipoVehiculo[10], lcHoraAlta[3];
    int liNumeroPasajeros;

//Entrada de datos
    printf("Ingrese tipo de veh%cculo (Cami%cn %c Autom%cvil): ", 161, 162, 162, 162);
    scanf("%s", lcTipoVehiculo);

    printf("N%cmero de pasajeros: ", 163);
    scanf("%d", &liNumeroPasajeros);

    printf("Hora de alta congesti%cn (Si %c No): ", 162, 162);
    scanf("%s", lcHoraAlta);

if ((lcHoraAlta == 'SI') || (lcHoraAlta == 'si') && (lcTipoVehiculo == 'AUTOMOVIL') || (lcTipoVehiculo == 'automovil') && (liNumeroPasajeros >= 3))
    {
        printf("\nN%c paga peaje.\n", 162);
    }

    else if ((lcHoraAlta == 'SI') || (lcHoraAlta == 'si') && (lcTipoVehiculo == 'AUTOMOVIL') || (lcTipoVehiculo == 'automovil') && (liNumeroPasajeros < 3))
    {
        printf("\nTarifa: EUR$30.\n");

    }
Tengo problemas usando varios && y || dentro de un IF.

En el primer IF me refiero a:
si lcHoraAlta es igual a 'SI' ó 'si'
y si lctipoVehiculo es igual a 'AUTOMOVIL' ó 'automovil'
y si linumeroPasajeros es mayor o igual a 3

Cuando ingreso los datos el programa finaliza y no lee las condiciones, estaré usando mal los operadores lógicos?, se pueden usar varios dentro de un IF o nó.

Espero puedan aclararme.

Última edición por RGT; 01/02/2015 a las 10:31
  #2 (permalink)  
Antiguo 01/02/2015, 10:36
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 4 meses
Puntos: 28
Respuesta: Problemas con varios operadores lógicos (&&,||) dentro de IF

Te faltan varios parentesis ahí, creo que lo que quieres decir es:
Código C++:
Ver original
  1. if (((lcHoraAlta == "SI") || (lcHoraAlta == "si") )&& ((lcTipoVehiculo == "AUTOMOVIL") || (lcTipoVehiculo == "automovil")) && (liNumeroPasajeros >= 3))

De todas formas, ese if me parece muy complicado y que puede optimizarse:

- Pasando los strings a mayúsculas antes del if te evitas hacer dos comparaciones.
- Si la única diferencia entre esos dos ifs es el número de pasajeros, puedes hacer un if anidado.

Código C++:
Ver original
  1. #include <algorithm>
  2. //...
  3.  
  4. transform(lcHoraAlta.begin(),lcHoraAlta.end(),::toupper); // pasar horaAlta a mayuscula
  5. transform(lcTipoVehiculo.begin(),lcTipoVehiculo.end(),::toupper); // pasar lcTipoVehiculo a mayuscula
  6.  
  7. if (lcHoraAlta == "SI" && lcTipoVehiculo == "AUTOMOVIL")
  8. {
  9.     if (liNumeroPasajeros >= 3)
  10.     {
  11.         printf("\nN%c paga peaje.\n", 162);
  12.     }
  13.     else
  14.     {
  15.           printf("\nTarifa: EUR$30.\n");
  16.     }
  17. }

Si no puedes usar la función transform, puedes hacerte tu propia función que pase un string a mayúsculas (no es díficil, es hacer un for que recorra el string y que vaya aplicando el método toupper() a cada caracter).
  #3 (permalink)  
Antiguo 01/02/2015, 10:49
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 16 años
Puntos: 5
Respuesta: Problemas con varios operadores lógicos (&&,||) dentro de IF

Cita:
Iniciado por amchacon Ver Mensaje
Te faltan varios parentesis ahí, creo que lo que quieres decir es:
Código C++:
Ver original
  1. if (((lcHoraAlta == "SI") || (lcHoraAlta == "si") )&& ((lcTipoVehiculo == "AUTOMOVIL") || (lcTipoVehiculo == "automovil")) && (liNumeroPasajeros >= 3))

De todas formas, ese if me parece muy complicado y que puede optimizarse:

- Pasando los strings a mayúsculas antes del if te evitas hacer dos comparaciones.
- Si la única diferencia entre esos dos ifs es el número de pasajeros, puedes hacer un if anidado.

Código C++:
Ver original
  1. #include <algorithm>
  2. //...
  3.  
  4. transform(lcHoraAlta.begin(),lcHoraAlta.end(),::toupper); // pasar horaAlta a mayuscula
  5. transform(lcTipoVehiculo.begin(),lcTipoVehiculo.end(),::toupper); // pasar lcTipoVehiculo a mayuscula
  6.  
  7. if (lcHoraAlta == "SI" && lcTipoVehiculo == "AUTOMOVIL")
  8. {
  9.     if (liNumeroPasajeros >= 3)
  10.     {
  11.         printf("\nN%c paga peaje.\n", 162);
  12.     }
  13.     else
  14.     {
  15.           printf("\nTarifa: EUR$30.\n");
  16.     }
  17. }

Si no puedes usar la función transform, puedes hacerte tu propia función que pase un string a mayúsculas (no es díficil, es hacer un for que recorra el string y que vaya aplicando el método toupper() a cada caracter).
Hola, gracias por ayudarme.

El problema se mantiene, corres el programas e ingresas los datos y el programa se finaliza, no lee ninguna condicion.

Otra pregunta: por qué usar en los IF == "si", debería ser 'si' o nó?

Espero puedas responderme ambas, realmente lo necesito.

Aquí screenshot:
  #4 (permalink)  
Antiguo 01/02/2015, 11:41
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Problemas con varios operadores lógicos (&&,||) dentro de IF

O_O así no se comparan las cadenas, al menos no en C y en C++ si no mal recuerdo puedes usar el operador == siempre y cuando un objeto de tipo string (no char*) este de lado izquierdo. Para comparar arreglos de caracteres existen funciones como strncasecmp que compara 2 arreglos de caracteres, dado una longuitud e ignorando el case de los caracteres.

Lo segundo que vi fue que tienes problemas con el encoding pero es problema mas de la consola donde lo ejecutas. En mi caso añadi system("chcp 65001"); y le cambie el encoding de mi archivo a utf-8.

Código C:
Ver original
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4.  
  5. int main() {
  6.     system("chcp 65001");
  7.     //Declaración de variables
  8.     char lcTipoVehiculo[10], lcHoraAlta[3];
  9.     int liNumeroPasajeros;
  10.  
  11.     //Entrada de datos
  12.     printf("Ingrese tipo de vehículo (Camión o Automóvil): ");
  13.     scanf("%s", lcTipoVehiculo);
  14.  
  15.     printf("Número de pasajeros: ");
  16.     scanf("%d", &liNumeroPasajeros);
  17.  
  18.     printf("Hora de alta congestión (Si o No): ");
  19.     scanf("%s", lcHoraAlta);
  20.  
  21.     if ((strncasecmp("SI", lcHoraAlta, 2) == 0) && (strncasecmp("AUTOMOVIL", lcTipoVehiculo, 9) == 0) && (liNumeroPasajeros >= 3))
  22.     {
  23.         printf("\nNó paga peaje.\n");
  24.     }
  25.  
  26.     else if ((strncasecmp("SI", lcHoraAlta, 3) == 0) && (strncasecmp("AUTOMOVIL", lcTipoVehiculo, 10) == 0) && (liNumeroPasajeros < 3))
  27.     {
  28.         printf("\nTarifa: EUR$30.\n");
  29.  
  30.     }
  31.     return 0;
  32. }
  #5 (permalink)  
Antiguo 01/02/2015, 11:53
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 4 meses
Puntos: 28
Respuesta: Problemas con varios operadores lógicos (&&,||) dentro de IF

Huy, creía que era C++ xD
  #6 (permalink)  
Antiguo 01/02/2015, 12:02
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 16 años
Puntos: 5
Pregunta Respuesta: Problemas con varios operadores lógicos (&&,||) dentro de IF

Hola,
También tengo problemas con eso :(, no se que pasa.

He cambiado cadenas por 1 caracter.

Aquí el codigo:

Código:
#include <stdio.h>
#include <stdlib.h>

/*
La compañía que gestiona la autopista ha decidido cambiar las tarifas de peaje. Estas tarifas
dependen del tipo de vehículo (camión o automóvil) que desee utilizar la autopista, del número de
pasajeros que lleve y de la hora del día: en las horas de alta congestión los automóviles con tres
pasajeros o más no pagan peaje, los otros pagan 30 euros, los camiones pagan 50 euros; en las
horas menos congestionadas el peaje para los automóviles es de 25 euros y para los camiones es
de 30 euros independientemente del número de pasajeros. Escriba un programa que leyendo el
tipo de vehículo, si la hora es de alta congestión o no y el número de pasajeros, calcule la tarifa
que le debe cobrar a un vehículo.

Datos de entrada: Tipo de vehículo (Camión ó Automóvil), Hora de alta congestión o no, Número de pasajeros
Datos de salida: Tarifa a cobrar
*/

int main()
{
    //Declaración de variables
    char lcTipoVehiculo, lcHoraAlta;
    int liNumeroPasajeros;

    //Entrada de datos
    printf("Ingrese tipo de veh%cculo (Cami%cn = C/Autom%cvil = A): ", 161, 162, 162, 162);
    scanf("%s", &lcTipoVehiculo);

    printf("Hora de alta congesti%cn (S/N): ", 162, 162);
    scanf("%s", &lcHoraAlta);

    printf("N%cmero de pasajeros: ", 163);
    scanf("%d", &liNumeroPasajeros);

    //Procesamiento
    if (lcTipoVehiculo == 'A' || lcTipoVehiculo == 'a')
    {
        if (lcHoraAlta == 'S' || lcHoraAlta == 's')
        {
            if (liNumeroPasajeros >= 3)
            {
                printf("\nN%c paga peaje.\n", 162); //Salida de datos
            }

            else
                printf("\nTarifa: EUR$30.\n"); //Salida de datos
        }

        else
            printf("\nTarifa: EUR$25.\n"); //Salida de datos
    }

    else if (lcTipoVehiculo == 'C' || lcTipoVehiculo == 'c')
    {
        if (lcHoraAlta == 'S' || lcHoraAlta == 's')
        {
            if (liNumeroPasajeros >= 3)
            {
                printf("\nN%c paga peaje.\n", 162); //Salida de datos
            }

            else
                printf("\nTarifa: EUR$50.\n"); //Salida de datos
        }

        else
            printf("\nTarifa: EUR$30.\n"); //Salida de datos
    }

    return 0;
}
También he eliminado todas las condiciones en un solo IF como indicaste.

Pero, sigo teniendo el mismo problema. Ingresas todos los datos y el programa se finaliza, no lee ninguna condicion.

Nota: usé %s y no %c porque al ingresar los datos, de la segunda pregunta saltaba a la tercera pregunta.

Espero poder solucionar esto y gracias a todos los que me han ayudado.

Esperare su respuesta.
  #7 (permalink)  
Antiguo 01/02/2015, 12:05
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 4 meses
Puntos: 28
Respuesta: Problemas con varios operadores lógicos (&&,||) dentro de IF

Cambia los %s de los scanfs por %c
  #8 (permalink)  
Antiguo 01/02/2015, 12:15
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 16 años
Puntos: 5
Pregunta Respuesta: Problemas con varios operadores lógicos (&&,||) dentro de IF

Cita:
Iniciado por amchacon Ver Mensaje
Cambia los %s de los scanfs por %c
hola, lo intenté y me provoca problemas leyendo los datos ingresados.

Código:
    //Entrada de datos
    printf("Ingrese tipo de veh%cculo (Cami%cn = C/Autom%cvil = A): ", 161, 162, 162, 162);
    scanf("%c", &lcTipoVehiculo);

    printf("Hora de alta congesti%cn (S/N): ", 162, 162);
    scanf("%s", &lcHoraAlta);

    printf("N%cmero de pasajeros: ", 163);
    scanf("%c", &liNumeroPasajeros);
Aquí foto:


Cuándo te pregunta la última pregunta, el programa se detiene.

Sabes por qué?.

Ya no se que hacer :(
  #9 (permalink)  
Antiguo 01/02/2015, 15:28
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Problemas con varios operadores lógicos (&&,||) dentro de IF

Prueba eso:

Código C:
Ver original
  1. //Entrada de datos
  2.     printf("Ingrese tipo de veh%cculo (Cami%cn = C/Autom%cvil = A): ", 161, 162, 162, 162);
  3.     scanf("%c%*c", &lcTipoVehiculo);  //para leer un char %c.
  4.  
  5.     printf("Hora de alta congesti%cn (S/N): ", 162, 162);
  6.     scanf("%c%*c", &lcHoraAlta);
  7.  
  8.     printf("N%cmero de pasajeros: ", 163);
  9.     scanf("%d%*c", &liNumeroPasajeros);  //para leer un int %d

El %*c ignora la tecla enter, esta es la causante de problemas traz leer muchos caracteres intercalados con enters de por medio.
Si vas a leer una letra recuerde que pulsas enter para decir que ya has introducido el char, o sea que tienes 2 chars por el precio de 1. O bien necesitas limpiar el buffer antes y/o después de cada scanf, o bien ignoras esos enters con algunos trucos como puede ser el especificador de entrada %*c que al contrario de %c que le el numero, %*c lo ignora. ;)

Debes leer sobre el buffer de entrada, y tambien el de salida, pero ahora mismo el de entrada te esta trolleando. XD
  #10 (permalink)  
Antiguo 01/02/2015, 15:40
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 16 años
Puntos: 5
Respuesta: Problemas con varios operadores lógicos (&&,||) dentro de IF

Cita:
Iniciado por vangodp Ver Mensaje
Prueba eso:

Código C:
Ver original
  1. //Entrada de datos
  2.     printf("Ingrese tipo de veh%cculo (Cami%cn = C/Autom%cvil = A): ", 161, 162, 162, 162);
  3.     scanf("%c%*c", &lcTipoVehiculo);  //para leer un char %c.
  4.  
  5.     printf("Hora de alta congesti%cn (S/N): ", 162, 162);
  6.     scanf("%c%*c", &lcHoraAlta);
  7.  
  8.     printf("N%cmero de pasajeros: ", 163);
  9.     scanf("%d%*c", &liNumeroPasajeros);  //para leer un int %d

El %*c ignora la tecla enter, esta es la causante de problemas traz leer muchos caracteres intercalados con enters de por medio.
Si vas a leer una letra recuerde que pulsas enter para decir que ya has introducido el char, o sea que tienes 2 chars por el precio de 1. O bien necesitas limpiar el buffer antes y/o después de cada scanf, o bien ignoras esos enters con algunos trucos como puede ser el especificador de entrada %*c que al contrario de %c que le el numero, %*c lo ignora. ;)

Debes leer sobre el buffer de entrada, y tambien el de salida, pero ahora mismo el de entrada te esta trolleando. XD
GRACIAS HERMANO. ME HA FUNCIONADO A LA PERFECCIÓN!.

Es extraño que en la documentación de C no mencionen este truco, en ninguna otra parte en internet he leído este truco.

Puedo preguntarte cómo sabías este truco ó dónde lo encontraste?.

  #11 (permalink)  
Antiguo 01/02/2015, 17:43
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Problemas con varios operadores lógicos (&&,||) dentro de IF

En la documentación de scanf.

http://www.cplusplus.com/reference/cstdio/scanf/
  #12 (permalink)  
Antiguo 02/02/2015, 06:36
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Problemas con varios operadores lógicos (&&,||) dentro de IF

Cita:
Puedo preguntarte cómo sabías este truco ó dónde lo encontraste?.
Pues depende de como lo busques. Yo todo lo que encuentro esta en internet ya que aprendo con ayuda de internet y de los compañeros de los foros a los que visito.

Las mismas dudas que tienen los usuarios a diario aqui son utiles para aprender trucos.
Claro que si solo usas el foro cuando tengas dudas no te sirve de mucho, pero si usas los foros para mas que hacer preguntas, con una simple pasada por los temas que consideres interesante ya verás lo que digo XD

Si quieres aprender mas sobre el tema puede agregarme en skype que te ayudo sim problemas. Por cierto me llamo igual por allá.

Etiquetas: numero, operadores, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:24.