Facultad de Informática, Electrónica y Comunicación Programación III - Estructuras de Datos. De Pascal a C
Guía para uso del lenguaje C. Tanto Pascal como C son lenguajes procedurales o imperativos, lo que significa que debe tomarse en cuenta el orden en que se escriben las instrucciones de un programa. Los lenguajes procedurales tienen un conjunto de instrucciones que de manera general y según el concepto de programación estructurada de Edsger Dijkstra, pueden considerarse comunes. La diferencia entonces la encontramos en la sintaxis de cada lenguaje, aunque en muchos casos son muy parecidas. Cuadro Comparativo de Instrucciones fundamentales en Pascal y C Instrucciones Entrada Salida Atribución
Transferencia Condicional
Repetición
Diego Santimateo G.
Pascal
C
Read (a); Write (a); b := a; If condición Then begin Proceso1; end Else begin Proceso2; end; for i :=1 to n do begin Proceso; end;
Scanf(“%d”, &a); Printf (“%d”, a); b = a; If (condición) { Proceso1; } else { Proceso2; {
While condición do Begin Proceso; End;
While (condición) { Proceso; }
Repeat Proceso; Until condición;
Do
for (i = 0; i < n; i++) { Proceso; }
{ Proceso; } While (condición);
CRUV – FIEC.
1
Facultad de Informática, Electrónica y Comunicación Programación III - Estructuras de Datos. De Pascal a C
Esquema general de un programa Pascal y C Pascal
C
Program nombre; var (*declaración de variables *)
#include main() { /* declaración de variables */
begin (* lógica del programa *) end.
/* lógica del programa */ }
Las declaraciones en C En C como en otros lenguajes la declaración incluye el nombre de la variable y el tipo de dato que puede almacenar la variable. Los tipos de datos básicos en C son: int, flotat, double y char que corresponden a valores enteros, reales, reales con doble precisión y caracteres o cadena de caracteres. Ejemplos
int char flotat double
a,b, c[20], mat[10][7]; x, des[15]; peso, medidas[20]; raiz;
Los arreglos en C siempre inician en la posición cero (0). Una cadena de caracteres es almacenada en un vector y cada carácter de la cadena queda en una posición del mismo y automáticamente se incluye el carácter de fin de cadena que es el '\0’, así como se ilustra a continuación: M A R ‘\0’ 0 1 2 3 4
Operadores aritméticos, de relación y lógicos en C Aritméticos + ... suma - ...resta * ...multiplicación / ...división % ..residuo de división entera
> >= < <= == !=
Relación Lógicos mayor que ! ...negación mayor o igual && ...Y menor que || ...O menor o igual que igual a diferente de
Las expresiones lógicas representan valores numéricos, así uno (1) corresponde a verdadero o cierto y cero (0) a falso. Diego Santimateo G.
CRUV – FIEC.
2
Facultad de Informática, Electrónica y Comunicación Programación III - Estructuras de Datos. De Pascal a C
Instrucciones Fundamentales En realidad el C no tiene instrucciones de entrada y salida, para realizar estas tarea se vale de funciones de librería como scanf y printf, que son las que utilizaremos en este curso. Entrada de datos La sintaxis general de la función scanf es: scanf (“formato de conversión”, lista de direcciones de memoria de las variables); Los formatos de conversión brindan información sobre el tipo de dato que desea capturarse y la estructura de ingreso de los mismos. Nótese que la función scanf exige que en el segundo argumento se ingresen las direcciones de las variable y no los nombres de las variables. En C podemos indicar la dirección de una variable utilizando el operador de dirección & que proporciona la dirección del operando, es decir si x es una variable entonces &x es la dirección de la variable x. En la siguiente tabla presentamos los formatos de conversión Tipo de dato
Formato de conversión
int
“%d”
float
“%f”
char
“%c”
char
“%s”
char
“%[^\n]”
Explicación Se utiliza al leer valores enteros. Se aplica para números reales o flotantes. Para lectura de caracteres. Para lectura de cadena de caracteres terminadas en espacio. Permite la entrada de cadenas que contienen espacios en blanco.
Ejemplos scanf (“%d” , &x); /* lectura de la variable entera x */ scanf (“%3d”, &x); /* lectura de la variable entera x de tres dígitos */ scanf (“%f %d %c”, &a, &b, &a); o /* conviene dejar un espacio en blanco entre formatos y dejarlos también al introducir los datos o bien usar enter después de cada valor de entrada*/ scanf (“%d %s”, &edad, nombre); o /* observe que los vectores tipo char que almacenan cadenas no utilizan el operador de dirección & ya que el nombre del vector representa la dirección de memoria */ Diego Santimateo G.
CRUV – FIEC.
3
Facultad de Informática, Electrónica y Comunicación Programación III - Estructuras de Datos. De Pascal a C scanf (“%[^\n]”, corregimiento); /* se captura el corregimiento incluyendo espacios */ scanf (“%[aeiou]”, texto); /* solo acepta vocales minúsculas */ Salida de datos La salida al igual que la entrada se puede lograr utilizando diversas funciones, no obstante, en este curso emplearemos la función printf(), cuya sintaxis es: printf (“formato de conversión y/o cadena”, lista de nombres de las variables); Ejemplos Instrucción printf (“%d” , x); printf (“%6.2f”, ry); printf (“\n nueva línea”); printf (“La edad es: %d”, edad); printf (“El empleado que gana %f es %s”, salario, nombre); printf (“%-5d”, cant)
Comentario /* despliega el valor de la variable entera x */ /* el valor de ry se ubica en un campo de seis posiciones, dos de las cuales son para los decimales */ /* salta de línea y luego despliega la cadena*/ /* despliega la cadena seguida del valor de edad , nótese que el lugar que ocupa %d será sustituido por el valor de la variable edad*/ /* el formato %f será sustituido por el valor de salario y %s por el nombre de la persona */ /* el valor se ajusta por la izquierda dentro del campo de tamaño cinco */
Atribución o asignación Esta instrucción asigna un valor a una variable, desde una posición de memoria a otra. Observe que en la entrada de datos también se consigue la asignación de valores a variables, solo que los valores provienen de algún periférico. La sintaxis general es:
variable = variable o constante o expresión;
La constante no puede ser una cadena
Es importante recordar que la asignación se hace a partir del miembro derecho del = hacia la variable que está en la izquierda. Ejemplos Diego Santimateo G.
CRUV – FIEC.
4
Facultad de Informática, Electrónica y Comunicación Programación III - Estructuras de Datos. De Pascal a C
x = 100; c = ‘\0’; p = 0.3e5; swt = ‘f’; pi = 3.14159;
Algunas asignaciones en C se consideran operadores de asignación, tales como las siguientes: Operador += -= *= /= %= ++ ++ --
Ejemplo a += b; a -= b; a *= b; a /= b; a %= b; ++i i++ --i
Significado a = a + b; a = a - b; a = a * b; a = a / b; a = a % b; i = i +1 …modifica i antes de usarla para otro propósito i = i +1 …modifica i después de usarla para otro propósito i = i -1
Repeticiones o ciclos Una de las instrucciones más poderosas de los lenguajes de programación es la que permite repetir un número finito de veces un proceso. En los lenguajes procedurales usualmente existen las siguientes tres formas de repetición: El for cuya sintaxis es: for (inicialización; control de salida; actualización de variable de control) { Proceso; /*conjunto de instrucciones*/ } En C a diferencia de Pascal las expresiones que controlan el for deben estar entre paréntesis. La inicialización se refiere a la asignación inicial de la variable que controla la repetición (variable de control), el control de salida es la condición de parada de la repetición y la actualización es la expresión que modifica a la variable de control a fin de alcanzar en algún momento la condición de parada para poder salir del ciclo. Ejemplos for (i = 0; i < n; i++) { Proceso; }
Diego Santimateo G.
La variable de control i se inicializa en cero, se verifica si i < n, si es verdad se realiza el Proceso y luego se incrementa la i con la expresión i++, si i < n es falsa termina el for . Recuerde que Proceso es una secuencia ordenada de instrucciones, lo que significa que puede contener
CRUV – FIEC.
5
Facultad de Informática, Electrónica y Comunicación Programación III - Estructuras de Datos. De Pascal a C cualquier instrucción, incluyendo otro for.
s = 0; for (i = 0; i < n; i++) { Cálculo de la suma de n valores enteros, en este scanf (“%d”, &edad); ejemplo las edades. s += edad; } Otra instrucción que podemos utilizar para repetir un Proceso un número finito de veces es el while: while (condición) { Proceso; }
Ejemplos i = 0; while ( i < n ) { Proceso; i++; }
scanf (“%f”, &n); scanf("%d", &val); i = 0; hallar = 1; while ((hallar) && (i < n)) { if (x [ i ] == val) hallar = 0; else i++; }
Mientras la condición sea verdadera se repite el Proceso.
El while se puede usar como un for tal como lo muestra este ejemplo. Observe que la variable de control se inicializa antes del while y que la condición debe ser verdadera para poder entrar al cuerpo de la repetición, el cual debe contener la actualización de la variable de control para lograr que la condición sea en algún momento falsa y se termine la repetición. Aquí se asume que tenemos el vector x en memoria. Se procede a leer un valor y a buscar el valor en el vector. Como hallar es uno (verdadero) e i
La otra forma de repetición es el do...while:
do { Proceso;
Observe que el proceso se realiza por lo menos una vez y que la condición de parada se verifica al final y no al inicio como en el for y el while.
} while (condición); Diego Santimateo G.
CRUV – FIEC.
6
Facultad de Informática, Electrónica y Comunicación Programación III - Estructuras de Datos. De Pascal a C Ejemplos i = 0; do {
Esta instrucción se puede usar como un for , tal como lo muestra este ejemplo. Observe que la variable de control i se inicializa antes del do e inmediatamente se entra en el Proceso. Luego se actualiza la variable de control y se verifica la condición de salida. Si i
Proceso; i++; } while ( i < n ) do { printf (“\n Menú Principal”); printf (“\n1. suma”); printf (“\n2. divide”); printf (“\n3. multiplica”); printf (“\n9. salir”); printf (“\n indique una opción:”); scanf("%d", &op);
Esta es la clásica presentación de un menú. Se despliegan las opciones y luego se captura el número que corresponde a la opción deseada. Este menú se presentará hasta que se seleccione la opción de salir.
} while ( op ! = 9 ) La transferencia condicional Esta instrucción permite al programador decidir que proceso desea realizar dependiendo del resultado de la evaluación de expresión, su sintaxis es: if (condición) { Proceso1; } else { Proceso2; }
La palabra then no es necesaria. El Proceso1 se realiza si la condición es verdadera, en caso contrario, se ejecuta el Proceso2. La parte del else solo se usa si se necesita, es decir, no siempre el if lleva else.
Ejemplos If (a == 100) { Proceso; } Diego Santimateo G.
Presentamos un if sin else, Proceso se ejecutará cuando el valor de la variable a sea cien.
CRUV – FIEC.
7
Facultad de Informática, Electrónica y Comunicación Programación III - Estructuras de Datos. De Pascal a C If ((a == 100) && (p !=0)) { Proceso1; } else { Proceso2; }
Como usamos la Y lógica (&&) en la condición, entonces, el Proceso2 se realizará cuando una de las dos condiciones no se cumpla o cuando las dos sean falsas.
do { printf (“\n Menú Principal”); printf (“\n1. suma”); printf (“\n2. divide”); printf (“\n3. multiplica”); printf (“\n9. salir”); printf (“\n indique una opción:”); scanf("%d", &op);
Complementamos la construcción del menú utilizando if anidados, es decir, uno dentro de otro.
if (op == 1) /* llamar a la función que suma*/ else if (op == 2) /* llamar a la función que divide*/ else if (op == 3) /* llamar a la función que multiplica*/
Usted siempre puede hacer anidamiento de instrucciones según le indique la lógica que esté desarrollando.
Observe además que, tenemos if dentro de un do...while.
} while ( op ! = 9 )
Diego Santimateo G.
CRUV – FIEC.
8