[C] Problema con ejercicio

Iniciado por dmacias, 24 Febrero 2014, 16:38 PM

0 Miembros y 2 Visitantes están viendo este tema.

rir3760

Cita de: dmacias en 24 Febrero 2014, 22:26 PMSin esta linea, como comento en el comentario de arriba, el resultado a veces no es correcto
a2 = b2 = c2 = d2 = e2 = 0;
Eso sucede porque si no se inicializa una variable local su valor inicial es no definido o basura.

Con las variables a1, b1, etc. no hay problema porque lo primero que haces con ellas es asignarles un valor, por ejemplo:
case 1:
   a1 = a * n;


Pero con las variables a2, b2, etc. lo primero que haces con ellas es utilizar su valor, por ejemplo:
case 1:
   a1 = a * n;
   a2 += a1; /* a2 = a2 + a1 == ALGUN_VALOR + a1 */


Y deberías sustituir esos dos grupos de variable (X1 y X2) por arrays, con ello el programa es mas fácil de desarrollar y mas corto.

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

leosansan


En cualquier caso, inicializando las variables x2 a cero, ya que son sumas parciales,  puedes prescindir perfectamente de las x1 sin más que ir haciendo "a2 += a*n;", etc..

Código (cpp) [Seleccionar]

do{
    printf("Ingrese el codigo de producto: 1-5 (-1 para salir): ");
    scanf("%d", &x);
    if (x==-1)
      break;
    else  if(x >= 1 && x <= 5){
      printf("Ingrese las unidades vendidas: ");
      scanf("%d", &n);
      }
      switch (x){
case 1:
      a2 += a*n;
      break;
case 2:
b2 += b*n;
break;
case 3:
c2 += c*n;
break;
case 4:
d2 += d*n;
break;
case 5:
e2 += e*n;
break;
        default:
        printf("Introdujo un codigo erroneo\n");
        break;
    } /*fin de switch*/
} /*fin de do*/
while (1); /*condicion de do*/


¡¡¡¡ Saluditos! ..... !!!!






dmacias

CitarY deberías sustituir esos dos grupos de variable (X1 y X2) por arrays, con ello el programa es mas fácil de desarrollar y mas corto.

Aun noi he estudidado eso, estoy empezando y obvio que no puedo usar algo que aun no se, es con lo poco que se y ando  :rolleyes: jajja

leosansan, ya veo que podria reducir las dos operaciones a una y asi ahorrarme las variables de 'x1', supongo que será cuestion de practica

No sabía que se podia hacer esto

    if (x==-1)
     break


Solo he visto break en switch, lo desconocia.

Y esto no lo entiendo

while (1); /*condicion de do*/

Que es lo que valida esa condicion???? supongo que el 1 solo no será??

Gracias por pasaros y sigo estudiando, asi que no vayais muy lejos  :P

Un saludo

eferion

Cita de: dmacias en 25 Febrero 2014, 08:42 AM
No sabía que se podia hacer esto

    if (x==-1)
     break


Solo he visto break en switch, lo desconocia.

break sirve para salir de un bucle for o while o de una sentencia switch. Da igual donde lo pongas, si la ejecución del programa alcanza ese break, saldrás del bucle.

Cita de: dmacias en 25 Febrero 2014, 08:42 AM
Y esto no lo entiendo

while (1); /*condicion de do*/

Que es lo que valida esa condicion???? supongo que el 1 solo no será??

el contenido de un while se ejecuta mientras la condición evaluada sea cierta. Se considera cierta siempre y cuando su resultado no sea 0. En while(1), la condición NUNCA será 0, luego el bucle se ejecutará de forma perpetua hasta que se salga del mismo con un break o un return.

dmacias

Entonces ahora entiendo el porque del break en if(x==-1), ya voy aprendiendolo.

Muchas gracias a todos

Un saludo

leosansan

Cita de: dmacias en 25 Febrero 2014, 08:42 AM
......................................................................
No sabía que se podia hacer esto

    if (x==-1)
     break


Solo he visto break en switch, lo desconocia.

Y esto no lo entiendo

while (1); /*condicion de do*/

Que es lo que valida esa condicion???? supongo que el 1 solo no será??


Provoca un bucle infinito que se rompe desde el "interior" del mismo,  como con el if-break, al cumplirse alguna condición.

¡¡¡¡ Saluditos! ..... !!!!





xaps

No creo que sea buena idea incitar a la gente que está empezando a programar a usar bucles sin condición de los que se saldrá mediante breaks, no es una buena práctica.

Yo te animo a que intentes hacer un bucle con condición y te olvides del break.

Saludos
"The programmers of tomorrow are the wizards of the future" - Gave Newel

Gh057

hola dmacias ,coincido con xaps; personalmente no lo considero un buen hábito esos saltos sin control, me recuerda mucho a los famosos "goto"... nada mejor para aprender que tratar de definir que tipo de bucle necesitas ,si es interativo o  condicional, y si es posible o necesario que se realice una vez.

(por ejemplo en un menú, es usual que la condición de repetición es la opción distinta a las permitidas, complementándose con un mensaje por medio del default; en un bucle que se ejecute por lo menos una vez)

te recomiendo partir del algoritmo a implementar (puedes practicarlo de manera gráfica y en seudocódigo) y de ahí ya teniendo una idea clara de como sería tu estructura te pones a codificarlo. puede parecer al comienzo una gasto de tiempo extra, de hecho lo es, pero el tiempo invertido en ello cada vez será menor, y desarrollarás mejores aplicaciones. saludos
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...

leosansan

#18
Teniendo en cuenta que ya dmacias ha propuesto un código con la condición en el while, "recompongo" mi propuesta del while(1), esta vez con la condición incorporada al mismo, no quiero que por mi culpa se"revuelva"el patio: :silbar:


Código (cpp) [Seleccionar]

#include <stdio.h>

int main()
{
float a = 2.98;
float b = 4.50;
float c = 9.98;
float d = 4.49;
float e = 6.87;
int n=0;
int x = 0;
float total=0;
float a2=0,b2=0,c2=0,d2=0,e2=0;

do{
printf("Ingrese el codigo de producto: 1-5 (-1 para salir): ");
scanf("%d", &x);
if(x >= 1 && x <= 5){
     printf("Ingrese las unidades vendidas: ");
     scanf("%d", &n);
}
switch (x){
case 1:
a2 += a*n;
break;
case 2:
b2 += b*n;
break;
case 3:
c2 += c*n;
break;
case 4:
d2 += d*n;
break;
case 5:
e2 += e*n;
break;
default:
if (x!=-1)
           printf("Introdujo un codigo erroneo\n");
break;
} /*fin de switch*/
} /*fin de do*/
while (x!=-1); /*condicion de do*/
total = a2+b2+c2+d2+e2;
printf("El total vendido es %1.2f \n", total);
return 0;
 }


¡¡¡¡ Saluditos! ..... !!!!



P.D: Juraito, juraito que el código está bien indentado, pero no sé que pasa últimamente que al ponerlo en las Code se "desparrama". :o



Gh057

jaajaj por mi parte jamás ocurriría...! excelente aporte leosansan :laugh: dmacias fíjate que claro quedó ahora, por favor ténlo en cuenta para futuros ejercicios, así como la validación del ingreso,    saludos!
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...