Está en la página 1de 72

UNIDAD 1

1.1.- HISTORIA DE LOS LENGUAJES DE PROGRAMACION AO LENGUAJE INVENTOR DESCRIPCION 1900s BINARIO Bool primer lenguaje 1946 Plankalkul Konrad Zuse creado para jugar al ajedrez 1949 Short Code lenguaje traducido a mano 1950 ASM (ensamblador) lenguaje ensamblador 1951 A-0 Grace Hopper fue el primer compilador 1952 AUTOCODE Alick E. Glennie compilador muy rudimentario 1956 FORTRAN IBM sistema de TRAduccin de Formulas matemticas 1956 COBOL Compilador 1958 ALGOL 58 1960 LISP Interprete orientado a la Inteligencia Artificial 1961 FORTRAN IV IBM sistema de Traduccin de Formulas matemticas 1961 COBOL 61 Extendido 1960 ALGOL 60 Revisado 1964 PASCAL Niklaus Wirth programacion estructurada 1964 BASIC Universidad de Dartmouth (california) Beginners All Purpose Symbolic Instruction Code

1965 SNOBOL 1965 APL solo anotacion 1965 COBOL 65 1966 PL/I 1966 FORTRAN 66 IBM sistema de TRAduccin de Formulas matemticas 1967 SIMULA 67 1968 ALGOL 68 1968 SNOBOL4 1970s GW-BASIC antiguo y clasico BASIC 1970 APL/360 1972 SMALLTALK Centro de Investigacin de Xerox en Palo Alto pequeo y rapido 1972 C Laboratorios Bell lenguaje con tipos 1974 COBOL 74 1975 PL /I Lenguaje sencillo 1977 FORTRAN 77 IBM sistema de TRAduccin de Formulas matemticas 1980s SMALLTALK/V Digitalk pequeo y rapido 1980 C con clases Laboratorios Bell lenguaje con clases 1981 PROLOG Ministerio Japons de Comercio Internacional e Industria (MITI) Lenguaje estandar para la Inteligencia Artificial 1982 ADA Ministerio de Defensa de los EE.UU lenguaje muy seguro 1984 C++ AT&T Bell Laboratories (Bjarne Stroustrup) compilador 1985 CLIPPER compilador para bases de datos 1985 QuickBASIC 1.0 Microsoft compilador de BASIC

1986 QuickBASIC 2.0 Microsoft soporte de tarjeta grfica EGA 1987 QuickBASIC 3.0 Microsoft 43 lineas con la tarjeta EGA 1987 QuickBASIC 4.0 Microsoft tarjetas Hercules, VGA 1987 CLIPPER SUMMER '87 compilador para bases de datos 1988 QuickBASIC 4.5 Microsoft tarjeta SVGA 1989 QuickBASIC 7.1 Microsoft ultima version de QuickBASIC 1989 ASIC v5.0 interprete tipo QBASIC shareware 1990s VISUAL C++ 1990s VISUAL BASICScript Microsoft lenguaje de script 1990 HTML Tim Berners-Lee para internet 1993 XML C. M. Sperberg-McQueen para internet 1993 SGML Charles F. Goldfarb para internet 1990s WML para internet 1990s ASP Microsoft para internet 1990s PHP para internet 1995 JAVA Sun Microsystems para internet y proposito general 1995 CLIPPER 5.01 compilador para bases de datos 1995 GNAT ADA95 Ministerio de Defensa de los EE.UU lenguaje muy seguro 1995 FORTRAN 95 IBM sistema de TRAduccin de Formulas matemticas 1991 VISUAL BASIC 1.0 Microsoft 1992 VISUAL BASIC 2.0 Microsoft

1993 VISUAL BASIC 3.0 Microsoft 1994 VISUAL BASIC 4.0 Microsoft 1995 VISUAL BASIC 5.0 Microsoft 1998 VISUAL BASIC 6.0 Microsoft 1990s C# 2001 VISUAL BASIC .NET Microsoft La evolucin de Visual Basic .

C es en lenguaje de programacin de proposito general sus principales caracteristicas son:


Programacin estructurada Economa de las expresiones Abundancia en operadores y tipos de datos. Codificacin en alto y bajo nivel simultneamente. Reemplaza ventajosamente la programacin en ensamblador (assembler). Utilizacin natural de las funciones primitivas del sistema. No est orientado a ningn rea en especial. Produccin de cdigo objeto altamente optimizado. Facilidad de aprendizaje (;-)).

El lenguajes C naci en los Laboratorios Bell de AT&T y ha sido estrechamente asociado con el Sistema Operativo UNIX, ya que su desarrollo se realiz en este sistema y debido a que tanto UNIX como el propio compilador de C y la casi totalidad de los programas y herramientas de UNIX, fueron escritos en C. Su eficacia y claridad han hecho que el lenguaje asembler apenas haya sido utilizado en UNIX.

Este lenguajes est inspirado en el lenguaje B escrito por Ken Thompson en 1970 con intencin de recodificar el UNIX, que en la fase de arranque esta escrito en asembler, en vistas a su transportabilidad a otras mquinas. B era un lenguaje evolucionado e independiente de la mquina, inspirado en la lenguajes BCPL concedido por Martin Richard en 1967. En 1972, Dennis Ritchie, toma el relevo y modifica el lenguaje B, creando el lenguaje C y reescribiendo el UNIX en dicho lenguaje. La novedad que proporcion el lenguaje C sobre el B fue el diseo de tipos y estructuras de datos. Una de las peculiaridades de C es su riqueza de operadores, Puede decirse que prcticamente dispone de un operador para cada una de las posibles operaciones en cdigo mquina. Finalmente, C, que ha sido pensado para ser altamente transportable y para programar lo improgramable, igual que otros lenguajes tiene sus inconvenientes:

Carece de instrucciones de entrada/salida, de instrucciones para manejo de cadenas de caracteres, con lo que este trabajo queda para la biblioteca de rutinas, con la consiguiente prdida de transportabilidad La excesiva libertad en la escritura de los programas puede llevar a errores en la programcin que, por ser correctos sintcticamente no se detectan a simple vista Por otra parte las precedencias de los operadores convierten a veces las expresiones en pequeos rompecabezas.

A pesar de todo, C ha demostrado ser un lenguaje extremadamente eficaz y expresivo.

1.2 .-ANALISIS Y COMPRENSION DE LOS PROBLEMAS 1.3.- DISEO DE ALGORITMOS DEFINICION DE ALGORITMO Un algoritmo es un conjunto finito de instrucciones o pasos que sirven para ejecutar una tarea o resolver un problema. La palabra algoritmo deriva del nombre del matemtico rabe Al Juarism, que vivi entre los siglos VIII y IX. DISEO DEL ALGORITMO Las caractersticas de un buen algoritmo son: Debe tener un punto particular de inicio. Debe ser definido, no debe permitir dobles interpretaciones. Debe ser general, es decir, soportar la mayora de las variantes que se puedan presentar en la definicin del problema. Debe ser finito en tamao y tiempo de ejecucin. Diseo del Algoritmo Prueba de escritorio o Depuracin Se denomina prueba de escritorio a la comprobacin que se hace de un algoritmo para saber si est bien hecho. Esta prueba consiste en

tomar datos especficos como entrada y seguir la secuencia indicada en el algoritmo hasta obtener un resultado, el anlisis de estos resultados indicar si el algoritmo est correcto o si por el contrario hay necesidad de corregirlo o hacerle ajustes. 1.3.1.-CONCEPTOS BASICOS COMPILADOR Un compilador acepta programas escritos en un lenguaje de alto nivel y los traduce a otro lenguaje, generando un programa equivalente independiente, que puede ejecutarse tantas veces como se quiera. Este proceso de traduccin se conoce como compilacin.

DATO Un dato es la unidad o cantidad mnima de informacin no elaborada, sin sentido en s misma, pero que convenientemente tratada se puede utilizar en la realizacin de clculos o toma de decisiones. Es de empleo muy comn en el mbito informtico. BUCLE Un bucle en programacin es una sentencia que se realiza repetidas veces.----Bucle se utiliza para hacer un accin repetida sin tener que repetir

varias veces el mismo cdigo, lo que ahorra tiempo, deja el cdigo ms claro y facilita su modificacin en el futuro. ARREGLOS Los arreglos son las estructuras de datos ms sencillas. Definicin: Los arreglos son un grupo de posiciones en memoria relacionadas entre s por el hecho de que todas tienen el mismo nombre y los datos que contiene son todos del mismo tipo. Son entidades estticas ya que conservan el mismo tamao durante toda la ejecucin del programa. Para poder referirnos a una posicin en particular o al datos dentro de esa posicin del arreglo, se especifica el nombre del arreglo y el nmero de posicin del elemento. Las posiciones generalmente se cuentan a partir del cero como primera posicin. FICHERO Un archivo o fichero informtico es una entidad lgica compuesta por una secuencia finita de bytes, almacenada en un sistema de archivos ubicada en la memoria secundaria de un ordenador. Los archivos son agrupados en directorios dentro del sistema de archivos y son identificados por un nombre de archivo. El nombre forma la identificacin nica en

relacin a los otros archivos en el mismo directorio.

1.3.2.- METODOLOGIA DE LA PROGRAMACION Vale, en el prximo captulo entraremos mas a fondo en los lenguajes, pero antes, vamos a comentar unas caractersticas comunes en todos ellos ... es lo que llamamos Metodologa de la programacin. Podramos considerar la Metodologa como la "ciencia" que estudia la programacin, en estado puro, independientemente del lenguaje en el que se implementar luego. Digamos que todos los lenguajes permiten hacer lo mismo (as a grandes rasgos...), lo que cambia es la forma de escribirlo y la forma de interpretarlo. Pero en el fondo, todo es lo mismo, y por eso, es mejor aprender lo que son estos mtodos a nivel general, que no en un lenguaje especfico. Ya te aviso que este es de los captulos mas largos y quiz mas pesados, pero es fundamental, a parte, comenta distintos trminos que se usarn mas adelante, paciencia pues Esto es la base y est por encima de todos los lenguajes, vayamos pues, poco a poco y por pasos ...

1.3.3- DIAGRAMAS DE FLUJO

Los diagramas de flujo representan la forma ms tradicional para especificar los detalles algortmicos de un proceso. Se utilizan principalmente en programacin, economa y procesos industriales; estos diagramas utilizan una serie de smbolos con significados especiales. Son la representacin grfica de los pasos de un proceso, que se realiza para entender mejor al mismo. Son Modelos tecnolgicos utilizados para comprender los rudimentos de la programacin lineal Otra definicin del diagrama de flujo es la siguiente; "Es un esquema para representar grficamente un algoritmo. Se basan en la utilizacin de diversos smbolos para representar operaciones especficas. Se les llama diagramas de flujo porque los smbolos utilizados se conectan por medio de flechas para indicar la secuencia de operacin. Para hacer comprensibles los diagramas a todas las personas, los smbolos se someten a una normalizacin; es decir, se hicieron smbolos casi universales, ya que, en un principio cada usuario podra tener sus propios smbolos para representar sus procesos en forma de Diagrama de Flujo. Esto trajo como consecuencia que solo aquel que conoca sus smbolos, los poda interpretar. La simbologa utilizada para la elaboracin de diagramas de flujo es variable y debe ajustarse a un patrn definido previamente."

Diagrama de flujo en el cual se emplean los smbolos ms comunes. Principales simbolos Estandarizados segn ISO 5807 No es indispensable usar un tipo especial de smbolos para crear un diagrama de flujo, pero existen algunos ampliamente utilizados por lo que es adecuado conocerlos y utilizarlos, ampliando as las posibilidades de crear un diagrama ms claro y comprensible para crear un proceso lgico y con opciones mltiples adecuadas.

Flecha. Indica el sentido y trayectoria del proceso de informacin o tarea. un evento que ocurre de forma automtica y del cul generalmente se sigue una secuencia determinada.

Rombo. Se utiliza para representar una condicin. Normalmente el flujo de informacin entra por arriba y sale por un lado si la condicin se cumple o sale por el lado opuesto si la condicin no se cumple. Lo anterior hace que a partir de ste el proceso tenga dos caminos posibles. Crculo. Representa un punto de conexin entre procesos, se utiliza cuando es necesario dividir un diagrama de flujo en varias partes, por ejemplo por razones de espacio o simplicidad. Una referencia debe de darse dentro para distinguirlo de otros. La mayora de las veces se utizan nmeros en los mismos. Existen adems una variedad de formas especiales para denotar las entradas, las salidas, los almacenamientos, etctera.

Reglas De acuerdo al estndar ISO los smbolos e incluso las flechas deben de tener ciertas caractersticas para estar dentro del estndar. En el caso se los crculos de conexin se debe usar slo cuando se conecta con un proceso contenido dentro de la misma hoja. Aunque tambin existen conectores de pgina los cuales son como una casita y se utilizan para unir actividades que se encuentran en otra hoja.

Existe siempre un camino que permite arribar a una solucin Existe un nico inicio del proceso Existe un nico punto de fin para el proceso De cada smbolo solo puede salir una flecha de flujo, salvo del rombo que indica una comparacin con dos caminos posibles

1.3.4- PSEUDOCODIGO DEFINICION DE PSEUDOCODIGO El cdigo no ejecutable de un programa que se usa como una ayuda para desarrollar y documentar programas estructurados 1.4.- VARIABLES, OPERADORES, TIPOS DE DATOS Y EXPRESIONES 1.4.1.- VARIABLES Y CONSTANTES VARIABLE Una variable es un elemento de una frmula, proposicin o algoritmo que puede adquirir o ser sustitudo por un valor cualquiera. Los valores que una variable es capaz de recibir pueden estar definidos dentro de un rango. constantes (uso de #define)

CONTENIDO DEL CAPTULO Introduccin Constantes con nombre Introduccin Las constantes son aquellos datos que no pueden cambiar a lo largo de la ejecucin de un programa. #include <stdio.h> int main() { int radio, perimetro; radio = 20; perimetro = 2 * 3.1416 * radio;

printf( "El permetro es: %i", perimetro ); return 0; } radio y perimetro son variables, su valor puede cambiar a lo largo del programa. Sin embargo 20, 2 y 3.1416 son constantes, no hay manera de cambiarlas. El valor 3.1416 no cambia a lo largo del programa , ni entre ejecucin y ejecucin. Slo cambiar cuando edites el programa y lo cambies tu mismo. Esto es obvio, y no tiene ningn misterio as que no le des vueltas. Slo

quera indicarlo porque en algunos libros le dan muchas vueltas. Constantes con nombre Supongamos que tenemos que hacer un programa en el que haya que escribir unas cuantas veces 3.1416 (como todos sabreis es PI). Es muy fcil que nos confundamos alguna vez al teclearlo y al compilar el programa no tendremos ningn error, sin embargo el programa no dar resultados correctos. Para evitar esto usamos las constantes con nombre. Al definir una constante con nombre estamos dando un nombre al valor, a 3.1416 le llamamos PI. Estas constantes se definen de la manera siguiente: #define nombre_de_la_constante valor_de_la_constante Ejemplo: #include <stdio.h> #define PI 3.1416 int main() { int radio, perimetro; radio = 20; perimetro = 2 * PI * radio;

printf( "El permetro es: %i", perimetro ); return 0; } De esta forma cada vez que el compilador encuentre el nombre PI lo sustituir por 3.1416. A una constante no se le puede dar un valor mientras se ejecuta, no se puede hacer PI = 20;. Slo se le puede dar un valor con #define, y slo una vez. Tampoco podemos usar el scanf para dar valores a una constante: 1.4.2.- TIPOS DE DATOS FUNDAMENTALES CONTENIDO DEL CAPTULO

Introduccin Notas sobre los nombres de las variables El tipo Int o Declaracion de variables o Imprimir o Asignar o Operaciones El tipo Char El modificador Unsigned El tipo Float El tipo Double Cmo calcular el mximo valor que admite un tipo de datos Overflow: Cuando nos saltamos el rango

Resumen de los tipos de datos en C INTRODUCCIN Cuando usamos un programa es muy importante manejar datos. En C podemos almacenar los datos en variables. El contenido de las variables se puede ver o cambiar en cualquier momento. Estas variables pueden ser de distintos tipos dependiendo del tipo de dato que queramos meter. No es lo mismo guardar un nombre que un nmero. Hay que recordar tambin que la memoria del ordenador es limitada, as que cuando guardamos un dato, debemos usar slo la memoria necesaria. Por ejemplo si queremos almacenar el nmero 400 usaremos una variable tipo int (la estudiamos ms abajo) que ocupa slo 16 bits, y no una de tipo long que ocupa 32 bits. Si tenemos un ordenador con 32Mb de Ram parece una tontera ponernos a ahorrar bits (1Mb=1024Kb, 1Kb=1024bytes, 1byte=8bits), pero si tenemos un programa que maneja muchos datos puede no ser una cantidad despreciable. Adems ahorrar memoria es una buena costumbre.

(Por si alguno tiene dudas: No hay que confundir la memoria con el espacio en el disco duro. Son dos cosas distintas. La capacidad de ambos se mide en bytes, y la

del disco duro suele ser mayor que la de la memoria Ram. La informacin en la Ram se pierde al apagar el ordenador, la del disco duro permanece. Cuando queremos guardar un fichero lo que necesitamos es espacio en el disco duro. Cuando queremos ejecutar un programa lo que necesitamos es memoria Ram. La mayora me imagino que ya lo sabes, pero me he encontrado muchas veces con gente que los confunde.) Notas sobre los nombres de las variables A las variables no se les puede dar cualquier nombre. No se pueden poner ms que letras de la 'a' a la 'z' (la no vale), nmeros y el smbolo '_'. No se pueden poner signos de admiracin, ni de interrogacin... El nombre de una variable puede contener nmeros, pero su primer carcter no puede serlo. Ejemplos de nombres vlidos: camiones numero buffer a1 j10hola29 num_alumnos Ejemplos de nombres no vlidos: 1abc nombre? num/alumnos Tampoco valen como nombres de variable las palabras reservadas que usa el compilador. Por ejemplo: for, main, do, while.

Por ltimo es interesante sealar que el C distingue entre maysculas y minsculas. Por lo tanto: Nombre nombre NOMBRE seran tres variables distintas. El tipo Int En una variable de este tipo se almacenan nmeros enteros (sin decimales). El rango de valores que admite es -32767 a 32767. Cuando definimos una variable lo que estamos haciendo es decirle al compilador que nos reserve una zona de la memoria para almacenar datos de tipo int. Para guardarla necesitaremos 16 bits de la memoria del ordenador (216=32767). Para poder usar una variable primero hay que declararla (definirla). Hay que decirle al compilador que queremos crear una variable y hay que indicarle de qu tipo. Por ejemplo: int numero; Esto hace que declaremos una variable llamada numero que va a contener un nmero entero. Pero dnde se declaran las variables? Tenemos dos posibilidades, una es declararla como global y otra como local. Por ahora vamos a decir que global es aquella variable que se declara fuera de la funcin main y local la que se declara dentro: Variable Global #include <stdio.h> Variable Local

#include <stdio.h> int x; int main() { } int main() { int x; }

La diferencia prctica es que las variables globales se pueden usar en cualquier procedimiento. Las variables locales slo pueden usarse en el procedimiento en el que se declaran. Como por ahora slo tenemos el procedimiento (o funcin, o rutina, o subrutina, como prefieras) main esto no debe preocuparnos mucho por ahora. Cuando estudiemos cmo hacer un programa con ms funciones aparte de main volveremos sobre el tema. Sin embargo debes saber que es buena costumbre usar variables locales que globales. Ya veremos por qu. Podemos declarar ms de una variable en una sola lnea: int x, y; Mostrar variables por pantalla Vamos a ir u poco ms all con la funcin printf. Supongamos que queremos mostrar el contenido de la variable x por pantalla: printf( "%i", x );

Suponiendo que x valga 10 (x=10) en la pantalla tendramos: 10 Empieza a complicarse un poco no? Vamos poco a poco. Recuerdas el smbolo "\" que usbamos para sacar ciertos caracteres? Bueno, pues el uso del "%" es parecido. "%i" no se muestra por pantalla, se sustituye por el valor de la variable que va detrs de las comillas. ( %i, de integer=entero en ingls). Para ver el contenido de dos variables, por ejemplo x e y, podemos hacer: printf( "%i ", x ); printf( "%i", y ); resultado (suponiendo x=10, y=20): 10 20 Pero hay otra forma mejor: printf( "%i %i", x, y ); ... y as podemos poner el nmero de variables que queramos. Obtenemos el mismo resultado con menos trabajo. No olvidemos que por cada variable hay que poner un %i dentro de las comillas. Tambin podemos mezclar texto con enteros: printf( "El valor de x es %i, que bien!\n", x ); que quedar como:

El valor de x es 10, que bien! Como vemos %i al imprimir se sustituye por el valor de la variable. Asignar valores a variables de tipo int La asignacin de valores es tan sencilla como: x = 10; Tambin se puede dar un valor inicial a la variable cuando se define: int x = 15; Tambin se pueden inicializar varias variables en una sola lnea: int x = 15, y = 20; Hay que tener cuidado con lo siguiente: int x, y = 20; Podramos pensar que x e y son igual a 20, pero no es as. La variable x est sin valor inicial y la variable 'y' tiene el valor 20. Veamos un ejemplo para resumir todo: #include <stdio.h> int main() { int x = 10; prinft( "El valor inicial de x es %i\n", x );

x = 50; printf( "Ahora el valor es %i\n", x ); } Cuya salida ser: El valor inicial de x es 10 Ahora el valor es 50 Importante! Si imprimimos una variable a la que no hemos dado ningn valor no obtendremos ningn error al compilar pero la variable tendr un valor cualquiera. Prueba el ejemplo anterior quitando int x, y; Mostrar variables por pantalla Vamos a ir u poco ms all con la funcin printf. Supongamos que queremos mostrar el contenido de la variable x por pantalla: printf( "%i", x ); Suponiendo que x valga 10 (x=10) en la pantalla tendramos: 10 Empieza a complicarse un poco no? Vamos poco a poco. Recuerdas el smbolo "\" que usbamos para sacar ciertos caracteres? Bueno, pues el uso del "%" es parecido. "%i" no se muestra por pantalla, se sustituye por el valor de la variable que

va detrs de las comillas. ( %i, de integer=entero en ingls). Para ver el contenido de dos variables, por ejemplo x e y, podemos hacer: printf( "%i ", x ); printf( "%i", y ); resultado (suponiendo x=10, y=20): 10 20 Pero hay otra forma mejor: printf( "%i %i", x, y ); ... y as podemos poner el nmero de variables que queramos. Obtenemos el mismo resultado con menos trabajo. No olvidemos que por cada variable hay que poner un %i dentro de las comillas. Tambin podemos mezclar texto con enteros: printf( "El valor de x es %i, que bien!\n", x ); que quedar como: El valor de x es 10, que bien! Como vemos %i al imprimir se sustituye por el valor de la variable. Asignar valores a variables de tipo int La asignacin de valores es tan sencilla como: x = 10;

Tambin se puede dar un valor inicial a la variable cuando se define: int x = 15; Tambin se pueden inicializar varias variables en una sola lnea: int x = 15, y = 20; Hay que tener cuidado con lo siguiente: int x, y = 20; Podramos pensar que x e y son igual a 20, pero no es as. La variable x est sin valor inicial y la variable 'y' tiene el valor 20. Veamos un ejemplo para resumir todo: #include <stdio.h> int main() { int x = 10; prinft( "El valor inicial de x es %i\n", x ); x = 50; printf( "Ahora el valor es %i\n", x ); } Cuya salida ser: El valor inicial de x es 10 Ahora el valor es 50

Importante! Si imprimimos una variable a la que no hemos dado ningn valor no obtendremos ningn error al compilar pero la variable tendr un valor cualquiera. Prueba el ejemplo anterior quitando int x = 10; Puede que te imprima el valor 10 o puede que no. El tipo Char Las variables de tipo char sirven para almacenar caracteres. Los caracteres se almacenan en realidad como nmeros del 0 al 255. Los 128 primeros (0 a 127) son el ASCII estndar. El resto es el ASCII extendido y depende del idioma y del ordenador. Consulta la tabla ASCII en el anexo. Para declarar una variable de tipo char hacemos: char letra; En una variable char slo podemos almacenar solo una letra, no podemos almacenar ni frases ni palabras. Eso lo veremos ms adelante (strings, cadenas). Para almacenar un dato en una variable char tenemos dos posibilidades: letra = 'A'; o letra = 65; En ambos casos se almacena la letra 'A' en la variable. Esto es as porque el cdigo ASCII de la letra 'A' es el 65.

Para imprimir un char usamos el smbolo %c (c de character=caracter en ingls): letra = 'A'; printf( "La letra es: %c.", letra ); resultado: La letra es A. Tambin podemos imprimir el valor ASCII de la variable usando %i en vez de %c: letra = 'A'; printf( "El nmero ASCII de la letra %c es: %i.", letra, letra ); resultado: El cdigo ASCII de la letra A es 65. Como vemos la nica diferencia para obtener uno u otro es el modificador (%c %i) que usemos. Las variables tipo char se pueden usar (y de hecho se usan mucho) para almacenar enteros. Si necesitamos un nmero pequeo (entre -127 y 127) podemos usar una variable char (8bits) en vez de una int (16bits), con el consiguiente ahorro de memoria. Todo lo dems dicho para los datos de tipo int se aplica tambin a los de tipo char .

Una curiosidad: letra = 'A'; printf( "La letra es: %c y su valor ASCII es: %i\n", letra, letra ); letra = letra + 1; printf( "Ahora es: %c y su valor ASCII es: %i\n", letra, letra ); En este ejemplo letra comienza con el valor 'A', que es el cdigo ASCII 65. Al sumarle 1 pasa a tener el valor 66, que equivale a la letra 'B' (cdigo ASCII 66). La salida de este ejemplo sera: La letra es A y su valor ASCII es 65 Ahora es B y su valor ASCII es 66 El modificador Unsigned Este modificador (que significa sin signo) modifica el rango de valores que puede contener una variable. Slo admite valores positivos. Si hacemos: unsigned char variable; Esta variable en vez de tener un rango de -128 a 128 pasa a tener un rango de 0 a 255. El tipo Float En este tipo de variable podemos almacenar nmeros decimales, no slo enteros como en los anteriores. El rango de posibles valores es del 3,4E-38 al 3,4E38. Declaracin de una variable de tipo float: float numero;

Para imprimir valores tipo float Usamos %f. float num=4060.80; printf( "El valor de num es : %f", num ); Resultado: El valor de num es: 4060.80 Si queremos escribirlo en notacin exponencial usamos %e: float num = 4060.80; printf( "El valor de num es: %e", num ); Que da como resultado: El valor de num es: 4.06080e003 El tipo Double En las variables tipo double se almacenan nmeros reales del 1,7E-307 al 1,7E308. Se declaran como double: double numero; Para imprimir se usan los mismos modificadores que en float. Cmo calcular el mximo valor que admite un tipo de datos Lo primero que tenemos que conocer es el tamao en bytes de ese tipo de dato. Vamos a ver un ejemplo con el tipo INT. Hagamos el siguiente programa:

#include <stdio.h> int main() { int num1; printf( "El tipo int ocupa %i bytes\n", sizeof(int) ); } Comprobado con DJGPP En mi ordenador el resultado es: El tipo int ocupa 4 bytes. Como sabemos 1byte = 8bits. Por lo tanto el tipo int ocupa 4*8=32 bits. Ahora para calcular el mximo nmero debemos elevar 2 al nmero de bits obtenido. En nuestro ejemplo: 2^32=4.294.967.296. Es decir en un int se podra almacenar un nmero entre 0 y 4.294.967.296. Sin embargo esto slo es cierto si usamos un tipo unsigned (sin signo, se hace aadiendo la palabra unsigned antes de int). Para los tipos normales tenemos que almacenar nmeros positivos y negativos. As que de los 4.294.967.296 posibles nmeros la mitad sern positivos y la mitad negativos. Por lo tanto tenemos que dividir el nmero anterior entre 2 = 2.147.483.648. Como el 0 se considera positivo el rango de nmeros posibles que se pueden almacenar en un int sera: 2.147.483.648 a 2.147.483.647. Resumen: 1. Obtenemos el nmero de bytes.

2. Multiplicamos por ocho (ya lo tenemos en bits). 3. Elevamos 2 al nmero de bits. 4. Dividimos entre 2. Overflow: Qu pasa cuando nos saltamos el rango El overflow es lo que se produce cuando intentamos almacenar en una variable un nmero mayor del mximo permitido. El comportamiento es distinto para variablesde nmeros enteros y para variables de nmeros en coma flotante. Con nmeros enteros En mi ordenador y usando DJGPP bajo Dos el tamao del tipo int es de 4bytes(4*8=32bits). El nmero mximo que se puede almacenar en una variable tipo int es por tanto 2.147.483.647 (ver apartado anterior). Si nos pasamos de este nmero el que se guardar ser el siguiente pero empezando desde el otro extremo, es decir, el -2.147.483.648. El compilador seguramente nos dar un aviso (warning) de que nos hemos pasado. #include <stdio.h> int main() { int num1; num1 = 2147483648; printf( "El valor de num1 es: %i\n", num1 ); } Comprobado con DJGPP El resultado que obtenemos es:

El valor de num1 es: -2147483648 Comprueba si quieres que con el nmero anterior (2.147.483.647) no pasa nada. Con nmeros en coma flotante El comportamiento con nmeros en coma flotante es distinto. Dependiendo del ordenador si nos pasamos del rango al ejecutar un programa se puede producir un error y detenerse la ejecucin. Con estos nmeros tambin existe otro error que es el underflow. Este error se produce cuando almacenamos un nmero demasiado pequeo (3,4E-38 en float). Resumen de los tipos de datos en C Esto es algo orientativo, depende del sistema. Tipo char int Datos almacenados Caracteres enteros enteros largos N de Bits 8 Valores posibles (Rango) -128 a 128 -32.767 a 16 32.767 2.147.483.647 32 a 2.147.483.647 32 64 3,4E-38 a 3,4E38 1,7E-307 a Rango usando unsigned 0 a 255 0 a 65.535 0a 4.294.967.295

long

Nums. reales float (coma flotante) double Nums. reales

(coma flotante doble)

1,7E308

Esto no siempre es cierto, depende del ordenador y del compilador. Para saber en nuestro caso qu tamao tienen nuestros tipos de datos debemos hacer lo siguiente. Ejemplo para int: #include <stdio.h> int main() { printf( "Tamao (en bits) de int = %i\n", sizeof( int )*8 ); return 0; } Ya veremos ms tarde lo que significa sizeof. Por ahora basta con saber que nos dice cual es el tamao de una variable o un tipo de dato. Ejercicios Ejercicio 1. Busque los errores: #include <stdio.h> int main() { int nmero; nmero = 2;

return 0; } Solucin: Los nombres de variables no pueden llevar acentos, luego al compilar nmero dar error. #include <stdio.h> int main() { int numero; numero = 2; printf( "El valor es %i" Numero ); return 0; } Solucin: Falta la coma despus de "El valor es %i". Adems la segunda vez numero est escrito con maysculas.

1.4.3 .- MODIFICADORES DE DATOS Los compiladores de C diseados para computadoras personales o microcomputadoras (computadoras con longitud de palabra menor que 32 bit) representan generalmente una palabra con 4 bytes (32 bits). Algunos tipos bsicos de datos se pueden ampliar utilizando los modificadores de tipo de datos Short(corto), Long(largo), Signed(con signo) Unsigned(sin signo)

Tipo int unsigned int signed int short int unsigned short int signed short int log int

Bits 16

Rango -32.767 a 32.767 0 a 65.535

16 16 16 -32.768 a 32.767 -32.768 a 32.767 0 a 65.535 16 16 -32.768 a 32.767 2147483648 a 2147483648

32

signe long int 32 Char Unsigned char Signed char 8 8 8

2147483648 a 214748367 -128 a 127 0 a 255 -128 a 127

Por ejemplo, se pueden definir cantidades enteras como short int , long. Int o insigne int (estos tipos de datos se suelen escribir simplemente Short, long, o insigne y se supone que son enteros). La interpretacin de un tipo de daro entero modificador delante puede variar de un compilador de C a otro, aunque existe una relacin de sentido comn. De esta forma un short int requerir menos memoria o la misma que un int ordinario, pero nunca ms. De igual forma, un Long int puede requerir la misma cantidad de un int ordinario, pero nunca una cantidad de menora menor Si short int e int requieren la misma memoria (por ejemplo 2 Bytes), entonces Long int , generalmente, ocupar el doble (por ejemplo 4 Bytes). O si int y Long int ocupa la misma memoria (4 Bytes), entonces short

int ocupar la mitad de memoria (2 bytes) Un Unsigned int ocupa la misma memoria que un int ordinario. Sin embargo, en el caso de un int ordinario ( o un short int o un Long int), el bit ms a la izquierda se reservara para el signo. En un unsigned int, todos los bits se utilizan para representar el valor numrico , de esta forma , un unsigned int puede llegar a almacenar un valor numerico aproximadamente el doble que un int ordinario (uan que por supuesto no puede almacenar valores negativos). Constantes. (const.) C tiene cuatro tipos bsicos de constantes: constantes enteras, constantes en coma flotante, constantes de carcter y constantes de cadena de carcter. Es ms, hay distintas clases de constantes enteras y en coma flotante, Las constantes enteras y en coma flotante representan numeras. Se las denomina, en general, constantes de tipo numrico. Las siguientes reglas se pueden aplicar a todas las constantes numricas. No se pueden incluir comas ni espacios en blanco en la constante Si se desea, la constante puede ir presenciada de un signo menos(-) (realmente, el signo menos es un operador que cambia el signo de una constante positiva, aunque se puede ver como parte de la constante misma) El valor de una constante no se pude exceder un limite mximo y un mnimo especificado. Para cada tipo de constantes, estos limites varan de un compilador a otro. Este tipo de datos no puede cambiar durante la ejecucin del programa. Por ejemplo Const float pi =3.141592

1.4.4.- OPERADORES Y PRECEDENCIA Manipulando datos (Operadores) [Anterior] [Siguiente] [Contenido] Contenido del captulo

Introduccin, Qu es un operador? Operador = : Asignacin Operadores aritmticos o Suma (+) o Incremento (++) o Resta/Negativo (-) o Decremento (--) o Multiplicacin (*) o Divisin (/) o Resto (%) Operadores de comparacin Operadores lgicos Introduccin a los bits y bytes Operadores de bits Operador sizeof Otros Operadores Orden de evaluacin de operadores Ejercicios

Qu es un operador? Un operador sirve para manipular datos. Los hay de varios tipos: de asignacin, de relacin, lgicos, aritmticos y de manipulacin de bits. En realidad los nombres tampoco importan mucho; aqu lo que

queremos es aprender a programar, no aprender un montn de nombres. Operador de asignacin Este es un operador que ya hemos visto en el captulo de Tipos de Datos. Sirve para dar un valor a una variable. Este valor puede ser un nmero que tecleamos directamente u otra variable: a = 3; o a = b; */ Podemos dar valores a varias variables a la vez: a = b = c = 10; a,b,c el valor 10 */ /* Damos a las variables /* Le damos el valor de una variable /* Metemos un valor directamente */

Tambin podemos asignar a varias variables el valor de otra de un slo golpe: a = b = c = d; d */ Operadores aritmticos Los operadores aritmticos son aquellos que sirven para realizar operaciones tales como suma, resta, divisin y multiplicacin. Si quieres saber cmo usar funciones matemticas ms complejas (exponentes, races, trigonomtricas) vete al captulo correspondiente. Operador (+) : Suma /* a,b,c toman el valor de

Este operador permite sumar variables: #include <stdio.h> int main() { int a = 2; int b = 3; int c; c = a + b; printf ( "Resultado = %i\n", c ); } El resultado ser 5 obviamente. Por supuesto se pueden sumar varias variables o variables ms constantes: #include <stdio.h> int main() { int a = 2; int b = 3; int c = 1; int d; d = a + b + c + 4; printf ( "Resultado = %i\n", c ); } El resultado es 10.

Podemos utilizar este operador para incrementar el valor de una variable: x = x + 5; Pero existe una forma abreviada: x += 5; Esto suma el valor 5 al valor que tena la variable x. Veamos un ejemplo: #include <stdio.h> int main() { int x, y; x = 3; y = 5; x += 2; printf( "x = %i\n", x ); x += y; /* esto equivale a x = x + y */ printf( "x = %i\n", x ); } Resultado: x=5 x = 10

Operador (++) : Incremento

Este operador equivale a sumar uno a la variable: #include <stdio.h> int main() { int x = 5; printf ( "Valor de x = %i\n", x ); x++; printf ( "Valor de x = %i\n", x ); } Resultado: Valor de x = 5 Valor de x = 6 Se puede poner antes o despus de la variable. Operador (-) : Resta/Negativo Este operador tiene dos usos, uno es la resta que funciona como el operador suma y el otro es cambiar de signo. Resta: x = x - 5; Para la operacin resta se aplica todo lo dicho para la suma. Se puede usar tambin como: x -= 5;. Pero tambin tiene el uso de cambiar de signo. Poniendolo delante de una variable o constante equivale a multiplicarla por -1.

#include <stdio.h> int main() { int a, b; a = 1; b = -a; printf( "a = %i, b = %i\n", a, b ); } Resultado: a = 1, b = -1. No tiene mucho misterio. Operador (--) : Decremento Es equivalente a ++ pero en vez de incrementar disminuye el valor de la variable. Equivale a restar uno a la variable. Operador (*) : Multiplicacin y punteros Este operador sirve para multiplicar y funciona de manera parecida a los anteriores. Tambin sirve para definir y utilizar punteros, pero eso lo veremos ms tarde. Operador (/) : Divisin Este funciona tambin como los anteriores pero hay que tener cuidado. Si dividimos dos nmero en coma flotante (tipo float) tenemos las divisin con sus correspondientes decimales. Pero si dividimos dos enteros obtenemos un nmero entero. Es decir que si dividimos 4/3 tenemos como resultado 1. El redondeo

se hace por truncamiento, simplemente se eliminan los decimales y se deja el entero. Si dividimos dos enteros el resultado es un nmero entero, aunque luego lo saquemos por pantalla usando %f o %d no obtendremos la parte decimal. Cuando dividimos dos enteros, si queremos saber cual es el resto (o mdulo) usamos el operador %, que vemos ms abajo. Operador (%) : Resto Si con el anterior operador obtenamos el mdulo o cociente de una divisin entera con ste podemos tener el resto. No funciona ms que con enteros, no vale para nmeros float o double. Cmo se usa: #include <stdio.h> int main() { int a, b; a = 18; b = 5; printf( "Resto de la divisin: %d \n", a % b ); } Operadores de comparacin

Los operadores de condicin se utilizan para comprobar las condiciones de las sentencias de control de flujo (las estudiaremos en el captulo sentencias). Cuando se evala una condicin el resultado que se obtiene es 0 si no se cumple y un nmero distinto de 0 si se cumple. Normalmente cuando se cumplen devuelven un 1. Los operadores de comparacin son: == igual que != distinto que se cumple si son iguales se cumple 1 si son diferentes se cumple si el primero es mayor que > mayor que el segundo se cumple si el primero es menor que < menor que el segundo mayor o igual se cumple si el primero es mayor o >= que igual que el segundo menor o igual se cumple si el primero es menor o <= que igual que el segundo Veremos la aplicacin de estos operadores en el captulo Sentencias. Pero ahora vamos a ver unos ejemplos: #include <stdio.h> int main() { printf( "10 > 5 da como resultado %i\n", 10>5 );

printf( "10 > 5 da como resultado %i\n", 10>5 ); printf( "5== 5 da como resultado %i\n", 5==5 ); printf( "10==5 da como resultado %i\n", 10==5 ); } No slo se pueden comparar constantes, tambin se pueden comparar variables. Operadores lgicos Estos son los que nos permiten unir varias comparaciones: 10>5 y 6==6. Los operadores lgicos son: AND (&&), OR (||), NOT(!). Operador && (AND, en castellano Y): Devuelve un 1 si se cumplen dos condiciones. printf( "Resultado: %i", (10==10 && 5>2 ); Operador || (OR, en castellano O): Devuelve un 1 si se cumple una de las dos condiciones. Operador ! (NOT, negacin): Si la condicin se cumple NOT hace que no se cumpla y viceversa. Ver el captulo Sentencias, seccin Notas sobre las condiciones para ms informacin. Introduccin a los bits y bytes En esta seccin voy a describir lo que son los bytes y los bits. No voy a descubrir nada nuevo, as que la mayora se podrn saltar esta seccin.

Supongo que todo el mundo sabe lo que son los bytes y los bits, pero por si acaso all va. Los bits son la unidad de informacin ms pequea, digamos que son la base para almacenar la informacin. Son como los tomos a las molculas. Los valores que puede tomar un bit son 0 1. Si juntamos ocho bits tenemos un byte. Un byte puede tomar 256 valores diferentes (de 0 a 255). Cmo se consigue esto? Imaginemos nuestro flamante byte con sus ocho bits. Supongamos que los ocho bits valen cero. Ya tenemos el valor 0 en el byte. Ahora vamos a darle al ltimo byte el valor 1. 00000001 -> 1 Este es el uno para el byte. Ahora vamos a por el dos y el tres: 00000010 -> 2 00000011 -> 3 y as hasta 255. Como vemos con ocho bits podemos tener 256 valores diferentes, que en byte corresponden a los valores entre 0 y 255. Operadores de bits Ya hemos visto que un byte son ocho bits. Pues bien, con los operadores de bits podemos manipular las variables por dentro. Los diferentes operadores de bits son: Operador Descripcin | & OR (O) AND (Y)

^ ~ >> << Operador | (OR):

XOR (O exclusivo) Complemento a uno o negacin Desplazamiento a la derecha Desplazamiento a la izquierda

Toma los valores y hace con ellos la operacin OR. Vamos a ver un ejemplo: #include <stdio.h> int main() { printf( "El resultado de la operacin 235 | 143 es: %i\n", 235 | 143 ); } Se obtiene: El resultado de la operacin 235 | 143 es: 239 Veamos la operacin a nivel de bits: 235 -> 11101011 143 -> 10001111 | 239 -> 11101111 La operacin OR funciona de la siguiente manera: Tomamos los bits dos a dos y los comparamos si alguno de ellos es uno, se obtiene un uno. Si ambos son cero el

resultado es cero. Primero se compara los dos primeros (el primero de cada uno de los nmeros, 1 y 1 -> 1), luego la segunda pareja (1 y 0 -> 1) y as sucesivamente. Operador & (AND): Este operador compara los bits tambin dos a dos. Si ambos son 1 el resultado es 1. Si no, el resultado es cero. #include <stdio.h> int main() { printf( "El resultado de la operacin 170 & 155 es: %i\n", 170 & 155 ); } Tenemos: El resultado de la operacin 170 & 155 es: 138 A nivel de bits: 170 -> 10101010 155 -> 10011011 & 138 -> 10001010 Operador ^ (XOR): Compara los bits y los pone a unos si son distintos. 235 -> 11101011 143 -> 10001111 ^ 100 -> 01100100

Operador ~ (Complemento a uno): Este operador acepta un slo dato (operando) y pone a 0 los 1 y a 1 los 0, es decir los invierte. Se pone delante del operando. #include <stdio.h> int main() { printf( "El resultado de la operacin ~152 es: %i\n", ~152 ); } El resultado de la operacin ~152 es: 103 152 -> 10011000 ~ 103 -> 01100111 Operador >> (Desplazamiento a la derecha): Este operador mueve cada bit a la derecha. El bit de la izquierda se pone a cero, el de la derecha se pierde. Si realizamos la operacin inversa no recuperamos el nmero original. El formato es: variable o dato >> nmero de posiciones a desplazar El nmero de posiciones a desplazar indica cuantas veces hay que mover los bits hacia la derecha. Ejemplo: #include <stdio.h> int main() {

printf( "El resultado de la operacin 150 >> 2 es: %i\n", ~152 ); } El resultado de la operacin 150 >> 2 es: 37 Veamos la operacin paso a paso. Esta operacin equivale a hacer dos desplazamientos a la derecha: 150 -> 10010110 Nmero original 75 -> 01001011 Primer desplazamiento. Entra un cero por la izquierda, el cero de la derecha se pierde y los dems se mueven a la derecha. 37 -> 00100101 Segundo desplazamiento. NOTA: Un desplazamiento a la izquierda equivale a dividir por dos. Esto es muy interesante porque el desplazamiento es ms rpido que la divisin. Si queremos optimizar un programa esta es una buena idea. Slo sirve para dividir entre dos. Si hacemos dos desplazamientos sera dividir por dos dos veces, no por tres. Operador << (Desplazamiento a la izquierda): Funciona igual que la anterior pero los bits se desplazan a la izquierda. Esta operacin equivale a multiplicar por 2. Operador Sizeof Este es un operador muy til. Nos permite conocer el tamao en bytes de una variable. De esta manera no tenemos que preocuparnos en recordar o calcular cuanto ocupa. Adems el tamao de una variable

cambia de un compilador a otro, es la mejor forma de asegurarse. Se usa poniendo el nombre de la variable despus de sizeof y separado de un espacio: #include <stdio.h> int main() { int variable; printf( "Tamao de la variable: %i\n", sizeof variable ); } Tamben se puede usar con los especificadores de tipos de datos (char, int, float, double...). Pero en stos se usa de manera diferente, hay que poner el especificador entre parntesis: #include <stdio.h> int main() { printf( "Las variables tipo int ocupan: %i\n", sizeof(int) ); } Otros operadores Existen adems de los que hemos visto otros operadores. Sin embargo ya veremos en sucesivos captulos lo que significa cada uno. Orden de evaluacin de Operadores

Debemos tener cuidado al usar operadores pues a veces podemos tener resultados no esperados si no tenemos en cuenta su orden de evaluacin. Vamos a ver la lista de precedencias, cuanto ms arriba se evala antes: Precedencia () [] -> . ! ~ ++ -- (molde) * & sizeof (El * es el de puntero) * / % (El * de aqu es el de multiplicacin) +<< >> < <= > >= == != & ^ | && || ?: = += -= *= /= , Por ejemplo imaginemos que tenemos la siguiente operacin: 10 * 2 + 5 Si vamos a la tabla de precedencias vemos que el * tiene un orden superior al +, por lo tanto primero se

hace el producto 10*2=20 y luego la suma 20+5=25. Veamos otra: 10 * ( 2 + 5 ) Ahora con el parntesis cambia el orden de evaluacin. El que tiene mayor precedencia ahora es el parntesis, se ejecuta primero. Como dentro del parntesis slo hay una suma se evala sin ms, 2+5=7. Ya solo queda la multiplicacin 10*7=70. Otro caso: 10 * ( 5 * 2 +3 ) Como antes, el que mayor precedencia tiene es el parntesis, se evala primero. Dentro del parntesis tenemos producto y suma. Como sabemos ya se evala primero el producto, 5*2=10. Seguimos en el parntesis, nos queda la suma 10+3=13. Hemos acabado con el parntesis, ahora al resto de la expresin. Cogemos la multiplicacin que queda: 10*13=130. Otro detalle que debemos cuidar son los operadores ++ y --. Estos tienen mayor precedencia que las dems operaciones aritmticas (+, -, *, /, %). Por ejemplo: 10 * 5 ++ Puede parecer que primero se ejecutar la multiplicacin y luego el ++. Pero si vamos a la tabla de precedencias vemos que el ++ est por encima de * (de multiplicacin), por lo tanto se evaluar primero 5++=6. 10*6=60.

Es mejor no usar los operadores ++ y -- mezclados con otros, pues a veces obtenemos resultados inesperados. Por ejemplo: #include <stdio.h> int main() { int a, b; a = 5; b = a++; printf( "a = %i, b = %i\n", a, b ); } Este ejemplo en unos compiladores dar a = 6, b = 5 y en otros a = 6 y b = 6. Por favor si podeis, escribidme diciendo qu valores os salen a vosotros y qu compilador usais. Para asegurarse lo mejor sera separar la lnea donde se usa el ++ y el =: #include <stdio.h> int main() { int a, b; a = 5; a++; b = a; printf( "a = %i, b = %i\n", a, b ); }

Ejercicios Ejercicio 1: En este programa hay un fallo muy gordo y muy habitual en programacin. A ver si lo encuentras: #include <stdio.h> int main() { int a, c; a = 5; c += a +5; } Solucin: Cuando calculamos el valor de 'c' sumamos a+5 ( =10 ) al valor de 'c'. Pero resulta que 'c' no tena ningn valor indicado por nosotros. Estamos usando la variable 'c' sin haberle dado valor. En algunos compiladores el resultado ser inesperado. Este es un fallo bastante habitual, usar variables a las que no hemos dado ningn valor. Ejercicio 2: Cual ser el resultado del siguiente programa? #include <conio.h> #include <stdio.h> int main() { int a, b, c;

a = 5; b = ++a; c = ( a + 5 * 2 ) * ( b + 6 / 2 ) + ( a * 2 ); printf( "%i, %i, %i", a, b, c ); } Solucin: El resultado es 156. En la primera a vale 5. Pero en la segunda se ejecuta b = ++a = ++5 = 6. Tenemos a = b = 6. Ejercicio 3: Escribir un programa que compruebe si un nmero es par o impar. Solucin: #include <stdio.h> int main() { char palabra[100]; int a; a = 124; if ( a % 2 == 0 ) printf( "%d es par\n", a ); else printf( "%d es impar\n", a ); printf( "\n" ); system( "pause" ); return 0; }

Para comprobar si un nmero es par o impar podemos usar el operador '%'. Si al calcular el resto de dividir un nmero por 2 el resultado es cero eso indica que el nmero es par. Si el resto es distinto de cero el nmero es impar.

1.4.5.- CONSTRUCCION DE EXPRESIONES

1.4.6.- SENTENCIAS Y BLOQUES DE SENTENCIAS DE PROGRAMA LAS SENTENCIAS PARA EL PREPROCESADOR Son rdenes que el preprocesador interpreta antes de que el cdigo fuente sea compilado. El preprocesador produce un programa escrito en C que es lo que se compila despus. Deben empezar con el smbolo " # " en la primera columna. # define PI 3.1416 # define EQ == ---------# define cuadrado(x) ( (x) * (x) ) ---------# include <stdio.h> # include <math.h> ----------

# define PRUEBA 1 ... ... # if PRUEBA printf("prueba: x = %d\n", x); # endif ---------# ifdef UNO ... ... # else ... ... # endif ( cc -DUNO fn.c ) ---------# ifndef ---------1.5 .- ESTRUCTURA DE UN PROGRAMA La estructura ms usual de un programa en C es la siguiente: 1: \*Programa para calcular el producto de dos nmeros */ 2:# include < stdio.h>
3: int a,b,c ; 4: int product (int x, int y); 5 : main ( ) 6: { 7: /*Pide el primer nmero*/ 8: printf (Enter a number between 1 and 100: ) ; 9: scanf (%d,&a);

10: 11: /*Pide el segundo nmero*/ 12: printf ( Enter another nmber between 1 and 100 :) 13: scanf (%d,&b); 14: 15: /*Calcula y despliega el producto */ 16: c= product (a,b); 17: printf ( \n%d times %d = %d,a,b,c); 18 : } 19 : 20: /* Funcion que regresa el producto de sus dos argumentos */ 21: int product (int x ,int y) 22: { 23: return (x*y); 24: } 1: Comentario del programa el compilador ignora todos los comentarios. 2: Aade el contenido del archivo STDIO.H. 3: Se proporciona el nombre y el tipo de dato. 4: Las lineas 5-18 comprenden la funcin main que consiste en el nombre main seguido de un par de parntesis y un par de llaves, dentro de las llaves se encuentran enunciados que forman el cuerpo principal del programa 20: Comentario 21-24 : Una funcin es una seccin de cdigo independiente y autocontenida que es escrita para ejecutar determinada tarea.

555555555programa, las funciones auxiliares, etc... Cuando se necesite, se puede incluir un fichero fuente mediante la primitiva del preprocesador #include, utilizando una linea por cada archivo. Para utilizar una funcin de librera es necesario incluir el archivo cabecera donde est declarada la funcin y tambin se puede encontrar declaraciones de constantes y tipos. Por convencin, los nombres de los archivos cabecera que contienen declaraciones acaban con la extensin .h , pero no es obligatorio. Las sentencias para hacer la inclusin son: #include <nombre_archivo.h> #include "nombre_archivo.h" Si se especifica explcitamente el nombre completo del camino al indicar el nombre del archivo, el compilador slo buscar el archivo con ese pathname completo. Diferencia de las dos sintaxis: si se encierra el nombre del archivo entre comillas, primero se buscar el archivo

en el directorio de trabajo actual, y si no lo encuentra, buscar en los directorios estndar de include. Si el nombre est encerrado entre parntesis angulares slo busca el archivo en los directorios de include estndar, pero en ningn momento se recorre el directorio de trabajo actual. Estos directorios estndar son /usr/include o /include, si no se especifican otros directorios con las directivas Idir o -I del compilador. 4. Declaracin de constantes y macros Para definir constantes se sigue el formato: #define identificador valor El compilador substituir el identificador por el valor, cuando lo encuentre en el archivo fuente. En general, las constantes se escriben totalmente en maysculas, aunque el preprocesador no impone ninguna norma al respecto. Es slo por claridad. Permite tambin definir macros, en las cuales se sustituye sus parmetros por los del punto en que se la invoca. Ejemplos: #define TRUE 1

#define FALSE 0 #define ERROR_MSG "Error en la lectura\n" #define IMPRIMIR(x) printf(%d ,x) Programacin en lenguaje C Introducci als Sistemes Operatius 5. Declaracin de variables globales y locales El formato para definir variables es el siguiente: tipo lista_variables ; La lista_variables es el conjunto de nombres de variables separadas por comas. Las variables pueden declararse: a) Dentro del bloque de cdigo de las funciones o del main. Son variables locales y por ello, slo se pueden utilizar en este entorno. b) En la definicin de los parmetros formales de las funciones. Tienen la misma utilizacin que las variables locales. c) Fuera de todas las funciones, incluido el main. Son variables globales y se pueden usar desde cualquier parte del programa.

5.1. Tipos de datos 5.1.1. Tipos de datos elementales Ejemplo: int a, b, c ; float x ; 5.1.2. Tipos de datos estructurados Declaracin de tablas El formato general para la declaracin de una tabla unidimensional es: tipo nombre_var [tamao]; Esta sentencia declara una variable nombre_var, donde tipo indica el tipo de los elementos de la tabla, y tamao el nmero de elementos que contiene la tabla. Esta tabla se indexar desde 0 hasta tamao-1. Un tipo especial de tablas son los "strings", que son vectores de carcteres que acaban con el carcter ASCII 0. Ejemplo: int vector[10]; char mens1[5], mens2[80] ; Para acceder a un elemento de una tabla, el formato es: nombre_var[posicin].Tambin se pueden definir

tablas multidimensionales, siguiendo el esquema: tipo nombre_var [tam_dim_1][tam_dim_2] ... [tam_dim_N]; en el que tam_dim_i es el tamao de la dimensin i-sima. Ejemplo: int a, b, num[3][10][4]; Nombre Descripcin int entero char carcter float nmero de coma flotante (con punto decimal y/o exponente)a funcin (aparte de los comentarios explicativos de dicha funcin). El uso de la sentencia GOTO debe ser restringido al mximo, pues la los programas y los hace ilegibles. Como dicen Kerninghan y Ritchie en su libro de C, su utilizacin slo est justificada en casos muy especiales, como salir de una estructura profundamente anidada, aunque para ello podemos, a veces, usar los comandos break, continue, return o la funcin exit(). Igualmente, esos recursos, para salir de bucles anidados deben usarse lo menos posible y slo en casos que quede bien clara su finalidad. Si no queda clara su finalidad, ser mejor que nos planteemos de nuevo el problema y estudiemos otra posible solucin que seguro que la hay.

Normalmente, un programa en C se suele estructurar de la siguiente forma: 1. Primero los comentarios de presentacin, como ya hemos indicado. 2. Despus, la inclusin de bibliotecas del sistema, los ficheros .h con el #include y entre ngulos (<...>) el nombre del fichero. Quizs la ms tpica sea: 3. #include <stdio.h> 4. Bibliotecas propias de la aplicacin. Normalmente, en grandes aplicaciones, se suelen realizar varias libreras con funciones, separadas por su semntica. Los nombres de fichero se ponen entre comillas (para que no las busque en el directorio de las bibliotecas o libreras estndar) y se puede incluir un comentario aclarativo: 5. #include "rata.h" /* Rutinas para control del ratn */ 6. #include "cola.h" /* Primitivas para el manejo de una cola */ 7. Variables globales, usadas en el mdulo y declaradas en otro mdulo distinto, con la palabra reservada extern. 8. Constantes simblicas y definiciones de macros, con #define. 9. Definicin de tipos, con typedef. 10. Declaracin de funciones del mdulo: Se escribir slo el prototipo de la funcin, no su implementacin. De esta forma, el programa (y el programador) sabr el nmero y el tipo de cada parmetro y cada funcin.

11. Declaracin de variables globales del mdulo: Se trata de las variables globales declaradas aqu, y que si se usan en otro mdulo debern llevar, en el otro mdulo, la palabra extern. 12. Implementacin de funciones: Aqu se programarn las acciones de cada funcin, incluida la funcin principal. Normalmente, si el mdulo incluye la funcin principal, la funcin main(), sta se pone la primera, aunque a veces se pone al final y nunca en medio. El resto de funciones, se suelen ordenar por orden de aparicin en la funcin principal y poner juntas las funciones que son llamadas desde otras. Es una buena medida, que aparezcan en el mismo orden que sus prototipos, ya que as puede ser ms fcil localizarlas. Naturalmente, este orden no es estricto y pueden cambiarse algunos puntos por otros, pero debemos ser coherentes, y usar el mismo orden en todos los mdulos. Por ejemplo, es frecuente saltarse la declaracin de los prototipos de las funciones poniendo en su lugar la implementacin y, por supuesto, dejando para el final la funcin main(). Otro punto muy importante es el referente a variables globales. En general es mejor no usar nunca variables globales, salvo que sean variables que se usen en gran parte de las funciones (y mdulos) y est bien definida y controlada su utilidad. El uso de estas variables puede dar lugar

a los llamados efectos laterales, que provienen de la modificacin indebida de una de estas variables en algn mdulo desconocido. Lo mejor es no usar nunca variables globales y pasar su valor por parmetros a las funciones que estrictamente lo necesiten, viendo as las funciones como cajas negras, a las que se le pasan unos determinados datos y nos devuelve otros, perfectamente conocidos y expresados en sus parmetros. Por la misma razn que no debemos usar variables globales, no se deben usar pasos de parmetros por referencia (o por variable), cuando no sea necesario. 1. Un programa debe ser claro, estar bien organizado y que sea fcil de leer y entender. Casi todos los lenguajes de programacin son de formato libre, de manera que los espacios no importan, y podemos organizar el cdigo del programa como ms nos interese. Para aumentar la claridad no se deben escribir lneas muy largas que se salgan de la pantalla y funciones con muchas lneas de cdigo (especialmente la funcin principal). Una funcin demasiado grande demuestra, en general, una programacin descuidada y un anlisis del problema poco estudiado. Se deber, en tal caso, dividir el bloque en varias llamadas a otras funciones ms simples, para que su lectura sea ms agradable. En general se debe modularizar siempre que se pueda, de forma que el programa principal llame a las funciones ms generales, y

estas vayan llamando a otras, hasta llegar a las funciones primitivas ms simples. Esto sigue el principio de divide y vencers, mediante el cual es ms fcil solucionar un problema dividindolo en subproblemas (funciones) ms simples. A veces, es conveniente usar parntesis en las expresiones, aunque no sean necesarios, para aumentar la claridad. Cada bloque de especial importancia o significacin, y cada funcin debe separarse de la siguiente con una lnea en blanco. A veces, entre cada funcin se aaden una linea de asteriscos o guiones, como comentario, para destacar que empieza la implementacin de otra funcin (aparte de los comentarios explicativos de dicha funcin). El uso de la sentencia GOTO debe ser restringido al mximo, pues la los programas y los hace ilegibles. Como dicen Kerninghan y Ritchie en su libro de C, su utilizacin slo est justificada en casos muy especiales, como salir de una estructura profundamente anidada, aunque para ello podemos, a veces, usar los comandos break, continue, return o la funcin exit(). Igualmente, esos recursos, para salir de bucles anidados deben usarse lo menos posible y slo en casos que quede bien clara su finalidad. Si no queda clara su finalidad, ser mejor que nos planteemos de nuevo el problema y estudiemos otra posible solucin que seguro que la hay.

Normalmente, un programa en C se suele estructurar de la siguiente forma: 1. Primero los comentarios de presentacin, como ya hemos indicado. 2. Despus, la inclusin de bibliotecas del sistema, los ficheros .h con el #include y entre ngulos (<...>) el nombre del fichero. Quizs la ms tpica sea: 3. #include <stdio.h> 4. Bibliotecas propias de la aplicacin. Normalmente, en grandes aplicaciones, se suelen realizar varias libreras con funciones, separadas por su semntica. Los nombres de fichero se ponen entre comillas (para que no las busque en el directorio de las bibliotecas o libreras estndar) y se puede incluir un comentario aclarativo: 5. #include "rata.h" /* Rutinas para control del ratn */ 6. #include "cola.h" /* Primitivas para el manejo de una cola */ 7. Variables globales, usadas en el mdulo y declaradas en otro mdulo distinto, con la palabra reservada extern. 8. Constantes simblicas y definiciones de macros, con #define. 9. Definicin de tipos, con typedef. 10. Declaracin de funciones del mdulo: Se escribir slo el prototipo de la funcin, no su implementacin. De esta forma, el programa (y el programador) sabr el nmero y el tipo de cada parmetro y cada funcin.

11. Declaracin de variables globales del mdulo: Se trata de las variables globales declaradas aqu, y que si se usan en otro mdulo debern llevar, en el otro mdulo, la palabra extern. 12. Implementacin de funciones: Aqu se programarn las acciones de cada funcin, incluida la funcin principal. Normalmente, si el mdulo incluye la funcin principal, la funcin main(), sta se pone la primera, aunque a veces se pone al final y nunca en medio. El resto de funciones, se suelen ordenar por orden de aparicin en la funcin principal y poner juntas las funciones que son llamadas desde otras. Es una buena medida, que aparezcan en el mismo orden que sus prototipos, ya que as puede ser ms fcil localizarlas. Naturalmente, este orden no es estricto y pueden cambiarse algunos puntos por otros, pero debemos ser coherentes, y usar el mismo orden en todos los mdulos. Por ejemplo, es frecuente saltarse la declaracin de los prototipos de las funciones poniendo en su lugar la implementacin y, por supuesto, dejando para el final la funcin main(). Otro punto muy importante es el referente a variables globales. En general es mejor no usar nunca variables globales, salvo que sean variables que se usen en gran parte de las funciones (y mdulos) y est bien definida y controlada su utilidad. El uso de estas variables puede dar lugar

a los llamados efectos laterales, que provienen de la modificacin indebida de una de estas variables en algn mdulo desconocido. Lo mejor es no usar nunca variables globales y pasar su valor por parmetros a las funciones que estrictamente lo necesiten, viendo as las funciones como cajas negras, a las que se le pasan unos determinados datos y nos devuelve otros, perfectamente conocidos y expresados en sus parmetros. Por la misma razn que no debemos usar variables globales, no se deben usar pasos de parmetros por referencia (o por variable), cuando no sea necesario.

También podría gustarte