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.
Los componentes de una computadora pueden dividirse de la siguiente manera:
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.
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”.
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.
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.
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.
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:
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).
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):
Otra manera muy similar de escribir este algoritmo es la siguiente:
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).
Cuando vayamos a resolver un problema en computadora lo primero que tenemos que lograr tener en claro es:
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.