Herramientas de usuario

Herramientas del sitio


curso-cpp:introduccion

Introducción

¿Qué es una computadora?

Una computadora es un dispositivo electrónico [No es esencial que sea electrónico, pero todas las computadoras desde aproximadamente 1960 lo son. Las computadoras utilizadas en la segunda guerra mundial eran fundamentalmente electromecánicas] utilizado para procesar información y obtener resultados.

Los datos e información se pueden introducir en una computadora como entrada, y a continuación se procesan para producir una salida.

Los componentes físicos que constituyen la computadora forman el hardware.

Un conjunto de instrucciones que hacen funcionar a la computadora se denomina un programa. Se denomina programador a una persona que escribe programas.

El software es el conjunto de todos los programas de una computadora.

Organización de una computadora

Los componentes de una computadora pueden dividirse de la siguiente manera:

  • Dispositivos de entrada. Son los que permiten introducir datos en la compu, que irán a parar a la memoria (principal o externa). Algunos ejemplos son:
    • Teclados
    • Lectores de códigos de barras (utilizados por computadoras en supermercados)
    • Lápices ópticos
    • Joysticks
    • Mouse
    • Scanner
    • Micrófonos
    • Placas de red
  • Dispositivos de salida. Son los que permiten representar resultados del procesamiento de los datos. Algunos ejemplos son:
    • Pantalla
    • Impresoras
    • Parlantes
    • Placas de red
    • Motores eléctricos en las articulaciones de un robot
  • CPU (procesador). Dirige y controla todo el procesamiento y movimiento de la información. Se considera “el cerebro” de una computadora, por analogía con el cerebro humano.
  • Memoria principal (RAM):
    • Permite almacenar información y datos utilizados por la computadora en todos sus cálculos y procesamiento de datos.
    • Está compuesta de muchísimas celdas o unidades básicas de información (Típicamente bytes, compuestos por 8 bits, dígitos binarios).
    • Los datos en memoria RAM son temporarios: se pierden cuando la computadora se apaga.
  • Memoria externa:
    • Discos rígidos, disquetes, memorias SD, pendrives USB, cintas magnéticas.
    • Permite almacenar y recuperar información desde un medio de almacenamiento permanente (no se pierde al apagar la computadora).
    • Es en ella donde se guardan todos los archivos, que son unidades independientes con datos en memoria externa, guardados en una carpeta bajo un nombre.

El software (los programas)

Una computadora típica tiene, incluso antes de que la comencemos a utilizar, ya instalados muchos programas fundamentales para su funcionamiento, que forman el software de sistema.

Uno de los programas más importantes del software de sistema es el sistema operativo, que realiza tareas generales de control y coordinación entre los distintos programas, permitiendo a todos usar la misma computadora y organizando las distintas operaciones que puede querer llevar a cabo el usuario (Ejemplos de sistemas operativos son Microsoft Windows, GNU/Linux, Mac OS X, Android). También se encarga de cargar y poner en marcha los programas cuando el usuario quiere ejecutarlos.

Los programas que realizan tareas concretas que interesan al usuario (navegador de internet, sistema de contabilidad de una empresa, grabador de efectos de guitarra de un estudio musical, programas para realizar cálculos científicos, videojuegos, etc) se denominan programas de aplicación.

Para crear un programa de aplicación como los mencionados, un programador debe escribir las correspondientes instrucciones que indican a la computadora cómo operar, y estas se escriben en algún Lenguaje de programación (C,C++,Pascal, Java, C#, Haskell, Python, Javascript, Smalltalk, Go, Scala, y muchos, muchos otros).

La computadora solamente entiende las instrucciones en su propio lenguaje de máquina, que está compuesto solamente de ceros y unos y por lo tanto un humano no lo puede leer ni escribir fácilmente de manera directa (Esto es fácil de verificar abriendo un archivo ejecutable con un editor de texto). Para ello existen programas traductores (Los compiladores e intérpretes) que se encargan de traducir las instrucciones en el lenguaje de programación (que son las que entienden y usan los humanos) al lenguaje de máquina (ceros y unos). Un archivo ejecutable contiene un programa escrito en el lenguaje de máquina, y por eso puede ser ejecutado directamente por la computadora.

Los lenguajes de programación

Efectivamente, los programas son una “receta” o “lista de instrucciones” de qué hacer, que será seguida por la computadora. Al texto que describe estos programas, escrito en un cierto lenguaje de programación, se lo denomina código fuente.

Así como los mismos textos pueden escribirse en los distintos idiomas del mundo, y un mismo texto puede verse de manera muy diferente en cada uno de ellos; cada lenguaje de programación tiene sus reglas particulares sobre cómo se deben escribir las órdenes para la computadora.

El siguiente es un fragmento de programa en el lenguaje de programación C++ a modo de ejemplo:

int sumaDeLosDigitos(int numero)
{
    int sumaParcial = 0;
    while (numero > 0)
    {
        sumaParcial += numero % 10; // Suma la ultima cifra del numero al resultado intermedio "sumaParcial"
        numero /= 10; // Le borra la ultima cifra al numero
    }
    return sumaParcial;
}

Este es un ejemplo de programa sencillo que indica a la computadora cómo calcular la suma de los dígitos de un número dado cualquiera. Más adelante podremos entender bien los detalles de su funcionamiento, pero es importante ir destacando esta característica esencial de los programas, que es su generalidad: Al escribir un programa, le estamos enseñando a la computadora cómo procesar cualquier posible dato de entrada, de una manera general, y deberemos tener eso en cuenta al programar. El ejemplo anterior por ejemplo explica cómo obtener la suma de los dígitos de un número cualquiera, que en el código fuente se ha denominado “numero”.

La resolución de problemas con computadora

El proceso de resolución de un problema con una computadora conduce a la escritura de un programa y a su ejecución en la misma.

Aunque el proceso de diseñar programas es esencialmente un proceso creativo, se pueden considerar una serie de pasos o fases comunes a ser seguidos por todos los programadores.

  • Análisis del problema [Entender qué tenemos que hacer, pensar, pensar, analizarlo]
  • Diseño del algoritmo [Diseñar un método para resolverlo, una idea, tener claro el “cómo” es que se resuelve]
  • Codificación (“codeo”, “codear”, “escribir el programa”) [Escribir un programa que le explique ese “cómo” del paso anterior a la computadora]
  • Compilación y ejecución [Generar un archivo ejecutable y ejecutarlo en la computadora para obtener los resultados]
  • Verificación [Contrastar los resultados contra lo esperado en distintos casos de tests]
  • Depuración [Entender y corregir todos los errores en el programa que vayamos encontrando a raíz del paso anterior]
  • Documentación [Dejar explicado con claridad para futuros programadores y usuarios, qué hace, cómo funciona, y cómo se usa el programa creado] (Esto es por ejemplo el editorial de topcoder/codeforces, un buen tutorial, manual de usuario, gráficos y diagramas explicativos, etc).

Notar que no necesariamente se siguen estrictamente en ese orden (en proyectos grandes, nunca se hacen en orden sino que se hace “todo en paralelo todo el tiempo”), y en pequeños programas (como todos los que haremos, y todos los que se hacen en competencias de programación) es común que no se noten o incluso que falten algunos pasos, pero “la idea del proceso es esa, y siempre está presente”.

Mientras más tiempo se invierta en análisis y diseño del algoritmo, en general menos tiempo se invertirá en los demás pasos: conviene pensar y entender muy bien qué queremos hacer, antes de mandarse a escribir código en la computadora.

Un algoritmo es un método para resolver un problema mediante una serie de pasos precisos, definidos y finitos.

  1. Preciso : Está bien claro qué pasos hay que hacer, y en qué orden. No hay ambigüedad.
  2. Definido : Llega al mismo resultado cada vez que se lo ejecuta [Si no se cumple esta propiedad, se habla de algoritmos no deterministas]
  3. Finito : Tiene fin, el método termina siempre luego de realizar suficientes pasos, y no puede continuar “eternamente”.

O sea que un algoritmo es, en definitiva, una receta super recontra precisa. Como para que la entienda un robot super literal sin inteligencia. O sea, una computadora.

Ejercicio: Escritura de algoritmo

Escribir un algoritmo para que Agus pueda calcular la suma de los números desde 1 hasta N (un número cualquiera) usando la calculadora. Es decir, con N=3, al seguir el algoritmo Agus debería obtener 6 (Porque 1 + 2 + 3 = 6). Sin embargo con N = 5 se debería obtener 15 al finalizar el proceso.

Conocimientos de Agus:

  • Agus sabe contar hasta N (conoce el siguiente de un número, y sabe cuándo llega a N)
  • Agus sabe escribir un número en la calculadora.

Recuerde que para que sea un algoritmo, las órdenes deben ser bien precisas y exactas, y no pueden quedar libradas al “sentido común” de Agus (ya que Agus opera como un robot mecánico que sigue todo lo que le pidan literalmente).

Posibles soluciones (Escritura de algoritmo)

El siguiente es un posible algoritmo para darle a Agus (los pasos deben seguirse en orden uno a continuación de otro, a menos que se indique explícitamente lo contrario):

  1. Encender la calculadora con el botón “ON”.
  2. Comenzar con “1” como el número actual, e introducirlo en la calculadora.
  3. Si el número actual ya es N, saltar al paso 8.
  4. Avanzar el número actual al siguiente.
  5. Presionar el botón “+” de la calculadora.
  6. Introducir el número actual en la calculadora.
  7. Volver al paso 3.
  8. Presionar el botón “=” de la calculadora.
  9. En este paso, tenemos en el visor de la calculadora el resultado deseado.
  10. Apagar la calculadora con el botón “OFF”.

Otra manera muy similar de escribir este algoritmo es la siguiente:

  • Encender la calculadora con el botón “ON”.
  • Comenzar con “1” como el número actual, e introducirlo en la calculadora.
  • Repetir lo siguiente mientras que el número actual no sea N:
    • Avanzar el número actual al siguiente.
    • Presionar el botón “+” de la calculadora.
    • Introducir el número actual en la calculadora.
  • Presionar el botón “=” de la calculadora.
  • En este paso, tenemos en el visor de la calculadora el resultado deseado.
  • Apagar la calculadora con el botón “OFF”.

Si bien ambas descripciones son en este caso completamente equivalentes, esperamos que coincida en que la segunda es más clara. Preferiremos siempre descripciones que se basen en “procesos” y “repeticiones”, antes que en “números de línea” y “saltos” entre ellos, ya que resultan más fáciles de entender y modificar.

Notar que las instrucciones son bien precisas y específicas, y no dan lugar a cuestionamientos. ¿Son también precisas las instrucciones que propuso antes de ver estos ejemplos?

Notar también que estas instrucciones, al ser tan precisas, pueden ser inadecuadas para modelos de calculadora levemente distintos. Esto es normal en programación: una computadora procesa las instrucciones dadas literalmente y no tiene la “capacidad de adaptación” o “sentido común” de un ser humano a la hora de seguir lo indicado en un programa. Por eso ante cambios relativamente menores (como usar otro modelo de calculadora), es común tener que modificar el programa igualmente, porque la computadora no logra adaptarse por sí sola (a menos por supuesto, que mediante un programa... ¡Ya se le haya indicado con total precisión cómo debe hacer para adaptarse por sí sola ante un cambio! Eso es extremadamente difícil y es la tarea que llevan a cabo los investigadores en inteligencia artificial).

Análisis del problema

Cuando vayamos a resolver un problema en computadora lo primero que tenemos que lograr tener en claro es:

  • ¿Qué entradas se requieren (tipo y cantidad)?
  • ¿Cuál es la salida deseada (tipo y cantidad)?
  • ¿Qué método produce la salida deseada?

Por ejemplo, si queremos hacer un programa que sume dos números enteros positivos, la entrada serán dos números enteros positivos A y B. La salida deseada será un único número entero positivo, X, que será el resultado X=A+B y por lo tanto se obtiene realizando una operación de suma entre A y B.

Diseño del algoritmo

  • Enfoque “top-down”: Sabemos (iremos aprendiendo cómo durante el curso) resolver problemas pequeños y sencillos. Para encarar problemas grandes entonces la idea será irlos descomponiendo en tareas más simples y luego juntar todos los pasos adecuadamente.
  • Ejemplo: Calcular pago mensual neto de un trabajador conociendo horas trabajadas, tarifa horaria y tasa de impuestos. Lo descomponemos en 3:
    • Leer datos: Horas, tarifa, tasa
    • Calcular el sueldo neto usando los datos
    • Mostrar el sueldo neto por la salida en el formato deseado
  • Si aprendemos entonces a “leer datos”, a “hacer cuentitas”, y a “escribir a la salida”, podremos juntar todo eso en un solo programa para resolver el problema original.
curso-cpp/introduccion.txt · Última modificación: 2017/10/29 19:14 por santo