elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Problema con código
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Problema con código  (Leído 14,212 veces)
audiogalaxy.

Desconectado Desconectado

Mensajes: 24



Ver Perfil
[C] Problema con código
« 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?


En línea

Qué sería de dios sin el Hombre.
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: [C] Problema con código
« Respuesta #1 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!


« Última modificación: 28 Marzo 2013, 23:58 pm por avesudra » En línea

Regístrate en
audiogalaxy.

Desconectado Desconectado

Mensajes: 24



Ver Perfil
Re: [C] Problema con código
« Respuesta #2 en: 29 Marzo 2013, 00:02 am »

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 Desconectado

Mensajes: 1.211



Ver Perfil
Re: [C] Problema con código
« Respuesta #3 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).
En línea

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.

Desconectado Desconectado

Mensajes: 24



Ver Perfil
Re: [C] Problema con código
« Respuesta #4 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
En línea

Qué sería de dios sin el Hombre.
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [C] Problema con código
« Respuesta #5 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.
En línea

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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [C] Problema con código
« Respuesta #6 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
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 Desconectado

Mensajes: 24



Ver Perfil
Re: [C] Problema con código
« Respuesta #7 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é.
En línea

Qué sería de dios sin el Hombre.
Luchoz95

Desconectado Desconectado

Mensajes: 58


Ver Perfil
Re: [C] Problema con código
« Respuesta #8 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(&) ?
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [C] Problema con código
« Respuesta #9 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
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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con código
Programación Visual Basic
z3r0 Bug 7 2,229 Último mensaje 24 Noviembre 2005, 16:51 pm
por NYlOn
¿Cuál es la diferencia entre código objeto, código máquina y código binario?
Programación General
Aikanáro Anário 9 29,036 Último mensaje 23 Diciembre 2010, 15:19 pm
por pucheto
Extrayendo código fuente de una web (Problema con código generado por JS)
PHP
Littl3 4 7,885 Último mensaje 3 Marzo 2011, 04:13 am
por Nakp
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines