La presente gua complementa los temas de algortmica desarrollados en el curso de Informtica, introduciendo elementos bsicos del lenguaje C que posibilitan al alumno la prueba inmediata y depuracin en mquina de los algoritmos que ha construido en pseudocdigo durante la ejercitacin. Se presentan as, en forma selectiva, las sentencias y estructuras necesarias para la tarea, sin entrar en una descripcin completa de las caractersticas y posibilidades del lenguaje C.
Ejemplo de codificacin de un algoritmo
PSEUDOCODIGO C / C++
Organizacin de un programa en C
Un programa en C puede organizarse en secciones, siguiendo la lnea de los algoritmos estudiados en el curso.
1) Seccin de declaracin o parte declarativa El nombre del programa puede colocase en un comentario. Pueden escribirse comentarios en cualquier parte del programa, precedidos de //. Otra forma de identificar comentarios es encerrarlos entre /* y */, algoritmo circulos // calcula areas de circulos // a partir de diametros var entero: n real: diam, radio, area const pi = 3.141592654 inicio n 0 escribir (ingresar diametro: ) leer (diam) repetir mientras (diam <> 0) si (diam < 0) entonces escribir (error diametro negativo) sino n n + 1 radio diam/2 area = pi * radio * radio escribir (area = , area) finsi escribir (ingresar diametro: ) leer (diam) finmientras escribir ('se han calculado , n , ' areas) fin
// programa circulos // calcula areas de circulos // a partir de diametros #include <stdio.h> #include <math.h> int n; float diam, radio, area; const double pi = 3.141592654; void main() {n = 0; printf("ingresar diametro: "); scanf("%f",&diam); while (diam!=0) {if (diam<0) printf("error diametro negativo\n"); else {n++; // equivale a n=n+1 radio=diam/2; area=pi*radio*radio; printf("area = %f\n",area) ;} printf("ingrese diametro: "); scanf("%f",&diam) ;} printf ("se han calculado %d",n); printf(" areas\n"); } 2 y en este caso pueden abarcar ms de una lnea. Luego deben declararse los archivos y bibliotecas complementarios que se van emplear y esto se hace (en forma ms o menos standard) mediante las sentencias #include. La declaracin de variables debe incluir todas las variables con que el programa va a trabajar. Tener en cuenta que para los nombres de variables en C, las maysculas y las minsculas son letras distintas. Evitar confusiones en este sentido. Los tipos bsicos de datos son:
entero: int (integer) real de precisin ordinaria: float (floating point, punto flotante) real de precisin doble: double lgico: bool (boolean) carcter: char (character)
Observar detalles de sintaxis: En C no se escribe la palabra var, no se colocan dos puntos luego del tipo, y cada lnea termina con ;. Eventualmente C puede operar con datos complejos, para lo que se deben incluir archivos y bibliotecas diseados a este efecto. En este curso no utilizaremos complejos.
2) Seccin de ejecucin o parte de procesos (cuerpo del algoritmo) En correspondencia con el inicio-fin de los algoritmos, la seccin de ejecucin de un programa C comienza con void main() seguido de una llave abierta {, y finaliza con una llave cerrada }.
Expresiones y asignaciones
Las expresiones aritmticas en C se construyen con las mismas reglas, y empleando operadores similares a los definidos en el pseudocdigo. Las evaluacin de los operadores sigue el orden jerrquico habitual, aclarando que el operador mod (resto de la divisin entera) se representa en C con el smbolo %. Cuando se dividen dos enteros, el resultado es entero, es decir se truncan los decimales. P. ej. 23 / 7 3; 23 % 7 2 . Adems, las versiones originales de C no poseen un operador especfico para la potenciacin, pero las potencias pueden calcularse mediante la funcin de biblioteca pow(a, n) a elevado a la n.
Los operadores de relacin son ==, != , < , > , <= , >= . Las constantes lgicas se expresan mediante true y false, y los operadores lgicos son (or), & (and), !(not).
En ausencia de parntesis, C evala las expresiones combinadas en el orden que empleamos en los algoritmos, es decir: 1) aritmticas 2) relacionales 3) lgicas
El operador de asignacin, que corresponde a en seudocdigo, es =
Entrada y salida por terminal
Para ingresar desde teclado el valor de una variable, se utiliza la sentencia
scanf(codigo de formato,&nombre de variable)
Los cdigos de formato (que deben ir entre comillas) dependen del tipo de variable, y los ms usuales son: %d : entero 3 %f : real %c : carcter
Para escribir en la pantalla el valor de una o ms variables o expresiones, se emplea la sentencia
printf(cadena de formato,expresion 1, expresion 2, ...)
La cadena de formato, que debe ir entre comillas, puede contener subcadenas constantes a ser exibidas, y cdigos de formato como los de la lectura, en correspondencia con las expresiones a escribir. El cdigo \n indica fin de lnea, o sea la escritura siguiente se har en un nuevo rengln. P- ej. si alfa=2.35; k=4, la sentencia
printf(los resultados son: %f %d\n,alfa, k+1)
escribir en la pantalla
los resultados son 2.35 5
pasando luego al rengln siguiente.
Separacin de sentencias mediante punto y coma
Al escribir algoritmos en pseudocdigo, y en muchos lenguajes de programacinn, es habitual considerar que cada sentencia corresponde a un rengln en el texto. C, en cambio, es un lenguaje de formato libre. Las sentencias pueden escribirse corridas, ya sea varias en un rengln, o una abarcando varios renglones, etc. Si bien una disposicin desordenada es absolutamente desaconsejable desde el punto de vista de la claridad de los programas, la necesidad de distinguir las sentencias obliga a separarlas con punto y coma. Es necesario examinar las reglas de sintaxis del lenguaje para saber qu elementos constituyen una sentencia completa, pero en general, despus del encabezamiento de una estructura de control no debe colocarse punto y coma, ni tampoco despus de una llave cerrada }
Estructuras y sentencias de control
Secuencia
Un conjunto de sentencias que se ejecutan consecutivamente constituye una secuencia. En C, una secuencia puede encerrarse entre llaves { } para formar una sentencia compuesta, que a los efectos de las sentencias de control que veremos luego, puede considerarse como una sentencia nica.
Seleccin
Seleccin simple y doble
El equivalente a: es en C:
si (expresion_logica) entonces if (expresion_logica)
acciones sentencia;
4 sino else
acciones sentencia;
finsi
Observar bien las diferencias:
a) Tanto el bloque then (entonces) como el bloque else (sino, que puede faltar) constan de una sola sentencia. Si, para describir las acciones correspondientes, se necesitan varias sentencias, hay que encerrarlas entre llaves { }, de manera de formar una nica sentencia compuesta.
b) Por la razn anterior, no existe en C una marca especfica de cierre de la estructura, anloga a finsi. En realidad todo el bloque, desde if hasta el ltimo punto y coma o llave, puede considerarse como una nica sentencia.
Seleccin mltiple
La estructura se representa en C como
segun sea (expresion) hacer switch (expresion) { valor1: case valor1: acciones sentencia1; break; valor2: case valor2: acciones sentencia; break; ...... sino default: acciones sentencia; } finsegun
Igual que antes, cada opcin permite ejecutar una nica sentencia. Si se necesita ejecutar varias, hay que recurrir a las sentencias compuestas.
Iteracin o repeticin
Estructura "repetir mientras"
PSEUDOCODIGO: C:
repetir mientras (expresion_logica) while (expresion_logica)
acciones sentencia;
finmientras
donde la sentencia (nica) puede ser simple o compuesta. 5 Estructura "repetir hasta que"
PSEUDOCODIGO: C:
repetir do
acciones sentencia:
hasta que expresion_logica while (! expresion_logica)
La sentencia interior (nica) puede ser simple o compuesta. Observar que la expresin lgica al final va precedida de la negacin !, ya que while (mientras) es lo contrario de hasta que.
Estructura "repetir para"
La estructura del pseudocdigo
repetir para indice valor_inicial, valor_final, incremento
acciones
fin_para
tiene un equivalente ms detallado en C, que se representa
for (expresion incial; expresion final; expresion de incremento)
sentencia;
En cada una de las expresiones debe aparecer el ndice de la estructura. Vemoslo con un ejemplo
repetir para i=1 hasta 10 incremento 2
se escribe en C
for (i=1; i <= 10 ; i=i+2)
Tener presente que en C hay una nica sentencia contenida en el rango de la estructura, y puede ser simple o compuesta.
Ejemplo resumen Leer un nmero real x, y evaluar la expresin
x 2 x 3 x n 1 + x + __ + __ + ... + __
2! 3! n!
de tal manera que el valor absoluto del ltimo sumando sea menor que 0.001. Comparar con e x , pues de acuerdo al Anlisis, la suma dada converge a dicha funcin. 6 // programa serie #include <stdio.h> #include <math.h> int n; float x, sum, ter; void main() { printf ("ingresar dato x: "); scanf ("%f",&x); n = 1; // inicializar cantidad de terminos sum = 0.; // inicializar suma ter = 1.; // inic. primer termino de la suma while (abs(ter) >= 0.001) { sum = sum + ter; ter = ter * x/n; // actualizar potencia y factorial n++; } // n++ equivale a n=n+1 sum = sum + ter; // sumar ultimo termino printf ("exponencial de x: %f\n",exp(x)); // funcion de biblioteca printf ("aproximacion con %d",n); printf(" sumandos: %f\n",sum); }
Ejercicio propuesto
Modificar el programa de la introduccin de manera que calcule dimetros de crculos en funcin de reas. La funcin raz cuadrada es sqrt.