Autor
|
Tema: [C] Problema con código (Leído 15,314 veces)
|
audiogalaxy.
Desconectado
Mensajes: 24
|
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?
|
|
|
En línea
|
Qué sería de dios sin el Hombre.
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
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: "); printf("Ingrese el color de la bola que le salio: "); { 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:
Quedando así:
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!
|
|
« Última modificación: 28 Marzo 2013, 23:58 pm por avesudra »
|
En línea
|
Regístrate en 
|
|
|
audiogalaxy.
Desconectado
Mensajes: 24
|
ohh la función strcmp: Voy a leer más sobre el tema.  Muchas Gracias.
|
|
|
En línea
|
Qué sería de dios sin el Hombre.
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
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).
|
|
|
En línea
|
|
|
|
audiogalaxy.
Desconectado
Mensajes: 24
|
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
|
|
|
En línea
|
Qué sería de dios sin el Hombre.
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
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.
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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':
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
|
|
|
En línea
|
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.
Desconectado
Mensajes: 24
|
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é.
|
|
|
En línea
|
Qué sería de dios sin el Hombre.
|
|
|
Luchoz95
Desconectado
Mensajes: 58
|
Perdón que me meta pero por que ....
"bola" no lleva el ampersand(&) ?
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
El operador "&" se utiliza cuando se desea obtener la dirección en memoria de una variable, por ejemplo: int 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]; /* ... */
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
|
|
|
En línea
|
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
|
|
|
|
|