[C] Problema con código

Iniciado por audiogalaxy., 28 Marzo 2013, 23:42 PM

0 Miembros y 1 Visitante están viendo este tema.

audiogalaxy.

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:
#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?
Qué sería de dios sin el Hombre.

avesudra

#1
Claro, es que para comparar cadenas de caracteres en C se utiliza la función strcmp:
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í:
#include <stdio.h>
#include <string.h>

int main(int argc, char * argv[])
{
   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(strcmp(bola,"azul") == 0)
   {
       descuento = compra * .20;
       total = compra-descuento;
       printf("Total a pagar, incluendo descuento es: %f",total);
   }
   else if(strcmp(bola,"roja") == 0)
   {
       descuento = compra * .30;
       total = compra - descuento;
       printf("Total a pagar, incluendo descuento es: %f",total);
   }
   else if(strcmp(bola,"blanca") == 0)
   {
       //descuento = compra * .0; NO HAY DESCUENTO ¬¬ :)
       total = compra;
       printf("Total a pagar, incluendo descuento es: %f",total);
   }
   return 0;
}

Te sobraba el ampersand(&) en esta sentencia:
scanf("%s", &bola);

Quedando así:
scanf("%s", bola);
Y en la declaración del main al menos debes indicar el valor de retorno:
int main()
Y no poner solamente:
main()
Y obviamente retornar con:
return 0;
¡Un saludo y bienvenida/o al foro!
Regístrate en

audiogalaxy.

ohh la función strcmp:

Voy a leer más sobre el tema.
;-) Muchas Gracias.
Qué sería de dios sin el Hombre.

amchacon

char* bola;

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).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

audiogalaxy.

Cita de: amchacon en 29 Marzo 2013, 01:27 AM
char* bola;

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
Qué sería de dios sin el Hombre.

amchacon

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.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

rir3760

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:
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':
scanf("%6s", bola);

Por ultimo no es necesario calcular primero el descuento y a continuación restarlo:
descuento = compra * .20;
total = compra - descuento;

Ya que puedes hacerlo directamente:
total = compra * .8;

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

audiogalaxy.

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é.
Qué sería de dios sin el Hombre.

Luchoz95

Perdón que me meta pero por que ....
scanf("%s", bola);
"bola" no lleva el ampersand(&) ?

rir3760

El operador "&" se utiliza cuando se desea obtener la dirección en memoria de una variable, por ejemplo:
int num;

/* ... */

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:
char palabra[100];

/* ... */

scanf("%99s", palabra);


Otro ejemplo, el prototipo de la función puts es:
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:
char cadena[] = "Linea a imprimir";

/* ... */

puts(&cadena[0]); /* Direccion en memoria de cadena[0] */

/* O bien */

puts(cadena); /* La direccion en memoria se genera automaticamente */


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language