You are on page 1of 105

El Lenguaje C

Un poco de Historia

El lenguaje de programacin C fue diseado por Dennis Ritchie en los laboratorios Bell para desarrollar nuevas versiones del sistema operativo Unix, all por el ao 1972. De ah, la fuerte relacin entre el C y la mquina. El lenguaje ensamblador es aquel que tiene una correspondencia di- recta con el lenguaje mquina que entiende el procesador. En otraspalabras, cada instruccin del lenguaje mquina se corresponde con una instruccin del lenguaje ensamblador.

Un poco de Historia

Por el contrario, las instrucciones del lenguaje C pueden equivaler a pequeos programas en el lenguaje mquina, pero de frecuente uso en los algoritmos que se programan en los computadores. Es decir, se trata de un lenguaje en el que se emplean instrucciones que slo puede procesar una mquina abstracta, que no existe en la realidad (el procesador real slo entiende el lenguaje mquina). Por ello, se habla del C como lenguaje de alto nivel de abstraccin y del ensam- blador como lenguaje de bajo nivel.

Un poco de Historia

Esta mquina abstracta se construye parcialmente mediante un con-junto de programas que se ocupan de gestionar la mquina real: el sistema operativo. La otra parte se construye empleando un programa de traduccin del lenguaje de alto nivel a lenguaje mquina. Estos programas se llaman compiladores si generan un cdigo que puede ejecutarse directamente por el computador, o intrpretes si es necesaria su ejecucin para llevar a cabo el programa descrito en un lenguaje de alto nivel.

Un poco de Historia

Para el caso que nos ocupa, resulta de mucho inters que el cdigo de los programas que constituyen el sistema operativo sea lo ms in- dependiente de la mquina posible. nicamente de esta manera ser viable adaptar un sistema operativo a cualquier computador de forma rpida y fiable. Por otra parte, es necesario que el compilador del lenguaje de alto nivel sea extremadamente eficiente. Para ello, y dado los escasos re- cursos computacionales (fundamentalmente, capacidad de memoria y velocidad de ejecucin) de los ordenadores de aquellos tiempos, se requiere que el lenguaje sea simple y permita una traduccin muy ajustada a las caractersticas de los procesadores.

Un poco de Historia

ste fue el motivo de que en el origen de C estuviera el lenguaje de- nominado B, desarrollado por Ken Thompson para programar Unix para el PDP-7 en 1970. Evidentemente, esta versin del sistema operativo tambin incluy una parte programada en ensamblador, pues haba operaciones que no podan realizarse sino con la mquina real.

El Lenguaje C
La relativa simplicidad del lenguaje C por su escaso nmero de instrucciones permite que sus compiladores generen un cdigo en lenguaje mquina muy eficiente y, adems, lo convierten en un lenguaje fcilmente transportable de una mquina a otra. Esta simplicidad, no obstante, ha supuesto la necesidad de disponer para C de un conjunto de funciones muy completas que le confieren una gran potencia para desarrollar aplicaciones de todo tipo. Mu- chas de estas funciones son estndar y se encuentran disponibles en todos los compiladores de C.

El Lenguaje C
Las funciones estndar de C se recogen en una biblioteca: la biblioteca estndar de funciones. As pues, cualquier programa puede emplear todas las funciones que requiera de la misma, puesto que todos los compiladores disponen de ella. Finalmente, dada su dependencia de las funciones estndar, C promueve una programacin modular en la que los propios programadores tambin pueden preparar funciones especficas en sus programas.

El Lenguaje C
Todas estas caractersticas permitieron una gran difusin de C que se normaliz por la ANSI (American National Standards Association) en 1989 a partir de los trabajos de un comit creado en 1983 para proporcionar una definicin no ambigua e independiente de m- quina del lenguaje. La segunda edicin de Kernighan y Ritchie, que se public en 1988, refleja esta versin que se conoce como ANSI-C.

Un Primer Programa
Un programa es un texto escrito en un lenguaje simple que permite expresar una serie de acciones sobre objetos (instrucciones) de forma no ambigua. Antes de elaborar un programa, como en todo texto escrito, habremos de conocer las reglas del lenguaje para que aquello que se exprese sea correcto tanto lxica como sintcticamente.

Un Primer Programa
Adems deberemos procurar que el programa tenga sentido y exprese exactamente aquello que se desea que haga. Ahora ya podemos escribir el siguiente programa en C:
Es muy importante tener presente que, en C (y tambin en C++ y en Java), se distinguen maysculas de minsculas. Por lo tanto, el tex to del programa tiene que ser exactamente como se ha mostrado a excepcin del texto entre comillas y el que est entre los smbolos /* y */.

#include <stdio.h> main( ) { printf( ""Hola a todos! \n" ); } /* main */

Un Primer Programa
Una vez editado y guardado el programa en C, hay que compilarlo para obtener un fichero binario (con ceros y unos) que contenga una versin del programa traducido a lenguaje mquina. Para ello, hay que emplear el compilador en nuestro caso la version en modo consola del c++ de Builder.

#include <stdio.h> main( ) { printf( ""Hola a todos! \n" ); } /* main */

Estructura General de un Programa Simple


En general, un programa en C debera estar organizado como sigue: /* Fichero: nombre.c */ /* Contenido: ejemplo de estructura de un programa en C */ /* Autor: nombre del autor */ /* Revisin: preliminar*/ /* COMANDOS DEL PREPROCESADOR*/ /* -inclusin de ficheros de cabeceras */ #include <stdio.h> /* -definicin de constantes simblicas*/ #define FALSO 0 /* FUNCIONES DEL PROGRAMADOR*/ main( ) /* Funcin principal:*/ { /* El programa se empieza a ejecutar aqu */ ... /* Cuerpo de la funcin principal */ } /* main */

Dada la simplicidad del C, muchas de las operaciones que se realizan en un programa son, en realidad, llamadas a funciones estndar. As pues, para que el compilador conozca qu parmetros tienen y qu valores devuelven, es necesario incluir en el cdigo de nuestro programa las declaraciones de las funciones que se emplea- rn. Para ello, se utiliza el comando #include del llamado preprocesador de C, que se ocupa de montar un fichero nico de entrada para el compilador de C.

Estructura General de un Programa Simple

Los ficheros que contienen declaraciones de funciones externas a un determinado archivo fuente son llamados ficheros de cabeceras (header files). De ah que se utilice la extensin .h para indicar su contenido.

Tanto estos ficheros como el del cdigo fuente de un programa pue- den contener definiciones de constantes simblicas. Estas constantes simblicas son reemplazadas por su valor en el fiche- ro final que se suministra al compilador de C. Es importante recalcar que su uso debe redundar en una mayor legibilidad del cdigo y, por otra parte, en una facilidad de cambio del programa, cuando fuese necesario. A continuacin presentamos una muestra de estas definiciones: #define VACIO '\0 /* El carcter ASCII NUL*/ #define NUMERO_OCTAL 0173 /* Un valor octal*/ #define MAX_USUARIOS 20 #define CODIGO_HEXA 0xf39b /* Un valor hexadecimal*/ #define PI 3.1416 /* Un nmero real */ #define PRECISION 1e-10 /* Otro nmero real*/ #define CADENA "cadena de caracteres"

Estructura General de un Programa Simple

Estructura General de un Programa Simple


Finalmente, se incluir el programa en el cuerpo de la funcin principal (main). Esta funcin debe estar presente en todo programa, pues la primera instruccin que contenga es la que se toma como punto inicial del programa y, por tanto, ser la primera en ser ejecutada.
main( ) /* Funcin principal:*/ { /* El programa se empieza a ejecutar aqu */ ... /* Cuerpo de la funcin principal */ } /* main */

Programacion Imperativa
La programacin consiste en la traduccin de algoritmos a versiones en lenguajes de programacin que puedan ser ejecutados directa o indirectamente por un ordenador. La mayora de algoritmos consisten en una secuencia de pasos que indican lo que hay que hacer. Estas instrucciones suelen ser de carcter imperativo, es decir, indican lo que hay que hacer de forma incondicional.

Programacion Imperativa
La programacin de los algoritmos expresados en estos trminos se denomina programacin imperativa. As pues, en este tipo de programas, cada instruccin implica realizar una determinada accin sobre su entorno, en este caso, en el computador en el que se ejecuta.

Tipos de datos Bsicos


Los tipos de datos primitivos de un lenguaje son aqullos cuyo tratamiento se puede realizar con las instrucciones del mismo lenguaje; es decir, que estn soportados por el lenguaje de programacin co- rrespondiente. En C, los tipos de datos primitivos ms comunes son los compatibles con enteros. La representacin binaria de stos no es codificada, sino que se corresponde con el valor numrico representado en base 2. Por tanto, se puede calcular su valor numrico en base 10 sumando los productos de los valores intrnsecos (0 o 1) de sus dgitos (bits) por sus valores posicionales (2posicin) correspondientes.

Tipos de datos Bsicos


Se tratan bien como nmeros naturales, o bien como representaciones de enteros en base 2, si pueden ser negativos. En este ltimo caso, el bit ms significativo (el de ms a la izquierda) es siempre un 1 y el valor absoluto se obtiene restando el nmero natural representado del valor mximo representable con el mismo nmero de bits ms 1.

Tipos de datos Bsicos

Las palabras de la especificacin entre parntesis son opcionales en las declaraciones de las variables correspondientes. Por otra parte, hay que tener presente que las especificaciones pueden variar levemente con otros compiladores. Hay que recordar especialmente los distintos rangos de valores que pueden tomar las variables de cada tipo para su correcto uso en los programas. De esta manera, es posible ajustar su tamao al que realmente sea til.

Tipos de datos Bsicos


El tipo carcter (char) es, de hecho, un entero que identifica una po- sicin de la tabla de caracteres ASCII. Para evitar tener que traducir los caracteres a nmeros, stos se pueden introducir entre comillas simples (por ejemplo: 'A'). Tambin es posible representar cdigos no visibles como el salto de lnea ('\n') o la tabulacin ('\t').

Tipos de datos Bsicos


Numeros reales Este tipo de datos es ms complejo que el anterior, pues su representacin binaria se encuentra codificada en distintos campos. As pues, no se corresponde con el valor del nmero que se podra extraer de los bits que los forman. Los nmeros reales se representan mediante signo, mantisa y exponente. La mantisa expresa la parte fraccionaria del nmero y el exponente es el nmero al que se eleva la base correspondiente:

[+/-] mantisa x base exponente

Tipos de datos Bsicos


Numeros reales

Declaraciones
La declaracin de una variable supone manifestar su existencia ante el compilador y que ste planifique una reserva de espacio en la me- moria para contener sus datos. La declaracin se realiza anteponien- do al nombre de la variable la especificacin de su tipo (char, int, float, double), que puede, a su vez, ir precedida de uno o varios modificadores (signed, unsigned, short, long). El uso de algn modificador hace innecesaria la especificacin int salvo para long. Por ejemplo:

Declaraciones

La asignacin y la evaluacin de expresiones


Tal como se ha comentado, en la programacin imperativa, la ejecucin de las instrucciones implica cambiar el estado del entorno del programa o, lo que es lo mismo, cambiar la referencia de la instruc- cin a ejecutar y, posiblemente, el contenido de alguna variable. Esto ltimo ocurre cuando la instruccin que se ejecuta es la de asignacin:
variable = expresin en trminos de variables y valores constantes ;

La asignacin y la evaluacin de expresiones


Evidentemente, evaluar una expresin no tiene sentido si no se asig- na el resultado de su evaluacin a alguna variable que pueda almacenarlo para operaciones posteriores. As pues, el primer operador que se debe aprender es el de asignacin: entero = 23; destino = origen;
Es importante no confundir el operador de asignacin (=) con el de comparacin de igualdad (==); pues en C, ambos son operadores que pueden emplearse entre datos del mismo tipo.

Operadores
Aparte de la asignacin, los operadores ms habituales de C y que aparecen en otros lenguajes de programacin se muestran en la tabla siguiente:

Operadores
Los operadores aritmticos sirven tanto para los nmeros reales, como para los enteros. Por este motivo, se realizan implcitamente todas las operaciones con el tipo de datos de mayor rango. A este comportamiento implcito de los operadores se le llama promocin de tipos de datos y se realiza cada vez que se opera con da- tos de tipos distintos.

Operadores
Por ejemplo, el resultado de una operacin con un entero y un real (las constantes reales deben tener un punto decimal o bien contener la letra e que separa mantisa de exponente) ser siempre un n- mero real. En cambio, si la operacin se efecta slo con enteros, el resultado ser siempre el del tipo de datos entero de mayor rango. De esta manera: real = 3 / 2 ; tiene como resultado asignar a la variable real el valor 1.0, que es el resultado de la divisin entera entre 3 y 2 transformado en un real

Operadores
Aun con esto, el operador de asignacin siempre convierte el resultado de la expresin fuente al tipo de datos de la variable receptora. Por ejemplo, la asignacin siguiente: entero = 3.0 / 2 + 0.5; asigna el valor 2 a entero. Es decir, se calcula la divisin real (el nmero 3.0 es real, ya que lleva un punto decimal) y se suma 0.5 al resultado. Esta suma acta como factor de redondeo. El resultado es de tipo real y ser truncado (su parte decimal ser eliminada) al ser asignado a la variable entero.

Operadores
Operadores relacionales: Hay que tener presente que en C no hay ningn tipo de datos lgico que se corresponda con 'falso' y verdadero'. As pues, cualquier dato de tipo compatible con entero ser indicacin de 'falso' si es 0, y 'cierto' si es distinto de 0. Esto puede no suceder con los datos de tipo real, pues hay que tener presente que incluso los nmeros infinitesimales cerca del 0 sern tomados como indicacin de resultado lgico 'cierto'.

Operadores
Operadores relacionales: Como consecuencia de ello, los operadores relacionales devuelven 0 para indicar que la relacin no se cumple y distinto de 0 en caso afir- mativo. Los operadores && y || slo evalan las expresiones necesa- rias para determinar, respectivamente, si se cumplen todos los casos o slo algunos. As pues, && implica la evaluacin de la expresin que constituye su segundo argumento slo en caso de que el primero haya resultado positivo. Similarmente, || slo ejecutar la evaluacin de su segundo argumento si el primero ha resultado 'falso'.

Operadores
Operadores relacionales:

As pues: (20 > 10) || ( 10.0 / 0.0 < 1.0 ) dar como resultado 'cierto' a pesar de que el segundo argumento no se puede evaluar (es una divisin por cero!). En el caso anterior, los parntesis eran innecesarios, pues los opera- dores relacionales tienen mayor prioridad que los lgicos. Aun as, es conveniente emplear parntesis en las expresiones para dotarlas de mayor claridad y despejar cualquier duda sobre el orden de eva- luacin de los distintos operadores que puedan contener.

Operadores
Otros operadores: Como se ha comentado, C fue un lenguaje inicialmente concebido para la programacin de sistemas operativos y, como consecuencia, con un alto grado de relacin con la mquina, que se manifiesta en la existencia de un conjunto de operadores orientados a facilitar una traduccin muy eficiente a instrucciones del lenguaje mquina. En particular, dispone de los operadores de autoincremento (++) y autodecremento (--), que se aplican directamente sobre variables cuyo contenido sea compatible con enteros.

Operadores
Por ejemplo:
contador++; /* Equivalente a: contador = contador + 1; */ --descuento; /* Equivalente a: descuento = descuento - 1; */

La diferencia entre la forma prefija (es decir, precediendo a la variable) y la forma postfija de los operadores estriba en el momento en que se hace el incremento o decremento: en forma prefija, se hace antes de emplear el contenido de la variable.

Operadores
Por ejemplo:

Vase cmo se modifican los contenidos de las variables en el siguiente ejemplo: a = 5;/* ( a == 5 )*/ b = ++a; /* ( a == 6 ) && ( b == 6 ) */ c = b--; /* ( c == 6 ) && ( b == 5 ) */

Instrucciones de seleccin
En el modelo de ejecucin de los programas, las instrucciones se ejecutan en secuencia, una tras la otra, en el mismo orden en que aparecen en el cdigo. Ciertamente, esta ejecucin puramente secuencial no permitira realizar programas muy complejos, pues siempre realizaran las mismas operaciones. Por ello, es necesario contar con instrucciones que permitan controlar el flujo de ejecucin del programa. En otras palabras, disponer de instrucciones que permitan alterar el orden secuencial de su ejecucin.

Instrucciones de seleccin
if( condicin ) instruccin_si ; else instruccin_no ; switch( expresin ) { case valor_1 : instrucciones case valor_2 : instrucciones default : instrucciones } /* switch */
La condicin tiene que ser una expresin cuya evaluacin d como resultado un dato de tipo compatible con entero. Si el resultado es distinto de cero, se considera que la condicin se cumple y se ejecuta instruccin_si. En caso contrario, se ejecuta instruccin_no. El else es opcional. La evaluacin de la expresin debe resultar en un dato compatible con entero. Este resultado se compara con los valores indicados en cada case y, de ser igual a alguno de ellos, se ejecutan todas las instrucciones a partir de la primera indicada en ese caso y hasta el final del bloque del switch. Es posible romper esta secuencia introduciendo una instruccin break; que finaliza la ejecucin de la secuencia de instrucciones. Opcionalmente, es posible indicar un caso por omisin (default) que permite especificar qu instrucciones se ejecutaran si el resultado de la expresin no ha producido ningn dato coincidente con los casos previstos.

Instrucciones de seleccin
En el caso del if es posible ejecutar ms de una instruccin, tanto si la condicin se cumple como si no, agrupando las instrucciones en un bloque. Los bloques de instrucciones son instrucciones agrupadas entre llaves: { instruccin_1; instruccin_2; ... instruccin_N; } En este sentido, es recomendable que todas las instrucciones condicionales agrupen las instrucciones que se deben ejecutar en cada caso: if( condicin ) { instrucciones } else { instrucciones } /* if */

Instrucciones de seleccin
De esta manera se evitan casos confusos como el siguiente: if( a > b ) mayor = a ; menor = b ; diferencia = mayor - menor; En este caso se asigna b a menor, independientemente de la condicin, pues la nica instruccin del if es la de asignacin a mayor.

Instrucciones de seleccin
Como se puede apreciar, las instrucciones que pertenecen a un mis- mo bloque empiezan siempre en la misma columna. Para facilitar la identificacin de los bloques, stos deben presentar un sangrado a la derecha respecto de la columna inicial de la instruccin que los gobierna (en este caso: if, switch y case).
Por convenio, cada bloque de instrucciones debe presentar un sangrado a la derecha respecto de la instruccin que determina su ejecucin.

Dado que resulta frecuente tener que asignar un valor u otro a una variable es funcin de una condicin, es posible, para estos casos, emplear un operador de asignacin condicional en lugar de una instruccin if: condicin ? expresin_si_cierto : expresin_si_falso As pues, en lugar de: if( condicion ) var = expresin_si_cierto; else var = expresin_si falso;

Instrucciones de seleccin

Es preferible limitar el uso del operador condicional a los casos en que se facilite la lectura.

Se puede escribir:
var = condicin ? expresin_si_cierto : expresin_si_falso;

Funciones estndar de entrada y de salida


El lenguaje C slo cuenta con operadores e instrucciones de control de flujo. Cualquier otra operacin que se desee realizar hay que programarla o bien emplear las funciones de que se disponga en nuestra biblioteca de programas. El lenguaje C cuenta con un amplio conjunto de funciones estndar entre las que se encuentran las de entrada y de salida de datos, que veremos en esta seccin. El compilador de C tiene que saber (nombre y tipo de datos de los ar- gumentos y del valor devuelto) qu funciones utilizar nuestro progra- ma para poder generar el cdigo ejecutable de forma correcta. Por tanto, es necesario incluir los ficheros de cabecera que contengan sus declaraciones en el cdigo de nuestro programa. En este caso: #include <stdio.h>
Ya hemos comentado que una funcin no es ms que una serie de instrucciones que se ejecuta como una unidad para llevar a cabo una tarea concreta. Como idea, puede tomarse la de las funciones matemticas, que realizan alguna operacin con los argumentos dados y devuelven el resultado calculado.

Funciones de salida estndar: La salida estndar es el lugar donde se muestran los datos producidos (mensajes, resultados, etctera) por el programa que se encuentra en ejecucin. Normalmente, esta salida es la pantalla del ordenador o una ventana dentro de la pantalla. En este ltimo caso, se trata de la ventana asociada al programa. printf( "formato" [, lista_de_campos ] ) Esta funcin imprime en la pantalla (la salida estndar) el texto cotenido en formato. En este texto se sustituyen los caracteres espe- ciales, que deben de ir precedidos por la barra invertida (\), por su significado en ASCII. Adems, se sustituyen los especificadores de campo, que van precedidos por un %, por el valor resultante de la expresin (normalmente, el contenido de una variable) correspondiente indicada en la lista de campos. Este valor se imprime segn el formato indicado en el mismo especificador.

Funciones estndar de entrada y de salida

Funciones de salida estndar: (continuacion)

Funciones estndar de entrada y de salida

La tabla siguiente muestra la correspondencia entre los smbolos de la cadena del formato de impresin y los caracteres ASCII. n se utiliza para indicar un dgito de un nmero:

Funciones estndar de entrada y de salida


Funciones de salida estndar: (continuacion) Los especificadores de campo tienen el formato siguiente: %[-][+][anchura[.precisin]]tipo_de_dato Los corchetes indican que el elemento es opcional. El signo menos se emplea para indicar alineacin derecha, cosa habitual en la impresin de nmeros. Para stos, adems, si se especifica el signo ms se conseguir que se muestren precedidos por su signo, sea positivo o negativo. La anchura se utilizar para indicar el nmero mnimo de caracteres que se utilizarn para mostrar el campo correspon- diente y, en el caso particular de los nmeros reales, se puede espe- cificar el nmero de dgitos que se desea mostrar en la parte decimal mediante la precisin.

Funciones de salida estndar: (continuacion)

Funciones estndar de entrada y de salida

El tipo de dato que se desea mostrar se debe incluir obligatoriamente y puede ser uno de los siguientes:

Ejemplo: printf( "El importe de la factura nm.: %5d", num_fact ); printf( "de Sr./-a. %s sube a %.2f_\n", cliente, importe ); Para los tipos numricos es posible prefijar el indicador de tipo con una ele a la manera que se hace en la declaracin de tipos con long. En este caso, el tipo double debe tratarse como un "long float" y, por tanto, como "%lf".

Funciones de salida estndar: (continuacion)

Funciones estndar de entrada y de salida

putchar( carcter ) Muestra el carcter indicado por la salida estndar. Ejemplo: putchar( \n' ); puts( "cadena de caracteres" ) Muestra una cadena de caracteres por la salida estndar. Ejemplo: puts( "Hola a todos!\n" );

Funciones estndar de entrada y de salida


Funciones de entrada estndar: Se ocupan de obtener datos de la entrada estndar que, habitual- mente, se trata del teclado. Devuelven algn valor adicional que in- forma del resultado del proceso de lectura. El valor devuelto no tiene por qu emplearse si no se necesita, pues muchas veces se conoce que la entrada de datos se puede efectuar sin mayor problema. scanf( "formato" [, lista_de_&variables ] ) Lee del buffer del teclado para trasladar su contenido a las variables que tiene como argumentos. La lectura se efecta segn el formato indicado, de forma similar a la especificacin de campos empleada para printf.

Funciones de entrada estndar: (continuacion)

Funciones estndar de entrada y de salida

Para poder depositar los datos ledos en las variables indicadas, esta funcin requiere que los argumentos de la lista de variables sean las direcciones de memoria en las que se encuentran. Por este motivo, es necesario emplear el operador direccin de (&). De esta manera, scanf deja directamente en las zonas de memoria correspondiente la informacin que haya ledo y, naturalmente, la variable afectada ver modificado su contenido con el nuevo dato.
Es importante tener presente que si se especifican menos argumentos que especificadores de campo en el formato, los resultados pueden ser imprevisibles, pues la funcin cambiar el contenido de alguna zona de memoria totalmente aleatoria.

Funciones de entrada estndar: (continuacion) Ejemplo:

Funciones estndar de entrada y de salida


scanf( "%d", &num_articulos );

En el ejemplo anterior, scanf lee los caracteres que se tecleen para convertirlos (presumiblemente) a un entero. El valor que se obtenga se colocar en la direccin indicada en su argumento, es decir, en el de la variable num_articulos. Esta lectura de caracteres del buffer de memoria del teclado se detiene cuando el carcter ledo no se co- rresponde con un posible carcter del formato especificado. Este ca- rcter se devuelve al buffer para una posible lectura posterior.

Funciones de entrada estndar: (continuacion)

Funciones estndar de entrada y de salida

Para la entrada que se muestra en la figura siguiente, la funcin detiene la lectura despus del espacio en blanco que separa los nmeros tecleados. ste y el resto de caracteres se quedan en el buffer para posteriores lecturas.

La funcin scanf devuelve el nmero de datos correctamente ledos. Es decir, todos aquellos para los que se ha encontrado algn texto compatible con una representacin de su tipo.

Funciones de entrada estndar: (continuacion)

Funciones estndar de entrada y de salida

getchar( ) Devuelve un carcter ledo por la entrada estndar (habitualmente, el buffer del teclado). Ejemplo: respuesta = getchar(); En caso de que no pueda leer ningn carcter, devuelve el carcter EOF. Esta constante est definida en stdio.h y, por tanto, puede emplearse para determinar si la lectura ha tenido xito o, por lo con- trario, se ha producido algn error o se ha llegado al final de los da- tos de entrada.

Funciones de entrada estndar: (continuacion)

Funciones estndar de entrada y de salida

gets( cadena_caracteres ) Lee de la entrada estndar toda una serie de caracteres hasta encontrar un final de lnea (carcter '\n'). Este ltimo carcter es ledo pero no se almacena en la cadena de caracteres que tiene por argumento. Ejemplo: gets( nombre_usuario ); De no leer nada devuelve NULL, que es una constante definida en stdio.h y cuyo valor es 0.

Ejercicios
1. Edita, compila, ejecuta y comprueba el funcionamiento del siguiente programa:
#include <stdio.h> main() { int a, b, suma; printf( "Teclea un nmero entero: " ); scanf( "%d", &a ); printf( "Teclea otro nmero entero: " ); scanf( "%d", &b ); suma = a + b; printf( "%d + %d =%d\n", a, b,suma ); } /* main */

Ejercicios
2. Hacer un programa que, dado un importe en bolivares y un determinado porcentaje de IVA, calcule el monto total. 3. Hacer un programa que calcule cunto costara 1Kg o 1 litro de un producto (contenido en el envase) sabiendo el precio de un envase y la cantidad de producto que contiene. 4. Modifica el programa anterior para que calcule el precio del producto para la cantidad deseada, que tambin deber darse como entrada. 5. Hacer un programa que calcule el cambio que hay que devolver conociendo el importe total a cobrar y la cantidad recibida como pago. El programa debe advertir si el importe pagado es insuficiente.

Ejercicios
2. Hacer un programa que, dado un importe en bolivares y un determinado porcentaje de IVA, calcule el monto total. 3. Hacer un programa que calcule cunto costara 1Kg o 1 litro de un producto (contenido en el envase) sabiendo el precio de un envase y la cantidad de producto que contiene. 4. Modifica el programa anterior para que calcule el precio del producto para la cantidad deseada, que tambin deber darse como entrada. 5. Hacer un programa que calcule el cambio que hay que devolver conociendo el importe total a cobrar y la cantidad recibida como pago. El programa debe advertir si el importe pagado es insuficiente.

Ejercicios
6. Hacer un programa que, dado el nmero de litros aproximado que hay en el depsito de un coche, su consumo medio cada 100 km y una distancia en kilmetros, indique si es posible recorrerla. En caso negativo, debe indicar cuntos litros habra que aadir al depsito.

Posibles Soluciones
2. #include <stdio.h> main() {float importe, IVA, total; printf( "Importe = " ); scanf( "%f", &importe ); printf( "%% IVA = " ); scanf( "%f", &IVA ); total = importe * ( 1.0 + IVA / 100.0 ); printf( "Total = %.2f\n", total ); } /* main */

Posibles Soluciones
3. #include <stdio.h> main() { float precio, precio_unit; int cantidad; printf( "Precio = " ); scanf( "%f", &precio ); printf( "Cantidad (gramos o mililitros) = " ); scanf( "%d", &cantidad ); precio_unit = precio * 1000.0 / (float) cantidad; printf( "Precio por Kg/Litro = %.2f\n", precio_unit ); } /* main */

4. #include <stdio.h> main() {float precio, precio_unit, precio_compra; int cantidad, canti_compra; printf( "Precio = " ); scanf( "%f", &precio ); printf( "Cantidad (gramos o mililitros) = " ); scanf( "%d", &cantidad ); printf( "Cantidad a adquirir = " ); scanf( "%d", &canti_compra ); precio_unit = precio / (float) cantidad; precio_compra = precio_unit * canti_compra; printf( "Precio de compra = %.2f\n", precio_compra ); } /* main */

Posibles Soluciones

5. #include <stdio.h> main() { float importe, pago; printf( "Importe = " ); scanf( "%f", &importe ); printf( "Pago = " ); scanf( "%f", &pago ); if( pago < importe ) { printf( "Importe de pago insuficiente.\n" ); } else { printf( "Cambio = %.2f euros.\n", pago - importe ); } /* if */ } /* main */

Posibles Soluciones

6. #include <stdio.h> #define RESERVA 10 main() {int litros, distancia, consumo; float consumo_medio; printf( "Litros en el depsito = " ); scanf( "%d", &litros ); printf( "Consumo medio cada 100Km = " ); scanf( "%f", &consumo_medio ); printf( "Distancia a recorrer = " ); scanf( "%d", &distancia ); consumo = consumo_medio * (float) distancia / 100.0; if( litros < consumo ) { printf( "Faltan %d Ltrs.\n", consumo-litros+RESERVA ); } else { printf( "Se puede hacer el recorrido.\n" ); } /* if */ } /* main */

Posibles Soluciones

Programacin estructurada
La programacin eficaz es aquella que obtiene un cdigo legible y fcilmente actualizable en un tiempo de desarrollo razonable y cuya ejecucin se realiza de forma eficiente. Afortunadamente, los compiladores e intrpretes de cdigo de programas escritos en lenguajes de alto nivel realizan ciertas optimizaciones para reducir el coste de su ejecucin. Sirva como ejemplo el hecho de que muchos compiladores tienen la capacidad de utilizar el mismo espacio de memoria para diversas variables, siempre que stas no se utilicen simultneamente, claro est. Adems de sta y otras optimizaciones en el uso de la memoria, tambin pueden incluir mejoras en el cdigo ejecutable tendentes a disminuir el tiempo final de ejecucin. Pueden, por ejemplo, aprovechar los factores comunes de las expresiones para evitar la repeticin de clculos.

Programacin estructurada
Con todo esto, los programadores pueden centrar su tarea en la pre- paracin de programas legibles y de fcil mantenimiento. Por ejemplo, no hay ningn problema en dar nombres significativos a las variables, pues la longitud de los nombres no tiene consecuencias en un cdigo compilado. En este mismo sentido, no resulta lgico em- plear trucos de programacin orientados a obtener un cdigo ejecutable ms eficiente si ello supone disminuir la legibilidad del cdigo fuente. Generalmente, los trucos de programacin no suponen una mejora significativa del coste de ejecucin y, en cambio, implican di- ficultad de mantenimiento del programa y dependencia de un deter- minado entorno de desarrollo y de una determinada mquina. Por este motivo, se explica cmo organizar el cdigo fuente de un programa. La correcta organizacin de los programas supone un incremento notable de su legibilidad y, como consecuencia, una disminucin de los errores de programacin y facilidad de mantenimiento y actualizacin posterior.

Programacin estructurada
Concepto: La programacin estructurada es una tcnica de programacin que result del anlisis de las estructuras de control de flujo subyacentes a todo programa de computador. El producto de este estudio revel que es posible construir cualquier estructura de control de flujo mediante tres estructuras bsicas: la secuencial, la condicional y la iterativa. Un teorema formulado el ao 1966 por Bhm y Jacopini dice que todo programa propio debera tener un nico punto de entrada y un nico punto de salida, de manera que toda instruccin entre estos dos puntos es ejecutable y no hay bucles infinitos.

Programacin estructurada
Concepto: (continuacion) La conjuncin de estas propuestas proporciona las bases para la construccin de programas estructurados en los que las estructuras de control de flujo se pueden realizar mediante un conjunto de ins- trucciones muy reducido. De hecho, la estructura secuencial no necesita ninguna instruccin adicional, pues los programas se ejecutan normalmente llevando a cabo las instrucciones en el orden en que aparecen en el cdigo fuente.

Instrucciones iterativas
Las instrucciones iterativas son instrucciones de control de flujo que permiten repetir la ejecucin de un bloque de instrucciones. En la ta- bla siguiente se muestran las que estn presentes en C: Se ejecutan todas las instrucciones en while( condicin ) { Instrucciones } /* while */
el bloque del bucle mientras la expresin de la condicin d como resultado un dato de tipo compatible con entero distinto de cero; es decir, mientras la condicin se cumpla. Las instrucciones pueden no ejecutarse nunca.

Instrucciones iterativas
do { Instrucciones } while ( condicin );
De forma similar al bucle while, se ejecutan todas las instrucciones en el bloque del bucle mientras la expresin de la condicin se cumpla. La diferencia estriba en que las instrucciones se ejecutarn, al menos, una vez. (La comprobacin de la condicin y, por tanto, de la posible repeticin de las instrucciones, se realiza al final del bloque.)

for( inicializacin ; condicin ; continuacion) El comportamiento es parecido a un bucle while; es decir, { mientras se cumpla la condicin se ejecutan las instrucciones de su bloque. En este caso, sin embargo, es instrucciones posible indicar qu instruccin o instrucciones quieren } /* for */ ejecutarse de forma previa al inicio del bucle

(inicializacin) y qu instruccin o instrucciones hay que ejecutar cada vez que finaliza la ejecucin de las instrucciones (continuacin).

Instrucciones iterativas
Como se puede apreciar, todos los bucles pueden reducirse a un bucle mientras. Aun as, hay casos en los que resulta ms lgico emplear alguna de sus variaciones. Hay que tener presente que la estructura del flujo de control de un programa en un lenguaje de alto nivel no refleja lo que realmente hace el procesador (saltos condicionales e incondicionales) en el aspecto del control del flujo de la ejecucin de un programa. Aun as, el lenguaje C dispone de instrucciones que nos acercan a la realidad de la mquina, como la de salida forzada de bucle (break;) y la de la continuacin forzada de bucle (continue;). Adems, tambin cuenta con una instruccin de salto incondicional (goto) que no debera de emplearse en ningn programa de alto nivel.

Instrucciones iterativas
Normalmente, la programacin de un bucle implica determinar cul es el bloque de instrucciones que hay que repetir y, sobre todo, bajo qu condiciones hay que realizar su ejecucin. En este sentido, es muy importante tener presente que la condicin que gobierna un bu- cle es la que determina la validez de la repeticin y, especialmente, su finalizacin cuando no se cumple. Ntese que debe existir algn caso en el que la evaluacin de la expresin de la condicin d como resultado un valor 'falso'. En caso contrario, el bucle se repetira indefinidamente (esto es lo que se llamara un caso de bucle infinito).
La instruccin iterativa debe escogerse en funcin de la condicin que gobierna el bucle y de su posible inicializacin.

Instrucciones iterativas
En los casos en que sea posible que no se ejecuten las instrucciones del bucle, es conveniente emplear while. Por ejemplo, para calcular cuntos divisores tiene un nmero entero positivo dado:

Instrucciones iterativas
A veces, la condicin que gobierna el bucle depende de alguna variable que se puede tomar como un contador de repeticiones; es decir, su contenido refleja el nmero de iteraciones realizado. En estos casos, puede considerarse el uso de un bucle for. En concreto, se podra interpretar como iterar el siguiente conjunto de instrucciones para todos los valores de un contador entre uno inicial y uno final dados. En el ejemplo siguiente, se muestra esta interpretacin en cdigo C:
A pesar de que el ejemplo anterior es muy comn, no es necesario que la variable que acte de contador tenga que incrementarse, ni que tenga que hacerlo en un paso fijo, ni que la condicin slo deba consistir en comprobar que haya llegado a su valor final y, ni mucho menos, que sea una variable adicional que no se emplee en las instrucciones del cuerpo a iterar. De hecho sera muy til que fuera alguna variable cuyo contenido se modificara a cada iteracin y que, con ello, pudiese emplearse como contador.

Esquemas algortmicos: recorrido y bsqueda


En los dos casos, el tratamiento de la secuencia se puede observar en el cdigo del programa, pues debe realizarse mediante alguna instruccin iterativa. Habitualmente, este bucle se corresponde con un esquema algortmico determinado. En los siguientes apartados veremos los dos esquemas fundamentales para el tratamiento de se- cuencias de datos Esquemas algortmicos: recorrido y bsqueda: Los esquemas algortmicos para el procesado de secuencias de datos son unos patrones que se repiten frecuentemente en muchos al- goritmos. Consecuentemente, existen unos patrones equivalentes en los lenguajes de programacin como el C. En este apartado veremos los patrones bsicos de tratamiento de secuencias: el de recorrido y el de bsqueda.

Esquemas algortmicos: recorrido y bsqueda


Recorrido: Un recorrido de una secuencia implica realizar un tra- tamiento idntico a todos los miembros de la misma. En otras palabras, supone tratar cada uno de los elementos de la secuencia, desde el primero hasta el ltimo. Si el nmero de elementos de que constar la secuencia es conocido a priori y la inicializacin del bucle es muy simple, entonces puede ser conveniente emplear un bucle for. En caso contrario, los bucles ms adecuados son el bucle while o el dowhile si se sabe que habr, al menos, un elemento en la secuencia de datos.

Esquemas algortmicos: recorrido y bsqueda


Recorrido:

El esquema algortmico del recorrido de una secuencia sera, en su versin para C, el que se presenta a continuacin:

El patrn anterior podra realizarse con alguna otra instruccin iterativa, si las circunstancias lo aconsejaran.

Esquemas algortmicos: recorrido y bsqueda


Para ilustrar varios ejemplos de recorrido, supongamos que se desea obtener la temperatura media en la zona de una estacin meteorolgica. Para ello, procederemos a hacer un programa al que se le suministran las temperaturas registradas a intervalos regulares por el termmetro de la estacin y obtenga la media de los valores introducidos. As pues, el cuerpo del bucle consiste, simplemente, en acumular la temperatura (tratar el elemento) y en leer una nueva temperatura (avanzar en la secuencia):
En este bloque iterativo se puede observar que temperatura debe tener un valor determinado antes de poderse acumular en la variable acumulado, la cual, a su vez, tambin tiene que estar inicializada. Similarmente, cantidad deber inicializarse a cero.

Esquemas algortmicos: recorrido y bsqueda


Por ello, la fase de inicializacin y preparacin de la secuencia ya est lista: Aun queda por resolver el problema de establecer
la condicin de fi- nalizacin de la secuencia de datos. En este sentido, puede ser que la secuencia de datos tenga una marca de final de secuencia o que su longitud sea conocida. En el primero de los casos, la marca de final debe de ser un elemento especial de la secuencia que tenga un valor distinto del que pueda tener cualquier otro dato. En este sentido, como se sabe que una temperatura no puede ser nunca inferior a -273,16 oC (y, mucho menos, una temperatura ambiental), se puede emplear este valor como marca de final. Por claridad, esta marca ser una constante definida en el preprocesador:

#define MIN_TEMP -273.16

Esquemas algortmicos: recorrido y bsqueda


Cuando se encuentre, no deber ser procesada y, en cambio, s que debe hacerse la finalizacin del recorrido, calculando la media:

Esquemas algortmicos: recorrido y bsqueda


En el clculo de la media, se comprueba primero que haya algn dato significativo para computarse. En caso contrario, se asigna a media la temperatura de marca de final. Con todo, el cdigo del re- corrido sera el mostrado a continuacin:

Esquemas algortmicos: recorrido y bsqueda


Si la marca de final de secuencia se proporcionara aparte, la instruc- cin iterativa debera ser una do..while. En este caso, se supondr que la secuencia de entrada la forman elementos con dos datos: la temperatura y un valor entero tomado como valor lgico que indica si es el ltimo elemento:

Esquemas algortmicos: recorrido y bsqueda


En caso de que se conociera el nmero de temperaturas (NTEMP) que se han registrado, bastara con emplear un bucle de tipo for:

Esquemas algortmicos: recorrido y bsqueda


Bsqueda:
Las bsquedas consisten en recorridos, mayoritariamente parciales, de secuencias de datos de entrada. Se recorren los datos de una se- cuencia de entrada hasta encontrar el que satisfaga una determina- da condicin. Evidentemente, si no se encuentra ningn elemento que satisfaga la condicin, se realizar el recorrido completo de la secuencia. Siguiendo el ejemplo anterior, es posible hacer una bsqueda que detenga el recorrido cuando la media progresiva se mantenga en un margen de 1 oC respecto de la temperatura detectada durante ms de 10 registros.
De forma general, la bsqueda consiste en recorrer una secuencia de datos de entrada hasta que se cumpla una determinada condicin o se acaben los elementos de la secuencia. No es necesario que la condicin afecte a un nico elemento.

Esquemas algortmicos: recorrido y bsqueda


El esquema algortmico es muy parecido al del recorrido, salvo por el hecho de que se incorpora la condicin de bsqueda y que, a la salida del bucle, es necesario comprobar si la bsqueda se ha resuelto satisfactoriamente o no: En este esquema se supone que se han definido las constantes FALSO y CIERTO del modo siguiente:

#define FALSO 0 #define CIERTO 1

Esquemas algortmicos: recorrido y bsqueda


Si se aplica el patrn anterior a la bsqueda de una media progresiva estable, el cdigo fuente sera el siguiente: En los casos de bsqueda no suele ser conveniente emplear un for, ya que suele ser una instruccin iterativa que emplea un contador que toma una serie de valores desde uno inicial hasta uno final. Es decir, hace un recorrido por la secuencia implcita de todos los valo- res que toma la variable de conteo.

Filtros y tuberas
Los filtros son programas que generan una secuencia de datos a par- tir de un recorrido de una secuencia de datos de entrada. Habitual- mente, la secuencia de datos de salida contiene los datos procesados de la de entrada. El nombre de filtros se les aplica porque es muy comn que la se- cuencia de salida sea, simplemente, una secuencia de datos como la de entrada en la que se han suprimido algunos de sus elementos.

Filtros y tuberas
Un filtro sera, por ejemplo, un programa que tuviera como salida las sumas parciales de los nmeros de En los casos de entrada:

bsqueda no suele ser conveniente emplear un for, ya que suele ser una instruccin iterativa que emplea un contador que toma una serie de valores desde uno inicial hasta uno final. Es decir, hace un recorrido por la secuencia implcita de todos los valo- res que toma la variable de conteo.

Filtros y tuberas
Un filtro sera, por ejemplo, un programa que tuviera como salida las sumas parciales de los nmeros de entrada:

Filtros y tuberas
Otro filtro, quiz ms til, podra tratarse de un programa que sustituya los tabuladores por el nmero de espacios en blanco necesarios hasta la siguiente columna de tabulacin:
Estos pequeos programas pueden resultar tiles por s mismos o bien combinados. As pues, la secuencia de datos de salida de uno puede constituir la secuencia de entrada de otro, constituyndose lo que de- nominamos una tubera (pipe, en ingls) la idea visual es que por un extremo de la tubera se introduce un flujo de datos y por el otro se ob- tiene otro flujo de datos ya procesado. En el camino, la tubera puede incluir uno o ms filtros que retienen y/o transforman los datos.
Una estructura homognea es aquella cuyos datos son todos del mismo tipo y una heterognea puede estar formada por datos de tipo distinto.

Estructuras de Datos
Los tipos de datos bsicos (compatibles con enteros y reales) pueden agruparse en estructuras homogneas o heterogneas, de manera que se facilita (y aclara) el acceso a sus componentes dentro de un programa.

Una estructura homognea es aquella cuyos datos son todos del mismo tipo y una heterognea puede estar formada por datos de tipo distinto.

Matrices
Las matrices son estructuras de datos homogneas de tamao fijo. Es decir, se representa siempre una informacin que emplea un n- mero determinado de datos. Tambin se llaman arreglos (una tra- duccin bastante directa del trmino array en ingls), tablas (para las de una o dos dimensiones) o vectores (si son unidimensionales). En el caso particular de los vectores de caracteres, reciben el nombre de cadenas de caracteres o strings, en ingls.

Matrices y Vectores
Declaracion: A continuacin se muestran cuatro declaraciones de matrices distintas y un esquema de su distribucin en la memoria del computador. El n- mero de bytes de cada divisin depende del tipo de dato de cada ma- triz correspondiente. En el esquema ya se avanza el nombre de cada dato dentro de la matriz, en el que se distingue el nombre comn de la matriz y una identificacin particular del dato, que se corresponde con la posicin del elemento en ella. Es muy importante tener presente que las posiciones siempre se numeran desde 0, en C

Matrices y Vectores
Declaracion:

A continuacin, se muestran las declaraciones de las variables que conduciran hasta la distribucin en memoria que se ha visto: intvector[4]; charcadena[20]; unsigned shorttabla[10]; doublematriz[3][3];
La matriz cuadrada se almacena en la memoria por fi- las; es decir, primero aparece la primera fila, luego la segunda y as hasta la ltima. En caso de que hubiera que declarar una matriz con un nmero mayor de dimensiones, bastara con aadir su tamao entre corchetes en la posicin deseada entre el nombre de la estructura y el punto y coma final.

La primera declaracin prepara un vector de 4 enteros con signo; la segunda, una cadena de 20 caracteres; la tercera, una tabla de 10 enteros positivos, y la ltima reserva espacio para una matriz de 3 3 nmeros reales de doble precisin.

Matrices y Vectores
Como se ha comentado, las cadenas de caracteres son, realmente, matrices unidimensionales en C. Es decir, que tienen una longitud mxima fijada por el espacio reservado al vector que les correspon- de. Aun as, las cadenas de caracteres pueden ser de longitud va- riable y, por tanto, se utiliza un marcador de final. En este caso, se trata del carcter NUL del cdigo ASCII, cuyo valor numrico es 0. En el ejemplo anterior, la cadena puede ser cualquier texto de hasta 19 caracteres, pues es necesario prever que el ltimo carcter es el de fin de cadena ('\0'). En todos los casos, especialmente cuando se trata de variables que hayan de contener valores constantes, se puede dar un valor inicial a cada uno de los elementos que contienen. Hay que tener presente que las matrices se guardan en memoria por filas y que es posible no especificar la primera dimensin (la que aparece inmediatamente despus del nombre de la variable) de una matriz. En este caso, tomar las dimensiones necesarias para conte- ner los datos presentes en su inicializacin. El resto de dimensiones deben de estar fijadas de manera que cada elemento de la primera dimensin tenga una ocupacin de memoria conocido.

Matrices y Vectores
En los ejemplos siguientes, podemos observar distintas inicializaciones para las declaraciones de las variables anteriores.

En el caso de la cadena de caracteres, los elementos en posiciones posteriores a la ocupada por '\0' no tendrn ningn valor inicial. Es ms, podrn tener cualquier valor. Se trata, pues, de una iniciali- zacin incompleta.

Para facilitar la inicializacin de las cadenas de caracteres tambin es posible hacerlo de la manera siguiente:

Matrices y Vectores

char cadena[20] = "Hola";


Si, adems, la cadena no ha de cambiar de valor, es posible aprovechar que no es necesario especificar la dimensin, si sta se puede calcular a travs de la inicializacin que se hace de la variable co- rrespondiente:

char cadena[] = "Hola";


En el caso de la tabla, se realiza una inicializacin completa al indicar, con la ltima coma, que todos los elementos posteriores tendrn el mismo valor que el ltimo dado.

Referencia: Para hacer referencia, en alguna expresin, a un elemento de una matriz, basta con indicar su nombre y la posicin que ocupa dentro de ella: matriz[i0][i1]...[in] donde ik son expresiones el resultado de las cuales debe de ser un valor entero. Habitualmente, las expresiones suelen ser muy simples: una variable o una constante.

Matrices y Vectores

Referencia: Por ejemplo, para leer de la entrada estndar los datos para la ma- triz de reales dobles de 3 3 que se ha declarado anteriormente, se podra hacer el programa siguiente en el que, por supuesto, las va- riables fila y columna son enteros positivos:

Matrices y Vectores

Matrices y Vectores
Es muy importante tener presente que el compilador de C no aade cdigo para comprobar la validez de los ndices de las matrices. Por lo tanto, no se comprueban los lmites de las matrices y se puede ha- cer referencia a cualquier elemento, tanto si pertenece a la matriz como si no. Esto es siempre responsabilidad del programador! Adems, en C, los corchetes son operadores de acceso a estructuras ho- mogneas de datos (es decir, matrices) que calculan la posicin de un elemento a partir de la direccin de memoria base en la que se encuen- tran y el argumento que se les da. Esto implica que es posible, por ejem- plo, acceder a una columna de una matriz cuadrada (por ejemplo: int A[3][3]; ) indicando slo su primer ndice (por ejemplo: pcol = A[0]; ). Ms an, es posible que se cometa el error de referirse a un elemento en la forma A[1,2] (comn en otros lenguajes de programa- cin). En este caso, el compilador acepta la referencia al tratarse de una forma vlida de acceder a la ltima columna de la matriz, puesto que la coma es un operador de concatenacin de expresiones cuyo resulta- do es el de la ltima expresin evaluada; es decir, para el ejemplo dado, la referencia A[1,2] sera, en realidad, A[2].

Matrices y Vectores
Ejemplos En este primer ejemplo, el programa comprobar si una palabra o frase corta es un palndromo; es decir, si se lee igual de izquierda a derecha que de derecha a izquierda.
Uno de los palndromos ms conocidos en castellano es el siguiente: dbale arroz a la zorra el abad . Como gets toma como argumento la referencia de toda la cade- na de caracteres, es decir, la direccin de la posicin inicial de memoria que ocupa, no es necesario emplear el operador de di- reccin de.

Matrices y Vectores
El siguiente programa que se muestra almacena en un vector los coeficientes de un polinomio para luego evaluarlo en un determinado punto. El polinomio tiene la forma siguiente: P(x) = aMAX_GRADO-1xMAX_GRADO + ... + a2x2 + a1x + a0 Los polinomios seran almacenados en un vector segn la correspondencia siguiente: a[MAX_GRADO-1]= aMAX_GRADO-1 :: a[2]= a2 a[1]= a1 a[0]= a0

Matrices y Vectores
El programa deber evaluar el polinomio para una x determinada se- gn el mtodo de Horner, en el cual el polinomio se trata como si estu- viera expresado en la forma:

P(x) = (... (aMAX_GRADO-1x + aMAX_GRADO-2)x + ... + a1)x + a0 De esta manera, el coeficiente de mayor grado se multiplica por x y le suma el coeficiente del grado precedente. El resultado se vuelve a multiplicar por x, siempre que en este proceso no se haya llegado al trmino independiente. Si as fuera, ya se habra obtenido el resultado final.

Matrices y Vectores

You might also like