Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: audiogalaxy. en 28 Marzo 2013, 23:42 pm



Título: [C] Problema con código
Publicado por: audiogalaxy. en 28 Marzo 2013, 23:42 pm
Hola, soy nuevo programando.

Estoy tratando de hacer ejercicios para aprender a programar:

Tengo este ejercicio:
En un supermercado, se realizan descuentos por las compras a partir de unas bolitas de colores. Si el cliente saca una bolita color azul, tiene un descuento del 20%, si la bolita es roja, se aplica un descuento del 30% y si saca una bolita color blanca, no se aplica ningún descuento. Diseñe un programa que a partir del importe de la compra y el color de la bolita, muestre lo que debe pagar dicho cliente.

Pues bien tengo así el código en C:
Código:
#include <stdio.h>
#include <string.h>
main()
{
float compra,total,descuento;
char bola[6];
printf("Ingrese el importe de su compra: ");
scanf("%f",&compra);
printf("Ingrese el color de la bola que le salio: ");
scanf("%s",&bola);
if (bola=="azul"){
descuento=compra*.20;
total=compra-descuento;
printf("Total a pagar, incluendo descuento es: %f",total);
}
else
if (bola=="roja"){
descuento=compra*.30;
total=compra-descuento;
printf("Total a pagar, incluendo descuento es: %f",total);
}
else
if (bola=="blanca"){
descuento=compra*.0;
total=compra-descuento;
printf("Total a pagar, incluendo descuento es: %f",total);
}
}

El programa sí corre, pero cuando me pide el color de la bola, lo escribo y no me devuelve ningun resultado. Sale una nueva línea sin nada.



¿Hay algo que me falta?


Título: Re: [C] Problema con código
Publicado por: avesudra en 28 Marzo 2013, 23:52 pm
Claro, es que para comparar cadenas de caracteres en C se utiliza la función strcmp:
Código
  1. int strcmp ( const char * str1, const char * str2 );
Referencia: http://www.cplusplus.com/reference/cstring/strcmp/
Esa función devuelve 0 si las dos cadenas que le pasas son iguales.Quedando tu código así:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(int argc, char * argv[])
  5. {
  6.    float compra,total,descuento;
  7.    char bola[6];
  8.  
  9.    printf("Ingrese el importe de su compra: ");
  10.    scanf("%f",&compra);
  11.  
  12.    printf("Ingrese el color de la bola que le salio: ");
  13.    scanf("%s",bola);
  14.  
  15.    if(strcmp(bola,"azul") == 0)
  16.    {
  17.        descuento = compra * .20;
  18.        total = compra-descuento;
  19.        printf("Total a pagar, incluendo descuento es: %f",total);
  20.    }
  21.    else if(strcmp(bola,"roja") == 0)
  22.    {
  23.        descuento = compra * .30;
  24.        total = compra - descuento;
  25.        printf("Total a pagar, incluendo descuento es: %f",total);
  26.    }
  27.    else if(strcmp(bola,"blanca") == 0)
  28.    {
  29.        //descuento = compra * .0; NO HAY DESCUENTO ¬¬ :)
  30.        total = compra;
  31.        printf("Total a pagar, incluendo descuento es: %f",total);
  32.    }
  33.    return 0;
  34. }
Te sobraba el ampersand(&) en esta sentencia:
Código
  1. scanf("%s", &bola);
  2.  
Quedando así:
Código
  1. scanf("%s", bola);
Y en la declaración del main al menos debes indicar el valor de retorno:
Código
  1. int main()
Y no poner solamente:
Código
  1. main()
Y obviamente retornar con:
Código
  1. return 0;
¡Un saludo y bienvenida/o al foro!


Título: Re: [C] Problema con código
Publicado por: audiogalaxy. en 29 Marzo 2013, 00:02 am
ohh la función strcmp:

Voy a leer más sobre el tema.
 ;-) Muchas Gracias.


Título: Re: [C] Problema con código
Publicado por: amchacon en 29 Marzo 2013, 01:27 am
Código
  1. char* bola;
  2.  
  3. if (bola=="roja")
Cuando el compilador lee esto, interpetra que quieres comparar la dirreción de memoria del puntero char con el valor decimal de "roja" (se hace una conversión de cadena a su equivalente char).

Por eso te compila pero no funciona, aunque me extraña que el compilador no te lanzado un warning (a ver si lo adivino, usas Devcpp).


Título: Re: [C] Problema con código
Publicado por: audiogalaxy. en 29 Marzo 2013, 01:52 am
Código
  1. char* bola;
  2.  
  3. if (bola=="roja")
Cuando el compilador lee esto, interpetra que quieres comparar la dirreción de memoria del puntero char con el valor decimal de "roja" (se hace una conversión de cadena a su equivalente char).

Por eso te compila pero no funciona, aunque me extraña que el compilador no te lanzado un warning (a ver si lo adivino, usas Devcpp).
Sí, ese uso. Bbueno, apenas estoy aprendiendo.
Pero con strcmp funcionó ya que sirve, por lo que leo, para comparar dos cadenas


Título: Re: [C] Problema con código
Publicado por: amchacon en 29 Marzo 2013, 02:22 am
Está desfasado, su última versión oficial fue hace 10 años.

Yo miraria pasarme a Codeblocks (la version que incluye el mingw). Merece la pena el cambio.


Título: Re: [C] Problema con código
Publicado por: rir3760 en 29 Marzo 2013, 04:14 am
Solo para redondear lo comentado por avesudra y amchacon.

Cuando se declara un array este debe tener el tamaño suficiente para almacenar la cadena incluyendo el '\0' al final de esta. Ya que "blanca" es una cadena de siete caracteres hay que cambiar la declaración a:
Código
  1. char bola[7];

Y en la llamada a scanf debes utilizar el especificador "%Ns" donde N indica el numero máximo de caracteres que serán almacenados en el array sin incluir el '\0':
Código
  1. scanf("%6s", bola);

Por ultimo no es necesario calcular primero el descuento y a continuación restarlo:
Código
  1. descuento = compra * .20;
  2. total = compra - descuento;
Ya que puedes hacerlo directamente:
Código
  1. total = compra * .8;

Un saludo


Título: Re: [C] Problema con código
Publicado por: audiogalaxy. en 29 Marzo 2013, 04:34 am
Muchas gracias por puntualizar la infromación.

Precisamente tenía esa duda con el tamaño de caracteres que va entre los corchetes.

Ya lo optimicé.


Título: Re: [C] Problema con código
Publicado por: Luchoz95 en 29 Marzo 2013, 05:07 am
Perdón que me meta pero por que ....
Código
  1. scanf("%s", bola);
"bola" no lleva el ampersand(&) ?


Título: Re: [C] Problema con código
Publicado por: rir3760 en 29 Marzo 2013, 06:28 am
El operador "&" se utiliza cuando se desea obtener la dirección en memoria de una variable, por ejemplo:
Código
  1. int num;
  2.  
  3. /* ... */
  4.  
  5. scanf("%d", &num);

En el caso de los arrays no es necesario porque (salvo contadas excepciones) al utilizar el nombre de uno automáticamente se obtiene la dirección en memoria de su primer elemento:
Código
  1. char palabra[100];
  2.  
  3. /* ... */
  4.  
  5. scanf("%99s", palabra);

Otro ejemplo, el prototipo de la función puts es:
Código
  1. int puts(const char *cadena);
La función espera la dirección en memoria del primer carácter de la cadena a imprimir, para indicarlo podemos utilizar:
Código
  1. char cadena[] = "Linea a imprimir";
  2.  
  3. /* ... */
  4.  
  5. puts(&cadena[0]); /* Direccion en memoria de cadena[0] */
  6.  
  7. /* O bien */
  8.  
  9. puts(cadena); /* La direccion en memoria se genera automaticamente */

Un saludo