[Curso] Introducción a la programación en C (VII)

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, m0skit0, LnD, ka69, zacky06

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

[Curso] Introducción a la programación en C (VII)

Mensaje por m0skit0 »

<< Anterior Siguiente >>

Él puede parecer un idiota y actuar como un idiota, pero no se deje usted engañar, es realmente un idiota (Groucho Marx)

Seguimos con el control de flujo. Por ejemplo el siguiente programa:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char* argv[])
{
    int numero;

    printf("Introduzca un número del 0 al 9: ");
    scanf("%d", &numero);

    if (numero == 0)
        printf("El cero!\n");
    else if (numero == 1)
        printf("El uno!\n");
    else if (numero == 2)
        printf("El dos!\n");
    else if (numero == 3)
        printf("El tres!\n");
    else if (numero == 4)
        printf("El cuatro!\n");
    else if (numero == 5)
        printf("El cinco!\n");
    else if (numero == 6)
        printf("El seis!\n");
    else if (numero == 7)
        printf("El siete!\n");
    else if (numero == 8)
        printf("El ocho!\n");
    else if (numero == 9)
        printf("El nueve!\n");

    // No está entre 0 y 9
    else
        printf("Entre 0 y 9, melon!\n");

    return 0;
}


Para este tipo de situaciones se suele usar la sentencia switch(). Es muy sencilla, os dejo el programa anterior usando switch:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char* argv[])
{
    int numero;

    printf("Introduzca un número del 0 al 9: ");
    scanf("%d", &numero);

    switch(numero)
    {
        case 0:
            printf("El cero!\n");
            break;
        case 1:
            printf("El uno!\n");
            break;
        case 2:
            printf("El dos!\n");
            break;
        case 3:
            printf("El tres!\n");
            break;
        // Tanto si es 4 como si es 5
        case 4:
        case 5:
            printf("El cuatro o el cinco!\n");
            break;
        case 6:
            printf("El seis!\n");
            break;
        case 7:
            printf("El siete!\n");
            break;
        case 8:
            printf("El ocho!\n");
            break;
        case 9:
            printf("El nueve!\n");
            break;
        default:
            printf("Entre 0 y 9, melon!\n");
            break;
    }

    return 0;
}

Para practicar el switch:

  1. Dado un número entero entre 0 y 100, decir en que decena se encuentra (por ejemplo, 1 está en la 1ª decena, 52 está en la 6ª decena, etc...).
  2. Dados dos números reales, dar la opción al usuario de elegir entre sumarlos, restarlos, multiplicarlos o dividirlos, y mostrar el resultado de la operación.

Venga, a estrujarse un poco el coco con la segunda :mrgreen:

Descarga en PDF (por Chacaritas)

<< Anterior Siguiente >>
Imagen

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

Re: [Curso] Introducción a la programación en C (VII)

Mensaje por arisma »

El primer ejercicio.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main()
{
   int num;

   printf("Introduce un número entre 1 y 100, ambos inclusive: ");
   scanf("%i", &num);

   if (num > 0 && num <10) printf ("Está en la primera decena\n");
   else if (num >= 10 && num < 20) printf ("Está en la segunda decena\n");
   else if (num >= 20 && num < 30) printf ("Está en la tercera decena\n");
   else if (num >= 30 && num < 40) printf ("Está en la cuarta decena\n");
   else if (num >= 40 && num < 50) printf ("Está en la quinta decena\n");
   else if (num >= 50 && num < 60) printf ("Está en la sexta decena\n");
   else if (num >= 60 && num < 70) printf ("Está en la septima decena\n");
   else if (num >= 70 && num < 80) printf ("Está en la octava decena\n");
   else if (num >= 80 && num < 90) printf ("Está en la novena decena\n");
   else if (num >= 90 && num < 100) printf ("Está en la decima decena\n");
   else if (num == 100) printf ("Está en la undecima decena\n");
   else printf("Dije entre 1 y 100, ni más ni menos...\n");
   return 0;
}


Primer ejercicio, con switch
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main()
{
   int num;

   printf("Introduce un número entre 1 y 100, ambos inclusive: ");
   scanf("%i", &num);

   if (num <= 0 || num > 100) num = 175;
   else
   num = num / 10;


   switch(num)
   {
   case 0: printf ("Está en la primera decena\n");
      break;
   case 1: printf ("Está en la segunda decena\n");
      break;
   case 2: printf ("Está en la tercera decena\n");
      break;
   case 3: printf ("Está en la cuarta decena\n");
      break;
   case 4: printf ("Está en la quinta decena\n");
      break;
   case 5: printf ("Está en la sexta decena\n");
      break;
   case 6: printf ("Está en la septima decena\n");
      break;
   case 7: printf ("Está en la octava decena\n");
      break;
   case 8: printf ("Está en la novena decena\n");
      break;
   case 9: printf ("Está en la decima decena\n");
      break;
   case 10: printf ("Está en la undecima decena\n");
      break;
   default: printf("Dije entre 1 y 100, ni más ni menos...\n");
      break;
   }
   return 0;
}


Mi solución al segundo, eso sí nada elegante jeje.

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main()
{

   float nPri, nSeg;
   double res;
   char oper;

   printf("Introduce el primer número: ");
   scanf("%f", &nPri);
   
   printf("Introduce el segundo número: ");
   scanf("%f", &nSeg);

   printf("Introduce la operación(+ - * /):");
   //Como no me funciona fflush xD
   while(getchar()!='\n');
   scanf("%c", &oper);

   switch(oper)
   {
   case '+':
      printf("%f\n", nPri + nSeg);
      break;
   case '-':
      printf("%f\n", nPri - nSeg);
      break;
   case '*':
      printf("%f\n", nPri * nSeg);
      break;
   case '/':
      if (nSeg != 0)
         printf("%f\n", nPri / nSeg);
      else
         printf("Lo siento no está permitida la división entre 0");
      break;
   default:
      printf("Introduce uno de ellos + - * /\n");
      break;
   }
   return 0;
}
Última edición por arisma el 04 Nov 2009, 12:10, editado 1 vez en total.

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (VII)

Mensaje por m0skit0 »

arisma escribió:El primer ejercicio.

Está bien, pero hay que hacerlo con switch xD

arisma escribió://Como no me funciona fflush xD

¿Has incluído unistd.h? ;)
Imagen

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

Re: [Curso] Introducción a la programación en C (VII)

Mensaje por arisma »

kk, lo haré con switch, pero seráaaaaaaaaaaaaaaaaaaaaa muy largo.

No he incluido unistd al estar haciendolo con VC++. Así es compatible con ambos sistemas. Ya que el fflush no le hace ni caso.

Lo sé, pero es que en un portátil estoy instalando Ubuntu. En otro tengo Wifislax, pero como prefiero no tocarlo, en el Win2000 que tengo he instalado DevC++. Y en el de sobremesa tengo VC++.

Vaya cacao, jejeje.

Avatar de Usuario
Mirlo_PJ
Enteradillo
Enteradillo
Mensajes: 45
Registrado: 14 Oct 2009, 19:52

Re: [Curso] Introducción a la programación en C (VII)

Mensaje por Mirlo_PJ »

Otro pa' la saca

Spoiler:
Ejercicio 1

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int numero;
 
  printf("Introduzca un numero entre 0 y 100 :");
  scanf("%d", &numero);
  numero = numero /10;
  switch(numero){
      case 0:
           printf("\nEsta en la primera decena\n");
           break;
      case 2:
           printf("\nEsta en la segunda decena\n");
           break;
      case 3:
           printf("\nEsta en la tercera decena\n");
           break;
      case 4:
           printf("\nEsta en la cuarta decena\n");
           break;
      case 5:
           printf("\nEsta en la quinta decena\n");
           break;
      case 6:
           printf("\nEsta en la sexta decena\n");
           break;
      case 7:
           printf("\nEsta en la septima decena\n");
           break;
      case 8:
           printf("\nEsta en la octava decena\n");
           break;
      case 9:
           printf("\nEsta en la novena decena\n");
           break;
      case 10:
           printf("\nEsta en la decima decena\n");
           break;
      default:
           printf("\nTu pon lo que quieras que eso no te lo e pedido\n");
  }
     
  system("PAUSE");   
  return 0;
}

ejercicio2

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int numero1;
  int numero2;
  int num;
  char res;
 
  printf("Introduzca un numero :");
  scanf("%d", &numero1);
  system("CLS");
 
  printf("Introduzca otro numero :");
  scanf("%d", &numero2);
  system("CLS");
 
  printf ("Que desea hacer con %d y %d:",numero1, numero2);
  printf ("\n (S)umarlos");
  printf ("\n (R)estarlos");
  printf ("\n (M)ultiplicarlos");
  printf ("\n (D)ividirlos\n");
  scanf("%s", &res);

  switch(res){
      case 's':
           num =numero1+numero2;
           printf("\nEl resultado es: %d\n",num);
           break;
      case 'r':
           num =numero1-numero2;
           printf("\nEl resultado es: %d\n",num);
           break;
      case 'm':
           num =numero1*numero2;
           printf("\nEl resultado es: %d\n",num);
           break;
      case 'd':
           num =numero1/numero2;
           printf("\nEl resultado es: %d\n",num);
           break;
      default:
           printf("\nTu no vas al colegio no\n");
  }
     
  system("PAUSE");   
  return 0;
}
Imagen

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

Re: [Curso] Introducción a la programación en C (VII)

Mensaje por arisma »

Pero en el primero te has saltado 1 y se te ha descuadrado, jeje. Repasalo.

En el segundo no muestras el resultado.

Bien hecho. Veremos lo que dice el profe.

Avatar de Usuario
Mirlo_PJ
Enteradillo
Enteradillo
Mensajes: 45
Registrado: 14 Oct 2009, 19:52

Re: [Curso] Introducción a la programación en C (VII)

Mensaje por Mirlo_PJ »

arisma escribió:Pero en el primero te has saltado 1 y se te ha descuadrado, jeje. Repasalo.

En el segundo no muestras el resultado.

Bien hecho. Veremos lo que dice el profe.


En el primero no me deja poner "0, 1" y lo deje en 0 y en el segundo lo muestra directamente en la seleccion despues de cada "case" ;)
Imagen

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (VII)

Mensaje por m0skit0 »

arisma escribió:No he incluido unistd al estar haciendolo con VC++. Así es compatible con ambos sistemas. Ya que el fflush no le hace ni caso.

Microsoft no conforma lo suficiente al estándar POSIX de sistemas operativos :ko:

Mirlo_PJ escribió:En el primero no me deja poner "0, 1" y lo deje en 0 y en el segundo lo muestra directamente en la seleccion despues de cada "case"

arisma creo que se refiere a que debería ser:

Spoiler:

Código: Seleccionar todo

   switch(numero){
      case 0:
           printf("\nEsta en la primera decena\n");
           break;
      case 1:
           printf("\nEsta en la segunda decena\n");
           break;
      case 2:
           printf("\nEsta en la tercera decena\n");
           break;
      // Etc...

que sería efectivamente lo correcto.

Mirlo_PJ escribió:scanf("%s", &res);

Si lo que quieres es capturar un solo carácter, es más correcto usar %c. %s es para una cadena de caracteres :) Mira lo que hace tu código en Linux:

Código: Seleccionar todo

m0skit0@sobiet:~$ ./ejercicio
Introduzca un numero :22
sh: CLS: not found
Introduzca otro numero :20
sh: CLS: not found
Que desea hacer con 22 y 20:
 (S)umarlos
 (R)estarlos
 (M)ultiplicarlos
 (D)ividirlos
s

El resultado es: 42
sh: PAUSE: not found
Segmentation fault

El Segmentation fault es debido a declarar char res, y usarlo como entrada para %s en scanf. Recuerda que para %s debes usar char* o char[] ;) Además, especificas letras mayúsculas en el menú, pero tu programa sólo responde a entradas en minúsculas. Te dejo la corrección:

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int numero1;
  int numero2;
  int num;
  char res;
 
  printf("Introduzca un numero :");
  scanf("%d", &numero1);
  system("CLS");
 
  printf("Introduzca otro numero :");
  scanf("%d", &numero2);
  system("CLS");
 
  printf ("Que desea hacer con %d y %d:",numero1, numero2);
  printf ("\n (S)umarlos");
  printf ("\n (R)estarlos");
  printf ("\n (M)ultiplicarlos");
  printf ("\n (D)ividirlos\n");
  // Nótese el espacio antes del %c... Rayadas de C xD
  scanf(" %c", &res);

  // Si res es mayúscula
  if (res < 97)
    // La cambiamos a minúscula con el truco del almendruco xD
    res = res + ' ';

  switch(res){
      case 's':
           num =numero1+numero2;
           printf("\nEl resultado es: %d\n",num);
           break;
      case 'r':
           num =numero1-numero2;
           printf("\nEl resultado es: %d\n",num);
           break;
      case 'm':
           num =numero1*numero2;
           printf("\nEl resultado es: %d\n",num);
           break;
      case 'd':
           num =numero1/numero2;
           printf("\nEl resultado es: %d\n",num);
           break;
      default:
           printf("\nTu no vas al colegio no\n");
  }
     
  system("PAUSE");   
  return 0;
}

Ahora puedes comprobar que funciona sin importar mayúsculas y minúsculas. ¿Os ha molao el truco del almendruco? Pues a ver quién es capaz de explicarme cómo funciona :mrgreen:
Imagen

Avatar de Usuario
wf19
Habitual
Habitual
Mensajes: 194
Registrado: 03 Sep 2009, 02:12

Re: [Curso] Introducción a la programación en C (VII)

Mensaje por wf19 »

Dood!, aca mi trabajo preliminar:

Primer trabajo:
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main ()

{
   int num;

   printf("Porfavor introduzca un numero entre 0 y 100:\n");
   scanf("%d", &num);
   num = num/10;

      //Por si no "leyo" bien
      if (num > 10)
         {printf ("Joer, que era un numero entre 0 y 100, vuelve a ejecutar ^^");
         return 0;}

   switch (num)
   {
   case 1:
   printf("Esta en la primera decena");
   break;

   case 2:
   printf("Esta en la segunda decena");
   break;

   case 3:
   printf("Esta en la tercera decena");
   break;

   case 4:
   printf("Esta en la cuarta decena");
   break;

   case 5:
   printf("Esta en la quinta decena");
   break;

   case 6:
   printf("Esta en la sexta decena");
   break;

   case 7:
   printf("Esta en la septima decena");
   break;

   case 8:
   printf("Esta en la octava decena");
   break;

   case 9:
   printf("Esta en la novena decena");
   break;

   case 10:
   printf("Esta en la decima decena, xD");
   break;
   }
   return 0;
}


El segundo:

Spoiler:

Código: Seleccionar todo

#include <conio.h>

int main()

{
   int numa, numb, numc, opc;
   printf("Porfavor introduzca 2 numeros:\n");
   scanf("%d", &numa);
   scanf("%d", &numb);

   printf("\nAhora seleccione lo que desea hacer:\n");
   printf("1.-Sumarlos\n2.-Restarlos\n3.-Multiplicarlos\n4.-Dividirlos\n");
   scanf("%d", &opc);

   switch (opc)
   {case 1:
   numc = numa + numb;
   printf("El resultado es: %d", numc);
   break;

   case 2:
   numc = numa - numb;
   printf("El resultado es: %d", numc);
   break;

   case 3:
   numc = numa * numb;
   printf("El resultado es: %d", numc);
   break;

   case 4:
   printf("El resultado es: %d", numc);
   break;}

   getch();
   }

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

Re: [Curso] Introducción a la programación en C (VII)

Mensaje por arisma »

Mirlo_PJ escribió:
arisma escribió:Pero en el primero te has saltado 1 y se te ha descuadrado, jeje. Repasalo.

En el segundo no muestras el resultado.

Bien hecho. Veremos lo que dice el profe.


En el primero no me deja poner "0, 1" y lo deje en 0 y en el segundo lo muestra directamente en la seleccion despues de cada "case" ;)


Efectivamente me refería a case 0 y case 1, ten en cuenta que tal como lo tienes, cuando pones 1 no te dice la decena sino que sale el mensaje por defecto como si pusieras 50. Además por saltartelo fíjate en lo que te ha pasado los 2x te sale como decena 2, y realmente es la decena 3 y así con los consecutivos.

M0squit0, sé lo de Microsoft, pero es que lo tengo instalado y por no petarlo más, no te preocupes que ya tengo más herramientas, pero ya veremos cuando termine de configurar el Ubuntu, jeje.

Respecto al tema de las mayúsculas, es más o menos sencillo. Le estamos sumando el valor ASCII del espacio.

Para ello, miramos una tabla ASCII para ver que curiosamente las minúsculas tienen un valor ascii mayor que las mayúsculas.
En cual comienza las minúsculas? En 97 efectivamente.
Lo que estamos haciendo es ver si es inferior a 97, es decir, mayúsculas y si es así le sumamos la diferencia de valor que hay entre mayúsculas y minúsculas que es 32(0x20), que precisamente es el valor del espacio(SPACE).

Se podría haber controlado para que sólo sumara el valor si era mayúsculas, pero tampoco parece algo fundamental en este caso. Hay que tomar nota de la pista para aplicarla según necesitemos. Gracias.

wf19

Creo que debería modificar el primer ejercicio sin el if, aunque tiene el mismo problema que el case. Por ejemplo, el número 101, al dividirlo entre 10 da 10,1 que truncando
los decimales sale 10. Y lo va a dar por bueno.

Pero parece mejor no duplicar, ya que simplemente con dejarlo en la etiqueta default nos valdría. Es buena idea usar el if, para descartar ese problema, pero para ello
deberías comparar el número antes de dividir. Es decir,

Código: Seleccionar todo

   //scanf(...);
   if (num > 100 || num < 0)  {
      //printf(...);
      //return 0;
   }


Lo que sí está incorrecto son las decena, no tienes en cuenta del 0..9, y el 1 debe ser la segunda decena, el 2 tercera decena y etc...

Respecto al segundo ejercicio, parece que está correcto a excepción del caso 4(división), en el que no está la operación realizada, jaja.

Falta

Código: Seleccionar todo

   //Ojo yo controlaría la división entre 0
   numc = numa / numb;

Responder