You are on page 1of 8

Prlogo

El posible lector de este manual, puede preguntarse y con razn, Por qu es necesario otro libro de C? Efectivamente en las bibliotecas de nuestros centros hay numerosos libros de texto para aprender C. Asimismo en la red hay tambin infinidad de manuales o apuntes editados por distintos departamentos universitarios. Por tanto, necesidad como tal no hay. Sin embargo, aparte de aquello tan castizo de cada maestrito tiene su librito, el objetivo de estos apuntes es dar una visin ligeramente distinta de la habitual. Desde nuestro punto de vista, la enseanza del lenguaje C en los estudios de ingeniera se presenta de una forma antiptica, dando ms importancia al lenguaje a que el alumno aprenda a programar. El objetivo de estas pginas es aprender C pero simultneamente aprender a programar con algunos fundamentos adecuados para un curso de iniciacin a la programacin. Algunas cuestiones que distinguen en los temas que siguen son las siguientes: Se simplifica el lenguaje C obviando algunos detalles que no aaden ninguna funcionalidad interesante: sentencia do_while, operador ?, operador ++ como prefjo, operadores de bits, tipos sin sentido actualmente como short, unsigned, etc. Se trabaja con funciones desde el primer momento, planteando todos los problemas para ser resueltos mediante ellas. De esta forma el alumno debe aprender desde el principio los conceptos de modularidad y reutilizacin. Las variables arrays o struct deben ser siempre declaradas a travs de sus tipos previamente definidos. Igualmente los argumentos de las funciones deben ser tipos declarados. Los arrays siempre son tratados diferenciando tamao y dimensin. Las funciones que tratan arrays como entrada o salida deben recibir o devolver el tamao del array respectivamente. Los tratamientos de los algoritmos bsicos sobre arrays: recorridos, filtros, bsqueda, etc, se exponen mediante esquemas. Los punteros se explican ms tarde de lo que suele ser habitual, y slo con su uso imprescindible, esto es, para definir argumentos de entrada/salida a funciones. En los problemas siempre se pide una funcin y el programa principal que la invoque. Numerosos ejercicios reutilizan las funciones de problemas anteriores. Los problemas son algortmicos, puros de aprender a programar, pero no son algoritmos que podran denominarse de idea feliz, sino que tienen un esquema claro asociado. No se hace apenas mencin a los tpicos y tan extendidos problemas o ejercicios, pensados ms para desarrollar la memoria que para aprender a programar. No encontrar en este manual los ejercicios que dan importancia fundamental a la sintaxis del C, buscando ms el error del alumno que su aprendizaje.

Jos C. Riquelme Santos Catedrtico de Universidad ETS Ingeniera Informtica Universidad de Sevilla

Autor: Jos C. Riquelme (Universidad de Sevilla)

TEMA 1. Conceptos de programacin.


1. Conceptos bsicos.
Ordenador o computador. Un ordenador es un sistema capaz de almacenar y procesar con gran rapidez una gran cantidad de informacin. Adems, un ordenador tiene capacidad para comunicarse con el exterior, recibiendo datos, rdenes y programas como entrada (por medio del teclado, del ratn, de un dispositivo USB, Bluetooth, etc.), y proporcionando resultados de distinto tipo como salida (en la pantalla, por la impresora, mediante un fichero en disco, etc.). Partes de un ordenador. Un computador en general, o un PC en particular, constan de distintas partes interconectadas entre s y que trabajan conjunta y coordinadamente. Las principales son: Procesador o CPU (Central Processing Unit, o unidad central de proceso). Se encarga de realizar las operaciones aritmticas y lgicas, as como de coordinar el funcionamiento de todos los dems componentes. Memoria principal o memoria RAM (Random Access Memory). Es el componente del computador donde se guardan los datos y los programas que la CPU est utilizando. Se llama tambin a veces memoria voltil, porque su contenido se borra cuando se apaga el ordenador, o simplemente cuando se reinicializa. Disco duro. El disco duro es capaz de mantener la informacin datos y programas de modo estable, tambin con el computador apagado. El computador no puede trabajar directamente con los datos del disco, sino que antes tiene que transferirlos a la memoria principal. De ordinario cada disco duro est fijo en un determinado computador. Dispositivos externos de memoria. Desde los antiguos disquetes, los CD o DVD o las memorias USB son elementos que sirven para transportar y guardar de manera fcil informacin y datos que nos interese guardar. Con la aparicin de la nube o sitios en internet que nos permiten guardar e intercambiar datos entre ordenadores conectados (Google Drive, Dropbox, etc), estos dispositivos cada vez tienen menos uso. Pantalla o monitor. Es el elemento visual del sistema. A travs de l el computador se comunica de forma grfica o mediante texto con el usuario. Ratn. Es el dispositivo ms utilizado para introducir informacin no alfanumrica, como por ejemplo, seleccionar una entre varias opciones en un men o caja de dilogo. Su principal utilidad consiste en mover con facilidad el cursor por la pantalla. Teclado. Es el elemento ms utilizado para introducir informacin alfanumrica en el ordenador. Programa informtico. Es una lista de instrucciones con una finalidad concreta que se ejecutan habitualmente de modo secuencial (una detrs de otra) aunque en ciertos ordenadores es posible tambin en paralelo. Estas instrucciones se escriben en un fichero fuente siguiendo unas reglas que vienen dadas por un lenguaje de programacin concreto. Normalmente un programa procesa unos datos a partir de una entrada de informacin y presenta al acabar unos resultados de salida. Almacenamiento de datos. La memoria de un computador est constituida por un gran nmero de unidades elementales, llamadas bits, que almacenan slo unos o ceros. Un conjunto de 8 bits recibe el nombre de byte u octeto. La capacidad de almacenamiento de memoria de un ordenador suele medir en Kilobytes (1024 bytes), Megabytes o

Tema 1. Conceptos de programacin

simplemente "megas" (1024 Kbytes) y Gigabytes o "gigas" (1024 Mbytes). Durante la ejecucin de un programa las instrucciones y datos estn habitualmente en la memoria principal o RAM. Los datos de entrada a un programa suelen ser introducidos desde teclado o ledos desde un almacenamiento externo. Los datos de salida suelen ser mostrados en pantalla o escritos en un archivo. Sistema Operativo. Es un programa o conjunto de programas que en un sistema informtico gestiona los recursos de hardware y facilita el uso de programas de aplicacin como el explorador de ficheros o el navegador web. Lenguajes de programacin. Las instrucciones de un programa deben estar escritas en un lenguaje comprensible por el ordenador y dependiendo de la cercana de ese lenguaje a la mquina concreta se hablan de lenguajes de bajo o alto nivel. El lenguaje de ms bajo nivel es el lenguaje mquina binario constituido por un conjunto de unos y ceros, que evidentemente es incomprensible para el ser humano. A partir de ah los lenguajes ensambladores constituyen el siguiente nivel, comprensibles pero difciles de programar. Finalmente los lenguajes de alto nivel son capaces de escribir instrucciones con una estructura sintctica comprensible por el programador y que convenientemente traducidas son capaces de ejecutarse en un ordenador. Lenguajes de alto nivel primitivos como Fortran o Cobol de mediados del siglo XX han ido evolucionando hasta lenguajes como Java o Python. Todos los programas excepto los escritos en cdigo mquina binario deben ser traducidos para que puedan ser ejecutados. El fichero fuente traducido se suele denominar fichero ejecutable. Compilador. Un compilador es un programa que traduce un conjunto de instrucciones escritas en un lenguaje de alto nivel a un lenguaje comprensible por el ordenador. Normalmente el compilador est integrado con otras funcionalidades constituyendo un Entorno de Desarrollo Integrado (IDE en ingls). Un IDE adems del compilador, suele disponer de un editor, un depurador y otras herramientas que facilitan la construccin y prueba de programas. Una de las principales tareas de un buen compilador es ayudar al programador a descubrir los errores sintcticos del programa. Como se ha dicho anteriormente los lenguajes de alto nivel tienen una sintaxis bastante estricta, es decir, la estructura de cada instruccin y sus relaciones con las dems estn fuertemente condicionadas por un conjunto de reglas sintcticas. Estas reglas obligan al programador a ser muy cuidadoso en la escritura de un programa para que pueda ser traducido por el compilador. Un buen IDE debe proporcionar informacin adecuada sobre por qu una instruccin no est bien escrita para que el programador pueda corregirla. Otra tarea bsica del IDE es el depurador o facilidad que ofrece la posibilidad de ejecutar paso a paso un programa controlando si el orden de las sentencias y los datos que procesa son los que se esperaba o no.

2. Programacin de ordenadores
2.1 El lenguaje C. El lenguaje C es un lenguaje de programacin creado en 1972 por Dennis M. Ritchie en los Laboratorios Bell. Es un lenguaje cuyo origen es la implementacin del sistema operativo Unix. C es apreciado por la eficiencia del cdigo que produce y es el lenguaje de programacin ms popular para crear software de sistemas, aunque tambin se utiliza para crear aplicaciones. Se trata de un lenguaje de medio nivel pero con muchas caractersticas de bajo nivel. Dispone de las estructuras de control tpicas de los lenguajes de alto nivel pero, a su vez, dispone de sentencias y

Autor: Jos C. Riquelme (Universidad de Sevilla)

operadores que permiten un control a muy bajo nivel, esto es, cercano a la mquina. La compilacin de un programa C se realiza en varias fases que normalmente son automatizadas y ocultadas por el IDE: 1. Preprocesado consistente en modificar el cdigo fuente en C segn una serie de instrucciones (denominadas directivas de preprocesado) simplificando de esta forma el trabajo del compilador. 2. Compilacin que genera el cdigo objeto a partir del cdigo ya preprocesado. 3. Enlazado que une los cdigos objeto de los distintos mdulos y bibliotecas externas (como las bibliotecas del sistema) para generar el programa ejecutable final. El fichero fuente de un programa en C tiene la extensin .c, el cdigo objeto despus de la fase de compilacin mantiene el mismo nombre y la extensin .obj, finalmente el fichero ejecutable despus de la fase de enlazado tiene la extensin .exe. 2.2 Ventajas del lenguaje C.

Aunque la portabilidad es un estndar en los actuales lenguajes de programacin, el C fue uno de los primeros en la portabilidad de los ficheros fuente. Quiere esto decir que un programa desarrollado en una determinada mquina y sistema operativo podr ser ejecutado en otra, con mnimas modificaciones y una simple recompilacin. Esto fue conseguido gracias a la adopcin en 1989 del conocido como ANSI C, tambin llamado C estndar. De esta manera, ANSI C est soportado hoy en da por casi la totalidad de los compiladores y cualquier programa escrito slo en C estndar funciona (una vez compilado) correctamente en cualquier plataforma que disponga de una implementacin de C compatible. Un ncleo del lenguaje simple, con funcionalidades aadidas importantes, como funciones matemticas y de manejo de archivos, proporcionadas por bibliotecas. Es un lenguaje muy flexible que permite programar con mltiples estilos. sta es una cualidad que tambin puede ser un problema cuando se est aprendiendo a programar. Un sistema de tipos que impide operaciones sin sentido. Acceso a memoria de bajo nivel mediante el uso de punteros. Un conjunto reducido de palabras clave. Permite definir tipos de datos como vectores y estructuras que permite manipular como un todo un conjunto de datos.

2.3 Otros conceptos relacionados. Ingeniera del Software. El desarrollo de aplicaciones software con las restricciones habituales de todo proceso productivo, esto es, con el menor esfuerzo y coste y la mejor calidad posible, requiere de una metodologa propia. La ingeniera del software es la disciplina que trata de dar un enfoque sistemtico y disciplinado al diseo, desarrollo y mantenimiento del software. Desde este punto de vista, en la actualidad podemos afirmar que la programacin de ordenadores no es un arte, a pesar de que durante aos la mala interpretacin del ttulo de la obra de DE Knuth The Art of Computer Programming pareca decir lo contrario. La programacin de ordenadores debe ser

Tema 1. Conceptos de programacin

entonces contemplada como un proceso ingenieril, base de la ingeniera del software y pilar fundamental de numerosos problemas que resuelven las distintas ingenieras. Algoritmo. Segn la RAE un algoritmo es un conjunto ordenado y finito de operaciones que permite hallar la solucin de un problema. Ejemplos cotidianos de algoritmos suelen ser las recetas de cocina o las instrucciones para montar un mueble. En la programacin de ordenadores se suele entender por algoritmo una lista de instrucciones que se ejecutan secuencialmente, que normalmente recibe de entrada un conjunto de datos y despus de realizar operaciones aritmticas o lgicas con ellos produce un determinado resultado de salida. Un algoritmo suele representarse en programacin mediante un diagrama de flujo o un seudocdigo. Diagrama de flujo. Es una representacin grfica de las sentencias de un algoritmo donde cada tipo de sentencia tiene una forma determinada: rombo (bifurcacin condicional), rectngulo (asignacin), cuadriltero (lectura o escritura), etc. Las lneas que unen estas figuras representan la secuencia u orden en que se deben ejecutar. Los diagramas de flujo fueron muy usados en los aos 70 y 80 del siglo pasado, pero ahora se consideran obsoletos porque no son apropiados para representar fcilmente la divisin de un problema en mdulos ni para representar adecuadamente tipos de datos estructurados. El siguiente diagrama de flujo calcula el factorial de un nmero:

Leer n i=1 f=1

NO

i n S f=f*i i=i+1 Escribir n y f

Seudocdigo. Es un conjunto de instrucciones que en un lenguaje natural intentan describir un algoritmo. El lenguaje empleado para escribir el seudocdigo de un algoritmo suele ser una variante unificada de las principales sentencias o estructuras de control usadas por la mayora de los lenguajes de programacin. De esta manera un seudocdigo se aproxima bastante a la versin final de un programa codificado pero sin

Autor: Jos C. Riquelme (Universidad de Sevilla)

tener en cuenta las exigencias sintcticas de un lenguaje de programacin. Por ejemplo el seudocdigo del problema anterior sera:
Inicio Leer n Hacer i igual a 1 Hacer f igual a 1 Mientras i sea menor o igual a n Hacer f igual a f i Hacer i igual a i + 1 FinMientras Escribir el factorial de n es f Fin

Cdigo fuente. Es el conjunto de sentencias escritas en un lenguaje de programacin que una vez compiladas permiten al ejecutarse resolver un problema. Por ejemplo, un programa en C que resuelve el problema anterior es el siguiente:
#include <stdio.h> void main(void){ int i, f, n; scanf("%d",&n); i=1; f=1; while (i<=n){ f=f*i; i++; } printf("el factorial de %d es %d\n",n,f); }

Fundamentos de Programacin. En esta asignatura se sentarn las bases de la programacin de ordenadores, siguiendo un conjunto de reglas que convierten la construccin de software en un proceso ingenieril, donde no slo es importante que el cdigo funcione correctamente, sino que adems est bien hecho, esto es, sea fcil de disear, programar y mantener. Para ello en esta asignatura insistiremos desde el principio en tres cuestiones que consideramos bsicas: La primera es la obligacin de estructurar el cdigo en trozos ms pequeos que resuelvan un subproblema concreto. Estos trozos de cdigo han recibido a lo largo de los aos distintos nombres: mdulos, subrutinas, procedimientos, funciones, etc. Un mdulo principal invocar la ejecucin de los otros mdulos. El mdulo principal se comunicar con los mdulos mediante el uso de parmetros. En C estos mdulos reciben el nombre de funciones. El mdulo principal de nuestros programas en C entonces ser habitualmente una sucesin de llamadas a funciones. La segunda cuestin es la necesidad de definir los tipos de datos antes de usarlo. Como se ha dicho anteriormente el C es un lenguaje que da mucha libertad al programador y a pesar de ser un lenguaje fuertemente tipificado permite ciertas licencias en su uso que no se permitirn en esta asignatura. Los tipos

Tema 1. Conceptos de programacin

estructurados, vectores (array) o registros (struct) deben definirse como tipos siempre que se vayan a usar. No se usarn las caractersticas del C que son de bajo nivel. Esto es, no se har uso de cuestiones como la aritmtica de punteros, ni se acceder a los vectores a partir de sus direcciones de memoria. nicamente en los casos estrictamente necesarios, esto es, el paso de argumentos de entrada/salida en las funciones se har uso del concepto de puntero.

Modularizacin. En las lneas anteriores se ha resuelto el problema de obtener el factorial de un nmero mediante diagrama de flujo, seudocdigo y cdigo en C. Imaginemos que quisiramos calcular el factorial de varios nmeros. Por ejemplo, para calcular el valor de un nmero combinatorio, es necesario calcular tres factoriales: ( ) ( )

Es adecuada por tanto la solucin que se ha hecho antes? La respuesta es que no, porque en su construccin se ha ignorado la primera de las reglas que hemos enunciado para esta asignatura. La modularizacin de un programa tiene numerosas ventajas: Reduce la complejidad del problema que se quiere resolver dividindolo en problemas ms sencillos. Elimina el cdigo duplicado, favoreciendo la reutilizacin de cdigo y ahorrando en el tiempo de desarrollo de las aplicaciones. Limita los efectos de los cambios al mdulo que se desea modificar. Oculta detalles de implementacin en problemas complejos. Facilita la depuracin y prueba de las aplicaciones. Mejora la legibilidad del cdigo. Facilita la portabilidad del cdigo.

Por todo lo anterior, la mejor forma de resolver el problema de dado un nmero calcular su factorial es definir un mdulo o subprograma (funcin en C) que reciba como argumento el entero n y devuelva el valor de su factorial. El concepto de funcin en C es el mismo que el usado en matemticas. Por ejemplo, la funcin f(x)=2*x+3, contiene el concepto de que se recibe una entrada x y se devuelve un valor calculado como su doble ms tres. Por tanto, para esta asignatura la nica solucin vlida en C para calcular el factorial de un nmero sera:
#include <stdio.h> int factorial(int); void main(void){ int n, fac; scanf("%d",&n); fac=factorial(n); printf("el factorial de %d es %d\n",n,fac); } int factorial (int m){

Autor: Jos C. Riquelme (Universidad de Sevilla)

int i, f; i=1; f=1; while (i<=m){ f=f*i; i++; } return f; }

3. Ejercicios.
Intente escribir un seudocdigo que intente resolver los siguientes problemas. Para cada problema identifique claramente qu debe recibir como entrada y qu debe devolver cmo salida. 1. 2. 3. 4. 5. 6. Obtenga la suma de los n primeros nmeros naturales. Dados dos nmeros devolver el menor de los dos Dados dos nmeros devolver el mayor de los dos Obtenga la suma de los nmeros que hay entre dos nmeros naturales, ambos incluidos. Dados dos nmeros naturales a y b halle la potencia de a elevado a b. Dados tres valores con los coeficientes de una ecuacin de segundo grado, obtenga segn los casos sus dos soluciones o races, una sola raz o indique que no hay solucin real. Lea un nmero indeterminado de nmeros hasta que lea uno negativo y calcule la media de los valores ledos. Lea un nmero indeterminado de nmeros hasta que lea uno negativo y calcule el mximo. Lea un nmero indeterminado de nmeros hasta que lea uno negativo y calcule el mnimo.

7. 8. 9.

You might also like