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

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

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

Mensaje por m0skit0 »

Ok ok a ver si saco algo de tiempo, que ando justo justo...
Imagen

Avatar de Usuario
CARDIHO
Enteradillo
Enteradillo
Mensajes: 67
Registrado: 02 Feb 2011, 17:15

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

Mensaje por CARDIHO »

:chapao: :D

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 (VIII)

Mensaje por m0skit0 »

Buf... va:

CARDIHO escribió:profe me da un consejo que distribución de linux me aconsejaría para mi que soy noob en linux o ¿estoy bien con ubuntu?.

Ubuntu perfecto :)

CARDIHO escribió:¿Por que es considerado mala practica?

Porque resta legibilidad. Uno al ver un bucle while espera que lo que marca el final es la condición del while. Si pones breaks, returns dentro, dificultas a quien lea el entender qué está haciendo el programa.

m0skit0 escribió:No hace falta hacer 2 llamadas a printf().

Nada, olvídalo :mrgreen:

CARDIHO escribió:Ejercicio 2

Eso no funciona... ¿Lo has probado?

CARDIHO escribió:Ejercicio 5

No hagas return dentro del while! :lol:

dark_sasuke escribió:Primer ejercicio

¿Por qué haces tantas comparaciones? Intenta comprobar primero si es mayor que 20 y luego si es par, e imprimes ambas cosas ;)

dark_sasuke escribió:Segundo ejercicio [...] Numero1+Numero2/2

Uy, uy, uy, ojito ojito... ¿No prestas atención en las clases de aritmética, eh? :katana:

dark_sasuke escribió:Tercer ejercicio [...] else if(Suma%2 == 1)

El resto de dividir por 2 sólo puede ser 0 o 1. Si no es 0, por tanto es 1 ;) Te sobra la condición.

dark_sasuke escribió:Cuarto ejercicio

No está mal, pero ¿por qué sigues corriendo el bucle cuando ya sabes que no es primo?
Imagen

Avatar de Usuario
CARDIHO
Enteradillo
Enteradillo
Mensajes: 67
Registrado: 02 Feb 2011, 17:15

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

Mensaje por CARDIHO »

m0skit0 escribió: Ubuntu perfecto :)

Gracias profe, ya no soy tan noob :pinta: .

m0skit0 escribió:Porque resta legibilidad. Uno al ver un bucle while espera que lo que marca el final es la condición del while. Si pones breaks, returns dentro, dificultas a quien lea el entender qué está haciendo el programa.

¿Entonces tampoco debo de poner la función continue verdad?

m0skit0 escribió:Eso no funciona... ¿Lo has probado?

Ya hice otro

m0skit0 escribió:No hagas return dentro del while! :lol:

ok

Ejercicios:

1:
Spoiler:

Código: Seleccionar todo

#include <stdio.h>


int main()
{

  int numero;
 
 
  printf("Introduce un numero por favor\n");
  scanf("%d", &numero);
 
  if ((20 > numero) && (0 == numero % 2))
  {
 
    printf("Tu numero es menor que 20 y es un numero par\n");
    
  }
 
  else
  {
 
    printf("Tu numero no es par o no es menor que 20\n");
   
  }
 
 
  return 0;
 
}


2:
Spoiler:

Código: Seleccionar todo

#include <stdio.h>



int main()
{

  float numero_1, numero_2;
 
  printf("Introduce un numero real: ");
  scanf("%f", &numero_1);
  printf("Introduce otro numero real: ");
  scanf("%f", &numero_2);
 
  printf("Se haran las siguientes operaciones: suma, media, multiplicacion\n");
 
  float suma = numero_1 + numero_2;
  float media = suma / 2;
  float multiplicacion = numero_1 * numero_2;
 
  if ((20 < suma) && (20 < media) && (20 < multiplicacion))
  {
 
    printf("Suma: %.1f es mayor que 20\n", suma);
   printf("media: %.1f es mayor que 20\n", media);
   printf("multiplicacion: %.1f es mayor que 20\n", multiplicacion);
   
  }
 
  else
  {
 
    printf("Alguna de las operaciones es menor que 20\n");
   
  }
 
 
  return 0;
 
}


3:
Spoiler:

Código: Seleccionar todo

#include <stdio.h>


int main()
{

  int numero1, numero2;
 
  printf("Introduce un numero entero: ");
  scanf("%d", &numero1);
  printf("Introduce otro numero entero: ");
  scanf("%d", &numero2);
 
  int suma = numero1 + numero2;
  int i = 1;
 
  while (i++ < suma)
  {
   
   
    if (0 == suma % 2)
   {
   
     printf("%d\n", i++);
    
   }
   
   else
   {
   
     printf("%d\n", ++i);
    
   }
   
   
  }
 
 
  return 0;
 
}


m0skit0 escribió:Ejercicio 4: correcto pero se puede optimizar porque haces demasiadas operaciones superfluas. Ahora compruebas si el número introducido es divisible por todos los números más pequeños que él. Ahora te pregunto: ¿sabes de algún número N que sea divisible por un número mayor que N/2 (y que no sea él mismo, claro)? ¿Por qué crees que ocurre esto?

No logro optimizarlo, y tampoco no entiendo muy bien lo que quiso decir con esto ( ¿sabes de algún número N que sea divisible por un número mayor que N/2 (y que no sea él mismo, claro)? ¿Por qué crees que ocurre esto?)

5:
Spoiler:

Código: Seleccionar todo

#include <stdio.h>



int main()
{

  int numero_secreto, numero_introducido;
 
 
  printf("Jugador 1 introduce un numero entre el 0 y el 10\n");
  scanf("%d", &numero_secreto);
 
  int i = 1;
 
  do
  {
 
    printf("Jugador 2 intenta adivinar el numero del jugador 1\n");
   printf("introduce un numero del 0 al 10\n");
   printf("Intento %d de 5: ", i);
   scanf("%d", &numero_introducido);
   
   if (numero_introducido == numero_secreto)
   {
   
     printf("Felicidades has ganado\n");
     i = 6;
    
   }
   
   
   else
   {
   
     switch (i)
     {
    
       case 1:
            printf("Por poco jejeje XD");
           break;
      case 2:
            printf("Creo que mi abuelita puede mas que tu\n");
             break;
      case 3:
            printf("Que sorpresa a un no puedes\n");
           break;
      case 4:
            printf("no eres muy bueno\n");
           break;
      case 5:
            printf("Game over\n");
           break;
          
     }
   
      
   }
   
   
  }
  while (5 >= ++i);
 
 
  return 0;
 
}


Saludos profe, cuídese

Avatar de Usuario
largeroliker
Administrador
Administrador
Mensajes: 8283
Registrado: 03 Sep 2009, 09:46
PSN ID: larger0o
Gamertag Xbox Live: larger0o
Steam ID: larger0o
Twitter: larger0o
Ubicación: Málaga
Contactar:

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

Mensaje por largeroliker »

Sobre el 1:

Ya no me acuerdo si en C se podía (me lío con los lenguajes :lol:) pero cuando sólo hay una orden a ejecutar dentro de un if, no es necesario poner llaves. Yo ya me he acostumbrado a eso, así reduzco líneas de código que luego se agradecen :lol:

Eso sí, como intentes poner una segunda orden (ya sea definitiva o debug), si no pones llaves te fallará.
Imagen
Steam Deck · Xbox Series X · PS5 · Switch · PS Vita · WiiU · PS3 · new 3DS XL · Xbox 360 · PSP · PS2

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 (VIII)

Mensaje por m0skit0 »

CARDIHO escribió:¿Entonces tampoco debo de poner la función continue verdad?

Tanto break, como return como continue son instrucciones (que no funciones) útiles, hay que saber cuándo usarlas y cuándo no hacen falta o simplemente es contraproducente. Hay ocasiones en las que usar break es mejor que no usarlo, por ejemplo un bucle con muchas condiciones.

Código: Seleccionar todo

while ((a != b) && (c % 2 == 0) && !d && !(e || f))

Esto es menos legible y mantenible que

Código: Seleccionar todo

while(a != b)
{
    if (c % 2 != 0) break;
    if (d) break;
    if (e || f) break;
}

Esto es mucho más claro a la hora de leerlo y modificarlo (mantenerlo).

Normalmente continue se usa igual que break, para comprobar condiciones del bucle, aunque su uso es muchísimo menos frecuente (no he usado continue nunca en ningún lenguaje en casi 20 años programando...).

CARDIHO escribió:3:

Uf, no me gusta nada eso de hacer 2 veces i++ en sitios diferentes por cada vuelta del bucle. Demasiado complicado para un problema tan sencillo. Esto lo lees dentro de una semana y no sabes lo que hace. Busca una solución más fácil y más entendible.

CARDIHO escribió:No logro optimizarlo, y tampoco no entiendo muy bien lo que quiso decir con esto

Tienes que prestar más atención en clase de matemáticas. Si quieres ser un buen programador, te tienen que gustar las matemáticas ;) Intenta mejorar la forma en la que piensas en números, eso te ayudará a ser mejor programador (ya que, al fin y al cabo, programar no es más que manipular números).

CARDIHO escribió:5:

No compruebas que el jugador 1 haya introducido el número en el rango especificado.

CARDIHO escribió:Saludos profe, cuídese

Gracias, igualmente :oki:

largeroliker escribió:pero cuando sólo hay una orden a ejecutar dentro de un if, no es necesario poner llaves

Uy uy uy, no. Sí se puede, prácticamente nunca hay que hacerlo. Poned SIEMPRE las llaves a los ifs, fors, whiles, etc... ¿Por qué? Porque los bugs que resultan de olvidarse de poner las llaves son luego un quebradero de cabeza. Imagina que yo escribo:

Código: Seleccionar todo

if (loquefuere)
    hazestootro();

Ahora 3 meses después tengo que modificar este if para que haga algo más. Me despisto (algo muy común en humanos) y pongo:

Código: Seleccionar todo

if (loquefuere)
    hazestootro();
    hazestonuevo();

Ahora lo llevo crudo porque hazestonuevo() se ejecutará SIEMPRE y no sólo cuando se cumpla la condición. Ahora pruebi el programa, hago que la condición se cumpla y parece que funciona correctamente. Lo subo a producción... Al día siguiente me despiden :lol: Esto en el mejor de los casos. Recemos para que el vice no programe el código para controlar una central nuclear :lol:

largeroliker escribió:Eso sí, como intentes poner una segunda orden (ya sea definitiva o debug), si no pones llaves te fallará.

Ojalá te fallara... El compilador no te avisará, y estarás como un lerdo buscando por qué falla durante 2 horas mínimo. Garantizado.
Imagen

Avatar de Usuario
largeroliker
Administrador
Administrador
Mensajes: 8283
Registrado: 03 Sep 2009, 09:46
PSN ID: larger0o
Gamertag Xbox Live: larger0o
Steam ID: larger0o
Twitter: larger0o
Ubicación: Málaga
Contactar:

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

Mensaje por largeroliker »

m0skit0 escribió:Esto en el mejor de los casos. Recemos para que el vice no programe el código para controlar una central nuclear :lol:

largeroliker escribió:Eso sí, como intentes poner una segunda orden (ya sea definitiva o debug), si no pones llaves te fallará.

Ojalá te fallara... El compilador no te avisará, y estarás como un lerdo buscando por qué falla durante 2 horas mínimo. Garantizado.

:lol: Por suerte llevo control en eso, todavía no he llegado a las 200 líneas de código en ningún programa :lol: y cuando quiero añadir una segunda orden siempre pongo las llaves. Como máximo me puede pasar que me coma una de las llaves :P
Imagen
Steam Deck · Xbox Series X · PS5 · Switch · PS Vita · WiiU · PS3 · new 3DS XL · Xbox 360 · PSP · PS2

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 (VIII)

Mensaje por m0skit0 »

Tú estás hablando de programación "amateur" y yo de programación profesional. No tiene nada que ver una cosa con otra ;)
Imagen

Avatar de Usuario
largeroliker
Administrador
Administrador
Mensajes: 8283
Registrado: 03 Sep 2009, 09:46
PSN ID: larger0o
Gamertag Xbox Live: larger0o
Steam ID: larger0o
Twitter: larger0o
Ubicación: Málaga
Contactar:

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

Mensaje por largeroliker »

m0skit0 escribió:Tú estás hablando de programación "amateur" y yo de programación profesional. No tiene nada que ver una cosa con otra ;)

Bueno, "amateur". No es programación profesional, pero tampoco lo hago en mi casa (ni en clase :P) :lol:
Imagen
Steam Deck · Xbox Series X · PS5 · Switch · PS Vita · WiiU · PS3 · new 3DS XL · Xbox 360 · PSP · PS2

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 (VIII)

Mensaje por m0skit0 »

Entonces hazme caso: más vale prevenir que curar. He visto programadores con mucha experiencia olvidarse de añadir las llaves. Dos llaves bien valen evitarse varias horas (o días en caso de novatos) de buscar por qué falla el programa.
Imagen

Responder