Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacion en C
Programacion en C
El lenguaje de programacin C:
Es de uso general Sintaxis compacta Alta portabilidad (ANSI-C) Creado por Dennis Ritchie, Laboratorios Bell hacia 1972 Es un lenguaje compilado
Utilizar editor de texto para escribir (nombre.c) Compilar para detectar errores sintcticos Ejecutar programa resultante (a.out)
Tema 3
Resolucin de Problemas Usando el lenguaje de programacin - C
Primer programa
#include <stdio.h> main() { printf("Hola Mundo!\n"); } Explicar sintaxis:
#include <> main() {} ; \n printf( );
Usa variables!
Declaracin 1ro. Uso al imprimir
Comentarios en C
Incluir comentarios en un programa es una prctica saludable, ayuda a su comprensin. Para el compilador C, los comentarios son inexistentes, No generan lneas de cdigo. En el lenguaje C se toma como comentario todo caracter interno a los simbolos: /* */ Los comentarios pueden ocupar uno o ms renglones, por ejemplo:
/* esto es un comentario */ /* esto tambin es un comentario; pero ocupa 2 lneas */
Identificadores
Nombres que identifican a los objetos de un programa en C:
Variables Funciones Constantes Estructuras de datos Definiciones de tipos (hechas mediante typedef)
El smbolo de subrayado (_) se emplea para dar mayor legibilidad a nombres compuestos por varias palabras. Se acostumbra emplear letras minsculas para nombrar a las variables y maysculas para las constantes simblicas.
Identificadores en C - ejemplos
Identificadores vlidos:
puntero nombre_empleado area TAMANO_STRING EdadEmpleado potencia10 i Nombre nombre
Variables
Toda variable debe ser declarada antes de usarla Forma genrica:
<tipo> <identificador> [= <valorInicial>] ; donde: <tipo> puede ser: int, float, char, etc. <valor_inicial> puede corresponder a una constante del tipo entero, real, caracter, arreglo, etc. ([] significa opcional)
Identificadores invlidos:
1texto nombre-empleado Telfono while
Variables
Ejemplos de declaraciones de variables:
int numero; char nombre;
de
variables
Reales
float (con 7 decimales de aproximacin) double (con 16 decimales de aproximacin)
Caracteres
char (a,z,?,$,@,G,7, etc.; en total los 256 caracteres del cdigo ASCII)
Cd
Carcter
Cd
Carcter
Cd
Carcter
Cd
Carcter
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ DEL
Expresiones Aritmticas
Valores numricos, de tipos enteros o reales. Operadores binarios
+ * / % Suma Resta Multiplicacin Divisin Mdulo (slo para int)
Precedencia
++ -- - (unitario) * / % + -
Operadores unitarios
++ -Signo negativo Incremento Decremento
Asociatividad
Por la izquierda
Expresiones Aritmticas
Los operandos pueden ser variables o constantes numricas.
Los operadores unarios ++ y -- fueron pensados para aplicarse a variables; y, el operador unario - a constantes.
Syntaxis
operando operador-binario operando operador-unario operando Caso particular:
Operadores relacionales o comparacin == igual != distinto < menor <= menor o igual > mayor >= mayor o igual
de
Expresiones
La precedencia de todos los operadores de C
Mxima
( ) [ ] ! ~ ++ -- - (unitario) * / % + << < <= >= > == != & | && || = += -= /=
Estructura de un programa
directiva #include
Incluye libreras o bibliotecas de funciones predefinidas
Ejemplos
#include #include #include #include <stdio.h> <stdlib.h> <math.h> <string.h> /* /* /* /* funciones de entrada y salida */ funciones bsicas */ funciones matemticas bsicas */ funciones para manejar cadenas de caracteres */
Mnima
Estructura de un programa
directiva #define
Definicin de constantes simblicas Consiste en asignar a un identificador un valor que permanecer constante durante el programa
2. 3.
Ejemplo
#define PI 3.1415
Algunas recomendaciones
Hacer cdigo ordenado:
1 instruccin por lnea Utilizar nombres de variables autoexplicativos Identar el cdigo Comentar el cdigo
Entrada y Salida
Las de mayor uso son las orientadas a la entrada y salida de datos con formato (biblioteca stdio.h) printf
Salida con formato
scanf
Entrada de datos con formato
Especificaciones de Conversin
Los caracteres de conversin de mayor uso son:
nmero entero en notacin decimal (base 10) caracter cadena de caracteres (string) nmero con decimales, expresado en notacin exponencial o de punto flotante (mantisa y exponente) f nmero con decimales, expresado en notacin de punto fijo (parte entera, punto, parte decimal) d c s e
Cadena de formato
Debe ir delimitada por comillas dobles Debe incluir una especificacin de conversin por cada argumento en la lista de argumentos. Texto aparecer durante el despliegue, y cada especificacin de conversin ser reemplazada por el correspondiente argumento.
Especificaciones de Conversin
Pueden incluir:
Un signo menos, que indica que el campo debe ajustarse a la izquierda. Un nmero entero, que indica el tamao mnimo que deber ocupar el campo al desplegarse. Un punto seguido de un nmero entero, que indica las posiciones decimales que deben desplegarse. De ser necesario, se agregan ceros al final.
Ejemplos
printf("El valor de la variable x es: %d\n", x); El valor de la variable x es: 100 Si x contena un valor igual a 100. Avanzar a la siguiente lnea luego del despliegue printf("El valor de dos + cinco es: %d\n", 2+5); El valor de dos + cinco es: 7 Avanzar a la siguiente lnea luego del despliegue printf("El area de %.2f\n", radio, area); un circulo con radio %.2f es
Secuencias especiales:
%% \n \t \ASCII para imprimir un smbolo de % para provocar que el cursor cambie de lnea para producir una tabulacin en el despliegue despliega el caracter con el cdigo ASCII suministrado
El area de un circulo con radio 1.00 es 3.14 Suponiendo los valores indicados para las variables. Avanzar a la siguiente lnea luego del despliegue
Ejemplos
printf("Este es el numero 2 con formato %%5d: %5d", 2); Este es el numero 2 con formato %5d: 2
printf("Numero 2 con formatos %%-5d y %%d: %-5d %d", 2, 2); Numero 2 con formatos %-5d y %d: 2 2
printf("Este es el caracter %c cuyo codigo ASCII es %d", 'A', 'A'); Este es el caracter A cuyo codigo ASCII es 65
La lista de argumentos consiste de una secuencia de punteros a variables, en las cuales se almacenarn las entradas dadas por el usuario.
Caracteres de conversin
d nmero entero; argumento debe ser puntero a int. h nmero entero; argumento debe ser puntero a short int. lx nmero entero; argumento debe ser puntero a long int. c carcter; argumento debe ser puntero a char. Para leer el primer caracter distinto de blanco debe emplearse %1s. s cadena de caracteres; argumento debe ser un puntero a caracter, o el nombre de un vector de caracteres. f nmero con decimales; argumento debe ser puntero a float. Entrada puede ser en notacin de punto fijo (parte entera, punto, decimales), o de punto flotante (mantisa, E, exponente). lf nmero con decimales; argumento debe ser puntero a double.
Ejemplos
scanf("%d", &edad); Espera entero que ser almacenado en la variable edad. scanf("%4d", &agno); Espera el ao actual (4 dgitos). Si se ingresan ms de 4 dgitos, los restantes se descartarn, o se dejarn para la siguiente llamada a scanf. scanf("%d %f", &edad, &salario); Espera un nmero entero y uno con decimales. scanf("%s", nombre); Espera una cadena de caracteres (string). Entrada se almacenar en el vector nombre, y se delimitar con un ASCII(0) al final.
Conversiones de tipos
Conversiones automticas
De entero a flotante:
a = 4 + 4.0 b = 3.5 + 3 4.0 + 4.0 3.5 + 3.0 8.0 6.5 6
Para los ejemplos: float a; int b;
De flotante a entero:
/* Imprime el valor antes del intercambio */ printf("var1 contiene %d y var2 contiene %d\n", var1, var2); aux = var1; var1 = var2; var2 = aux; /* Imprime el valor luego del intercambio */ printf("var1 contiene %d y var2 contiene %d\n", var1, var2); }
El comando if
if ( condicin ) { ... Bloque de instrucciones ... }
Variacin if/else
if ( condicin ) { ... instrucciones ... } else { ... instrucciones ... } /* (X) */
/* (Y) */
Permite escoger entre varias ramas Ej.: programa que imprime etapa de la vida dependiendo de la edad (nio 0-12, adolescente 13-19, joven 20-30, adulto 31-50, mayor 51-)
Ejemplos if
Crdito autorizado
int salario, credito; if (salario > 1000000) credito = 5000000; else if (salario > 500000) credito = 2000000; else if (salario > 100000) credito = 1000000; else credito = 0;
Instruccin switch
switch ( expresin ) { case constante1 : { ... Bloque de instrucciones ... break; } case constante2 : { ... Bloque de instrucciones ... break; } ... case constanteN : { ... Bloque de instrucciones ... break; } default : { /* Opcional */ ... Bloque de instrucciones ... } } 1
N+1
Similar a if / else if / else Es ms claro, es similar a un men de alternativas. break hace que el programa salte al final del switch. default es un atrapa todo.
Ejemplos switch
/* Tipico switch para un menu de una aplicacion. En la variable entera opcion el usuario ingreso su eleccion dentro del menu */ switch (opcion) { case 1 : { opcion1(); break; } case 2 : { opcion2(); break; } case 3 : { opcion3(); break; } default : printf("Opcion invalida\n"); }
Ejemplos switch
/* Dado un mes, identifica el trimestre */ switch (mes) { case 1 : ; case 2 : ; case 3 : { printf("Primer trimestre\n"); break; } case 4 : ; case 5 : ; case 6 : { printf("Segundo trimestre\n"); break; } case 7 : ; case 8 : ; case 9 : { printf("Tercer trimestre\n"); break; } case 10 : ; case 11 : ; case 12 : { printf(Cuarto trimestre\n"); break; } default : { printf("Mes invalido\n"); } }
Ejemplo: Clculo de 2n
Programa que calcula 2n, para n entre 1 y 10. Para la implementacin se emplea un switch sin breaks, lo cual puede ser una tcnica de programacin peligrosa.
main() { int n; int x = 2;
Ejemplo: Clculo de 2n
printf("Calculo de 2**n. Ingrese n entre 1 y 10: "); scanf("%d", &n); switch(n) { case 10: case 9: case 8: case 7: case 6: case 5: case 4: case 3: case 2: } } x x x x x x x x x = = = = = = = = = x x x x x x x x x * * * * * * * * * 2; 2; 2; 2; 2; 2; 2; 2; 2;
Instruccin while
while ( condicin ) { ... Bloque de instrucciones ... }
Instruccin while
Al ejecutarse la instruccin while, se evaluar la condicin en los parntesis, y si su valor es verdadero (distinto de cero), se ejecutarn las instrucciones entre { } . Una vez hecho esto, la condicin se vuelve a evaluar y se procede de la misma manera. Cuando la condicin se vuelve falsa (es decir, cero), se dar la instruccin while por terminada cuando se evale. Las instrucciones subordinadas al while pueden ser compuestas, es decir, otras instrucciones while, if, etc.
Instruccin do-while
do { ... Bloque de instrucciones ... } while ( condicin );
Ejemplo do-while
char respuesta; do {
/* Esto se ejecuta en cada iteracion del ciclo */
... printf("Desea continuar? (s/n): "); scanf("%1s", &respuesta); } while (respuesta != 'n');
10
Instruccin for
for ( inicializacin ; condicin ; actualizacin ) { ... Bloque de instrucciones ... }
Ejemplo de for
#include <stdio.h> int main() { int rep; /* repite valores de 5 en 5 en forma ascendente */ for (rep=1;rep<=20;rep=rep+5) printf("Valor ascendente de rep: %d\n",rep); /* repite valores de 5 en 5 en forma descendente */ for (rep=20;rep>=1;rep=rep-5) printf("Valor descendente de rep: %d\n",rep); }
#include <stdio.h> main() { double base, pot; int exponente, i;
Clculo de xn
/* Base empleada para el calculo */ /* Exponente empleado para el calculo */
printf("\nIngrese el valor de la base: "); scanf("%lf", &base); printf("Ingrese el valor del exponente: "); scanf("%d", &exponente); /* Ciclo que realiza el calculo: i variara de 2 a exponente */ pot = base; for (i=2; i<=exponente; i++) pot = pot * base; printf("Resultado de %.2f elevado a %d es %.2f\n", base, exponente, pot);
Empleando while
bloque1 while (condicin) { bloque3 bloque2 } Instrucciones de los bloques separadas por punto y coma
11
Empleando do-while
bloque1 if (condicin) { do { bloque3 bloque2 } while (condicin) } Instrucciones de los bloques separadas por punto y coma Por qu es necesario el if?
Ciclos anidados
Hay un ciclo dentro de otro Por ejemplo, se requiere para recorrer una matriz:
Empleando while
bloque while (condicin) { bloque } Instrucciones del bloque separadas por punto y coma Por qu se debe repetir el bloque (afuera y adentro)? for (i=1; i<=3; i++) for (j=1; j<=5; j++) printf("%d %d\n", i, j);
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
Funciones
Conjunto de instrucciones (posiblemente acompaadas de algunos datos temporales) que llevan a cabo una subtarea dentro de un programa ms complejo. Reciben datos de entrada Generan datos de salida.
Funciones
Un programa C se estructura en funciones. La ejecucin comienza a partir de la funcin main. Parmetros de entrada y valor de retorno parmetros de entrada: materia prima con la que trabajar la funcin valor de retorno: resultado del procesamiento llevado a cabo por la funcin Tanto los argumentos de entrada como el valor de retorno tienen un tipo de datos asociado.
12
Funcin Suma
#include <stdio.h> #include <stdlib.h>
Funcin Factorial
int fact (int x) { int i, f = 1; for (i= 2; i<= x; i++) f = f * i; return(f); }
#include <stdio.h> #include <stdlib.h> int suma (int a, int b) { return(a + b); } int main() { int x = 5, y = 6, resultado; resultado = suma(x,y); printf("la suma es: %d \n",resultado); return(EXIT_SUCCESS); }
int main() { int x, resultado; printf( "ingrese valor: " ); scanf( "%d", &x); resultado = fact(x); printf( "el factorial es: %d", resultado); return(EXIT_SUCCESS); }
Prototipos
#include <stdio.h> #include <stdlib.h> int fact(int); int main() { int x, resultado; printf( "ingrese valor: " ); scanf( "%d", &x); } resultado = fact(x); printf( "el factorial es: %d", resultado); return(EXIT_SUCCESS); } int fact (int x) { int i, f = 1; for (i= 2; i<= x; i++) f = f * i; return(f); } int main() { int x; printf( "ingrese valor: " ); scanf( "%d", &x); void fact (int x) { int i, f = 1; for (i= 2; i<= x; i++) f = f * i; #include <stdio.h> #include <stdlib.h>
Funciones VOID
fact(x); return(EXIT_SUCCESS); }
Qu es un arreglo?
Los arreglos son estructuras de datos complejas (en el sentido de que no son atmicas) Agrupan datos de un mismo tipo en particular, llamado el tipo base del arreglo.
El tipo base de un arreglo puede ser cualquiera de los tipos bsicos de C, o incluso algunos tipos complejos como las estructuras.
Un arreglo puede considerarse como ejemplo de un variable compuesta, capaz de almacenar uno o ms datos al mismo tiempo.
13
Arreglos
Arreglo
valores posicin
10
0
21
1
32
2
83
3
int vec[20];
La cantidad de elementos del tipo base que contiene el arreglo es fijo
Debe especificarse al declararlo.
La sintaxis del lenguaje permite referirse a cada uno de los elementos que constituyen el arreglo empleando ndices. Esto es posible pues los elementos del arreglo estn numerados en forma jerrquica y consecutiva, empezando en 0 en cada dimensin. Detalle de programacin: El lenguaje C no controla la validez de los ndices que se emplean para referenciar un arreglo.
Ejemplos de uso
1. Declaracin de un arreglo de 50 enteros: int A[50]; 2. Declaracin de un arreglo de 100 caracteres: char A[100]; 3. Declaracin e inicializacin de un arreglo de 10 enteros: int A[10] = { 2, 5, 8, 100, 1, 2, 100, 5, 5, 5 }; 4. Inicializacin parcial: El resto se inicializa en cero: int A[100] = { 25, 5, 100, 25, 5 }; 5. Declaracin e inicializacin de un arreglo de 10 caracteres:
char A[10] = {'a','z','E','e',65,'\65','@','U','*','\n'};
Ms ejemplos de uso
7. Asignando un valor a la sexta posicin de un arreglo de enteros: A[5] = 200; 8. Imprimiendo un arreglo de 100 enteros mediante un ciclo for: int i; for (i=0; i<100; i++) printf("%d\n", A[i]); 9. Leyendo del usuario el contenido de un arreglo de 20 enteros, mediante un ciclo for: int i; for (i=0; i<20; i++) scanf("%d", &A[i]); 10. Calcula el promedio de un arreglo de enteros: int prom = 0; int i, num_elementos=10; for (i=0; i<num_elementos; i++) prom = prom + A[i]; printf(el promedio es: %d \n, prom/num_elementos);
6. Determinacin en forma implcita del tamao de un arreglo: int A[] = { 5, 10, 2, 15, 20 };
El nombre de un arreglo tambin puede emplearse sin ndice, por ejemplo, para pasar el arreglo completo como parmetro a una funcin.
Es comn cometer estos errores olvidando que las posiciones de los arreglos estn numeradas a partir del ndice cero.
Es decir, en un arreglo de tamao N, las posiciones estn numeradas de 0 a N-1.
14
15