martes, 31 de mayo de 2016

Codigo para saber si un numero es par o impar

Diario de un programador. Anexo B: Códigos


Par o impar: Clásico ejercicio de programación que sirve para saber si un numero es par o impar.


C
Programa utilizado: Code Blocks 13.12


#include<stdio.h>

int main(void){
  int numero;

  printf("Ingresa un numero: ");
  scanf("%d",&numero);

  if(numero % 2 == 0){
    printf("Es par\n");
  }
  else{
    printf("Es impar\n");
  }
return 0;
}
//Escrito por Gustavo J. Cerda Nilo, diciembre 2015


JAVA
Programa utilizado: Net Beans 8.0.1

import java.util.Scanner;
public class parImpar {
  public static void main(String[]args){
    Scanner ingreso = new Scanner(System.in);
    int numero;
    
    System.out.print("Ingresa un numero: ");
    numero = ingreso.nextInt();

    if(numero % 2 == 0){
        System.out.println("Es par");   
    }   
    else{
        System.out.println("Es impar");
    }
  }//fin main   
}//fin class

//Escrito por Gustavo J. Cerda Nilo, diciembre 2015


PYTHON 3.5
Programa utilizado: Idle

numero = int(input("Ingresa un numero: "))

if numero % 2 == 0:
    print("Es par")
else:
    print("Es impar")

#Escrito por Gustavo J. Cerda Nilo, diciembre 2015

SMALL BASIC
Programa utilizado: Small Basic 1.1

TextWindow.WriteLine("Par o impar")
TextWindow.Write("Ingresa un numero ")
numero = TextWindow.ReadNumber()

If Math.Remainder(numero,2) = 0 Then
  TextWindow.WriteLine("Es par")

Else
  TextWindow.WriteLine("Es impar")
EndIf

'Escrito por Gustavo J. Cerda Nilo, Junio 2015


Capítulo 32: PHP. Operadores de comparación, operadores logicos, instrucción IF, Switch, case, break


Diario de un programador día 76

Operadores de comparación...

¿Pero qué pasó con la lectura desde el teclado que se seguía con los otros lenguajes? Bueno, por lo que estuve leyendo, eso en php se logra con formularios y los formularios se verán en su oportunidad. Así que desde ahora, poco a poco se empezarán a ver aspectos individuales de cada lenguaje pero siempre trataré de ir casi a la par.

Operadores lógicos


Condiciones. El operador IF

Esta vez se verá la sintaxis de cómo utilizar la instrucción IF. Esta sintaxis es así:

<? php
if (condicion a evaluar){
    condición se cumple;
}
else {
    condición no se cumple;
}
?>

Ejemplo:


La línea 1 marca el inicio del código php. En la línea 2 y 3 se declaran variables. En la línea 5 se usa la condición IF, la cual según su sintaxis, la expresión a evaluar debe ir encerrada entre paréntesis. Luego, se debe abrir una llave {. Esta llave puede ir tanto en esta línea como en la línea siguiente. Por preferencia personal, a mi me gusta colocarla en este lugar. La línea 6 mostrará el resultado en caso de que la condición a evaluar haya sido verdadera. En la línea 7 se muestra la llave de cierre } la cual indica que no se ejecutarán más instrucciones. Todo lo que esté dentro de las llaves { } se ejecutará si la condición es verdadera o se cumple.
En la línea 8 va la instrucción ELSE, la cual ejecutará todo el contenido que se encuentre entre llaves { } si la condición a evaluar es falsa o no se cumplió. La línea 11 marca el fin del código php.

Como dije al principio, desde ahora se empezarán a ver poco a poco las características de cada lenguaje, pero principalmente en php, ya que al estar ligado a páginas web y bases de datos, se tendrán que aprender cosas muy distintas a lo que se verán en otros lenguajes. 
  
Instrucción Switch - Case

Esta instrucción, es como una variante o forma abreviada de la instrucción IF, ya que lo que hace es dar varias opciones a mostrar dependiendo del valor de la variable. Se da preferencia al uso de Switch por sobre IF cuando habría que colocar muchas condiciones del tipo IF, entonces para que no se vea "un poco" desordenado o un código muy largo, es que se opta por esta instrucción. Por esta misma razón hay que tener en cuenta que lo que se puede lograr con una instrucción Switch, perfectamente se puede lograr con una instrucción IF.
La sintaxis de esta instrucción va de esta forma:

variable = 1
switch (variable){
    case 1:
        ejecutar instrucciones;
        break;
    case 2:
        ejecutar instrucciones;
        break;
    default:
        ejecutar instrucciones;
        break;
}

Al igual que la instrucción IF, la instrucción switch ejecutará una determinada acción en caso de que la variable sea verdadera o se cumpla. En este caso se muestra que la variable vale 1, por lo tanto se ejecutará el "case 1" conjuntamente con todas sus instrucciones. Notar y no olvidar colocar los 2 puntos (:) al final de la instrucción "case". Al final de cada bloque "case" se debe colocar la instrucción "break", que sirve para salir de la instrucción switch. Si no se coloca el break, se seguirán ejecutando todas las instrucciones case que siguen a continuación, o sea el case 2, 3, etc. Más abajo aparece la instrucción "default". Esta se ejecutará en caso que la variable sea distinta a todos los otros case. Por ejemplo, si tengo un menú con tres opciones, algo así:

opcion 1
opcion 2
opcion 3

Y le pido al usuario que ingrese el nombre de alguna opción. En caso de que el usuario ingrese una opción que no corresponde, yo puedo indicar mediante la instrucción "default" que la opción ingresada no existe o no es válida.  Funciona de manera similar a la instrucción "else".
  
Otro ejemplo:

variable = "user"
switch (variable){
    case "user":
        ejecutar instrucciones;
        break;
    default:
        ejecutar instrucciones;
        break;
}

Aquí se está evaluando si la variable tiene la cadena "user". En caso de ser cierto esto, ejecutará las instrucciones correspondientes y en caso contrario, ejecutará las instrucciones "default".
Supongo que para no complicar las cosas, en Small Basic no incluyeron esta instrucción debido a que como dije antes, se puede lograr exactamente lo mismo con la instrucción IF.

Ahora veré como queda esto en código PHP

<?php
  $numero = 5;

  switch($numero){
      case 1:
        echo "La variable vale 1";
        break;
                 
      case 5:
        echo "La variable vale 5";
        break;
                              
      case 3:
        echo "La variable vale 3";    
        break;
               
      default:
         echo "La variable tiene otro valor";
         break;
  }
?>

Si todo sale como pienso que saldrá, entonces me mostrará como resultado "La variable vale 5". A ver, voy a abrir el navegador, a cargar el trabajo y...
Muy bien !!!.

Si se cambia el valor de la variable, entonces como es de suponer cambiará el resultado a mostrar. Para ver que todo funciona, cambiaré el valor de la variable a todos los valores case que puse.
Empezaré con cambiar el valor de la variable numero que vale 5 y le colocaré un valor de 1...


Guardo los cambios, recargo la página y ...

Bien !!!
Ha funcionado como se esperaba. Ahora con el case 3...

Ok. Ahora por último, agregaré un valor que no existe en los case para hacer funcionar la instrucción "default". Asignaré un valor de 10 a la variable numero y veré que pasa.

Funcionó como se esperaba. Eso es cuanto a esta instrucción.
Hasta la próxima :)

Gustavo J. Cerda Nilo
Enero 2016, última actualización Mayo 2016




Capítulo 31: Python. Ingreso desde el teclado


Diario de un programador día 75

Lectura desde el teclado.

Es el turno de python. Se verá como leer datos desde el taclado. Para ello se utilizará la función input()
Lo primero que se hará, será solicitar un número al usuario y luego este será mostrado en pantalla.
num1 = int(input("Ingresa un numero: "))
print ("El numero ingresado es", num1)


En la línea 1 se puede apreciar que la función fue asignada a la variable num1. Luego, la sintaxis dice que si se va a solicitar un número entero, se debe anteponer "int". La línea 2 muestra el contenido de la variable num1
Si fuese un decimal lo que debe guardar la variable, entonces se coloca float antes del input.
Ejemplo:

num1 = float(input("Ingresa un decimal: "))
print ("El numero ingresado es", num1)

Y si se tratase de una cadena, entonces no se coloca nada, va el input solo.
Ejemplo:

cadena = input("Ingresa una palabra o frase: ")
print ("La palabra o frase es:", cadena)


Como se puede apreciar, no hay problemas para manejar palabras o frases. No hay que agregar nada adicional para que la variable acepte una palabra o frase a diferencia de lo visto en C o C++.

¿Y si se intercalan datos entre números y cadenas, habrá problemas de buffer?.... Veamos

palabra = input("Ingresa una palabra: ")
entero = int(input("Ingresa un entero: "))
frase = input("Ingresa una frase: ")
decimal = float(input("Ingresa un decimal: "))

print ("La palabra es:", palabra)
print ("El entero es:", entero)
print ("La frase es:", frase)
print ("El decimal es:", decimal)


Este es el resultado. Todo salió sin problemas.

Quizás a más de alguien se le haya pasado por la mente, que pasa si un usuario ingresa un dato que no se le está solicitando, como puede ser por ejemplo que si yo solicito un entero y el usuario ingresa un decimal. Como se puede ver en el último programa que solicita distintos tipos de datos, si se ingresa un dato que no corresponde, el programa se interrumpe y muestra un mensaje de error. Este tipo de situaciones no sucede (al menos no con demasiada frecuencia) en Small Basic, ya que ese lenguaje tiene un control de excepciones interno que se encarga de ese tipo de situaciones y evita que el usuario ingrese un dato que no se le está solicitando. En python, el control de excepciones debe ser puesto por el programador y eso es algo que se verá en los próximos capítulos.
Hasta la próxima clase.

Gustavo J. Cerda Nilo
Enero 2016, última actualización Mayo 2016




viernes, 27 de mayo de 2016

Capítulo 30 C++: Lectura desde el teclado


Diario de un programador día 74

Lectura desde el teclado.

En esta ocasión se verá como solicitar información al usuario, guardarla en una variable y luego mostrarla en pantalla. (Al igual que en las clases anteriores con los otros lenguajes)
Para leer datos se utilizará el objeto de flujo de entrada std::cin y el operador de extracción de flujo >> para obtener los datos ingresados por el usuario.
std::cin
Para tratar de entender este objeto, se empezará con un pequeño ejemplo, el cual solicitará un número entero y luego lo mostrará en pantalla:

#include<iostream>
int main(){
  int num1;

  std::cout << "Ingresa un numero: ";
  std::cin >> num1;
  std::cout << "El numero es: " << num1 << std::endl;

return 0;
}

Otro ejemplo.  Esta vez se solicitarán dos números, se sumarán y se mostrará el resultado en pantalla.

#include <iostream>
  int main(void){
  int num1, num2;

  std::cout << "Ingresa un numero ";
  std::cin  >> num1;

  std::cout << "Ingresa otro numero ";
  std::cin  >> num2;

  std::cout << "La suma es " << num1 + num2 << std::endl;
  return 0;
  }


Y aquí otro ejemplo, pero esta vez un número y una cadena:

#include <iostream>
  int main(void){
  int num1;
  char palabra[20];

  std::cout << "Ingresa un numero  ";
  std::cin  >> num1;

  std::cout << "Ingresa una palabra  ";
  std::cin  >> palabra;

  std::cout << "Numero: " << num1 << std::endl;
  std::cout << "Palabra: " << palabra << std::endl;
  return 0;

  }


Esto al parecer se ve bien, se solicitó un número y luego una palabra, entonces el resultado fue mostrado en pantalla. Hasta hora todo bien pero, ¿si en vez de escribir una palabra escribo una frase?. Probaré con una compuesta por dos palabras, utilizaré el reconocido mensaje "hola mundo"... veamos:

La palabra "hola mundo" salió cortada, imprimiendo solamente "hola". Esto mismo ocurre con scanf() en el lenguaje C., lo que ocurre es que cin lee hasta encontrar un retorno de carro o un espacio en blanco, por lo que al dejar el espacio entre "hola mundo", simplemente ignoró todo lo que seguía después, dejando la parte sobrante en el buffer (memoria). Una solución a este problema es utilizar cin.getline(variable, nro.caracteres). Ejemplo:

#include <iostream>
    int main(void){
    char frase[50];

    std::cout << "Ingresa una frase: ";
    std::cin.getline(frase, 50);
    std::cout << "Frase: " << frase << std::endl;

    return 0;
  }


Muy bien!!! ahora si leyó la frase completa. Bueno, ahora que ya se pueden leer frases, se tratará de arreglar el programa anterior a ver qué sorpresa ocurre. En C, C++ es casi "normal" que ocurran cosas inesperadas o que una vez que se arregla una cosa, dos se echan a perder jajaja.  A ver...

#include <iostream>
  int main(void){
  int num1;
  char frase[50];

  std::cout << "Ingresa un numero ";
  std::cin  >> num1;

  std::cout << "Ingresa una frase: ";
  std::cin.getline(frase, 50);

  std::cout << "Numero: " << num1 << std::endl;
  std::cout << "Frase: " << frase << std::endl;
  return 0;
  }


A ver que acaba de ocurrir. El programa no permitió que ingresara la frase, "comiéndose" la instrucción siguiente. Esto ocurrió debido a que cin.getline, tomó o leyó (como prefieras llamar) el retorno de carro de la instrucción anterior que quedó almacenada en el buffer y la utilizó como si fuese el carácter ingresado por mi (aunque en realidad, si lo ingresé, ya que es la manera de aceptar el dato ingresado en la instrucción anterior, pero no quería que fuese utilizado de esta manera). Para arreglar este inconveniente, se puede utilizar cin.ignore(), el cual sirve para sacar o extraer lo que quedó en el buffer, en este caso el "Enter" o retorno de carro.

#include <iostream>
  int main(void){
  int num1;
  char frase[50];

  std::cout << "Ingresa un numero ";
  std::cin  >> num1;

  std::cin.ignore();
  std::cout << "Ingresa una frase: ";
  std::cin.getline(frase, 50);

  std::cout << "Numero: " << num1 << std::endl;
  std::cout << "Frase: " << frase << std::endl;
  return 0;
  }


Ahora sí. El limpiar la memoria logró el resultado buscado.

Algo que me he dado cuenta, es que estos errores de buffer, suceden a menudo que se intercalan solicitudes de ingreso entre números y cadenas. Por ejemplo, si solamente solicito datos numéricos, por lo general (siempre hay excepciones) no hay problema. Por otra parte si solamente solicito cadenas, tampoco se producen mayores inconvenientes. Colocaré un par de ejemplos de esto:

#include <iostream>
  int main(void){
  int num1, num2, num3;

  std::cout << "Ingresa un numero ";
  std::cin  >> num1;

  std::cout << "Ingresa otro numero ";
  std::cin  >> num2;

  std::cout << "Ingresa el ultimo numero ";
  std::cin  >> num3;

  std::cout << "Numero 1: " << num1 << std::endl;
  std::cout << "Numero 2: " << num2 << std::endl;
  std::cout << "Numero 3: " << num3 << std::endl;
  return 0;
  }


No hubo necesidad (aparente) de limpiar el buffer.
Otro ejemplo. Ahora con cadenas.

#include <iostream>
  int main(void){
  char cadena1[20], cadena2[20], cadena3[20];

  std::cout << "Ingresa una frase: ";
  std::cin.getline(cadena1,20);

  std::cout << "Ingresa otra frase: ";
  std::cin.getline(cadena2,20);;

  std::cout << "Ingresa la ultima frase: ";
  std::cin.getline(cadena3,20);

  std::cout << "Cadena 1: " << cadena1 << std::endl;
  std::cout << "Cadena 2: " << cadena2 << std::endl;
  std::cout << "Cadena 3: " << cadena3 << std::endl;
  return 0;
  }


Como se puede ver, esta vez cin.getline se "comporto de buena forma" y no se "comió" el retorno de carro como sí ocurrió cuando se ingresó un dato de tipo numérico.

Para terminar esto del ingreso por teclado, cabe mencionar que C++ también acepta las funciones de C, tales como scanf(), fgets() y varias más que rondan por ahí. Otra que mencionaré antes de terminar es la clase string, la cual permite(entre muchas otras funciones) utilizar la función getline(std::cin, variable), la que permite también leer frases. Un ejemplo de esta clase:

#include <iostream>
#include <string>

  int main(void){

  std::string frase;

  std::cout << "Ingresa una frase: ";
  getline(std::cin, frase);

  std::cout << "Frase: "   << frase   << std::endl;

  return 0;
  }
Poner atención en la forma en que se declara la variable, se utiliza un std::string, no siendo necesario declarar un arreglo a esa variable, ya que no es un arreglo de caracteres.


Hay mucha información en la web, lo malo es que no siempre es fácil de ubicar y muchas veces paso horas tratando de solucionar problemas como estos presentados ahora. Hasta la próxima.

Gustavo J. Cerda Nilo
Enero 2016, última actualización Mayo 2016




Capítulo 29: C. Lectura desde el teclado


Diario de un programador día 73

Lectura desde el teclado.

En esta ocasión se verá como solicitar información al usuario, guardarla en una variable y luego mostrarla en pantalla.
Para leer datos se utilizará en primera instancia la función scanf, la cual se utilizará para leer datos numéricos, pero para leer cadenas se utilizará la función fgets, que es más segura que scanf, aunque con scanf también se pueden leer cadenas, pero como dije, en este caso se utilizará fgets que es más seguro y será explicado más abajo.
scanf()
Para tratar de entender esta función, se empezará con un pequeño ejemplo, el cual solicitará un número entero y luego lo mostrará en pantalla:

#include <stdio.h>
int main(void){

  int num1;
  printf("Escribe un numero: ");
  scanf("%d", &num1);
  printf("El numero ingresado es: %d", num1);

return 0;
}



La función scanf() tiene dos argumentos, %d y &num1. El primer argumento es la cadena de control de formato, que indica el tipo de dato que debe ser escrito por el usuario, en este caso un entero. El segundo argumento empieza con el signo ampersand (&), llamado el operador de dirección,  seguido de una variable. El ampersand al ser combinado con una variable, le indica a scanf la dirección de memoria en la cual está almacenada la variable (en este caso num1), para luego almacenar el valor de esa variable en esa posición de memoria. No olvidar el ampersand, a pesar de que el programa compila y se ejecuta, dará error al momento de ingresar un número, ya que no podrá asignar la memoria en forma adecuada.

El poder trabajar directamente con la memoria hace que el lenguaje C gane en rendimiento en comparación con otros lenguajes a la hora de producir programas, lo que lo hace ideal cuando se desea trabajar a nivel de hardware.
Aquí otro ejemplo para seguir avanzando:

#include <stdio.h>
int main(void){
  int num1, num2;
  printf("Escribe un numero: ");
  scanf("%d", &num1);
 
  printf("Escribe otro numero: ");
  scanf("%d", &num2);
 
  printf("num1 = %d, num2 = %d\n", num1, num2);

return 0;
}




Este programa solicita dos números y luego los muestra en pantalla.
Por último, una operación entre ellos:


#include <stdio.h>

int main(void){

  int num1, num2, num3;
  printf("Escribe un numero: ");
  scanf("%d", &num1);

  printf("Escribe otro numero: ");
  scanf("%d", &num2);

  num3 = num1 + num2;
  printf("%d + %d = %d\n", num1, num2, num3);

return 0;
}
 


fgets()

Esta función, también permite leer desde el teclado y es mucho más segura para leer cadenas que scanf, debido a que es muy probable que se produzca un desbordamiento de memoria o que se sobre escriban sectores de memoria que no se debería, etc.

Aquí un ejemplo de su uso:



#include <stdio.h>
int main(void){
  char palabra[5];
  printf("Ingresa una palabra: ");
  fgets(palabra, 5, stdin);

  printf("La palabra es %s\n", palabra);
  return 0;
}
 


fgets() utiliza tres argumentos, el primero es el nombre de la variable, el segundo el largo de la cadena -1 y por último el flujo de entrada, en este caso se utiliza el teclado (stdin). Que el largo de la cadena sea -1 significa en este caso, al ser 5, que solamente leerá 4 caracteres. Si el largo de la cadena supera el número de caracteres permitidos, entonces la palabra quedará cortada. En caso de que el largo de la cadena sea inferior, la cadena terminará con un salto de línea. Si no interesa que genere un salto automático de línea, entonces está bien, pero si por algún motivo no se desea que realice un salto al finalizar la frase, se puede hacer lo siguiente:



if (variable[strlen(variable)-1] == '\n')
  variable[strlen(variable)-1] = '\0';


Nota: Para ocupar strlen se debe incluir la cabecera string.h

Ejemplo:

#include <stdio.h>
#include <string.h>

int main(void){
  char palabra[10];
  int num;
 
  printf("Ingresa una palabra: ");
  fgets(palabra, 10, stdin);
  if (palabra[strlen(palabra)-1] == '\n')
    palabra[strlen(palabra)-1] = '\0';

  printf("Ingresa un numero: ");
  scanf("%d", &num);

  printf("La palabra es %s. El numero es %d\n", palabra,num);
  return 0;
}


Este programa lo que hace es solicitar el ingreso de una palabra  o frase y un numero, para luego mostrar ambos ingresos en una misma línea.
Si se escribe una palabra con 9 caracteres o menos incluyendo espacios, entonces no habrá problemas con el programa y no realizará el salto de línea al finalizar la frase, pero si se escribe una palabra con 10 caracteres o más, entonces ocurrirá uno de los problemas más comunes que pasan con la función scanf(), lo que hará será tomar el resto de los caracteres que quedaron en memoria y los utilizará como si fuesen un ingreso normal, lo que dará a lugar a errores. Es solo cosa de que intentes ingresar una palabra de 10 caracteres o más (en este caso) y verás lo que hace. 
A modo de ejemplo y para que vean que no miento XD, ejecutaré nuevamente el programa y cuando me solicite una palabra escribiré "hola mundo" y verán que pasa:

La frase "hola mundo" tiene 10 caracteres (9 letras y un espacio), entonces, al sobrepasar el límite, la última letra pasó a formar parte del buffer y fue utilizada para realizar el ingreso automático del número, generando el error que se muestra. El número que se muestra, podría ser cualquier cosa, como una dirección de memoria o algo más. En alguna oportunidad creo haber mencionado que en C se pueden producir errores inesperados. Y es que C no respeta nada, si C te pide un número y tu le entregas un caracter... te lo acepta, pero tu debes aceptar también los resultados. Esta situación lo hace algo peligroso, sobre todo si se trabaja en sistemas como linux, ya que C no te advierte nada. Si no estás pendiente de lo que haces, facilmente te puedes "cargar" tu disco duro sobreescribiendo la tabla de partición. Si tu dices "Quiero que escribas en tal lugar", C te dirá "ok, escribo en tal lugar". Así que ten cuidado, por ahí alguien dijo "Echar a perder un disco duro no es una posibilidad, es una probabilidad, así que haz respaldo de tus archivos de vez en cuando"
Volviendo a lo nuestro. Es por esto que hay que tener cuidado al utilizar scanf en combinación con funciones que lean cadenas, (En realidad, es mejor no hacerlo). Otro de los problemas con scanf que no mencioné es que tiene problemas para leer frases. Esto es debido porque toda frase está separada por espacios.
La función scanf dice que solo leera caracteres hasta que encuentre un “Enter” o un “espacio” y al encontrar cualquiera de las dos situaciones, no seguira "leyendo" y todo lo que se haya escrito despues del espacio en blanco quedará en memoria (buffer) disponible para un proximo ingreso. Con fgets no hay problemas en leer frases siempre y cuando el argumento del largo de la cadena lo permita. En resumen.
Scanf() para números y fgets() para cadenas. Hasta la próxima.

Gustavo J. Cerda Nilo
Enero 2016, última actualización Mayo 2016
 



C++ El apuntador This

El apuntador This En C++, cada objeto tiene acceso a su propia dirección a través de un puntero o apuntador denominado This. Lo...