PROGRAMACN BSCA Agosto 2013 Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1 CONTENIO ndice de contenido CAPIT!"O # INT$O!CCI%N A "A P$O&$AMACI%N ..................................................' INT$O!CCI%N A "EN&!A(E C.....................................................................................' CAP)T!"O * +A$IAB"ES, CONSTANTES - TIPOS E ATOS ..................................1. ASI&NACI%N M!"TIP"E ................................................................................................// OPE$AO$ES E ASI&NACI%N ESPECIA"................................................................/0 +A$IAB"ES TIPO ENTE$O............................................................................................./. +A$IAB"ES E P!NTO 1"OTANTE............................................................................../2 +A$IAB"ES O!B"E......................................................................................................./' IENTI1ICACI%N de CONSTANTES ............................................................................/# CON+E$SI%NES - P$OMOCIONES............................................................................../* E3P$ESI%N MOO MI3TO.............................................................................................04 OPE$AO$ CAST ...........................................................................................................01 +A$IAB"E TIPO C5A$ ..................................................................................................0/ CAP)T!"O 6 MANIP!"ACI%N E ATA .......................................................................0. "A 1!NCION scanf78..........................................................................................................0. ENT$AA 9 SA"IA E !N c:ar....................................................................................0# ENT$AA SA"IA CON 1O$MATO...............................................................................4 OPE$AO$ES $E"ACIONA"ES....................................................................................../ B"O;!ES E SENTENCIAS.............................................................................................. Cap<=>lo 14 Sal=os ? Condicionamien=os................................................................................2 SENTENCIAS CONICIONA"ES...................................................................................2 I1 E"SE I1 ...........................................................................................................................# I1 ANIAOS......................................................................................................................6 SENTENCIA S@ITC5 ......................................................................................................24 OPE$AO$ CONICIONA" 7operador =ernario8............................................................2. OPE$AO$ES E INC$EMENTO - EC$EMENTO .................................................22 Cap<=>lo 11 $epe=icin ? laAos...............................................................................................2' B!C"ES..............................................................................................................................2' B!C"ES ANIAOS.........................................................................................................'/ EC"A$ACIONES E SA"TO ........................................................................................'0 TraBaCo con Arreglos o Ma=rices .........................................................................................'# Cap<=>lo 1/ S>Bprogramas, S>Br>=inas ? "iBrer<as .............................................................#4 1!NCIONES O M%!"OS ..............................................................................................#4 "iBrerias de 1>nciones : ......................................................................................................#6 Cons=an=es miemBro.............................................................................................................*1 OBCe=os de la "iBrer<a s=dliB.:..............................................................................................*2 MDS SOB$E +A$IAB"ES.................................................................................................*' TI$AS E CA$ACTE$ES 7S=rings8..................................................................................*6 S=rings ? Carac=eres .............................................................................................................61 1>nciones con S=rings .........................................................................................................6/ AP!NTAO$ES ................................................................................................................66 Capi=>lo 10 In=rod>ccin a Es=r>c=>ras ? !niones ................................................................146 $E1E$ENCIAS A "OS E"EMENTOS 9 OPE$AO$ P!NTO ....................................114 Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg/ INICI"IEACI%N E EST$!CT!$AS ...........................................................................110 EST$!CT!$AS ANIAAS..........................................................................................11* EST$!CT!$AS - 1!NCIONES ...................................................................................1/4 OPE$AO$ 1"EC5A FG.................................................................................................1/0 !NIONES .........................................................................................................................1/. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg0 BBLOGRAFA a. BSICA Bibliografa (Normas APA) Disponible en Biblioteca a la fecha N! "#emplares Harvey M. D (2003) C++ Cmo programar . Mexico: Pearson Edca!ion . S< 0 Dei!e"# Harvey M (20$0) %n!rodccin a "a programacin orien!ada a o&'e!os. ()*: Pren!ice Ha"". Si 0 +is,op# -dy M ($...). -ava : /ndamen!os de programacin Mexico # Pearson Edca!ion. Si 0 Dei!e"# Pa" -. (20$0). Programacin in!ermedia en -ava. Mexico: Pearson Edca!ion. SI 0 b. C$%P&"%"N'A(IA Bibliografa (Normas APA) Disponible en Biblioteca a la fecha N! "#emplare s 'C' Programming ,Salim Y. Amdani ,Laxmi Publications 2009 NO The Art and Science of C , Roberts Eric, Adission-Wesley 1995 NO Big C++, Cay S. Horstmann and Timothy A. Budd,m2009 NO 1001 Microsoft Visual C++ Programming Tips , Kris Jamsa and Charles Wright ,2011 NO C For Dummies, Dan Gookin John Wiley & Sons 2004 NO c. ("C$%"NDADA Bibliografa (Normas APA) Disponible en Biblioteca a la fecha N! "#emplares Mar0 1ee. (200.). C++ Programming for the Absolute Beginner USA : Cengage 1earning NO
-osep, P. NO Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg. 2sse"" ($.33). Java Programming for the Absolute Beginner USA: Premier Press ).). BIB&I$'"CAS *I('+A&"S , SI'I$S -"B ("C$%"NDAD$S :==p:HHIII.BooJfi.org :==p:HHIII.oracle.comHCaKa :==p:HHc.conclase.ne=HliBreriasH :==p:HHc.conclase.ne=HliBreriasH
Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg2 CAPITULO 7 INTRODUCCIN A LA PROGRAMACIN IN'($D+CCI.N A &"N/+A0" C C es un lenguaje de programacin de propsito general. C se conoce como un lenguaje de nivel medio, debido a la elaboracin de programas ms rpido, similar a otros lenguajes de alto nivel y de ms rpida ejecucin como los programas de ensamblador y el lenguaje de mquina. C permite manejar un conjunto de operadores, control de flujo y una moderada cantidad de expresiones. C tambin contiene algunas caractersticas adicionales que le permiten ser utilizados en el nivel inferior, salvando as la brecha entre los lenguajes de mquina y lenguajes de alto nivel. Esta flexibilidad permite a C que se utilice para la programacin del sistema (por ejemplo, para escribir sistemas operativos), as como para la programacin de aplicaciones (por ejemplo, para escribir un programa para resolver un complicado sistema de ecuaciones matemticas, o para escribir un programa, como la facturacin de los clientes). C en la actualidad se usa con casi todos los equipos y es un lenguaje estructurado. CARACTERSTCAS DE C Haremos una breve lista de algunas de las caractersticas de C que definen el lenguaje y tambin han llevado a su popularidad como un lenguaje de programacin. Naturalmente, vamos a estudiar muchos de estos aspectos durante el curso. Pequeo tamao , los fuentes y objetos son bastante compactos El uso extensivo de las llamadas a funciones Escritura fcil - a diferencia de PASCAL o COBOL Lenguaje estructurado Nivel bajo de programacin disponibles Muy flexible , hace uso de punteros en la memoria, matrices, estructuras y funciones. VARIANTES DE C Aunque el lenguaje de programacin C es popular, no es perfecto. Cuando la programacin orientada a objetos se hizo popular para el diseo y mantenimiento de grandes programas, especialistas en informtica crearon una versin orientada a objetos de C llamado C ++. C++ Debido a que ms gente est escribiendo y la organizacin de programas de gran Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg' tamao con programacin orientada a objetos, ms programas se escriben en C + +. La mejor forma de aprender C++ es comprender primero las peculiaridades de C. luego cuando se sienten cmodos con C, empiezan a estudiar C ++ y programacin orientada a objetos . Mas adelante veremos las diferencias entre estos tipo de programacin. Sin embargo , depende del programador el usar exclusivamente la orientacin a objetos , es otras palabras el programador podra crear una mezcla de C y C++ . Microsoft ech un vistazo a C / C + + y decidieron que podan crear un lenguaje mejorado, que dieron el nombre de C # (pronunciado C-sharp). C # C # tiene un par de ventajas sobre lenguajes como C, C + +, e incluso Java. Orientada a Objetos Una de las ventajas principales de C # que C + + es que C # es un verdadero lenguaje orientado a objetos de programacin, por lo que tiene que usar programacin orientada a objetos para escribir un programa en C #. Te obliga a utilizar slo tcnicas orientadas a objetos de programacin puede parecer un inconveniente hasta que te das cuenta de que C ++ es un lenguaje hbrido que le permite elegir si desea utilizar programacin orientada a objetos. Aunque C ++ da, el programador, una mayor flexibilidad, C ++ tambin puede ser una mezcolanza de la programacin estructurada mezclados con programacin orientada a objetos. Tratando de descifrar como una mezcla de tcnicas de programacin puede ser confuso. Al obligar a todos los programadores a usar programacin orientada a objetos (y aislar a sus tcnicas de programacin estructurada slo dentro de los objetos), programas de C # pueden ser mucho ms fcil de entender y modificar. Objectie C Objective-C es una programacin orientada a objetos (OOP) que constituye la base del desarrollo de la mayora del software en Mac OS X. Se trata de un superconjunto del lenguaje de programacin C, lo que significa que puede utilizar el cdigo C directamente en Objective-C del programa. De hecho, gran parte de un programa de Objective-C es simplemente C. nclye un pequeo nmero de extensiones para facilitar la programacin orientada a objetos, lo que potencialmente puede hacer la vida mucho ms fcil que un programador. La filosofa de Objective-C es un minimalista . La orientacin a objetos caractersticas de Objective-C se han diseado como una extensin compacta de C y fcil de entender . Esto es a diferencia de C + +, por ejemplo, que tambin es un superconjunto de C, pero que incluye muchas diferentes extensiones de C, y es relativamente difcil de aprender. Cualquier persona que entienda C ++, o cualquier otro lenguaje orientado a objetos para el caso, puede aprender Objective-C en pocas horas. Para aquellos que no tienen conocimiento de programacin orientada a objetos, Objective-C es uno de los idiomas con los que mejor que aprender, debido a su simplicidad Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg# Las siguientes secciones comprenden nicamente el lenguage C: PALA!RAS RESERVADAS "PALA!RAS CLAVE# Como en todos los lenguajes las palabras reservadas no se pueden utilizar como identificadores. Tienen significados predefinidos, que no pueden ser cambiados por un programador. No se puede dar una funcin o un nombre de identificador como palabras clave. El uso incorrecto de palabras clave provocar un error de compilacin. Palabras clave actan como bloques de construccin de instrucciones del programa. Hay 29 palabras clave reconocidas por el compilador de C : ESTRUCTURA DE UN PROGRAMA C Cada programa se compone de uno o ms mdulos llamados funciones. Una de las funciones debe ser llamada main () esta es la funcin de inicio . El programa siempre comenzar por la ejecucin de la funcin principal (main() ), la cual puede acceder a otras funciones. Si un mdulo no tiene main() ste podr ser llamado por otros programas pero el usuario nunca podr iniciarlo por si solo. Un programa de C tiene bsicamente la siguiente forma: Comentarios o Documentacin Opcional Comandos de preproceso Definiciones de tipos Funciones prototipo (Declaraciones de tipos de funciones y variables pasadas a la funcin Declaracin de Variables Funciones Los siguientes puntos deben tenerse en cuenta para cualquier 'C' del programa: Cada programa comienza con main () y debe haber una y slo una funcin main () en un programa. Todos los programas de C debe ser escrito en letras minsculas solamente. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg* auto goto struct default return void break if switch do short while case int typedef double signed extern char long union else static for continue register unsigned enum float Variables y procedimientos son case-sensitive , es decir no es lo mismo var que VaR, esto es independiente de la plataforma en la cual se est compilando. Cada sentencia debe terminar con punto y coma (;), lo que indica final de la sentencia. Existen pocas excepciones que veremos adelante Todos los identificadores deben ser declarados antes de ser utilizados. Los comentarios pueden ser incluido en / * * /, los comentarios no son sentencias ejecutables, y sirven para documentar el programa. La primera lnea generalmente sera : #include <stdio.h> Sentenci$% de P&eco'(i)$do& Como hemos visto en los captulos anteriores , los programas deben compilarse. La primera seccin en un programa C pueden contener una serie de instrucciones que no forman parte del programa sino que son instrucciones para dar ciertas instrucciones al compilador. Para que el compilador sepa distinguir entre las sentencias del programa y las de precompilacin colocaremos el signo numeral (#) en la primera columna. La ms comn de esta es la sentencia include. #include <stdio.h> Note que la lnea NO termina con (;) Los programas se escriben generalmente en mdulos que pueden ser re-utilizables. Estos mdulos se agrupan en libreras que pueden estar distribuidas en cualquier parte del disco duro . La instruccin include indica al compilador que el programa usar uno o ms de los mdulos que se hallan entre brackets angulares ( < > ) y/o comillas dobles ( " ) . Usaremos los angulares para definir libreras del sistema y comillas para definir libreras propias del programador. Es importante mencionar que las libreras estn distribuidas en dos archivos, los archivos de cabecera y los archivos de cdigo. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg6 Fuente: Internet Stdio.h es la librera que contiene las rutinas de entrada salida que todo programa generalmente necesita . La sentencia #include <stdio.h> indica al compilador que incluya el archivo de cabeceras que contiene procedimientos de entrada / salida de datos. Esta lnea se incluye en el comienzo del programa de C por encima de main(). El signo de nmero (#) indica que es una sentencia del pre-compilador y gua para que el compilador encuentre cualquier funcin de esta librera. A continuacin un ejemplo de programa : /*Mi primer programa en C */ #include <stdio.h> main() { printf("hola mundo \n);
} comentario incluir el archivo de cabeceras de /O funcin principal Llave de inicio llamadas a una funcin para que imprima algo \n representa salto de linea Fin de la funcin Una funcin es llamada por nombre, seguida por una lista de argumentos entre parntesis la funcin printf () con el argumento de "hola, mundo \ n". printf () es una funcin de librera cuya salida es, en este caso, la cadena de caracteres entre las comillas dobles ("). Una secuencia de caracteres entre comillas dobles, como "hola mundo \ n", se llama una cadena de caracteres o una cadena constante. La funcin printf () tambin se puede utilizar para mostrar otro tipo de informacin que veremos en las siguientes secciones. En los editores, al escribir la informacin para mover el control a la nueva lnea se utiliza la tecla ENTER. En C, no podemos hacer esto, para mover el cursor a la Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg14 nueva lnea se utiliza '\ n' , esto instruye al proceso de compilacin mover el control a la nueva lnea. En el ejemplo anterior, el printf () mostrar la cadena "Hola mundo" en la pantalla y '\ n' mover el cursor a la nueva lnea. La funcin printf () es la declaracin de salida utilizada para imprimir la salida o el mensaje, en pantalla , la letra ('f') significa "formato" o "funcin" indicando que puede definirse en que formato deseamos que salga. La funcin printf () es una funcin de biblioteca stdio para sacar algo a salida estndar es decir, dispositivos, pantalla o monitor. El formato general de printf () es: printf ("cadena de control", arg1, arg2, ... .., argn) La cadena de control dentro de las comillas es la salida real. Los otros argumentos representan variables cuyo valor queremos desplegar. Cada argumento se representa en el orden dentro de la cadena de las especificaciones. El formato de los argumentos se definir con letras precedidas con el signo "% A continuacin una tabla con los formatos que C permite: Modificadores de formato de printf() A continuacin algunos ejemplos de printf printf("Color %s, numero1 %d, numero2 %05d, hex %x, real %5.2f.\n", "rojo", 12345, 89, 255, 3.14); printf("El nmero entero es %d y el nmero flotante es %f",numeroEntero,numeroFlotante); printf("La letra que falta sera %c",letra); Reglas para los modificador de formato: Deber existir la misma cantidad de variables que de formatos An cuando el formato de todas las variables sea el mismo , deber repetir la Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg11 D$to Formato 1 nt %d or %i 2 Float %g or %f 3 Char %c 4 Unsigned int %u 5 Long int %ld 6 Unsigned long int %lu 7 Double %lf 8 Long double %Lf S. No especificacin el nmero de veces que sea necesario. Se puede incluir un texto fijo en la cadena control , en este caso , el texto se desplegar en la pantalla tambin. En caso de querer desplegar el signo de % se deber "comentar el signo usando otro % . El colocar otros operadores en la cadena de control no causa que operacin alguna se efecte. Por otro lado el colocar operadores fuera de la cadena de control obligar al compilador a realizar la operacin primero y luego el despliegue en pantalla. El formato debe coincidir con el tipo de variable ,caso contrario la salida no tendr sentido. Veamos el siguiente ejemplo : #include<stdio.h> #include<conio.h> void main() { float f; clrscr(); printf("Enter a float value\n"); scanf("%d",&f); printf("f = %f \n", f); getch(); } Salida: Enter a float value 4.7 f= 0.000000 ________________________________________ Nota: clrscr es una funcin de la librera conio.h .Algunos compiladores podran no soportarlo , en sy lugar se puede usar system("cls); REGLAS PARA LOS DENTFCADORES Los identificadores son nombres que se dan a los diversos elementos del programa, tales como variables, constantes, funciones y matrices. dentificador es una secuencia de letras y dgitos. Las reglas que aplican son : El primer carcter de un identificador debe ser una letra. Maysculas y minsculas son permitidas y se tratan por separado, es decir, una letra mayscula no es equivalente a la letra minscula correspondiente. En cuanto a signos , el guin bajo (_) tambin puede ser incluido. Los identificadores no deben ser palabras reservadas. No puede haber espacios Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1/ Ejemplos de identificadores vlidos a tax05 address roll_no A temp TAX07 dt_of_birth Ejemplos de identificadores no vlidos 2007tax numero pagina char nicia con nmero No puede tener blancos u otros signos Palabra reservada Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg10 CAPTULO * VARIA!LES+ CONSTANTES , TIPOS DE DATOS Los tipos de datos especifica el tipo de informacin que se almacena. C es compatible con varios tipos diferentes de datos, cada uno de los cuales son representados de manera diferente dentro de la memoria del computador. Los requisitos de memoria de cada tipo de dato determinar el rango permitido de valores para ese tipo de datos. Los tipos de datos bsicos son los siguientes. Los requisitos tpicos de la memoria tambin se les da. ipos de datos ! su composici"n Otros tipos de datos pueden ser creados en base a los anteriores CONSTANTES Las constantes son los identificadores que no cambia su valor durante la ejecucin del programa. C tiene cuatro tipos bsicos Constante entera Constante de punto flotante Constante de caracteres Cadena constante (string) Con%t$nte ente&$ Una constante entera es un nmero entero sin ningn tipo de valor fraccionario. Constante de entero se puede escribir en tres sistemas numricos diferentes. Decimal (base 10) Octal (base 8) Hexadecimal (base 16) Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1. 1 int or short 2 - 32768 to 32767 2 Unsigned int 2 0 to 65535 3 Long int 4 - 2147483648 to 2147483647 4 Float 4 3.4e-38 to 3.4e+38 5 Char 1 - 128to127 6 Unsigned char 1 0 to 255 7 Unsigned long 4 0 to 4294967295 8 Double 8 1.7e-308 to 1.7e+308 9 Long double 10 3.4e-4932 to 3.4e+4932 S. No. Ti(o de D$to byte Rango Una constante octal puede ser cualquier combinacin de dgitos del 0 al 9. Si la constante contiene ms de un dgito, el primer dgito debe ser distinto de 0, una constante hexadecimal debe ser precedido por 0x. Ejemplos Ejemplo Decimales 1 30 50 23456 Ejemplos octales -1 -123 -234 -6743 Ejemplo hexadecimales -.2045 -/5678 -.f4567 -.abcdef Es importante mencionar que el formato sirve nicamente para indicar que el dato ingresado est en dicho sistema de numeracin , pero la representacin interna del dato seguir siendo en binario . Con%t$nte de (0nto 1)ot$nte Una constante de punto flotante se compone de un nmero entero seguido por el punto decimal y uno o ms nmeros decimales despus del punto decimal que hace la parte fraccionaria. Ejemplos 5E-5 0.009e-2 .234e-10 0.5 12.00278 2. 11.3 La letra e o # representa el valor exponencial base 10 Con%t$nte% C$&$cte& Un carcter es constante est delimitado por comillas %i'()e% Ejemplos 'Z' 'z' '8' '$'
St&in2 Con%t$nte Es una cadena de caracteres que est delimitado por comillas dobles (") Ejemplos "Program "1234 " "123.45 Sec0enci$ de e%c$(e Ciertos caracteres no imprimibles, as como la barra invertida (\) y el apstrofe ('), se puede expresar en trminos de secuencia de escape. Una secuencia de escape Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg12 comienza siempre con una barra invertida y es seguido por uno o ms caracteres especiales. Por ejemplo, un avance de lnea (LF), que se conoce como una nueva lnea en C se puede representar como \n. La secuencia de escape siempre representa un solo carcter, a pesar de que estn escritas en trminos de dos o ms caracteres. La secuencia de escape de uso general se enumeran a continuacin. VARABLES Cadenas y valores numricos se pueden almacenar en la memoria de la computadora para su uso durante la vida del programa. Cada variable tiene que ser asignada un nombre nico y se guarda en la memoria. Una variable es un rea de memoria, que es asignado por el compilador y le da un nombre. El contenido de una memoria (en el caso de variable) puede ser alterado o cambiado durante la ejecucin de un programa. Slo un valor se puede almacenar en cada variable, variables del tipo matriz tiene un tratamiento especial ,pero en general hay un solo valor para cada variable en un momento determinado . Poner un nuevo valor en una variable se reemplaza el valor anterior. La lectura del contenido de una variable no elimina el contenido. Es conveniente dar nombres significativos para las variables. Nombres significativos para las variables son auto-documentados, fcil de entender y hace que el programa fcil de leer. Reglas para nombres de variables: Nombre de la variable debe comenzar con caracteres alfabticos Puede ser seguido por letras y o nmeros (0 a 9). Otra vez, El compilador distingue las letras maysculas y minsculas. No utilice palabras reservadas (palabras clave) como nombre de variable. Ningn carcter especial, como un espacio en blanco, punto, punto y coma, coma o una barra, etc se puede utilizar en nombre de la variable, excepto Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1' subrayado '_'. Esto es independiente de la plataforma de programacin . Ejemplos : Nombres de variables vlidos count total average tot_amt sum a avg mins Nombre invlidos Float 2007sa "con espacio "juan,perez Dec)$&$ci3n de V$&i$b)e% Para declarar una variable es necesario indicar primero que tipo de variable es y luego su nombre . Opcional se puede iniciar con un valor determinado . Se pueden definir mltiples variables de cada tipo separndoles con comas. El formato general es : <type> varname1,varname2,.! Ejemplos: int sum, numbers; char ch1,ch2; float amount, average; Note que cada lnea termina con (;) SENTENCAS DE ASGNACN Despus de declarar las variables, se pueden asignar valores a las variables a travs de sentencia de asignacin. Las variables deben ser declaradas antes de asignar los valores. El formato de instruccin de asignacin es varia$le % e&pression' Note que cada lnea termina con (;) Los valores son asignados a las variables usando el operador '='. Ejemplos: num = 148; suma = suma + 5; ch1 = 'A'; CH2 = 'Z'; cantidad = 143,95;
Declaracin e nicializacin Cuando los valores de las variables se asignan en el momento de la declaracin se Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1# llaman como la declaracin e inicializacin. int numero = 100; En la declaracin anterior, el nmero se declara la variable de tipo entero y al mismo tiempo el valor 100 se asigna. Ejemplos : /* Programa para sumar dos nmeros */ # include <stdio.h> main() { int num1,num2; num1=40; num2=50; printf("La suma de los nmeros es %d, num1+num2); } /* Programa para declaracin variables*/ #include <stdio.h> main() {int hrs; hrs = 24; printf("Las %d horas del da .\n, hrs); } /* Programa usando dos declaraciones */ # include <stdio.h> main() { int minutes, hours; minutes = 60; hours = 24; printf("Hay %d minutos en una hora .\n, minutes); printf("Hay %d horas en el da .\n, hours); } /* Programa para desplegar mltiples variable en un printf() */ #include <stdio.h> main() { int units, dozens; dozens = 5; units = dozens * 12; printf("%d unidad son equivalentes a %d docenas \n, units, dozens); } O(e&$do&e% A&it'4tico% Hay cinco operadores aritmticos en C. Se llaman operadores binarios, ya que operan sobre dos operandos . Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1*
+ adicin - sustraccin * multiplicacin / divisin % Mdulo (el resto despus de la divisin entera) Ejemplo : #include <stdio.h> main() { int a = 4, b = 8, c = 13; printf("%d mod %d = %d\n,b,a,b%a); printf("%d mod %d = %d\n,c,a,c%a); printf("%d mod %d = %d\n,c,b,c%b); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg16 P&ecedenci$ de )o% o(e&$do&e% $&it'4tico% Dado que al escribir el programa definimos frmulas en la misma lnea , se pueden presentar situaciones ambiguas en las cuales no es claro cual es la secuencia de los operadores : Ejemplo : var= a*b-c; Para solucionar esto algunos operadores tienen preferencia sobre los otros en las expresiones. Por ejemplo, los operadores de multiplicacin y divisin tienen prioridad sobre la suma y resta. Parntesis tiene la ms alta prioridad sobre todos los operadores. La siguiente tabla indica la precedencia de ANS C (recedencia de operadores en )*+I , , fuente ---.ansi.com Favor notar que los signos + y de la lnea 2 se refieren a cambio de signo y no a las operaciones de suma y resta que figuran en la linea 4 . Asumiendo lo siguiente num1= 25 ; num2 = 2 ; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg/4 result=num1+num2*10; /*resultado = 45*/ result=(num1+num2)*10; /*resultado = 270*/ Los parntesis se utilizan para anular la precedencia. Reglas sobre el uso de los operadores en general. En caso de empate entre las operaciones de preferencia misma prioridad se le da al operador que est primero. Si hay ms de un conjunto de parntesis, las operaciones dentro del parntesis ms interno se llevar a cabo en primer lugar, seguida por las operaciones en el segundo parntesis ms interno y as sucesivamente. Debemos recordar siempre que el uso de pares de parntesis. Un desequilibrio por descuido de los parntesis derecho y / o la izquierda es un error comn. #include <stdio.h> main() { int a = 5, b = 10, c = 15, answer; answer = a + b / c; printf("%d + %d / %d = %d\n, a ,b, c, answer); answer = a * b c; printf("%d * %d - %d = %d\n, a, b, c, answer); answer = a * b / c; printf("%d * %d / %d = %d\n, a, b, c, answer); answer = (a + c) * b / a; printf("(%d + %d) * %d / %d = %d, a, c, b, a, answer); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg/1 ASIGNACIN MULTIPLE Es posible tener ms de una asignacin dentro de una instruccin ejecutable. En C, el mismo valor puede ser asignado a ms de una las variables del mismo tipo que utiliza la instruccin de asignacin mltiple. El formato es var1 = var2 = expresin; Aqu var1 y var2 son los nombres de variables y de expresin es el valor que se asigna. Se puede extender por ms de dos variables tambin. por ejemplo num1 = num2 = 0; x = a = c = 2; La ejecucin de mltiples tareas se lleva a cabo derecha a izquierda, en el primer ejemplo, num2 se le da el valor de 0, num1 se le da el valor de num2 (que ahora es 0). #include <stdio.h> main() { int a,b; a=b=2; printf("a=%d , b=%d.\n,a,b); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg// OPERADORES DE ASIGNACIN ESPECIAL C contiene cinco operadores especiales de asignacin: + =, -=, *=, / = , % =. Operadores especiales de asignacin se utilizan para procesar rpidamente. El contenido de una variable opera en una expresin y asigna de nuevo a la variable. Por ejemplo, considere el primer operador + =. La expresin de asignacin varia$le . % e&pression es equivalente a varia$le % varia$le . e&pression De la misma manera , la expresin de asignacin varia$les /% e&pression es equivalente a varia$le %varia$le / e&presi"n Veamos algunos ejemplos: #include <stdio.h> main() { int num = 1; num += 5; printf("num=%d\n, num); num - = 3; printf("num=%d\n, num); num *= 2; printf("num=%d\n, num); num /= 2; printf("num=%d\n, num); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg/0 VARIA!LES TIPO ENTERO Son variables cuyo valor es entero , es decir no utiliza fraccionarios. C utiliza un distinta clase de variable dependiendo del tamao de bytes en memoria que debe asignar para dicha variable . El siguiente cuadro indica el tipo y el rango de valores que puede asignar. Ejemplos: main() { int int_var=32767; short short_var=32767; unsigned un_var=65535; long long_var=2147483647; printf("nteger=%d\n,int_var); printf("Short integer=%d\n,short_var); printf("Unsigned integer=%u\n,un_var); printf("Long integer=%ld\n,long_var); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg/. VARIA!LES DE PUNTO 5LOTANTE Variables de punto flotante son las variables que tienen un punto decimal (nmero real). Podra ser positivo o negativo. La principal diferencia entre nmeros enteros y de punto flotante son: Entero slo contiene nmeros enteros, mientras que la variable de punto flotante puede contener ya sea enteros o fracciones. Variable de punto flotante pueden contener una gama ms amplia de nmero que los enteros. En la mayora de las computadoras, las ejecuciones de operaciones de punto flotante son ms lentos y requieren ms memoria que la operacin entera. Para esto , algunos procesadores cuentan con hardware especializado de punto flotante. Enteros son declarados por la palabra clave int, mientras que las variables de punto flotante se declaran por palabra clave float . La especificacin de formato % d se utiliza para una variable entera. Para punto flotante la especificaciones puede ser %e , %f , y %g Ejemplos: /* Programa con puntos flotantes */ #include <stdio.h> main( ) { float num1=468.57,num2=369.2,answer; clrscr(); answer =num1+num2; printf("%f + %f=%f\n, num1,num2,answer); answer=num1-num2; printf("%f - %f=%f\n, num1,num2,answer); answer=num1*num2; printf("%f * %f=%f\n, num1,num2,answer); answer=num1/num2; printf("%f / %f=%f\n,num1,num2,answer); } En el programa anterior, la especificacin de formato % f se utiliza en la sentencia printf, que indica al compilador que debe mostrar el contenido de la respuesta como nmero de punto flotante Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg/2 VARIA!LES DOU!LE El tipo de datos double es el mismo que float excepto que se ocupa el doble de memoria en comparacin con float . Si la precisin no es suficiente para un problema particular que nos ocupa, las variables pueden ser declaradas de tipo double. Ejemplo: #include <stdio.h> void main() { float fahr, celsius; int inf, sup, paso; inf = 0; /* limite inferior de temperaturas */ sup = 300; /* limite superior de temperaturas */ paso = 20; /* tamao del incremento */ fahr = inf; while (fahr <= sup) { celsius = 5.0 / 0.9 * (fahr - 32.0); printf("%3.0f\t%6.1f\n", fahr, celsius); fahr = fahr + paso; } } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg/' IDENTI5ICACIN de CONSTANTES Una constante es un identificador que tiene un valor fijo. Las constantes son similares a las variables, excepto que el valor de la constante no se puede cambiar. Una constante se define de la siguiente manera: # define var/constante # define es una directiva de preprocesador utiliza para configurar identificador constante. var_name es el nombre de la constante. Para diferenciar las variables y constantes, constant_name por convencin se usa las letras maysculas, aunque las letras minsculas tambin se permiten. Por ejemplo: #define P 3.14159 #define SZE 50 Las constantes se coloca normalmente al comienzo del programa antes del main() . El pre-compilador sustituir todas la ocurrencias en el programa de constante con el valor antes de la compilacin. Por ejemplo, en la declaracin sobre todos los sucesos de la P en el programa se sustituye con 3,14159. # define no debe terminar con un punto y coma (;). Ntese que la asignacin de valor a la constante no lleva el signo igual (=) . Ningn otro valor debe ser asignado a lo largo del programa. El tipo de datos de la constante depende del valor constante que le asigne en el momento de las declaraciones. #include<stdio.h> #define P 3.1519 main() { float radius = 5, area, circumfer; area = P * radius * radius; circumfer = 2 * P * radius; printf("Area = %f \n, area); printf("Circumference = %f \n, circumfer); } Ntese que las constantes podran estar definidas en el programa principal pero tambin pueden venir de alguno de los objetos de las libreras. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg/# CONVERSINES , PROMOCIONES C permite que se conviertan datos de un tipo a otro tipo en forma implcita y explcitamente. En forma implcita significa que alguna conversiones ocurren sin que el programador ingrese cdigo alguno . Sin embargo hay que tener cuidado porque eventualmente las conversiones implican prdida de precisin. Las siguientes reglas aplican a la conversin : Un char, un int o short, con o sin signo, se pueden utilizar en una expresin mezclado con un entero. Si un int puede representar todos los valores del tipo original, entonces el valor se convierte a int, de lo contrario el valor se convierte a unsigned int. Este proceso se llama promocin entera o promocin a enteros. Un int puede ser convertido a unsi0ned int , en este caso el valor convertido resulta positivo. Cuando un unsi0ned int es convertido a int , el valor resultante es un int si este cabe dentro del rango de valores , si no , depende del compilador ya que no est definido . Conversiones de punto flotante a entero son posibles , en este caso la parte fraccionaria es desechada , si el valor no puede ser representado por falta de bits el valor resultante no esta especificado. Cuando se convierte un int a punto float el valor se aproxima a la representacin mayor o menor Cuando se convierte de dou$le a float y el valor cabe en el float la conversin se realiza sin problema , sin embargo si el valor no cabe el resultado es indefinido. Conversiones Aritmticas Muchos operadores provocan conversiones una forma similar. El efecto es llevar operandos en un tipo comn, que es igual al tipo del resultado. Este patrn se llama las conversiones aritmticas habituales. En este caso se aplican la siguientes reglas en el orden mencionado : (1) Si cualquiera de los operandos es de tipo long double la conversin se realiza a un long double. Caso contrario : 7/8 Si cualquiera de los operandos es dou$le el resto se convertiran a dou$le. ,aso contrario : 708 Si uno de los operandos es float el resto se convertiran a float. ,aso contrario : 7.8 Si un operando es unsi0ned lon0 int el resto se convertiran a unsi0ned lon0 int .,aso contrario : 728 Si un operando es lon0 int y otro es unsi0ned int , el resultado depender si el long puede representarse como unsigned int , si es posible el unsi0ned int es convertido a lon0 , caso contrario los dos son convertidos en unsi0ned lon0 Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg/* int. ,aso contrario : (6) Si uno de los operandos es lon0 int en otro es convertido a lon0 int .Caso contrario: (7) Si uno de los operandos es unsi0ned int , el otro es convertido a unsi0ned int . Caso contrario : (8) Los dos operandos deben ser de tipo int. Ejemplo el valor entero se puede asignar a la variable de tipo float, el valor se convierte a float y no se cambia, es decir, el valor no se cambia solamente el tipo de dato. De la misma manera una variable float se puede convertir a entero , sin embargo en este caso el compilador truncar la parte fraccionaria . Para entender esto analice el siguiente programa: #include<stdio.h> main() { int ivar1,ivar2; float fvar1,fvar2; ivar1 = 5; fvar1 = 123.456; ivar2 = fvar1; fvar2 = ivar1; printf("ivar2=%d, fvar2=%f\n, ivar2, fvar2); } En el programa anterior, 'ivar1 " e ' ivar2 son variable enteras y dos variables float 'fvar1', 'fvar2' se declaran. El contenido de 'fvar1 "es decir, la variable de tipo float, 123.456 se asigna a la variable entero' ivar2. Por lo tanto el contenido de "ivar2 'ser 123 la parte fraccionaria se elimina. El contenido de 'ivar1 ", es decir variable int, 5 sern asignados a flote variable' fvar2. Por lo tanto el contenido ser 5.000000 Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg/6 E/PRESIN MODO MI/TO C permite que las expresiones contengan operandos de distinto tipo . Por ejemplo, un operando puede ser de tipo entero y el segundo puede ser de tipo flotante. Al realizar la operacin de enteros y float, el entero para fines de clculo convierte a float. De la misma manera, en la operacin de la float y doble . El float para fines de clculo se convierte en double . Esto se conoce como conversin implcita. Analice el siguiente programa #include<stdio.h> main() { int ivar=5,answer; float fvar=123.35,result; result=ivar * fvar; printf("%d * %f = %f \n, ivar, fvar, result); printf("%f en notacion cientfica es %e\n, result, result); answer=ivar * fvar; printf("%d * %f = %d\n, ivar, fvar, answer); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg04 OPERADOR CAST En las expresiones de modo mixto el tipo de datos se convierte implcitamente a efectos de clculo. Pero muchas veces queremos convertir explcitamente el tipo de datos de la variable, lo cual es posible a travs de operador cast. El operador de conversin convierte explcitamente el tipo de datos de la variable a otro slo para fines de clculo, pero el tipo de datos original de la variable no ser cambiado. El valor de una expresin se puede convertir en otro tipo de datos si lo desea. Para ello, la expresin debe ser precedido por el nombre del tipo de datos deseado, entre parntesis. El formato general es : (ipo de datos) la e&presi"n o varia$le En el siguiente caso, la variable float es convertido a int y el valor de ivar sera de 3 debido a que el entero no puede representar los puntos decimales. int a=7; float b; b=float(a)+1.0; /*Aqui a se convierte a float */ float fvar = 3.3; int ivar; ivar = int(fvar); Ejecute el siguiente ejemplo #include<stdio.h> main() { int intvar=25000; intvar=intvar*10/10; printf("ntvar = %d\n,intvar); intvar=25000; intvar=((long)intvar*10)/10; printf("ntvar = %d\n,intvar); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg01 VARIA!LE TIPO C6AR El tipo char se utiliza para almacenar un nico carcter de informacin. Una constante de carcter debe ser un nico carcter encerrado entre comillas simples. por ejemplo, 's', 'b', '#', 'etc Con el fin de mostrar un carcter constante, la especificacin de formato % c se utiliza en la declaracin correspondiente printf (). Ejemplo de variables tipo char . main() { char ch1 = 'H', ch2 = 'o', ch3 = 'w', ch4 = ' ', ch5 = 'a', ch6 = 'r', ch7 = 'e', ch8 = 'y', ch9 = 'u', ch10 = '?'; printf("%c%c%c%c%c%c%c%c%c%c%c%c\n", ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch4, ch8, ch2, ch9,ch10); } Conversin de ASC a entero; La funcin atoi () Eventualmente tenemos que convertir nmeros que estn en carcter a entero , la mejor forma de hacerlo e mediante una funcin de librera. El atoi () convierte los nmeros al principio de una cadena en un valor entero. La trata de convertir tiras o matrices de caracteres ASC. Por lo tanto atoi significa "convertir un archivo ASC (texto) de la cadena en un valor entero." As es como se puede leer enteros desde el teclado. E%t$ 10nci3n e% ($&te de )$ )ib&e&7$ %td)ib8 Aqu est el formato: var%atoi(strin0)' Veamos el si0uiente e1emplo : # include <stdio.h> #include <stdlib.h>
int main() { Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg0/ int age; char years[ ]= "696"; printf("Cuantos aos tenia Matusalem ? \n"); age=atoi(years); printf("Tena %d aos \n",age); return(0); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg00 CAPTULO 9 MANIPULACIN DE DATA LA 5UNCION %c$n1"# As como la mayora de programas necesitan salida de datos a la pantalla, tambin necesitan datos de entrada desde el teclado. La manera ms flexible que el programa puede leer los datos numricos desde el teclado es utilizando el scanf () funcin. El scanf () lee los datos desde el teclado de acuerdo a un formato especificado y asigna los datos de entrada a una o ms variables. Al igual que printf (), scanf () usa la cadena de control para describir el formato de la entrada. La cadena de control utiliza las especificaciones de conversin igual a la funcin printf (). El formato es: scanf (2cadena de control2, ar03, ar04, ..., ar0n.) La cadena de control indica al scanf () que lea los datos tipo caracteres y los convierta a los tipos especficos de valores, y luego guardarlos en la ubicacin dada por los argumentos de la direccin. Cada especificacin de conversin comienza con el carcter de porcentaje (%). por ejemplo scanf (25 d2, 6 a)' Lee un entero decimal desde el teclado y lo asigna a la variable de tipo entero 'a'. Se asume que la variable a ha sido declarada anteriormente. Asimismo, la declaracin siguiente, se lee un valor de punto flotante desde el teclado y lo asigna a la variable 'b'. scanf (25 f2, 6 $)' El smbolo & antes del nombre de la variable es el operador de C de direcciones. Los datos se introducen desde el teclado van a esta direccin, es decir, guardar los datos en la direccin de la variable, ms informacin sobre la direccin se tratarn en punteros. Revise el siguiente ejemplo: #include<stdio.h> main() { Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg0. int num; printf("Enter a number); scanf("%d,&num); printf("Square the number is %d\n, num*num); } En el programa anterior, cuando el compilador encuentra el scanf () la secuencia del programa se interrumpe (espera la respuesta del usuario) hasta que el usuario introduce un valor. Despus de recibir el valor del scanf () la funcin almacena el valor en la direccin de la variable en formato entero, ya que la especificacin de conversin utilizado es% d. Analice el siguiente programa , asuma que el operador entra el numero 5 y enter: Cual ser la salida? #include<stdio.h> main() { float realnum; printf("Enter a real number: ); scanf("%d,&realnum); printf("The number was %f \n,realnum); } Analice el siguiente programa , asuma que la entrada es 3.4 enter y 4.3 enter .Cual ser la salida: #include<stdio.h> main() { float num1,num2; printf("Enter a real number1: ); scanf("%f ,&num1); printf("Enter a real number2: ); scanf("%f ,&num2); printf("The sum of two numbers is %f \n,num1+num2); } Por ultimo , analice el siguiente: #include<stdio.h> main() { int a,b,answer; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg02 printf("Enter the values of a & b: ); scanf("%d%d,&a,&b); answer = a + b; printf("a + b = %d\n,answer); answer = a b; printf("a b = %d\n,answer); answer = a * b; printf("a * b = %d\n,answer); answer = a / b; printf("a / b = %d\n,answer); } Ahora, es importante que el programador asegure que la cantidad de datos ingresados pueden ser contenidos en la variable, caso contrario , los valores ingresados en exceso sobreescibirn posiciones de memoria que pueden estar asignados a otras variables. Ejemplo: char name[10]; //declara un string para recibir 10 caracteres scanf("%s", name); // lee 15 caracteres. Para solventar este problema existe una llamada similare: scanf_s #include<stdio.h> int main() { char c; printf("Enter a letter"); scanf_s("%c",&c); return 0; } La funcin scanf_s es ms segura en el sentido de evitar que reas de otras variables sean afectadas por el ingreso inesperado del usuario. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg0' ENTRADA : SALIDA DE UN c;$& Hay varias funciones de la librera estndar disponibles en C que se ocupa de las operaciones de E/S en un solo carcter. Estas son funciones de E/S de un solo char. Los siguientes son algunos de los caracteres de un solo funciones /O disponible en C. getchar () getch () getche () putchar () La funcin getchar recibe un carcter desde el dispositivo entrada estndar (stdin) que por defecto es el teclado , sin embargo puede ser redirigido . Este carcter puede ser asignado a una variable de la siguiente manera: ch = getchar (); Observe la diferencia entre la sintaxis de scanf () donde se utilizara el siguiente formato scanf ("% c", &ch) La diferencia entre las dos sentencias es que getchar devuelve un carcter . Mientras que scanf no devuelve nada , pero la variable ch tiene un nuevo valor. getchar () se usa normalmente con entrada tipo buffer. Todos los chars ingresados en el teclado entran en un buffer despus de la tecla ha sido presionada. Veamos el siguiente programa , fjese la conversin de carcter a decimal . #include<stdio.h> main() { int ch; printf("ntroduza un caracter: ); ch=getchar(); printf("The character was %c\n,ch); printf("The ASC code of %c is %d\nch,ch); } Si se ejecuta el programa anterior, se ver que despus de que el mensaje "ntroduzca un carcter:" el programa queda a la espera .Sin embargo, con el fin de introducir un carcter que tendra que pulsar el carcter y la tecla ENTER. Los cdigos ASC de ambos entraran en el bffer, getchar () tomara la primera de ellas, Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg0# dejando el carcter ENTER ("\ n") en el bfer. El segundo printf () que muestra el contenido de la 'ch' de tipo char, mientras que en la tercera declaracin printf () dos especificaciones de conversin y el uso %c %d para mostrar el contenido dos veces. La primera especificacin de conversin% c muestra el contenido de la 'ch' es decir, en formar el caracter, 'a' en tanto que la segunda especificacin de conversin se muestra el valor ASC del contenido de la 'ch', es decir, 97 Nota: Para usar getchar (), es necesario incluir el encabezado del archivo 'stdio.h'. # include <stdio.h> La funcin getchar () devuelve un cdigo ASC de tipo entero que en el ejemplo anterior 'ch' la variable debe ser declarada como de tipo int. El programa parece funcionar si 'ch' se declara como tipo char, pero podra haber problemas en otros programas, como veremos ms adelante. 2etc; "# < 2etc;e "# Muchos compiladores tienen funciones alternativas para la entrada de un solo carcter, que no utiliza un buffer. Tan pronto como un caracter es pulsado , el getch () o getche () obtiene el carcter, sin esperar a una tecla ENTER para ser presionado. E%t$% ))$'$d$% (e&tenecen $ )$ )ib&e&7$ conio." 8 Esto se conoce como la entrada directa. Ntese la diferencia mientras se ejecuta el siguiente programa: #include<stdio.h> #include<conio.h> main() { int ch; printf("Enter a character: ); ch=getche(); printf("\nThe character was %c\n,ch); printf("The ASC code of %c is %d\n,ch,ch); } Si ejecutamos el mismo programa con la funcion getch() , observaremos que la llamada funciona sin embargo la salida pantalla es diferente , con esta funcin no obtenemos el eco #include<stdio.h> main() { int ch; printf("Enter a character: ); ch=getch(); printf(\nThe character was %c\n,ch); Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg0* printf("The ASC code of %c is %d\n,ch,ch);} (0tc;$& "# Esta funcin enva un nico carcter en el dispositivo de salida estndar stdout (por defecto la pantalla). El caracter puede ser un carcter de control del dispositivo. El formato es: putchar (c)' Pruebe el siguiente programa: #include<stdio.h> main() { int ch; printf("Enter a character: ); ch=getch(); putchar('\n'); /* New Line */ printf("The character is ); putchar(ch); /* Displays content of ch in character form */ putchar('\a'); /* beep or bell */ putchar('\n'); /* New Line */ } El siguiente cuadro resume las capacidades de cada funcin: Funcin Librera Echo? Buffer? getchar() stdio si si getch conio no no getche conio si no putchar stdio NA si Not$= L$ )ib&e&7$ conio e% 1$b&ic$d$ (o& !o&)$nd < no e% ($&te de ANSI C + no todo% )o% co'(i)$do&e% )$ %o(o&t$n Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg06 ENTRADA SALIDA CON 5ORMATO Cuando se utiliza el 5tipo en las funciones printf () y scanf (), el programador tiene la opcin de especificar un formato de la variable . Adicionalmente un nmero positivo puede indicar el nmero de espaciado de caracteres de la informacin que se va a imprimir o para indicar los dgitos mnimo para ser ledo. Por ejemplo, si se desea que la variable utilice exactamente 5 espacios o posiciones se podr representar de la siguiente forma : printf ("%5d", a); y la sentencia : scanf ("% 5d", & a); Lea slo 5 dgitos e ignora el resto si hay ms de 5 dgitos. Normalmente los valores numricos se alinean hacia la derecha mientras que los textos se alinean hacia la izquierda . Para definir un alineamiento hacia la izquierda se podr usar el signo menos (-) de la siguiente forma: printf ("%-5d", a); En otras ocasiones es necesario rellenar los espacios que no estn siendo usados con ceros , esto puede hacerse de la siguiente forma: printf ("% 05D", a) Cuando tratamos con valores de punto flotante se hace necesario especificar la cantidad de decimales con los que se desea la salida. Esto puede hacerse mediante el uso del punto (.) printf ("% .2 f", a); El siguiente programa le ayudar a ver distintos uso de los modificadores de formato. #include<stdio.h> #include <conio.h> main() { int a=12345; printf("%d%3d%5d%7d\n,a,a,a,a); float x=345.678; printf("%7f%7.3f%7.1f \n",x,x,x); int m=1234; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg.4 float y=98.76; printf("%d\n,m); printf("%10d\n,m); printf("%010d\n,m+2); printf("%-7.2f \n,y); printf("%7.2f \n,y); char c1 = 'A', c2 = 'B', c3 = 'C'; clrscr(); printf("%c %c %c\n, c1,c2,c3); printf("%c %c %c\n,c1, c2, c3); printf("%3c %3c %3c\n,c1,c2,c3); printf("c1=%c c2=%c c3=%c\n,c1,c2,c3); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg.1 VARIA!LE LGICAS Adems de las variables que ya hemos visto , C permite usar un tipo de variable lgica o booleana. Estas variables estn definidas en una librera , la sdt$ool.h pero algunos compiladores nuevos ya las tiene como nativas , es decir , ya no se necesitara indicar al precompilador el include de std$ool. Una variable lgica es una variable que solo puede tomar uno de los siguientes valores , 1 o 0 o tambin llamados true o false . La librera stdbool incluye la definicin de true y false . True es una condicin verdadera y false una condicin falsa . Veamos un ejemplo: #include <stdio.h> #include <stdbool.h> int main (void)
En el ejemplo anterior , la palabra bool define un tipo de variable lgica , x e y son variable lgicas . Fijese que el formato de salida del printf es %d , esto es porque internamente la variable en un entero cuyo valor es 1 o 0 . Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg./ OPERADORES RELACIONALES Los operadores relacionales se utilizan para tomar decisiones con sentencias de alteracin del flujo del programa. Los operadores de relacin trabajan con operandos (valores o variables). Se utilizan para comparar el valor o la variable si es menor o igual o mayor que otra. Los operadores de relacin que se usa C se muestran en la siguiente tabla. 7peradores Relacionales El operando junto con los operadores de relacin constituye una expresin relacional. La expresin relacional produce slo dos valores de un verdadero y 0 para falso. "C" permite que se tomen decisiones mediante la evaluacin de una expresin dada como verdadera o falsa. Tal expresin incluye los operadores relacionales y lgicos. Dependiendo del resultado de la decisin, la ejecucin del programa procede en una direccin u otra. /* programa operadores relacionales */ #include<stdio.h> main() { int num; printf("Enter a number:); scanf("%d,&num); printf("Num < 20 = %d\n,(num<20)); printf("Num > 20 = %d\n,(num>20)); printf("Num == 20 = %d\n,(num==20)); } En el programa , la sentencia de control indica que debe imprimir un tipo decimal, el texto Num<20 es tomado como texto , aqu no hay ninguna evaluacin lgica . Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg.0 Pero en el lado de la variable se est colocando la expresin (num<20) misma que devuelve ya sea un boolean 1 o O. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg.. !LO>UES DE SENTENCIAS C permite la agrupacin de sentencias , que tienen que ser tratados como una entidad y el grupo resultante se llama sentencia compuesta o bloque. Consiste en sentencias encerradas entre llaves { } { printf ("Felicidades \ n"); printf ("Usted est aprobado"); } Un bloque es sintcticamente equivalente a una sola sentencia. Los bloques son muy tiles cuando la ramificacin o enlace de accin debe ser tomada en una serie de declaraciones en funcin de una determinada decisin. Ntese que an cuando se toma el bloque como una sola expresin, cada una de las sentencias debe estar terminada por el (;). Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg.2 C$(7t0)o ?- S$)to% < Condicion$'iento% SENTENCIAS CONDICIONALES Si la vida se mueve en una direccin, sera muy aburrido que es el caso de la programacin tambin. Sera muy aburrido si las declaraciones en el programa slo puede ser ejecutado en el orden en que aparecen. De hecho, una tarea comn de un programa es instruir a la computadora a saltar a diferentes partes del cdigo si cumplen determinadas condiciones. La decisin sobre dnde se mueven se realiza por instrucciones condicionales. Hay tres sentencias condicionales if , if-else y switch. L$ %entenci$ i1 La sentencia if evalu el valor de la condicin de que ser verdadera o falsa, y si la condicin es verdadera, la sentencia(s) siguientes se ejecuta de otro modo se ignoran El formato de la declaracin, si es la siguiente: if(condition) statement3' statement4' Dnde, la condicin es una expresin que se evala. Si la condicin es verdadera, se ejecuta la primera sentencia (statement 1). Si es falsa, sentencia1 se ignora y el programa contina en la siguiente instruccin despus de la condicional es decir, construir, statement2. Esta sintaxis es vlida nicamente cuando lo que se debe ejecutar cabe dentro de una sentencia , es decir , si el programador requiere ejecutar ms de una sentencia si la expresin es verdadera deber incluir las llaves de bloque. Note que la sentencia if no tiene el punto y coma final (;) Por ejemplo, if (notas > = 30) printf ("PASS"); printf ("Fin del programa"); En el ejemplo anterior, si 'notas> = 30' se imprime 'PASS' (expresion verdadera) y a continuacin, 'fin del programa ".Si 'notas< 30' se evala como falso, 'PASS' no se mostrar, el control pasa a la sentencia printf () que muestra 'Fin del programa'. Si queremos algo ms que una sola instruccin que se ejecutar Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg.' Las sentencias que se ejecutan con la evaluacin TRUE pueden ser sustituidas por un bloque : if(notas >= 30) { printf("PASS\n); printf("Very Good\n); } printf("fin del programa); Analice el siguiente programa : #include<stdio.h> main() { int num1,num2; printf("Enter first integer: ); scanf("%d,&num1); printf("Enter second integer: ); scanf("%d,&num2); if(num1==num2) printf("%d is equal to %d\n,num1,num2); printf ("The End "); } #include<stdio.h> main() { int n; printf("Enter a integer: ); scanf("%d,&n); if(n%2==0) printf("The number is Even\n); printf("THANKS.\n); } En el programa anterior, despus de la introduccin y la lectura de un nmero, si la declaracin se encuentra que el residuo de 'n' y 2, es 0, la condicin es verdadera, la funcin printf () declaracin siguiente si se ejecuta y muestra el mensaje 'nmero es par 'de lo contrario se omite. En los dos casos (es decir, si la condicin es verdadera o falsa) de la ltima instruccin printf("THANKS.\n) se ejecuta. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg.# I5 ELSE I5 Esta sentencia permite que las condiciones y sentencias sean anidadas . Esto permite que despus de la tomar la decisin de ejecutar un bloque el bloque contenga nuevos prrafos condicionales. No existe limite a la cantidad de decisiones que se pueden anidar, sin embargo el programador deber hacer que el cdigo sea fcilmente legible . El formato de esta sentencia es el siguiente: if(condition) statement3' else statement4' Si la condicin se prueba que es verdadera las sentencia statement1 ser ejecutada , caso contrario se ejecutar la sentencia 2 . De la misma manera se puede sustituir las sentencias que se ejecutarn en cualquier caso por un bloque de sentencias de la siguiente forma if (condition) 8 statements3' statements4' ... statementsn' 9 else 8 statements3' statements4' ... statementsn' 9 Analice el siguiente ejemplo: #include <stdio.h> main() { int num1,num2; printf("Enter an integer: ); scanf("%d,&num1); printf("Enter another integer: ); scanf("%d,&num2); if(num1 ==num2) printf("You have typed equal integers\n); Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg.* else printf("You have typed different integers\n); } En el programa anterior, despus de leer dos valores enteros de dos variables "num1" y "num2", los valores se ponen a prueba en el estado con el if. Si ambos valores son iguales, entonces la condicin si es verdadera y por lo tanto, la funcin printf () inmediatamente despus de la declaracin, si se ejecuta. Si los dos valores no son iguales, entonces la condicin si es falsa, y por lo tanto, la funcin printf () instruccin que sigue se ejecuta. Otro ejemplo : #include <stdio.h> main() { int num1,num2; printf("Enter an integer: ); scanf("%d,&num1); printf("Enter another integer: ); scanf("%d,&num2); if(num1 % num2==0) printf("%d is divisible by %d\n,num1,num2); else printf("%d is not divisible by %d\n,num1,num2); } Ahora con bloques en ambos lados del if : #include<stdio.h> main() { float years, seconds; printf("Enter your age in years:); scanf("%f,&years); if(years < 0) { printf(" am sorry\n); printf("Age cannot be negative); } else { seconds = years * 365 * 24 * 60 * 60; printf("Your lived for %f seconds,seconds); } } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg.6 I5 ANIDADOS Cuando existe un if dentro de otro if se llama que anidados. En otras palabra , un if- else dentro de otro if-else. Si la condicin del if exterior es verdadera entonces el programa empieza a evaluar los if internos. El formato de la instruccin if anidada puede ser de las siguientes formas: if (condition) { if(condition) statement1; else statement2; } else statement3; if(condition) statement1; else { if(condition 2) statement2; else statement3; } if(condition) { if(condition 2) statement4; else statement5; } else { if(condition 3) statement6; else statement7; } Veamos el siguiente cdigo : #include <stdio.h> main() { int n; printf("Please enter an integer: ); scanf("%d,&n); if(n<=15) { if(n>=10) printf("%d is between 10 and 15.\n,n); } else printf("%d is not between 10 and 15.\n,n); } En el programa anterior, despus de leer un valor entero en la variable 'n', si los controles de la condicin if el valor es inferior a 15, si el resultado de esta condicin Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg24 es cierta, las declaraciones de bloque entre llaves se ejecutan, de lo contrario la funcin printf () instruccin que sigue a otro que se ejecuta. C$%o% E%(eci$)e% = Cuando en lugar de una comparacin colocamos una expresin , C hace una "expansin automtica .Veamos el siguiente programa: #include<stdio.h> #include<conio.h> void main() { int x; clrscr(); x=12; if(x) printf("x is non zero"); getch(); } #include<stdio.h> #include<conio.h> void main() { int x; clrscr(); x=10; if(x=10) printf("x is equal to 10"); getch(); } El programa a la izquierda , en este caso la sentencia if(x) es entendida como if (!x=0), en otras palabras se esta preguntando si el valor de x es 0 . A la derecha , el if tiene una asignacin x=10, es expandida a if (!(10=0)) lo cual siempre dar un resultado de true, indistintamente del valor. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg21 SENTENCIA S@ITC6 La sentencia switch se utiliza para seleccionar una opcin entre mltiples opciones. La sentencia switch hace que un grupo particular de la declaracin escoja entre varios grupos disponibles. La seleccin se basa en el valor actual de una expresin que se incluye dentro de la sentencia switch. Demasiados construcciones if-else pueden volverse muy desordenada y difcil de leer en un programa, especialmente en el caso de la comparacin de la entrada con una amplia gama de posibilidades. Se trata de un mtodo alternativo de hacer esto mediante el uso de la sentencia switch / case , el formato general es el siguiente. s-itch(e&pression) 8 case constant3: $loc: of statements3' $rea:' case constant4: $loc: of statements4' $rea:' ;.. case constantn: $loc: of statementsn' $rea:' default: $loc: of statements' 9 Switch evala la expresin y comprueba si es equivalente a constante1, si lo es, se ejecuta bloque de statements1 hasta que encuentra la palabra clave break. En el momento que la palabra clave break se encuentra, el control pasar a la final de la sentencia switch. Si la expresin no se ha encontrado igual a constante1 se comprobar si la expresin es equivalente a constant2. Si es as, que se ejecute el bloque de statements2 hasta que encuentra la palabra clave break, y as sucesivamente. Por ltimo, si el valor de la expresin no ha coincidido con alguna de las constantes especificadas previamente, el programa ejecutar las instrucciones incluidas en la seccin por defecto. La clusula de default es opcional y se ejecuta si los casos no se cumplen. Note la inclusin de sentencia break al final de cada bloque. Esto es necesario porque si, por ejemplo, no se incluyen despus de un bloqueo de sentencia1, el control no cambiara hasta el final de la sentencia switch y se mantendra la ejecucin del resto de los bloques de sentencias hasta que la primera aparicin de un break o al final de la sentencia switch que se encuentre. Para entender mejor veamos el siguiente programa : Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg2/ #include <stdio.h> main() { float value1,value2; char operator; printf("Type an expression: ); scanf("%f%c%f ,&value1,&operator,&value2); switch(operator) { case '+': printf("%.2f \n,value1+value2); break; case '': printf("%.2f \n,value1-value2); break; case '*': printf("%.2f \n,value1*value2); break; case '/': if(value2==0) printf("Divisible by zero\n); else printf("%.2f \n,value1/value2); break; default: printf("Unknown operator\n);
} } En el programa anterior se realiza la entrada de 3 variables , dos son de tipo float y una de tipo carcter . La idea es realizar la operacin aritmtica que se desee. Dependiendo del operador aritmtico se transfiere control sobre determinado grupo de sentencias. Veamos un ejemplo sin el control break : #include<stdio.h> #include<conio.h> void main() { char ch; clrscr(); printf("Enter any character\n"); scanf("%c",&ch); switch(ch) { default: Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg20 printf("No es vocal l\n"); break; case'A': case'a': case'E': case'e': case'': case'i': case'O': case'o': case'U': case'u': printf("Es una vocal "); break; } getch(); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg2. OPERADOR CONDICIONAL "o(e&$do& te&n$&io# C incluye un operador muy especial llamado el operador condicional o ternario. Se le llama ternarios, ya que utiliza tres expresiones. Simples operaciones condicionales se pueden realizar con el operador condicional (?). Una expresin que hace uso del operador condicional se denomina una expresin condicional. Tal expresin se puede escribir en lugar de las ms tradicionales if-else. sintaxis: e&pression3# e&pression4$ e&pression< nicialmente C evaluar la expresin condicional e&pression3 . Si expression1 es verdadera entonces se evala expression2 y esto se convierte en el valor de la expresin condicional. Sin embargo, si expression1 es falsa, entonces expression3 se evala y se convierte en el valor de la expresin condicional. Veamos el siguiente programa: main() { int first,second,biggest; printf("Enter two positive integers\n); scanf("%d%d,&first,&second); bi22e%tA "1i&%t B %econd# C 1i&%t = %econdD printf("Biggest of two numbers is %d,biggest); } Este tipo de construccin hace que el cdigo sea ms compacto , pero tambin mas difcil de leer. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg22 OPERADORES DE INCREMENTO , DECREMENTO C utiliza dos operadores para incremento o decremento . Tambin se les llama auto incremento y auto decremento. El operador de incremento permite incrementar el contenido de la variable en 1, mientras que el operador de decremento disminuir el contenido de la variable en 1. Hay dos tipos de usos : prefijo de incremento (++ i) y el incremento postfijo (i ++). Del mismo modo en decremento tambin son de dos tipos, es decir, prefijo (-- i) y postfijo (i --). En prefijo de incremento que el operador agrega uno a la variable y luego procede a usarla y en el incremento de postfijo utiliza por primera vez la variable y luego aade 1 a la variable. De la misma manera trabaja el decremento . Considere los siguientes dos ejemplos. #include <stdio.h> main() { int x=5; printf("Value of x with increment operator is %d, ++x); } #include <stdio.h> main() { int x=5; printf("Value of x with increment operator is %d", x++); } El resultado de los dos programas es diferente debido a la localizacin del operador . Ejecute el siguiente programa para ver su utilidad #include<stdio.h> main() { int a=10; clrscr(); printf("A=%d\n,a++); printf("A=%d\n,++a); a++; ++a; printf("A=%d\n,--a); printf("A=%d\n,a--); printf("A=%d\n,a); printf("A=%d\n,a--); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg2' C$(7t0)o ?? Re(etici3n < )$Eo% !UCLES Si queremos que la ejecucin de sentencias se realice ms de una vez un bucle puede ser lo aconsejado . Esto implica la repeticin de una parte del programa, ya sea un nmero determinado de veces o hasta que una condicin en particular est siendo satisfecha. En muchas situaciones, sabemos de antemano el nmero de veces que se repite el bucle. Pero en muchas situaciones, no sabemos el nmero de veces que se repite el bucle, el bucle se repite hasta que la condicin es verdadera. Esta operacin se hace posible a travs de una estructura de control del bucle. Hay tres maneras en que podemos repetir la instruccin requerida (s). Ellos son: while do-while for !0c)e ti(o F;i)e El bucle while se utiliza para ejecutar un block de cdigo mientras que la condicin sea verdadera. Tan pronto como la condicin se vuelve falsa, no se ejecutar el bucle y pasar el control a la instruccin inmediatamente despus del bucle while. Si la condicin es falsa desde el principio, el bucle no se ejecuta, mientras que bucle se puede ejecutar por cero o mltiples veces. El formato general de es: -hile(condition) 8 statement3' statement4' . . statement(n)' 9 Para cualquier tipo de lazo tres puntos son importantes: nicializacin del contador del bucle Condicin, para poner a prueba si la condicin evala a verdadero o falso. Aumentar o disminuir el contador del bucle, caso contrario el bucle no acabar nunca En general el diagrama de flujo de la sentencia while es el siguiente : Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg2# Ejecute el siguiente programa para su anlisis main() { int i=1; while(i<11) { printf("This is line number %d\n, i); i++; } } En el programa anterior, la variable 'i' se declara y se inicializa a 1. A continuacin, inicia el bucle while que comprueba si el valor de 'i' es menor que 11. Si es cierto, el bloque de sentencias se ejecutarn. Si es falso, el bloque de sentencias se omitirn y saldr del bucle. En el lazo de determinado programa es ejecutado por 10 veces. Tenemos que tener alguna forma de poner fin al ciclo en algn momento, por lo tanto, en el bloque de sentencias, que debe proporcionar un mtodo que las fuerzas condicin sea falsa en algn momento, de lo contrario el bucle continuar en bucle para siempre. En este caso hemos incluido i + + que hace que la condicin sea falsa cuando el proceso de incrementar la 'i' por una llega a 11. Vemos el siguiente ejemplo de calculo de factorial : #include<stdio.h> main() { int num,original,factorial; printf("Type a positive integer: ); scanf("%d,&num); original=num; factorial=1; while(num>1) { Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg2* factorial*=num; num--; } printf("Factorial of %d=%d\n,original,factorial); } !0c)e ti(o doGF;i)e El do-while es similar al bucle while, excepto que en el do-while las pruebas de la condicin se realizan al final . El cuerpo del bucle se ejecutar al menos una vez en el peor de los casos. El formato general de do-while es la siguiente: do { statement 1; statement 2; . . statement (n); } while(condition); Hay una diferencia entre el funcionamiento de los bucles while y do-while. La diferencia es el lugar donde se prueba la condicin. El while pone a prueba la condicin antes de ejecutar cualquiera de las declaraciones dentro del bucle , es decir, antes de entrar en el bucle de prueba En caso de que el do-while prueba la condicin despus de haber ejecutado las sentencias dentro del bucle, es decir, al final del bucle y se conoce como post-test. El diagrama de flujo de do-while sera el siguiente : Analice los siguientes programa : Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg26 #include<stdio.h> main() { int n=1; do { printf("The value of n is now %d\n,n); n++; } while(n < =5); } #include<stdio.h> main() { int num,rev; printf("Enter the number to be reversed: ); scanf("%d,&num); printf("Reverse number is :\n); do { rev = num % 10; printf("%d,rev); num = num/10; } while(num!=0); } !0c)e ti(o 1o& A menudo en programacin se desea hacer algo por un nmero determinado (fijo) de veces. El bucle for es ideal para estos casos. El bucle for nos permite especificar tres cosas acerca de un bucle en una sola lnea: nicializar el contador del bucle. Prueba el contador del bucle para comprobar si su valor ha alcanzado el nmero de repeticiones deseado (valor final). Aumentar o disminuir el valor del contador del bucle despus de cada vez que las sentencias dentro del bucle se ha ejecutado. La forma general de la declaracin, conforme a: for(initiali=e counter ' condition ' increment or decrement counter) Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg'4 8 statement 3' statement 4' . . statement (n)' 9 El for trabaja de la siguiente forma : Se realiza la inicializacin del contador : En general, es establecer el valor inicial de una variable de contador. Esto se ejecuta slo una vez. Se comprueba la condicin : Si es verdadera el bucle contina, de lo contrario el bucle termina y las declaraciones se omiten. La condicin es generalmente una declaracin relacional que comprueba el valor de la variable contador con un valor de terminacin. Si la condicin es verdadera, se ejecutan las instrucciones. Como es habitual, la declaracin puede ser una sola declaracin o un bloque de sentencias encerradas entre llaves. Finalmente, lo que se especifique el incremento o decremento del campo (variable) contador se ejecuta y el bucle se vuelve al paso inicial . El diagrama de flujo de esta construccin es el siguiente : Analice el siguiente cdigo #include<stdio.h> main() { int i; printf("Count down\n); Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg'1 for(i=10;i>0;i--) printf("%2d\n,i); } main() { int i; printf("Table of Results\n\n); printf(" i i Square\n); for(i=1;i<=10;i++) printf("%4d%13d\n,i,i*i); } #include<stdio.h> main() { int i,low,high,temp,sum=0; printf("Please type in the low bound: ); scanf("%d,&low); printf("Please type in the high bound: ); scanf("%d,&high); if(high<low) { printf("Wrong Order, let use switch them\n); temp=low; low=high; high=temp; } for(i=low;i<=high;i++) sum+=i; printf("\nThe sum of integers from %d to %d is: %d\n, low,high,sum); } // El siguiente ejemplo usando variables booleanas #include <stdio.h> #include <stdlib.h> #include <stdbool.h> // Verificar si el compilador lo necesita
int main(void) { bool seguir = true; // Tambien podria ser puesto seguir = 1; int y=0; while(seguir) { printf("Sigue imprimiendo mientras la condicion sea true.\n %d",y++); if (y==10) seguir = false; // Tambien podria ser seguir= 0;` } printf("Parando !\n"); return EXT_SUCCESS; } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg'/ !UCLES ANIDADOS Cuando se tiene un lazo dentro de otro se conoce como bucles anidados. En este caso el bucle externo comienza su ejecucin por la inicializacin de su contador de bucle y el programa sigue su ejecucin hacia el bucle interno. El contador del bucle interior se inicia y el bucle se ejecuta hasta que la condicin es verdadera. Tan pronto como el estado del bucle interno se convierte en falsa el programa de control se mueve hacia atrs al bucle exterior. La condicin del bucle externo es incrementada o decrementada segn sea el caso y el control del programa regresa a la del bucle interior, de nuevo el contador del bucle del bucle interno se inicia de nuevo y el bucle interno se ejecuta hasta que la condicin del bucle interno es verdadera y etc. Este proceso se detendr cuando la condicin de ambos es decir, el bucle externo e interno se convierte en falsa. Veamos el siguiente ejemplo : #include<stdio.h> main() { int i,j; for(i=1;i < 4; i++) // outer loop for(j=1;j < 3; j++) // inner loop printf("%5d%5d\n",i,j); } En el programa anterior, el bucle externo se inicia la ejecucin de la inicializacin del valor de 'i' a 1 y pasar el control al bucle interior, donde el valor de la 'j' es definido como 1 y el bucle interior se repite dos veces. Despus de completar dos iteraciones del bucle interno se vuelve falsa y se mueve el control al bucle exterior. El lazo externo incrementa el valor de 'i' en 1. De nuevo el bucle interno se repite dos veces. En total, el bucle exterior se repite tres veces y en cada iteracin del bucle exterior del bucle interno se repite dos veces, es decir, un total de seis veces. OPERADOR COMA (,) En el bucle for se puede tener ms de la inicializacin separados por comas. Del mismo modo que podamos tener mas de un incremento o decremento separados por comas. El programa se muestra el operador coma. #include<stdio.h> main() { int i,j,n; printf("What number do you want a table for? ); scanf("%d,&n); for(i=0,j=n;i<=n;i++,j--) Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg'0 printf("%3d + %3d = %3d\n,i,j,n); } DECLARACIONES DE SALTO Las instrucciones de salto provocan un salto incondicional a otra declaracin en el resto del cdigo del programa. Se utilizan sobre todo para interrumpir las instrucciones switch y bucles. Las declaraciones de salto son: Continue Break Goto In%t&0cci3n Contin0e La sentencia continue se utiliza para evitar el resto del flujo pase travs de un bucle. El bucle no termina cuando una sentencia continue que se encuentre. Las sentencias restantes del bucle se omiten y el clculo procede directamente a la siguiente pasada por el bucle ( chequeo de condicin). Veamos el siguiente ejemplo : #include<stdio.h> main() { int sum = 0,i,x; for (i=0; i<4; i++) { printf("Enter an integer: ); scanf("%d,&x); if (x < 0) continue; sum = sum + x; } printf("Sum = %d\n,sum); } El programa realiza la suma de los nmeros que han sido ingresados por el usuario, sin embargo se desea que no se sumen los valores negativos. La prueba if <0 esta asociada a un continue que indica al programa que debe saltar al inicio del bucle . Ejecute el siguiente programa para observar los resultaos: #include<stdio.h> main() { int i,j; clrscr(); Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg'. for(i=1;i<4;i++) { for(j=1;j<4;j++) { if(i==j) continue; printf("%5d %5d\n",i,j); } } } !&e$H A menudo nos encontramos con situaciones en las que quiere saltar fuera de un bucle de forma instantnea, sin tener que esperar para volver a la prueba condicional. La palabra clave break que nos permite hacer esto. La sentencia break termina la ejecucin del inmediato del, do-while , for o switch. El control pasa a la siguiente declaracin del cuerpo del bucle o la sentencia compuesta de una sentencia switch. La sentencia tiene la siguiente sintaxis: $rea:' #include<stdio.h> main() { int i; for (i=1; i<=20; i++) { if(i==10) break; else printf("%5d\n,i); } printf("Program over ); } El siguiente programa permite encontrar nmeros primos: #include<stdio.h> main() { int num,i; printf("Enter a number\n); scanf("%d,&num); i=2; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg'2 while(i<=num-1) { if(num%i==0) { printf("Not a prime number\n); break; } i++; } if(i==num) printf("Prime number\n); } Goto La sentencia goto se utiliza para alterar la secuencia normal de la ejecucin del programa mediante la transferencia de control a alguna otra parte del programa. En su forma general, la sentencia goto se escribe como la$elname: sentencia3' instrucci"n4' . . . 0oto la$elname Aqu, labelname es un nombre de un punto del cdigo a donde goto dnde saltar. En el siguiente ejemplo esta etiqueta toma el nombre de repeat #include<stdio.h> main() { int num=1; &e(e$t= printf("%4d\t,num); num++; if(num<11) goto repeat; printf("\nProgram Over); } AIn c0$ndo e%t$ %entenci$ e% $ce(t$d$ (o& C + 2ene&$)'ente (&ooc$ (&ob)e'$% $) 'o'ento de )ee& e) (&o2&$'$+ (o& )o J0e %0 0%o no e% &eco'end$do8 Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg'' 50ncion e.it La funcin exit () se utiliza para salir del programa antes de su acabado natural. // PROGRAMA PARA REVSAR NOTAS #include<stdio.h> #include stdlib.h> main() { int marks; printf("Enter marks\n); scanf("%d,&marks); if (marks<30) goto end; else { printf("Alumno aprobado\n); exit(0); } end: printf("Alumno reprobado\n); exit(1) } La funcin exit pertenece a la librera stdlib.h La funcin return es similar en el sentido que retorna resultados a quien le haya llamado . Cuando return se usa en el main() su comportamiento es similar al exit() . Sin embargo el uso de return es ms general , pudiendo usarse en funciones . U%o% de c3di2o de &eto&no= Todos los sistemas operativos modernos incluyen la funcionalidad de codgo de retorno para conocer si el programa que est terminando tuvo una terminacin normal o anormal. Por ejemplo : es posible conocer si el programa tuvo un error interno como archivo no encontrado , parmetros invlidos , etc si es que el programa retorna un valor cero (0) . Si es que el programa termin normalmente deber retornar un cdigo uno (1) . Otros cdigos son posibles. Adicionalmente , el programador puede recibir este cdigo mediante un lenguaje de scripting como Perl, o cualquier shell de unix . A continuacin un ejemplo : #!/bin/sh # Script para probar cdigo de retorno notas if [ "$?" -ne "0" ]; then echo "alumno aprobado " ejecutar programa pase de semestre else echo " alumno reprobado no se ejecuta pase de semestre fi Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg'# T&$b$jo con A&&e2)o% o M$t&ice% !na matriz es una estructura de datos que puede almacenar mltiples elementos de mismo tipo de datos (homogneo) bajo un mismo nombre. En otra forma de decir es que la matriz es una coleccin de variables del mismo tipo todos los cuales son referidos por un nombre comn. Un elemento especfico de una matriz se accede por un ndice. La declaracin de una matriz se realiza como sigue: 1ata2t3pe 4ariable2name 5si6e78 Ejemplo: int arr[5]; En la declaracin anterior que se declara una matriz denominada como arr y que puede almacenar 5 elementos enteros. El tamao se especifica entre [] corchetes (operador de subndice). El tamao debe ser dado cuando se declara una matriz. Nombre de la matriz es un identificador que sigue las reglas de la escritura de un identificador. Debido a que cada elemento entero es de 2 bytes por lo que esta declaracin de matriz invierte 10 bytes de memoria para la matriz durante la compilacin. Todos los elementos de un array se almacenan en lugares contiguos con el primer elemento accedido como nombre de la matriz [0], segundo nombre de la matriz [1] y as sucesivamente. En nuestro caso, ser arr [0], matriz [1] hasta matriz [4]. El primer elemento de una matriz comienza en el ndice 0 y el ltimo elemento en el ndice arraysize-1. Las siguientes reglas aplican a los arreglos : Un arreglo es una estructura de datos homognea que almacena elementos de tipo similar, es decir, 5 elementos de tipo int, 10 elementos de tipo flotante, y 20 elementos del tipo char. Todos lo elementos comparten el mismo nombre con distinto ndice Al cambiar el valor de un elemento no cambia el valor del resto Aunque cada elemento tiene el mismo no0mbre son tratados como variable independientes. La cantidad de espacio requerido para almacenar un arreglo se puede calcular de la siguiente forma : Tamao = sizeof (type) * numero_elementos Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg'* En C no hay ningn control que refuerce que el programador no sobrepase la ltima direccin. Esto es responsabilidad del programador. No hay forma de insertar o eliminar un valor en medio de un arreglo , esto se puede hacer nicamente va programa. Veamos el siguiente ejemplo que inicializa un arreglo y luego lo despliega #include<stdio.h> #include<conio.h> #define s 5 void main() { int a[5]; int i; clrscr(); for(i=0;i<s;i++) { printf("\n Enter a[%d] element:",i); scanf("%d",&a[i]); } printf("Array elements are \n"); for(i=0;i<s;i++) printf("a[%d]= %d\n",i,a[i]); getch(); } El siguiente programa presenta otra forma de inicializacin: #include<stdio.h> #include<conio.h> void main() { int a[ ]={34,56,78,89,67}; int i; clrscr(); printf("Array element are \n"); for(i=0;i<5;i++) printf("a[%d]=%d\n",i,a[i]); getch(); } El siguiente pr5ograma indica que pasa cuando no todos los elementos han sido inicializados: Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg'6 #include<stdio.h> #include<conio.h> void main() { int a[8]={34,56,78,89,67}; int i; clrscr(); const int s=sizeof(a)/sizeof(int); printf("Array elements are\n"); for(i=0;i<s;i++) printf("a[%d]=%d\n",i,a[i]); getch(); } Array elements are a[0]=34 a[1]=56 a[2]=78 a[3]=89 a[4]=67 a[5]=0 a[6]=0 a[7]=0 Por ltimo veamos que pasa cuando se trata de acceder ms halla del ndice: int a[3] = {34,56,78,89,67}; Esto provocar un error de compilacin int a[3] = {34,56,78,89,67}; int s=6; printf("%d, a[s]); Esto provocar un error en tiempo de ejecucin Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg#4 C$(7t0)o ?K S0b(&o2&$'$%+ S0b&0tin$% < Lib&e&7$% 5UNCIONES O MDULOS Una funcin es un pequeo mdulo o pedazo de cdigo que se puede acceder en repetidas ocasiones desde varios lugares diferentes dentro de un programa. Sus caractersticas principales son : Se puede acceder desde distintos puntos con diferentes valores de los parmetros dentro de un programa. Evitar la programacin redundante de las mismas instrucciones. Aumenta la claridad lgica de romper el programa en varias funciones concisas. Divide en pequeos mdulos (funciones) que hace ms fcil de entender y depurar. Hace ms fcil escribir programas y realizar un seguimiento de lo que estn haciendo. TPOS DE FUNCONES Generalmente las funciones se pueden dividir en dos grandes categoras: Funciones del sistema Funciones definidas por el usuario Las funciones permiten que un pedazo de cdigo sea utilizado desde cualquier programa. En C , se separan las funciones del desarrollador del cdigo y del programador. El programador desea utilizar las funciones predefinidas para lo cual lo nico que le interesa es saber como usarla mas no como funciona internamente dicha funcin. El desarrollador por otro lado es aquel que escribe el cdigo de la funcin est centrado en los detalles de su implementacin. Para lograr esta separacin de funciones, C define dos tipos de archivos: 1. Archivos de cabecera (header) .h 2. Archivos de cdigo compilado .obj o dll Como programadores lo nico que debemos hacer es incluir una referencia al precompilador indicando que se usar uno o ms objetos. Para esto usamos la sentencia : #include li$rer>a 50ncione% de1inid$% (o& e) %i%te'$ Las funciones disponibles en la biblioteca estndar de C se llaman las funciones del sistema. Estas funciones del sistema se puede acceder a travs del archivo de Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg#1 cabecera (header file) generalmente identificados por la extensin .h . Por ejemplo, si desea utilizar las funciones printf () o scanf () tiene que incluir el archivo de cabecera <stdio.h> en su programa, esto se realiza mediante la sentencia de pre- proceso include . En C, hay muchas funciones del sistema que estn definidas en los archivos de cabecera diferentes dependiendo de la categora. Por ejemplo, todas las funciones estndar de entrada/salida estn disponibles en la librera <stdio.h>, las matemticas estn en funciones <math.h>, relacionados con la consola en <conio.h>. Cada vez que desee utilizar cualquier funcin definida en su programa habr que incluir el archivo de cabecera correspondiente antes de main(), por ejemplo, para encontrar la raz cuadrada de un nmero entero, la funcin sqrt (), disponible en <math.h> . Ntese que estas libreras del sistema deben estar delimitadas por <> . 50ncione% de1inid$% (o& e) 0%0$&io Cuando las funciones definidas por el sistema no satisface sus necesidades, es decir, el programador quiere realizar alguna tarea y no hay funcin estndar que este disponible para realizar esa tarea, entonces, el programador puede escribir la funcin y guardarla como funcin definida por el usuario . Escribir nuestra propia funcin, hace necesario indicarle al compilador el nombre de la funcin, el nmero y tipo de informacin que pasa a la funcin, es decir, los parmetros o argumentos y el tipo de declaracin que retorna de la funcin. Las funciones son identificadas por su nombre y pueden devolver un solo valor. De1inici3n de 10ncione% (&o(i$% Si desea utilizar la funcin definida por el usuario, debe indicar al compilador los detalles de la funcin. Usted puede hacer esto escribiendo algo que se llama definicin de la funcin o prototipo de la funcin. Una funcin no puede ser llamada sin que su definicin este completa. El formato es el siguiente : tipo?retorno nom$re?funcion(tipo nom$re , tipo nom$re ;.)' Lo primero que se especifica es el tipo de data que retorna la funcin . Recuerde que solo se permite una variable de retorno, aunque hay formas de evitar esta limitacin . Si el retorno de la funcin es de tipo punto flotante , entonces el retorno de tipo ser de float. No puede haber una sola declaracin de la funcin sin instruccin de retorno. Cuando la funcin no retorna nada , habr que usar la palabra clave void . A continuacin tiene que darle un nombre a la funcin , es buena prctica colocar un nombre que refleje el tipo de trabajo que har. A continuacin entre parntesis se tiene que indicar el tipo de parmetros que tomara , y el nombre de cada parmetro. No existe lmite en esta cantidad . Por ejemplo si la funcin toma como dato un texto la variable deber ser declarada como string . Los parmetros son una forma de pasar informacin a la funcin, la funcin puede procesar esta informacin. Si no existen variables de paso puede Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg#/ quedar en blanco . Posteriormente, usted deber incluir el cdigo de la funcin. La funcin puede estar definida en el mismo archivo o en otro archivo. Si est definida en el mismo archivo deber colocar el cdigo en cualquier lugar pero fuera del main(). Si la funcin est en otro archivo entonces dicho archivo deber tener el include correspondiente con el nombre delimitador por comillas. Ejemplo: #include <stdio.h> void rutina1(int a , char b); main() { .. rutina1(10, 'a') ... } void rutina1(int a , char b) { ... //codigo de la rutina . } #include <stdio.h> #include "mi-libreria; main() { .. rutina1(10, 'a') ... } //archivo mi_librera.h void rutina1(int a , char b) ; /archivo mi_librera.c void rutina1(int a , char b) { .. //codigo de la rutina .. } El principio y el final de la funcin se caracterizan por llave de apertura ({) y llave de cierre (}). Las declaraciones entre { } es el cuerpo de la funcin. Aqu se puede utilizar todo tipo de declaraciones o sentencias. ALCANCE DE LAS VARIA!LES Es el mbito de aplicacin o el rea o parte del programa en el que se reconoce o dentro de la cual es accesible, es decir, en qu parte del programa de una variable est activa. Un aspecto importante del diseo del programa es determinar el alcance de las variables. El mbito de las variables pueden ser de dos tipos: Variable global Variable local El esqueleto a continuacin explica el alcance de las variables. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg#0 V$&i$b)e% 2)ob$)e% Muchas veces el usuario quiere acceder a la variable en cualquier parte del programa,(desde el main o desde cualquier funcin), entonces es necesario el uso de variables globales. Las variables globales son accesibles en cualquier parte del programa, es decir, su mbito es todo el programa, se crean cuando se inicia un programa de ejecucin y se destruyen cuando un programa completa su ejecucin. Se declaran por encima de la funcin main (). Cualquier cambio que se hizo con el valor de la variable global se refleja en todas las funciones cuando se utiliza con independencia, en funcin de que el cambio tiene lugar. Ejecute el siguiente programa para ver su aplicacin #include<stdio.h> int gvar; main() { gvar = 5; printf("\ngvar = %d,gvar); inc(); inc(); dec(); dec(); } inc() { gvar++; printf("\n on incrementing gvar = %d\n,gvar); } dec() { gvar--; printf("\n on decrementing gvar = %d \n, gvar);} Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg#. En el programa anterior, 'gvar' variable global se declara por encima de main (). Dos funciones inc () y dec () se definen en el programa. Ya que, "gvar 'es una variable global que puede ser accesible en todas las tres funciones main (), inc () y dec (). A&20'ento% o ($&L'et&o% Las funciones pueden comunicarse unas con otras, lo que significa que la funcin de llamada puede pasar la informacin a la funcin llamada. La informacin se pasa a la funcin a travs de argumentos o parmetros. Una funcin llamante puede enviar un paquete de valores para la funcin de llamada para operar o para controlar la forma en operacin. Cuando la funcin llamante , enva la informacin se llama como el argumento o el paso de parmetros. Note que la segunda lnea define el uso de la funcin . Veamos el siguiente cdigo: #include<stdio.h> void display(int); <-------------prototipo de la funcin main() { int num=50; clrscr(); printf("Passing a constant integer"); display(50); printf("\nPassing content of variable"); display(num); printf("\nPassing the value of an expression"); display(num*5-3); } void display(int val) <------ { |--- cuerpo de la funcin printf(" %d", val); | } <-----+ #include<stdio.h> main() { int num; printf("Enter any number: ); scanf("%d,&num); square(num); } square(int n) { int sq; sq = n*n; printf("Square of %d is %d\n, n, sq); } A&20'ento% &e$)e% < 1o&'$)es Los argumentos reales: Cuando una funcin que llama pasa la informacin a la Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg#2 funcin llamada, la informacin que se conoce como argumentos reales o parmetros. Argumento real o parmetros se pasan de la funcin que llama a la funcin llamada. Los argumentos formales: Argumentos formales son los parmetros declarados en los soportes en la definicin de la funcin despus del nombre de la funcin. El tipo de datos de los argumentos formales debe ser igual a la de los argumentos actuales y tambin debe estar en la misma forma que en la declaracin de la funcin. Lo% %i20iente% (0nto% deben %e& con%ide&$do% d0&$nte e) ($%o de $&20'ento%8 El nmero de argumentos reales y formales debe ser el mismo. Tipo de datos de argumentos reales y formales debe ser el mismo. Secuencia de argumentos reales y formales debe ser el mismo. El siguiente programa permite convertir de minsculas a maysculas: # include<stdio.h> void lower_upper(char); main() { char lower; printf("Enter a lower case character: ); scanf("%c,&lower); /*actual argument*/ lower_upper(lower); }
void lower_upper(char c1) { char upper; upper=(c1 >= 'a' && c1 <= 'z' ) ? ('A' + c1 'a') : c1; printf("Upper case character is %c,upper); } PASAR MAS DE UN ARGUMENTO Ms de un valor puede ser pasado a una funcin como argumento, pero el nmero y tipo de argumentos reales debe ser igual al nmero y tipo de argumentos formales y tambin deben estar en la misma secuencia. #include<stdio.h> void largest (int , int); main() { int num1,num2; printf(" two numbers\n"); scanf("%d%d",&num1,&num2); Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg#' largest(num1,num2); } void largest(int n1 ,int n2) { if(n1 > n2) printf("%d is largest\n", n1); else printf("%d is largest\n", n2); } V$)o&e% Reto&n$do% A travs de los valores de los parmetros pasados a la funcin, la funcin puede realizar operaciones en esos valores y puede dar el valor procesado a la funcin que llama mediante sentencia de retorno. Hay comunicacin de dos vas, funcin que es llamada indica los valores a la funcin llamada a travs de argumentos y la funcin llamada a cambio puede retornar un valor a la funcin que la llam. Nota: Siempre hay un valor de retorno nico de la funcin. #include<stdio.h> main() { int num1,num2,prod; printf("Enter two integers\n); scanf("%d%d,&num1,&num2); prod=product(num1,num2); printf("%d * %d = %d\n,num1,num2,prod); } product(int n1,int n2) { return(n1 * n2); } PROTIPO DE LA 5UNCIN Siempre que una funcin es llamada, el compilador dar por hecho que esta funcin devuelve un valor de tipo int. Si queremos una funcin retorne un valor que no sea un entero, entonces es necesario mencionar explcitamente Como se ha mencionado el retorno de la funcin es siempre a travs de instruccin de return. Por default se asume que el retorno es un tipo entero. Sin embargo es buena prctica mencionarlo . En caso de que sea otro tipo distinto a un entero hay que mencionarlo explicitamente . Ejemplo rutina1( int entero1 , char caracter1) ; retorno implicito entero float rutina2 ( int entero2 , char caracter2) : A continuacin un ejemplo retornando un tipo float: Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg## #include<stdio.h> main() { float square(float); /* Function Declaration */ float a,b; printf("Enter any number\n); scanf("%f,&a); b=square(a); printf("Square of %.2f is %.2f \n,a,b); } float square(float x) { float y; y=x*x; return(y); } Otra forma de calcular el factorial usando funciones : #include<stdio.h> long factorial(int n); main() { long int fact; int num; clrscr(); printf("Enter any positive integer:"); scanf("%d",&num); fact = factorial(num); printf("Factorial of %d is %ld",num,fact); } long factorial(int n) { long f=1; while(n > 1) { f=f * n; n--; } return (f); } RECURSVDAD La recursividad es un proceso mediante el cual una funcin se llama repetidamente a si misma , hasta que una condicin especificada se ha cumplido. El proceso se utiliza para el clculo repetitivo en el que se afirma cada accin en trminos de un resultado anterior. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg#* Con el fin de resolver un problema de forma recursiva, dos condiciones deben ser satisfechas. Debe haber algunos criterios, denominados criterios de base, para detener la repeticin. Cada vez que la funcin de llamar a s mismo, debe estar ms cerca de los criterios de base. Veamos el siguiente programa #include<stdio.h> main() { int n,fact; printf("Enter an interger\n); scanf("%d,&n); fact=factorial(n); printf("Factorial of %d is %d\n,n,fact); } factorial( int m) { if(m<=1) return(1); else return(m*factorial(m-1)); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg#6 &ibrerias 1e 9:nciones ; Ya he mencionado que el compilador viene con una amplia gama de funciones estndar que se declaran en los archivos de cabecera, a veces llamados archivos de include. Estos representan una rica fuente de ayuda para usted cuando usted est desarrollando sus propias aplicaciones. Ya hemos usado algunos de ellos, porque los archivos de cabecera son un componente fundamental de la programacin en C. Adicionalmente a las funciones propias del lenguaje es comn encontrar que desarrolladores de software crean sus propias libreras, como por ejemplo Microsoft. A continuacin las libreras standard de C: C$bece&$ 50ncion$)id$d <stdio.h> Entrada y salida <stdarg.h> Macros que soportar funciones con un numero variable de parmetros <math.h> Matemticas y punto flotante <stdlib.h> Funciones de alocacin de memoria <string.h> Funciones de tiras de caracteres (strings) <stdbool.h> Tipos booleanos true/false <complex.h> Soporte de operacin con nmeros complejos <ctype.h> Funciones de clasificacin de caracteres <wctype.h> Funciones de conversin de caracteres Todos los archivos de cabecera de la tabla anterior contienen las declaraciones de una serie de funciones, as como las definiciones de las diversas constantes. Son todas las bibliotecas de la SO / EC estndar, por lo que todos los compiladores que sigan los estndares debern proporcionar al menos el conjunto bsico de funciones, pero por lo general van a proporcionar mucho ms. Por otro lado , ANS C (tambin conocida como SO) define una librera un poco ms extensa que incluye adems de las anteriores a: C$bece&$ 50ncion$)id$d <assert.h> Diagnostica estado de variables <errno.h> Manejo de errores <float.h> mplementacin de lmites de puntos flotantes <limits.h> mplementacin de limites definidos <locale.h> Manejo de variables de localizacin <setjmp.h> Ejecucin de saltos no locales <signal.h> Manejo de seales <stddef.h> Definiciones globales como null , size_t etc. <time.h> Manejo de variable tipo fecha y hora
Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg*4 Objeto% de )$ )ib&e&7$ %tdio Las funciones declaradas en stdio.h pueden clasificarse en dos categoras: funciones de manipulacin de ficheros y funciones de manipulacin de entradas y salidas. Nombre Descripci<n 9:nciones 1e manip:laci<n 1e archi4os fclose Cierra >n arc:iKo a =raKLs de s> p>n=ero. fopen, freopen, fdopen ABre >n arc:iKo para lec=>ra, para escri=>raHreescri=>ra o para adicin. remove Elimina >n arc:iKo. rename CamBia al arc:iKo de nomBre. rewind Coloca el indicador de posicin de arc:iKo para el s=ream ap>n=ado por s=ream al comienAo del arc:iKo. tmpfile Crea ? aBre >n arc:iKo =emporal M>e es Borrado c>ando cerramos con la f>ncin fclose(). 9:nciones 1e manip:laci<n 1e entra1as 3 sali1as. clearerr espeCa los indicadores de final de arc:iKo ? de posicin de arc:iKo para el s=ream ap>n=ado por s=ream al comienAo del arc:iKo. feof Compr>eBa el indicador de final de arc:iKo. ferror Compr>eBa el indicador de errores. fflush Si s=ream ap>n=a a >n stream de salida o de ac=>aliAacin c>?a operacin ms recien=e no era de en=rada, la f>ncin fflush enK<a c>alM>ier da=o aNn sin escriBir al en=orno local o a ser escri=o en el arc:iKoO si no, en=onces el compor=amien=o no es= definido. Si s=ream es >n p>n=ero n>lo, la f>ncin ffl>s: realiAa el despeCe para =odos los streams c>?o compor=amien=o es= descri=o an=eriormen=e. fgetpos eK>elKe la posicin ac=>al del arc:iKo. fgetc eK>elKe >n carc=er de >n arc:iKo. fgets Consig>e >na cadena de carac=eres de >n arc:iKo. fputc EscriBe >n carc=er en >n arc:iKo. fputs EscriBe >na cadena de carac=eres en >n arc:iKo. ftell eK>elKe la posicin ac=>al del arc:iKo como nNmero de B?=es. fseek Si=Na el p>n=ero de >n arc:iKo en >na posicin alea=oria. fsetpos CamBia la posicin ac=>al de >n arc:iKo. fread lee diferen=es =amaPos de da=os de >n arc:iKo. fwrite EnK<a, desde el arra? ap>n=ado por p>n=ero, :as=a nmemb de elemen=os c>?o =amaPo es especificado por =amaPo. El indicador de posicin de arc:iKos es aKanAado por el nNmero de carac=eres escri=os correc=amen=e. Si eQis=e >n error, el Kalor res>l=an=e del indicador de posicin de arc:iKos es inde=erminado. getc eK>elKe >n carc=er desde >n arc:iKo. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg*1 getchar Ig>al M>e getc. gets "ee carac=eres de en=rada :as=a M>e enc>en=ra >n sal=o de l<nea, ? los almacena en >n Nnico arg>men=o. printf, fprintf, sprintf snprintf !sados para imprimir salidas de da=os. vprintf TamBiLn >=iliAado para imprimir salidas. perror EscriBe >n mensaCe de error a s=derr. putc eK>elKe >n carc=er de >n arc:iKo. putchar, fputchar Ig>al M>e p>=c7s=do>=8. scanf, fscanf, sscanf !=iliAado para in=rod>cir en=radas. vfscanf, vscanf, vsscanf TamBiLn >=iliAado para in=rod>cir en=radas. setbuf Es=a f>ncin es eM>iKalen=e a la f>ncin se=KB>f pasando los Kalores RIO1B1 para modo ? B!1SIE para =amaPo, o 7si ac>m>lador es >n p>n=ero n>lo8, con el Kalor RIONB1 para modo. setvbuf Slo p>ede ser >sada desp>Ls de M>e el s=ream ap>n=ado por s=ream :a sido asociado con >n arc:iKo aBier=o ? an=es de o=ra operacin c>alM>iera es lleKada acaBo al s=ream. El arg>men=o modo de=ermina cmo s=ream ser almacenado segNn lo sig>ien=e: RIO1B1 ocasiona la en=radaHsalida a ser comple=amen=e almacenadoO RIO"B1 ocasiona la en=radaHsalida a almacenar por l<neasO RIONB1 ocasiona la en=radaHsalida a no ser almacenado. Si ac>m>lador no es >n p>n=ero n>lo, el arra? al M>e es ap>n=ado p>ede ser >sado en KeA de la ac>m>lacin adC>dicada por la f>ncin se=KB>f. El arg>men=o =amaPo especifica el =amaPo del arra?. tmpnam &enera >na cadena de carac=eres M>e es >n nomBre Klido para arc:iKos ? M>e no es ig>al al nomBre de >n arc:iKo eQis=en=e. "a f>ncin =mpnam genera >na cadena diferen=e cada KeA M>e es llamada, :as=a >n mQimo de TMPRMA3 Keces. Si la f>ncin es llamada ms Keces M>e TMPRMA3, en=onces el compor=amien=o de la f>ncin es= definido segNn la implemen=acin del compilador. ungetc puts Imprime >na de cadena de carac=eres. Constantes miembro "as cons=an=es definidas en la caBecera stdio.h son: Nombre Descripci<n EOF En=ero nega=iKo 7int8 >sado para indicar Sfin 1e ficheroS. BUFSI En=ero M>e indica el =amaPo del B>ffer >=iliAado por la f>ncin setbuf!". Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg*/ FI#E$%&E'& %( TamaPo mQimo de la cadena de carac=eres M>e con=ienen el nomBre de >n fic:ero para ser aBier=o FO)E$'&%( NNmero mQimo de fic:eros M>e p>eden es=ar aBier=os sim>l=neamen=e. 'IOFBF ABreKia=>ra de input/output fully buffered 7B>ffer en=radaHsalida =o=almen=e lleno8O es >n en=ero M>e se p>ede pasar como parme=ro de la f>ncin setvbuf!" para reM>erir bloqueo del buffer en la en=rada ? salida del s=ream aBier=o. 'IO#BF ABreKia=>ra de input/output line buffered 7...TT8O es >n en=ero M>e se p>ede pasar como parame=ro a la f>ncin setvbuf!" para reM>erir line buffered (??) en la en=rada ? salida del s=ream aBier=o. 'IO$BF ABreKia=>ra de Sinp>=Ho>=p>= no= B>fferedS 7en=radaHsalida sin B>ffer8O es >n en=ero M>e se p>ede pasar como parame=ro a la f>ncin setvbuf!" para reM>erir M>e la en=rada salida del s=ream aBier=o f>ncione sin B>ffer. #'tmpnam TamaPo de la cadena de carac=res con la longi=>d s>ficien=e para almacenar >n nomBre de fic:ero =emporal generado por la f>ncin tmpnam!". $U## Macro M>e represen=a la cons=an=e p>n=ero n>loO represen=a >n Kalor de p>n=ero M>e no ap>n=a a ning>na direccin Klida de oBCe=o alg>no en memoria. SEE*'+U, En=ero M>e se p>ede pasar como parme=ro a la f>ncin fseek!" para indicar posicionamien=o rela=iKo a la posicin ac=>al del fic:ero. SEE*'E$- En=ero M>e se p>ede pasar como parme=ro a la f>ncin fseek!" para indicar posicionamien=o rela=iKo al final del fic:ero. SEE*'SE. En=ero M>e se p>ede pasar como parme=ro a la f>ncin fseek!" para indicar posicionamien=o rela=iKo al inicio del fic:ero. .&)'&%( El nNmero mQimo de nomBres de fic:eros Nnicos generaBles por la f>ncin tmpnam!". Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg*0 Objeto% de )$ )ib&e&7$% '$t; Nombre Descripci<n acos arcocoseno asin arcoseno atan arco=angen=e atan/ arco=angen=e de dos parme=ros ceil menor en=ero no menor M>e el parme=ro cos coseno cosh coseno :iperBlico e0p!double 0" f>ncin eQponencial, comp>=a e x abs Kalor aBsol>=o floor ma?or en=ero no ma?or M>e el parme=ro fmod resid>o de la diKision de flo=an=es fre0p fracciona ? eleKa al c>adrado. lde0p =amaPo del eQponen=e de >n Kalor en p>n=o flo=an=e log logari=mo na=>ral log12 logari=mo en Base 14 modf oB=iene >n Kalor en p>n=o flo=an=e <n=egro ? en par=es pow!0,3" eleKa >n Kalor dado a >n eQponen=e, x y sin seno sinh seno :iperBlico s4rt ra<A c>adrada tan =angen=e tanh =angen=e :iperBlica Algunos ejemplos: #include <stdio.h> #include <math.h> main() { float result; float x = 0.5; result = cos(x); printf("The cosine of %f is %f \n, x, result); } #include <stdio.h> #include <math.h> main() { float result; float x = 4.0; result = exp(x); printf("'e' raised to the power of %f (e ^ %f ) = %f\n, x, x, result); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg*. #include <stdio.h> #include <math.h> main() { float x = 2.0, y = 3.0; printf("%f raised to %f is %f \n, x, y, pow(x, y)); } #include <stdio.h> #include <math.h> main() { float result, x; x = 0.5; result = tan(x); printf("The tan of %f is %f \n, x, result); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg*2 Objeto% de )$ Lib&e&7$ %td)ib8; "as f>nciones M>e per=enencen a stdlib.h p>eden clasificarse en las sig>ien=es ca=egor<as: conKersin, memoria, con=rol de procesos, ordenacin ? BNsM>eda, ma=em=icas. Nombre Descripci<n Con4ersi<n 1e tipos atof 7ascii to float8 cadena de carac=eres a coma flo=an=e atoi 7ascii to integer8 cadena de carac=eres a en=ero atol !+ Standard #ibrar3"55 7ascii to long8 cadena de carac=eres a en=ero =amaPo largo strtod 7string to double8 cadena de carac=eres a coma flo=an=e =amaPo doBle strtol 7string to long8 cadena de carac=eres a en=ero largo strtoul 7string to unsigned long8 cadena de carac=eres a en=ero largo sin signo 7posi=iKo8 /eneraci<n 1e n=meros pse:1o>aleatorios rand &enera >n nNmero pse>doFalea=orio srand Es=aBlece la semilla para el generador de nNmeros pse>doFalea=orios /esti<n 1e memoria 1in?mica malloc, calloc, realloc $eserKan memoria dinmica del :eap 7montn o montculo8 free "iBeran memoria deKolKiLndola al heap Control 1e procesos abort =erminar eCec>cin anormalmen=e ate0it regis=rar >na f>ncin callBacJ para la salida del programa e0it !operating s3stem" =erminar eCec>cin del programa getenv rec>perar >na KariaBle de en=orno s3stem !+ Standard #ibrar3" eCec>=ar >n comando eQ=erno $r1enaci<n 3 b=s@:e1a bsearch BNsM>eda Binaria en >n arra? 4sort !+ Standard #ibrar3" ordena >n Kec=or 7inform=ica8 >sando ;>icJsor= %atem?ticas abs, labs Kalor aBsol>=o div, ldiv diKisin en=era o e>clidiana Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg*' Objeto% de )$ Lib&e&7$ St&in28; Esta librera contiene varias funciones para trabajar con tiras de caracteres. Las funciones mas importantes son: Varios ejemplos se presentan en la seccin de strings Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg*# strcpy( s, const ct); Copia un string a otro strncpy( s, const ct, int n); Copia un string a otro pero desde cierta posicin strcat( s, const ct); Concatena dos strings strncat( s, const ct, int n); Concatena dos strings pero desde cierta posicion strcmp(const cs, const ct); Compara dos strings strncmp(const cs, const ct, int n); Compara dos Strings perop desde cierta posicin strchr(const cs, int c); REtorna un pointer a la primera ocurencia de c strrchr(const cs, int c); Retorna un pointer a la ultima ocurrencia de c strspn(const cs, const ct); Retorna la longitud del prefijo de ct en cs strcspn(const cs, const ct); Retorna la longitud del prejijo de cs no contenido en ct strpbrk(const cs, const ct); Retorna la primera ocurencia de cualquiert caracter en ct en cs o nulo si no lo encuentra strstr(const cs, const ct); Retorna el primera ocurencia de ct en cs strlen(const cs); Calcula la longitud de un string MMS SO!RE VARIA!LES V$&i$b)e Loc$)e% Cuando las variables se declaran dentro de una funcin en particular vienen a ser una clase de almacenamiento automtico. Tambin se le llama clase predeterminada de almacenamiento, es decir, cuando se declara una variable dentro de cualquier funcin sin ningn tipo de especificacin de la clase de almacenamiento por defecto asume como variable automtica. Sus caractersticas son: Alcance: Tener mbito local, es decir, el alcance se limita a la funcin en la que se declaran. Visibilidad : Solo en la funcin en la que se declaran. Tiempo de Vida : gual a la vida de la funcin, las variables se crean automticamente cuando el control pasa a la funcin en que estas variables se declaran y variables automticas son destruidas tan pronto como la ejecucin de esa funcin se ha completado. Valor inicial : No esta definido , puede ser basura #include<stdio.h> main() { int i,val; for(i=1;i<=10;i++) { val=funct(i); printf("%5d%5d\n,i,val); } } funct(int x) { int sum=100; sum+=x; return(sum); } En el programa anterior la variable sum es creada cada vez que la funcin funct es llamada. V$&i$b)e de Re2i%t&o La clase de registro de almacenamiento es igual a la anterior , las acciones de todas sus caractersticas con la clase de almacenamiento auto, excepto que en lugar de almacenar las variables en la memoria RAM, que se almacenan en los registros internos de la CPU. Las otras caractersticas son: Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg** Alcance: Tener mbito local, es decir, el alcance se limita a la funcin en la que se declaran. Slo es visible a la funcin en la que se declaran. Vida: La vida de estas variables es igual a la duracin de la funcin en la que se declaran. Almacenamiento: Las variables de registro de obtener almacenamiento en el interior del registro interno del CPU. Valor por defecto : No especificado puede ser basura. Nota referirse al captulo 1 sobre el uso de registros V$&i$b)e% E%tLtic$% El valor de la variable esttica persiste hasta el final del programa. El alcance de la variable esttica puede ser local o global. Depende de si la declaracin esttica se da fuera de todas las funciones (incluida el main()), o dentro de una funcin particular. Las variables internas estticas permanecen vivos hasta el final del programa. Las caractersticas son las siguientes: mbito de aplicacin: Su alcance puede ser local o global. Vida: La vida de las variables estticas es igual al tiempo de vida del programa ( no de la funcin). Las variables estticas conservan su valor durante la ejecucin del programa. Si la misma funcin que se llama varias veces, el valor de la variable esttica se mantiene, esta propiedad es muy til para resolver problemas recurrentes. Almacenamiento: Las variables estticas obtener almacenamiento en el interior de la memoria principal (RAM). Valor inicial por defecto: valor inicial por defecto de las variables estticas es basura. #include<stdio.h> main() { int i; for(i=1;i<=5;i++) {example();} } example() { %t$tic int sum=10; int sum1 =20; sum+=10; sum1+=10; printf("sum=%d\t, sum1=%d,sum,sum1); } Est claro que significa que la variable sum esttica se conserva (es decir, se mantiene activo), aun cuando la funcin ejemplo () termina. En contraste con la prdida automtica de las variables auto y register su valor despus de cada salida de la funcin. Tambin significa que la instruccin de inicializacin al comienzo de la Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg*6 funcin ejemplo () . En otras palabras, las variables estticas se inicializan una sola vez durante el tiempo de compilacin. Tenga en cuenta que las variables locales estticas son similares a las variables automticas, salvo que conservan su valor permanente para toda la duracin de la ejecucin del programa. V$&i$b)e% E.te&n$% Las variables externas son las variables que se declaran fuera de toda funcin, incluida la funcin main (). Generalmente estas variables se declaran antes de main (). Las caractersticas de las variables externas son las siguientes: Alcance: El alcance es global, es decir, son accesibles a travs del programa como variables estticas, pero la principal diferencia entre esttica variables globales y las variables externas es que las variables globales son estticas globales para programa nico en el que se han declarado, mientras que las variables externas son globales a dos o ms se unieron a los archivos de programas, es decir, de varios archivos. Vida: La vida de las variables externas es igual a la duracin del programa. Almacenamiento: Las variables estticas obtener almacenamiento en el interior de la memoria principal (RAM) Valor inicial por defecto: El valor por defecto inicial de las variables externas es cero. #include<stdio.h> int i; /* Declaracin de variable externa */ main() { printf("\n i=%d,i); inc(); inc(); dec(); dec(); } inc() { i=i+1; printf("\n on incrementing i = %d\n,i); } dec() { i=i-1; printf("\n on decrementing i = %d\n,i); } En el programa anterior, la variable externa 'i' se declara por encima de main (). Cualquier modificacin en el valor de lo externo se refleja en todas las funciones con independencia, en funcin de que el cambio tiene lugar. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg64 TIRAS DE CARACTERES "St&in2%# Para representar una tira de caracteres C no posee una clase nativa que pueda usarse , en su lugar stos deben manipularse ya sea usando arreglos de caracteres o funciones de libreras externas que proveen funciones para manipularlas. Por ejemplo , cuando el compilador ve una constante cuyo contenido es "Hola ste almacena la secuencia de caracteres en memoria terminados por un nulo (\0), y los caracteres individuales pueden ser accesados mediante el indice de una matriz. Para definir una matriz usaremos los corchetes de la siguiente forma: char pala$ra@AB ' pala$ra@CB %DED' pala$ra@3B %D7D' pala$ra@4B %DFD' pala$ra@<B %D)D' pala$ra@GB %DHCD' for (int i%C' i<I'i..) printf(J5cK,pala$ra@iB)' El programa anterior imprimir "Hola. Otras formas alternativas de inicializar un arreglo de caracteres son las siguientes: char name1[ ] = {'S','N','E','H','A'}; char name2[ ] = {{'A'},{'P'},{'U'},{'R'},{'V'},{'A'}}; char name3[ ] = "KALYAN; En la primera declaracin, la cadena se asigna a la matriz de caracteres, se incluye el carcter entre comillas simples y estos entre llaves. En la segunda declaracin, la cadena se asigna al conjunto de caracteres, por cada carcter se encierra entre comillas simples y llaves y una llave general. Cada char de la cadena ocupa un byte de memoria. El ltimo carcter es siempre '\ 0'. No es obligatorio escribir '\ 0' en la cadena. El compilador automticamente pone '\ 0' al final de la cadena de caracteres o de cadena. Los caracteres de la cadena se almacenan en posiciones de memoria contiguas. Veamos este ejemplo: #include<stdio.h> main() 8 char name@ B % J)FF7*+7 (R)L7K' int i' -hile (name@iB M% NHCO) 8 printf(J5cK, name@iB)' i..' 9 9 La especificacin de conversin '% s' se puede utilizar para leer y mostrar conjunto de caracteres a la vez. Por ejemplo : Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg61 scanf("%s,array); printf("%s,array); Si la especificacin de conversin %s se utiliza tanto para la lectura y la impresin de strings, el nombre de la matriz se utilizar sin el (&) ampersand. (ver ms adelante punteros). #include<stdio.h> main() 8 char arr3@PB % 8N+O,NO,NRO,NI O,N*O,NQO,NHCO9' char arr4@PB % J+RI*QK' char arr<@PB % 88N+O9,8NO9,8NRO9,8NI O9,8N*O9,8NQO9,8NHCO99' printf(JHn)rra!3 % 5sK,arr3)' printf(JHn)rra!4 % 5sK,arr4)' printf(JHn)rra!< % 5sK,arr<)' 9 include<stdio.h> main() 8 char name@4CB' printf(JIn0rese su nom$re: K)' scanf(J5sK,name)' printf(J+u nom$re es: 5sK, name)' 9 El siguiente programa permite manipular el string con la llamada getche() #include<stdio.h> #include<conio.h> main() 8 char te&t@ICB' int i,ch' clrscr()' printf(JIn0rese un strin0 :K)' ch % 0etche()' i%C' -hile(chM%NHrO) 8 te&t@iB%ch' i..' ch%0etche()' 9 te&t@iB%NHCO' printf(JHn strin0 in0resado es Hn 5sK , te&t )' 9 Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg6/ St&in2% < C$&$cte&e% Como hemos visto C se apoya en los arreglos para crear tiras de caracteres , sin embargo debemos tener en cuenta que las tiras de caracteres deben ser terminadas en un carcter nulo a fin de poder trabajar correctamente. La primera consecuencia de esto se puede observar en el tamao que ocurran un carcter y un string de un carcter: char ch = 'x'; // 1 byte reservado char str[] = "x"; //2 bytes reservados Aunque las variables ch y str representan el mismo carcter el tamao de las dos no es igual . Otra consecuencia es que si no controlamos la terminacin del string podriamos tener el despliegue de basura en la pantalla .Veamos el siguiente programa: #include<stdio.h> #include<conio.h> void main() 8 char str@B%8DmD,DoD,DhD,DaD,DnD9' clrscr()' printf(2Eello 5sHn2,str)' 0etch()' 9 +alida: Eello mohanR S (Tasura) Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg60 50ncione% con St&in2% gets() y puts() gets () se utiliza para leer una cadena incluyendo espacios en blanco incrustados en una matriz de caracteres, y puts() se utiliza para mostrar la cadena completa en la pantalla. #include <stdio.h> main() 8 char strin0@UCB' printf(JIn0rese un strin0:K)' 0ets(strin0)' printf(JFa cadena in0resada es : 5sHnK, strin0)' 9 #include <stdio.h> main() 8 char strin0@B % J#1emplo de asi0nacion de un strin0HnK' puts(strin0)' 9 main() 8 char strin03@3CB' int si=e,i' printf(J#ntre una pala$ra de V chars:HnK)' scanf(J5sK,strin03)' printf(J#l strin0 3 es : 5sK,strin03)' for(si=e%C'strin03@si=eBM%OHCO' si=e..)' printf(JHn#l strin0 al reves es :HnK)' for(i% si=e/3'i>%C'i//) printf(J5cK,strin03@iB)' 9 Funciones Relacionadas a Strings En C hay una serie de funciones estndar de manipulacin de cadenas disponibles que forman parte del archivo de cabecera <strin0.h>. Las siguientes son las funciones ms utilizadas. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg6. %t&c(<"# Copia la cadena desde el origen al destino. Esta funcin copia el contenido de una cadena a otra. Copia de la cadena significa copiar los elementos de una matriz a otra. El formato general de strcpy () es: %t&c(< "c$den$ 1in$)+ %e&ieG10ente#D #include<stdio.h> #include<strin0.h> main() 8 char str3@3CB, str4@3CB' printf(JIn0rese un strin0: HnK)' 0ets(str3)' strcp!(str4,str3)' printf(J+trin0 ori0inal : HnK)' puts(str3)' printf(J+trin0 final : HnK)' puts(str4)' 9 %t&nc(< "# Es similar a strcpy (), excepto que copia un nmero de caracteres de origen a destino. El formato general de strcnpy () es: %t&nc(< "'et$G%ec0enci$+ %e&ieG10ente+ n#D #include<stdio.h> #include<strin0.h> main() 8 char +3@3CB,+4@3CB' printf(J#nter an! strin0: HnK)' 0ets(+3)' strncp!(+4,+3,G)' WX copia G chars del +3 al +4 XW Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg62 strcpy() strcmp() strncpy() strncmp() strlen() strcmpi() strupr() strncmpi() strlwr() strset() strrev() strnset() strcat() strspn() strncat() +4@IB%OHCO' printf(J7ri0inal: 5sHnK,+3)' printf(J,opiada: 5sHnK,+4)' 9 %t&0(& "# Esta funcin se utiliza para convertir cualquier caracter de la cadena a maysculas. Cuando alguna cadena se pasa a esta funcin como un argumento convierte las letras minsculas a maysculas. El formato general de strupr () es: strupr(string) #include<stdio.h> #include<strin0.h> main() 8 char str@3CB' printf(J#nter an! strin0:HnK)' 0ets(str)' printf(J)ntes strupr(): 5sHnK,str)' strupr(str)' printf(JLespues strupr(): 5sHnK,str)' 9 %t&)F& "# Esta funcin se utiliza para convertir cualquier cadena en minsculas. Cuando algn carcter de la cadena que se pasa como argumento es mayscula ser convertido a minsculas. El formato general de strlwr () es: strlwr (cadena); #include<stdio.h> #include<strin0.h> main() 8 char str@3CB' printf(J#nter an! strin0:HnK)' 0ets(str)' printf(J)ntes strl-r(): 5sHnK,str)' strl-r(str)' printf(JLespues strl-r(): 5sHnK,str)' 9 %t&&e"# Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg6' La funcion strrev() reordena los caracteres de la cadena , colocando los mismos en orden inverso .El format de funcin es : strrev(string); #include<stdio.h> #include<strin0.h> main() 8 char str@3CB' printf(J#nter an! strin0:HnK)' 0ets(str)' printf(J)ntes strrev(): 5sHnK,str)' strrev(str)' printf(JLespues strrev(): 5sHnK,str)' 9 %t&c$t "# < %t&nc$t "# Las funciones strcat () y strncat () se utilizan para concatenar dos cadenas diferentes. La diferencia entre strcat () y strncat () es strncat () slo se copia un nmero especificado de caracteres, mientras que strcat () copia la cadena entera. El formato general de strcat () y strncat () es: strcat (string final , string fuente); strncat (string final , string fuente, #include<stdio.h> #include<string.h> main() 8 char +3@4IB,+4@4IB,+<@4IB,+G@4IB' printf(J#nter first strin0: K)' 0ets(+3)' printf(J#nter second strin0: K)' 0ets(+4)' strcp!(+<,+3)' strcat(+<,K J)' strcat(+<,+4)' printf(Jercer strin0 is: 5sHnK,+<)' strcp!(+G,K&&&&&&& K)' strncat(+G,+4,P)' printf(J,uarto strin0 is: 5sHnK,+G)' 9 %t&c'( "# Esta funcin se utiliza para comparar dos cadenas. Cuando dos cadenas se pasan como argumento a esta funcin, se realiza la comparacin de cadenas que Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg6# comienzan con el primer carcter de ambos . La comparacin contina hasta que un carcter diferente, o llega al final de cualquier cadena. La funcin devuelve cero si las dos cadenas son iguales y si no se devuelve la diferencia numrica entre los valores ASC de caracteres no coincidentes. Se comparan los strings con maysculas y minsculas. El formato general de strcmp () es: strcmp (cadena1, cadena2); #include<stdio.h> #include<string.h> main() { char S1[10],S2[10]; int len; printf("Entre string 1:\n); gets(S1); printf("Entre string 2: \n); gets(S2); len=strcmp(S2,S1); if(len>0) printf("String 2 es mayor que string 1\n); if(len<0) printf("String 2 ies menor que string 1\n); if(len= =0) printf("Strings iguales\n); } %t&nc'( "# Se realiza la misma tarea que strcmp (), pero se utiliza para comparar slo los n caracteres de la primera cadena con la segunda . Se comparan los strings con maysculas y minsculas. El formato general de strncmp () es: strncmp (cadena1, cadena2, n); #include<stdio.h> #include<strin0.h> main() 8 char +3@3CB,+4@3CB' int len' printf(J#ntre strin0 3:HnK)' 0ets(+3)' printf(J#ntre strin0 4: HnK)' 0ets(+4)' len%strncmp(+4,+3,<)' Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg6* if(len>C) printf(J+trin0 4 ma!or Yue strin0 3HnK)' if(len<C) printf(J+trin0 4 menor Yue strin0 3HnK)' if(len%%C) printf(J+trin0s i0ualesHnK)' 9 %t&c'(i "# Es similar a strcmp () excepto que se utiliza para comparar cadenas sin maysculas y minsculas, es decir, no toma en cuenta si los caracteres son maysculas o minsculas. El formato general de strcmpi () es: strcmpi (cadena1, cadena2); #include<stdio.h> #include<strin0.h> main() 8 char +3@3CB,+4@3CB' int len' printf(J#nter strin0 3: HnK)' 0ets(+3)' printf(J#nter strin0 4: HnK)' 0ets(+4)' len%strcmpi(+4,+3)' if(len>C) printf(J+trin0 4 ima!or Y strin0 3HnK)' if(len<C) printf(J+trin0 4 menor Y strin0 3HnK)' if(len% %C) printf(J+trin0s % HnK)' 9 %t&nc'(i "# Es similar a strcmpi (), pero se utiliza para comparar los n caracteres iniciales. El formato general de strncmpi () es: strncmpi (cadena1, cadena2, n); %t&%et "# Esta funcin reemplaza todos los caracteres de una cadena con un smbolo determinado por el programador, es decir, los caracteres de la cadenas se sustituyen con los argumentos dados por el programador. El formato de la funcin es: Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg66 strset (cadena, smbolo). #include<stdio.h> #include<strin0.h> main() 8 char strin0@3IB' char s!m$olo' puts(J#ntre strin0: K)' 0ets(strin0)' puts(J#ntre s!m$olo : K)' scanf(J5cK,6s!m$olo)' printf(J)ntes del strset(): 5sHnK,strin0)' strset(strin0,s!m$ol)' printf(JLespues del streset(): 5sHnK,strin0)' 9 %t&n%et "# Esta funcin es la misma que la de strset (). Aqu la longitud especificada es siempre. El formato de esta funcin es: strnset (cadena, smbolo, n), donde, n es el nmero de caracteres que ser reemplazado %t&%(n "# Esta funcin devuelve la posicin de la cadena, desde donde la matriz de origen no se corresponde con la final . Recuerde la que posicin inicial es nmero 0 ,El formato de esta funcin es: strspn (cadena1, cadena2); #include<stdio.h> #include<strin0.h> main() 8 char str3@3CB,str4@3CB' int len0th' printf(J#ntre strin0 3: K)' 0ets(str3)' printf(J#ntre strin0 4: K)' 0ets(str4)' len0th%strspn(str3,str4)' printf(JLiferentes desde la 5d posicion .HnK ,len0th)' 9 Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg144 Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg141 APUNTADORES Cuando las variables se declaran al inicio del programa ciertas ubicaciones de memoria se reservan para su uso , la cantidad de memoria depende del tipo de dato como hemos visto en el captulo 10. Cada localidad de memoria tiene una direccin numrica, el programador se refiere a posiciones de memoria por su nombre, pero el compilador traduce estos nombres en las direcciones, es decir, el programador se refiere a la ubicacin de la memoria por su nombre mientras que el compilador con la direccin de memoria. Este proceso es automtico, por lo que el programador no tiene que preocuparse de eso. En muchas situaciones el usuario desea hacer referencia a estas direcciones directamente, con el fin de manipular el contenido de las posiciones de memoria correspondientes.
La pregunta que uno se hace es porque necesitamos saber la direccin de una variable ? Una de las razones es que las direcciones de memoria son globales para todas las funciones, mientras que la variable local slo se puede acceder a las funciones en las que se declaran. Si queremos modificar las variables locales declaradas en una funcin desde otra funcin, entonces podemos pasar la direccin de una variable local a otra funcin, y la segunda funcin puede utilizar esta direccin para modificar el contenido de la primera funcin. Esto es posible porque las direcciones de memoria son fijas, en caso de que la funcin conozca la direccin de cualquier variable local de otra funcin podr modificar el valor de la variable . De ah que la direccin numrica es esencial para la manipulacin. Uno puede pensar que declarar todas las variables como globales en lugar de trabajar con las direcciones de variable local. El problema con la variable global, es que son accesibles a todas las funciones en el programa, si una funcin modifica la variable global todas las funciones que utilizan la variable global se modifican. El acceso a la ubicacin de memoria permite abordar slo las funciones para modificar la variable a la que la direccin de la variable se pasa. DE5INICIN , USOS DEL PUNTERO Un puntero es una variable que almacena una direccin de memoria de otra variable del mismo tipo. Las reglas para nombrar la variable de puntero son los mismos que nombrar las variables generales y se declara de la misma manera como otras variables, pero siempre es precedido por operador '*'. Caractersticas de los punteros Punteros almacena una direccin o espacio de memoria. El tiempo de ejecucin con el puntero es ms rpido porque los datos se accede con la direccin, es decir el acceso directo a posiciones de memoria. La memoria se accede de manera eficiente con los punteros. El puntero se asigna espacio de memoria y tambin libera es decir, asignacin dinmica de memoria. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg14/ Los punteros se utilizan en estructuras de datos. OPERADORES DE PUNTERO Hay dos operadores asociados con los punteros: el asterisco (*) y ampersand (&). Un asterisco (*) tiene dos propsitos. En primer lugar, para declarar la variable puntero. El formato general de la declaracin de puntero es el siguiente: tipo de datos % pointer?varia$le, donde: tipo de datos es el tipo de variable de puntero como integer, float, char, etc Por ejemplo: int * ptr; En la declaracin anterior, "ptr" es una variable puntero del tipo de datos entero que contiene la direccin de otras variables de tipo entero. En segundo lugar, para acceder al valor sealado por la variable puntero. En breve veremos el segundo propsito de asterisco (*). Cuando un operador de direccin ampersand (&) se usa delante de la variable devolver la direccin de memoria de esa variable. Por ejemplo: int a, * ptr; ptr = &a; * ptr = 50; En las tres declaraciones, la primera declaracin se declaran dos variables de tipo entero, variable 'a' y la variable de puntero ptr. Ninguna de las dos variables tiene un valor asignado ya que solo las hemos definido. En la segunda instruccin, la direccin de la variable 'a' (con '&') se asigna a la variable puntero 'ptr'. Tenga en cuenta que el '*' de la segunda declaracin no se utiliza antes de "ptr". En la tercera declaracin, valor 50 se asigna a la posicin de memoria apuntada por ptr es decir, 'a'. Tenga en cuenta que '*' se utiliza antes de "ptr". La siguiente grfica explica la secuencia de datos: Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg140 Veamos en el siguiente programa: #include <stdio.h> main() { int a,*ptr; ptr = &a; *ptr = 50; printf("Address of a = %u\n,ptr); printf("Value of a = %d\n,a); printf("Value of a = %d\n,*ptr); printf("Value of a=%d\n,*(&a)); } En el programa anterior tome en cuenta, que la impresin del valor de * y (& a) es lo mismo que imprimir el valor de 'a'. El u% se usa con printf () para imprimir la direccin de una variable. La direccin de cualquier variable es un nmero entero. Dec)$&$ci3n de P0nte&o% int *iptr; float *fptr; char *cptr; En la primera sentencia "iptr 'es una variable de puntero de enteros y contendr la direccin de otra variable de tipo entero. De la misma manera "fptr 'es una variable puntero del float, que almacena la direccin de cualquier variable de tipo float, y "cptr' es una variable de puntero de caracteres que almacena la direccin de cualquier variable de caracteres. Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg14. El operador de indireccin (*) tambin se llama el operador de de-referencia. Cuando el puntero se de- referencia, se accede al valor en esa direccin almacenada por el puntero . Normalmente cuando referenciamos una variable accedemos a su valor , cuando lo hacemos a un puntero accedemos al direccin de la variable a la que est apuntando , no a su valor propio que es una direccin . El operador de indireccin (*) se utiliza tanto en la declaracin y en la de- referencia.: int a,*ptr; *ptr = 50; Cuando un puntero se declara, el astersco (*) indica que es un puntero, no una variable normal. Cuando el puntero se de-referencia, el operador de indireccin indica que el valor en esa localidad de memoria almacenada en el puntero se va a acceder y no la propia direccin. #include<stdio.h> main() { int num=50,*ptr; ptr=# printf("Direccion de num = %u\n,&num); printf("Direccion de num = %u\n,ptr); printf("Valor de num = %d\n,*ptr); printf("Direccion del apuntador = %u\n,&ptr); } En el programa anterior, dos variables de tipo enteros se declaran, en primer lugar es "num" y la segunda es la variable puntero 'ptr'. Supongamos que las direcciones de "num" y "ptr" son 400 y 600. La direccin de "num" se asigna a "ptr". En la primera instruccin printf (), la direccin de la variable "num" se muestra, es decir 400, ya que, tenemos el & antes de "num". En la segunda sentencia printf (), el contenido de ptr es decir, 400 se muestra en la pantalla, ('*') no se utiliza antes de "ptr". En la tercera declaracin printf (), el valor de la direccin de memoria apuntada por 'ptr' se muestra es decir, 50, ('*') se utiliza antes de "ptr". En la ltima sentencia printf (), la direccin de "ptr" se muestra, es decir 600. Analice el siguiente programa main() { int num1=30,*ptr,num2; ptr=&num1; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg142 num2=*ptr; *ptr=40; printf("num1 = %d, *ptr = %d, num2 = %d\n,num1,*ptr,num2); } PUNTEROS , 5UNCIONES Cuando la funcin que llama desea pasar la informacin a la funcin llamada, esto es posible a travs de parmetros o el paso de argumentos. Hay dos formas de paso de argumentos a la funcin. La llamada por valor es decir, valor que pasa de los parmetros o argumentos Llamada por referencia que pasa los apuntadores a los argumentos L$ ))$'$d$ (o& $)o&: En llamada por valor, la funcin llamante enva el contenido de la variable a la funcin llamada. En otras palabras, el valor de los argumentos actuales se copian en los argumentos formales correspondientes cada vez que una funcin se llama. Modificacin de estos valores (argumentos formales) en la funcin no tiene ningn efecto sobre el valor de los argumentos actuales en la funcin llamante. El siguiente ejemplo muestra la llamada por el mtodo de valor. #include<stdio.h> main() { int num1=100,num2=200; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg14' printf("Before swapping \n); printf("num1: %d and num2: %d\n,num1,num2); swap(num1,num2); printf("After swapping\n); printf("num1: %d and num2: %d\n,num1,num2); } swap(int a, int b) { int temp; temp=a; a=b; b=temp; printf("n function swap()\n); printf("num1: %d and num2: %d\n,a,b); } En el programa anterior, el valor del argumento real es decir, 100 y 200 pasan al argumento formal 'a' y 'b'. En swap (), 'a' y 'b' tiene la copia de 'num1' y 'num2'. Cualquier modificacin en la 'a' y 'b' no afectar 'num1' y 'num2'. Si se desea modificar los valores de num1 y num2 , la alternativa sera retornar los valores formales a la rutina principal , sin embargo como solo podemos retornar una variable esto no sera posible en el ejemplo . La alternativa es hacerlo por referencia: L)$'$d$ (o& &e1e&enci$: En la llamada por referencia, las direcciones de actuales se pasan al argumento formal. Cualquier modificacin en los argumentos formales afectan directamente el valor de los argumentos reales. Esto es debido a que el argumento formal contiene la direccin del argumento real, as que cualquier cambio en ese sentido la direccin del valor. El siguiente ejemplo muestra la llamada por el mtodo de referencia. #include<stdio.h> include <stdio.h> void swap ( int * , int *) main() { int num1=100,num2=200; printf("Before swapping\n"); printf("num1: %d and num2: %d\n",num1,num2); swap(&num1,&num2); printf("After swapping\n"); printf("Value of num1: %d\n",num1); printf("Value of num2: %d\n",num2); } void swap(int *a, int *b) { int temp; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg14# temp=*a; *a=*b; *b=temp; printf("n function swap()\n"); printf("num1: %d and num2: %d\n",*a,*b); } En el programa anterior, la direccin de la 'num1' y 'num2' se pasan a los argumentos formales. Tenga en cuenta, ya que la direccin de 'num1' y 'num2' se pasan, los argumentos formales deben ser puntero a enteros, ya que las direcciones se almacena principalmente en las variables de puntero. En la funcin swap () 'a' y 'b' son variables de puntero con la direccin de 'num1' y 'num2' variables de main (). El efecto de cambiar 'a' y 'b' no es ms que intercambio de los punteros de "num1" y "num2". Otro ejemplo : #include<stdio.h> calc_area_per(int r,float *,float *); main() { int radius; float area,per; printf("Enter radius of circle: "); scanf("%d",&radius); calc_area_per(radius,&area,&per); printf("Area = %f\n",area); printf("Perimeter = %f\n",per); } calc_area_per(int r,float *a,float *p) { *a = 3.14 * r * r; *p = 2 * 3.14 * r; } RETORNAR MAS DE UN VALOR USANDO PUNTEROS Podemos sacar ms de un valor en un momento de una funcin mediante una llamada con el mtodo de referencia de los punteros que no es posible con el paso por valor. El mtodo siguiente, se muestra a obtener ms de un retorno de la funcin con puntero: #include<stdio.h> #include <conio.h> int *incdec(int val); main() { Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg14* int value,*ptr; clrscr(); printf("Enter a value:"); scanf("%d",&value); ptr = incdec(value); ptr++; printf("ncremented value: %d\n",*ptr); ptr--; printf("Original value: %d\n",*ptr); ptr--; printf("Decremented value: %d\n",*ptr); } int *incdec(int v) { int *pptr; *pptr=v; pptr++; *pptr = v + 10; pptr--; pptr--; *pptr = v - 10; pptr++; return pptr; } Otros ejemplos de punteros : /*suma con punteros*/ #include<stdio.h> #include<conio.h> void main() { int a,b,c,*pa,*pb,*pc; clrscr(); pa=&a; pb=&b; pc=&c; printf("Enter value of a and b \n"); scanf("%d%d",pa,pb); *pc=*pa+*pb; printf("a=%d\n",*pa); printf("b=%d\n",*pb); printf("c=%d\n",*pc); getch(); } #include<stdio.h> #include<conio.h> void main() { float a,b,*pa,*pb; float a1,a2,a3,a4; clrscr(); pa=&a; pb=&b; a=8.5; b=6.0; printf("Value of a=%f\n",*pa); printf("Value of b=%f\n",*pb); a1=*pa + *pb; a2=*pa - *pb; a3=*pa * *pb; a4=*pa / *pb; printf("a=%f\n",a); printf("b=%f\n",b); printf("Sum=%f\n",a1); printf("Sub=%f\n",a2); printf("Mul=%f\n",a3); Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg146 printf("Div=%f\n",a4); getch(); } #include<stdio.h> #include<conio.h> void main() { void a_s_m_d(float,float,float*,float*,float*,float*); float a,b,sum,sub,div,mul; clrscr(); printf("Enter two float numbers\n"); scanf("%f%f",&a,&b); a_s_m_d(a,b,&sum,&sub,&mul,&div); printf("a=%f\tb=%f\n",a,b); printf("Sum=%f\n",sum); printf("Sub=%f\n",sub); printf("Mul=%f\n",mul); printf("Div=%f\n",div); getch(); } void a_s_m_d(float p,float q, float*sm,float*sb,float*m l,float*di) { *sm=p+q; *sb=p-q; *ml=p*q; *di=p/q; } #include<stdio.h> #include<conio.h> void main() { void input(int*,int); void show(int*,int); int p[5]; clrscr(); input(p,5); show(&p[0],5); getch(); } void input(int*a,int s) { int i; for(i=0;i<s;i++) { printf("\n Enter array element %d:",i+1); scanf("%d",a+i); } } void show(int * a , int s) { int i; printf("Array elements are \n"); for(i=0;i<s;i++) { printf("%d\n",*(a+i)); } } PUNTEROS Y MATRCES Puntero a una matriz es muy simple. Slo tenemos que declarar un puntero a data_type de la matriz. Por ejemplo, si tenemos un arreglo como float matriz [5], podemos declarar un puntero float * puntero y puede asignar la direccin base de la matriz (es decir, la direccin del primer elemento de la matriz) a este puntero ptr al escribir : (t& A $&&D o (t& A N $&&O-PD Despus de esta asignacin de direcciones arr [0] es equivalente a ptr [0] o * (ptr + 0) , como ptr da la direccin del primer elemento de la matriz arr, ptr +1 la direccin de un segundo elemento de la matriz arr y as sucesivamente. En este respecto da lo mismo ptr [i], i [PTR], * (ptr + i) y * (i + ptr). Veamos el siguiente programa : Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg114 #include<stdio.h> #include<conio.h> void main() { void input(int*,int); void show(int*,int); int p[5]; clrscr(); input(p,5); show(&p[0],5); getch(); } void input(int*a,int s) { int i; for(i=0;i<s;i++) { printf("\n Enter array element %d:",i+1); scanf("%d",a+i); } } void show(int * a , int s) { int i; printf("Array elements are \n"); for(i=0;i<s;i++) { printf("%d\n",*(a+i)); } } Salida Enter array element 1:10 Enter array element 2:15 Enter array element 3:20 Enter array element 4:25 Enter array element 5:39 Array elements are 10 15 20 25 39 Asignaci<n 1in?mica 1e %emoria Hasta ahora todas la variables que hemos usadas han debido ser inicializadas previamente , y durante dicha inicializacin el compilador reservara un espacio de memoria de acuerdo al tipo que se refiera. Pero , hay veces que los programas no pueden saber cuantas variables vamos a necesitar. Por ejemplo , suponga que usted est haciendo un procesador de palabra tipo word o notepad . Sabra usted la cantidad de espacio que debe tener para el texto que ingresar el usuario?? No es posible. Por lo tanto se debe recurrir a hacer una solicitud al sistema para que nos asigne un espacio de cierto tamaa. Esto lo hace con las llamadas tipo malloc y calloc que pertenecen a stdio. Malloc y Calloc son muy similares , las dos retornan un puntero a una rea de memoria . Pero como hemos visto no es lo mismo un puntero a entero , o a doubles por ejemplo . El puntero que retorna malloc es un puntero indefinido , por lo Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg111 tanto siempre deberemos hacerle un cast al tipo de dato que guardemos . Veamos este ejemplo : #include <stdio.h> #include <stdlib.h> int main() { float *items; int k, n; printf("Entre el numero de items ingresar: "); scanf("%d", &n); ite'% A "1)o$t Q# '$))oc"%iEeo1"1)o$t# Q n#D for(k = 0; k < n; k++) { printf("\nEntre el precio del item No. %d : ", k + 1); scanf("%f", &items[k]); } for(k = 0; k < n; k++) { printf("\ntem %d Precio %5.2f ", k + 1, items[k]); } } En este programa estamos solicitando una cantidad de espacio para alojar n floats. Fijese en el cast del puntero , Otro ejemplo : #include <stdio.h> #include <stdlib.h> char *decimal_to_binary(int); main() { int n, c, k; char *pointer; printf("ngrese un Entero base 10\n"); scanf("%d",&n); pointer = decimal_to_binary(n); printf("Binary string of %d is: %s\n", n, pointer); 1&ee"(ointe&#D return 0; } char *decimal_to_binary(int n) { int c, d, count; char *pointer; count = 0; (ointe& A "c;$&Q#'$))oc"RK+?#D Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg11/
for ( c = 31 ; c >= 0 ; c-- ) { d = n >> c; if ( d & 1 ) *(pointer+count) = 1 + '0'; else *(pointer+count) = 0 + '0'; count++; } *(pointer+count) = '\0'; return pointer; } En este ejemplo hemos creado una funcin que retorna un puntero , el puntero es obtenido como resultado del malloc . La funcin utiliza el puntero para guardas el resultado de la conversion de entero a binario . De regreso en el main elpuntero es utilizado como si fuera un arreglo ( recuerde que los arreglos son en relalidad punteros) Por ltimo debemos usar la funcin free para liberar el espacio . Favor notar que en caso de que exista un error en la funcion malloc esta devolver un puntero nulo . Ejemplo de calloc: #include #include int main(){ long *pPuntero = NULL; // Creamos el Puntero! long numTotal = 0; // Creamos una variable tipo long ! printf("\nCuantos numeros quieres alocar: "); // Pedimos Numero! scanf("%ld", &numTotal); // Leemos numero! if(numTotal <= 0){ // Si numTotal es menor o igual a 0 printf("\n\nEl Numero debe ser mayor a zero!\n"); printf("Terminando el Programa...\n\n"); return 0x1; // Terminamos el Programa! } pPuntero = (long *) calloc (numTotal, sizeof(long)); // Alocamos memoria pedida! if(pPuntero){ // si la memoria se aloco bien Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg110 printf("\n\nMemoria Alocada Correctamente!\n\n"); // imprimimos esto }else{ printf("\nNo Hay Suficiente Memoria!\nTerminando el Programa...\n\n"); // return 0x1; //Terminamos el programa } free(pPuntero); return 0x0; // S todo salio bien, terminamos el programa correctamente! } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg11. C$(it0)o ?R Int&od0cci3n $ E%t&0ct0&$% < Unione% INTRODUCCIN El captulo comienza con la introduccin de los tipos de datos definidos por el usuario ms importantes que tambin se derivan de tipos que ya se han visto ,estos son las estructuras y uniones en C. Como usted ha aprendido, las matrices se pueden utilizar para recoger grupos de variables del mismo tipo. La pregunta ahora es cmo se pueden agregar en la misma estructura tipos de datos que no son iguales. La respuesta es que se puede agrupar variables de diferentes tipos con un tipo de datos llamado estructura. En C, una estructura agrupa diferentes elementos de datos, de tal manera que se puede hacer referencia como una sola unidad. Hay varias diferencias importantes entre una matriz y una estructura. Adems del hecho de que los elementos de datos en una estructura pueden tener diferentes tipos, cada elemento de datos tiene su propio nombre en lugar de un valor de subndice. De hecho, los elementos de datos en una estructura se denominan campos o miembros de la estructura. Una estructura es un tipo de datos derivado que consiste en la recopilacin de datos de tipo diferente, datos como int, char, float e incluso otra estructura tambin. Vemos ejemplo de estructura. Para mantener la informacin acerca de los estudiantes que tienen que almacenar su cdula, nombre, edad, direccin, clase, etc . Del mismo modo para mantener la informacin sobre los empleados se debe almacenar r cdigo de empleado, fecha de ingreso, salario, etc . Esto se ha visto en varios ejemplos anteriores. Todos estos datos no pueden ser almacenados en un arreglo por ser de distinto tipo. An si quisiramos usar arreglos de distintos tipos, se necesitaran varios de arreglos, por ejemplo uno de enteros para la cdula, otros de chars para los nombre, otro de doubles para los salarios etc. etc. Y el manejo de los datos en esta forma sera muy engorroso. Recordando las secciones que tiene un programa C : Comentarios o Documentacin Opcional Comandos de preproceso De1inicione% de ti(o% Funciones prototipo (Declaraciones de tipos de funciones y variables pasadas a la funcin Declaracin de Variables Funciones Las definiciones de tipos permite a C definir nuevos tipos de datos, entre ellos las estructuras y uniones . En esta seccin el programador debe especificar cmo se componen las estructuras para luego usarlas como cualquier tipo de variable. La forma general de declaracin de una estructura es la siguiente: struct struct_tag{ data_type1 variable1; data_type2 variable2; data_type3 variable3; ....................; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg112 ....................; ....................; }; En el cual struct_tag representa el nombre que usted quiere darle a la variable, data_type1,2,3 representa los tipos de datos primitivos que usted ya conoce ,por ejemplo int, char, float , double , etc. Ntese que la estructura est encerrada en llaves y que cada elemento termina en punto coma (;). Por ejemplo , suponga que usted quiere hacer una programa para la Comision de Trnsito de Quito , esta almacena la informacin de los autos que estn registrados, cada auto est definido por una serie de variables como ao del carro , modelo etc. Pensando en forma elemental se podra pensar en definir varias variables ao, modelo etc. , pero si queremos almacenar informacin de miles de carros la cantidad de variables sera inmensa y su manejo muy complicado . Una solucin sera crear un nuevo tipo de variable llamado automvil de la siguiente forma: %t&0ct $0to'oi) S int $nioD c;$& 'ode)O*PD int ci)ind&$d$D 1)o$t (e%oD TD Recuerde que antes de utilizar este tipo de estructura usted debe declararle, esto es antes de main(), usted ya puede utilizar este tipo de estructrura , para esto deber definir las variables de este tipo . Por ejemplo: %t&0ct $0to'obi)e %ed$n+ (icHU0(+ c0$t&o.c0$t&oD Aqu se han definido tres variables , sedan , pick-up y cuatroxcuatro , cada una de las cuales tiene la estructura mencionada anteriormente. Una forma compacta de hacer la definicin y la declaracin es la siguiente : %t&0ct $0to'oi) S int $nioD c;$& 'ode)O*PD int ci)ind&$d$D 1)o$t (e%oD T %ed$n+ (icHU0(+ c0$t&o.c0$t&oD RE5ERENCIAS A LOS ELEMENTOS : OPERADOR PUNTO Una vez que sean definido las variables debemos tener acceso los componentes de de cada una de ellas , para esto usaremos el operador punto (.) en forma similar a como lo hacemos en java. Por ejemplo : %ed$n8$nio A K--7D c0$t&o.c0$t&o8ci)ind&$d$ARV--D Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg11' De esta forma estamos asignando valores a las variables que componen la estructura de datos sedan y cuatroxcuatro. Veamos el siguiente ejemplo relacionado con datos de un computador : #include<stdio.h> #include<conio.h> %t&0ct co'(0te& S 1)o$t co%tD int <e$&D int c(0U%(eedD c;$& c(0Ut<(eO?WPD T 'ode)D main(void) { clrscr(); printf("Que tipo de procesador tiene?\n"); gets(model.cpu_type); printf("Que velocidad (MHz)tiene el CPU?\n"); scanf("%d", &model.c(0U%(eed); printf("Ao de fabricacion?\n"); scanf("%d", &'ode)8<e$&); printf("Cuanto cuesta?\n"); scanf("%f", &'ode)8co%t); printf("Estos son los datos :\n"); printf("Anio: %d\n", model.year); printf("Costo: $%6.2f\n", model.cost); printf("CPU : %s\n", model.cpu_type); printf("CPU velocidad: %d MHz\n", model.cpu_speed); getch(); } Note que el scanf tiene toma como variable el nombre de la estructura.variable. Esto indica que debe ingresar el valor de ese parte nicamente, no de toda la estructura. Veamos otro ejemplo , esta vez con una estructura de nombre de personas y edades: #include<stdio.h> #include<conio.h> %t&0ct (e&%on$ S c;$& n$'eO?-PD int $2eD TD void main() { %t&0ct persona p; clrscr(); printf("Enter name for person \n"); scanf("%s",p.name); Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg11# printf("Enter age for person\n"); scanf("%d",&p.age); printf("Name=%s\n",p.name); printf("Age=%d\n",p.age); getch(); } Es importante mencionar que la declaracin de la estructura no reserva ningn espacio en particular, es solo una especie de plantilla que indica que existe un tipo de dato estructura. En el programa anterior, se define la estructura llamada persona. Luego dentro del main usted indica al compilador que debe crear una variable de este tipo. Esto lo har con la sentencia struct llamada p. De ah en adelante el programa se refiere a la variable p y sus componentes como nombre y edad. Tambin se puede definir una estructura dentro de una funcin en cuyo caso la estructura solo ser vlida en esa funcin. Esto es lo mismo que cualquier variable local o global como ya se ha visto. Por ejemplo: #include<stdio.h> #include<conio.h> struct person { char name[20]; int age; }; t<(ede1 struct person Per; '$in() { Per p; clrscr(); printf("Enter name for person\n"); scanf("%s",p.name); printf("Enter age for person\n"); scanf("%d",&p.age); printf("Name=%s\n",p.name); printf("Age=%d",p.age); getch(); } #include<stdio.h> #include<conio.h> '$in() { struct person { char name[20]; int age; }; t<(ede1 struct person Per; Per p; clrscr(); printf("Enter name for person\n"); scanf("%s",p.name); printf("Enter age for person\n"); scanf("%d",&p.age); printf("Name=%s\n",p.name); printf("Age=%d",p.age); getch(); } En los programas anteriores se puede notar que se ha usado la sentencia typedef , esta sirve para definir la estructura como un tipo de dato nuevo llamado Per . De esta forma se hace referencia a toda la estructura . Esto es equivalente a: typedef struct { char name[20]; int age; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg11* }persona ; INICILIXACIN DE ESTRUCTURAS Eventualmente es necesario inicializar las variables que forman parte de la estructura, de la misma manera que inicializamos todas la variables del programa. La sintaxis para las estructuras es la misma pero estn separadas por comas (,) y dentro de llaves. Veamos el siguiente ejemplo: #include <stdio.h> #include <conio.h> main(void) { struct employee { int id; char name[32]; }; %t&0ct e'()o<ee e'()e$do A S ?+ YPe&icoY TD clrscr(); printf("Employee Name: %s\n", empleado.name); printf("Employee D #: %04d\n\n", empleado.id); printf("\nHere are what you entered:\n"); printf("Name: %s\n", empleado.name); printf("D #: %04d\n", empleado.id); getch(); }
En el ejemplo anterior se ha creado una estructura de datos llamada employee , otra vez , esto crea ninguna variable en particular, es solo una plantilla de lo que sern los employees, a continuacin creamos una variable llamada empleado que es del tipo employee y procedemos a inicializar sus valores de nombre y id. Alternativamente, tambin se puede declarar, definir e inicializar la estructura de un sola vez , a pesar de ser un poco ms confuso el C lo permite. struct employee { int id; char name[32]; } empleado = { 1, "Perico" }; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg116 Un ejemplo completo : #include<stdio.h> #include<conio.h> void main() { struct person { char name[20]; int age; }; struct person p1={"Maria",25}; struct person p2={"Marco",23}; // ..asi cualquier cantidad clrscr(); printf("Person1 Details\n"); printf("Name=%s\tAge=%d\n",p1.name,p1.age); printf("Person2 Details\n"); printf("Name=%s\tAge=%d\n",p2.name,p2.age); getch(); } Al igual que otros tipos de variable, usted puede hacer asignaciones de una variable a otra . Veamos un ejemplo relacionado con celulares: #include<stdio.h> #include<string.h> void main() { typedef struct { char cname[25]; char model[20]; int price; }celular; ce))0)$& '?={"NOKA","6600",12000}; ce)0)$& 'K+'RD 'KA'?D strcpy(m3.cname,"SONY_ERR"); strcpy(m3.model,"K700i"); m3.price=m1.price; printf("Mobile Details\n"); printf("Company Name=%s\tModel=%s",m1.cname,m1.model); printf("\tPrice=%d\n",m1.price); printf("Company Name=%s\tModel=%s",m2.cname,m2.model); printf("\tPrice=%d\n",m2.price); printf("Company Name=%s\tModel=%s",m3.cname,m3.model); printf("\tPrice=%d\n",m3.price); getch(); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1/4 En el ejemplo anterior hemos creado una estructura y le hemos asignado un tipo de dato llamado celular. De este tipo de dato hemos creado tres variables llamada m1,m2 ym3. Procedemos a inicializar la m1 y a asignar la m2 igual a la m1 .Despus vemos como usamos funciones de la librera string.h para copiar las partes que son strings de un celular a otro . A&&e2)o% de e%t&0ct0&$%= Eventualmente usted requiere crear varios elementos del mismo tipo, para esto ha usado siempre los arreglos. Ahora como podemos dar un nombre al tipo de dato entonces podemos crear arreglos de estructuras . El formato es el siguiente : Ejemplo : Suponga que requiere crear una gran cantidad de vehculos :
%t&0ct e;ic0)o S c;$& 'ode)o OK-PD int $nioD c;$& co'b0%tib)eD TD %t&0ct e;ic0)o )i%t$Uc$&&o%OVPD Creamos una estructura llamada vehiculo, est compuesta por el modelo del carro, un entero del ao y el tipo de combustible que usa como gasolina, diesel etc. Luego creamos un arreglo llamado lista _ carros que tiene 5 elementos. Veamos un ejemplo completo con estudiantes: #include<stdio.h> #include<conio.h> void main() { t<(ede1 %t&0ct %t0dent { char sname[20]; int rollno; char cname[20]; }student; %t0dent %$&&OVPD int i; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1/1 clrscr(); for(i=0;i<5;i++) { printf("\n Entre el numero de estudiante %d:",i+1); scanf("%s",sarr[i].sname); printf("\nEntre la materia del %d",i+1); scanf("%s",sarr[i].cname); printf("Entre el costo "); scanf("%d",&sarr[i].rollno); } printf("\n Detalles del Estudiante \n\n"); printf("\SName\tCName\tRollNo\n"); for(i=0;i<5;i++) { printf("%s\t%s\t",sarr[i].sname,sarr[i].cname); printf("%5d\n",sarr[i].rollno); }}
En este ejemplo usamos typedef para definir como un tipo de variable, aunque no es mandatorio , ayuda a que el cdigo sea ms legible. El nuevo tipo de dato se ha llamado student y es el mismo nombre de la estructura. Una vez definido el tipo de dato creo un arreglo de este tipo llamado sarr con 5 elementos. El resto del cdigo es simple.
Veamos otros ejemplos : #include<stdio.h> #include<conio.h> t<(ede1 %t&0ct S int d$<D int 'ont;D int <e$&D Td0&$cionD main() { d0&$cion d?+dK+dRD int d,m,y; clrscr(); printf("Entre la cantida de aos,mes y dias \n"); scanf("%d%d%d",&d1.year,&d1.month,&d1.day); printf("Entre la segunda cantidad de aos meses y das\n"); scanf("%d%d%d",&d2.year,&d2.month,&d2.day); d= (d1.day+d2.day) %30; m=d1.month+d2.month+ (d/30); y=d1.year+d2.year+ (m/12); d3.day=d; d3.month=m; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1// d3.year=y; printf("\Primera duracin\n"); printf("%dyears%d months",d1.year,d1.month); printf("and %d days\n",d1.day); printf("\n Segunda duracion \n"); printf("%d years %d months",d2.year,d2.month); printf("and %d days\n",d2.day); printf("\n Suma de duracines \n"); printf("%d years %d months",d3.year,d3.month); printf("and %d days \n",d3.day); getch(); } En este ejemplo hemos creado una estructura, la estructura como tal no tiene un nombre asignado pero se ha asignado a un tipo de dato llamado duracin. Posteriormente en el mail creamos 3 variables de este tipo d1,d2 y d3 .El resto es simple. Otro ejemplo de cmo usar estructuras en matemticas. Como ustedes saben los numero complejos estn compuestos por una parte real y una imaginaria. Esto lo podemos hacer fcilmente con estructuras. En este caso podramos no ha haber usado estructuras ya que los dos tipo de datos son iguales ( float) , pero al usar estructura podemo agrupar cada nmero complejo en una simple variable. #include<stdio.h> #include<conio.h> t<(ede1 %t&0ct S 1)o$t &e$)D 1)o$t i'$2D Tco'()e.; void main() { co'()e. c?+cK+cR+cZD float a,b; clrscr(); printf("Enter the real part for first complexnumber\n"); scanf("%f",&a); printf("Enter the imag part for first complex number\n"); scanf("%f",&b); c1.real=a; c1.imag=b; printf("Enter the real part for sec complex number \n"); scanf("%f",&a); printf("Enter the imag part for sec complex number \n"); scanf("%f",&b); c2.real=a; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1/0 c2.imag=b; c3.real=c1.real+c2.real; c3.imag=c1.imag+c2.imag; c4.real=c1.real*c2.real - c1.imag*c2.imag; c4.imag=c1.real*c2.imag + c1.imag*c2.real; printf("\t Complex Number 1\n"); printf("\t %5.2f +j%5.2f\n",c1.real,c1.imag); printf("\t Complex Number 2\n"); printf("\t%5.2f +%5.2f\n",c2.real,c2.imag); printf("\tSum of C1 & C2\n"); printf("\t%5.2f + j%5.2f\n",c3.real,c3.imag); printf("\t Mul of C1 & C2\n"); printf("\t%5.2f +j%5.2f\n",c4.real,c4.imag); getch(); } Ahora ya que es un experto en estructuras , veamos como anidarlas. ESTRUCTURAS ANIDADAS Suponga usted que quiere trabajar con datos de personas como nombre, edad, y direccin. Usted podra guardar la direccin como un solo string , pero eso le impide hacer trabajos en los cuales el comportamiento difiere si es de distinta ciudad . Por esto , ha decidido quela direccin a su vez sea un estructura que est compuesta por calle , nmero, ciudad y provincia . Esto es una estructura anidada. El cdigo quedara as: #include<stdio.h> #include<conio.h> struct direccion { char calle[10]; int no; char ciudad[25]; char provicia[30]; }; struct persona { char nombre[25]; int edad; struct direccion addr; }; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1/. Primero deber definir la estructura que no tiene ninguna dependencia y luego las que tienen dependencia. El programa completo quedara as: #include<stdio.h> #include<conio.h> struct direccion { char calle[10]; int num; char ciudad[25]; char prov[30]; }; struct person { char nombre[25]; int edad; %t&0ct di&eccion $dd&D }; void main() { struct person p; clrscr(); printf("Entre nombre y edad \n"); scanf("%s%d",p. nombre,&p.edad); printf("Direccion calle,No,ciudad y prov\n"); scanf("%s%d",p.addr. calle,&p.addr.num); scanf("%s%s",p.addr. ciudad,p.addr. prov); printf("ngresado \n\n"); printf("Name:\t%s\tAge:\t%d\n",p. nombre,p.edad); printf("Address:%s,%d\n",p.addr. calle,p.addr.num); printf("\t%s,%s\n",p.addr. ciudad,p.addr. prov); getch(); } Otros ejemplos de estructuras anidadas comunes: struct date { int day; int month; int year; }; struct employee { char ename[20]; struct department { int code; char name[32]; char position[16]; }; typedef struct department DPT; struct employee { Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1/2 char dept[20]; struct date doj; char qual[15]; }; DPT d; int id; char name[32]; }; En el ejemplo de la derecha se ha usado typedef para definir un tipo de variable llamada DPT. ESTRUCTURAS , 5UNCIONES Como ya hemos visto una funcin permite recibir datos de cualquier tipo definido as como retornar una variable, por lo tanto las estructuras puedes ser pasada y devueltas de una funcin al igual que cualquier variable primitiva. Veamos un ejemplo : #include<stdio.h> #include<conio.h> typedef struct { int ecode; char ename[30]; int esal; }emp; oid %;oF"e'(#D void main() { emp p={1023,"Vijay",25000}; clrscr(); show(p); getch(); } oid %;oF"e'( (# { printf("Details of Employee\n"); printf("Name:\t%s\n",p.ename); printf("Ecode:\t%d\n",p.ecode); printf("Sal:\t %d\n",p.esal); } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1/' En el ejemplo precedente hemos declarado una estructura de que no tiene nombre y la hemos definido como un tipo de variable llamada emp. En este caso emp es para todo propsito igual que un int, float. etc. Por otro lado definimos una funcin llamada show que recibe datos del tipo emp. Fjese en el prototipo de la funcin y la llamada a la funcin show. Otro Ejemplo : #include <stdio.h> #include<conio.h> // Primero creamos la estructura llamada computer %t&0ct co'(0te& S 1)o$t co%tD int <e$&D int c(0U%(eedD c;$& c(0Ut<(eO?WPD TD // definimos un tipo de dato llamado SC typedef struct computer SC; // definimos el prototipo de la funcin SC DataReceive(SC s); main(void) { SC model; clrscr(); model = DataReceive(model); printf("Here are what you entered:\n"); printf("Year: %d\n", model.year); printf("Cost: $%6.2f\n", model.cost); printf("CPU type: %s\n", model.cpu_type); printf("CPU speed: %d MHz\n", model.cpu_speed); getch(); } // cuerpo de la funcin SC DataReceive(SC s) { printf("The type of the CPU inside your computer?\n"); gets(s.cpu_type); printf("The speed(MHz) of the CPU?\n"); scanf("%d", &s.cpu_speed); printf("The year your computer was made?\n"); scanf("%d", &s.year); printf("How much you paid for the computer?\n"); scanf("%f", &s.cost); return s; } Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1/# APUINTADORES A ESTRUCTURAS En los ejemplos anteriores estbamos pasando por valor las estructuras de datos. Primero hemos definido una estructura llamada computer que tiene las variables de costo , ao , velocidad etc. Despus definimos un tipo de dato llamado SC y por ltimo definimos el prototipo de la funcin la cual recibe una variable del tipo SC y retorna una variable igual. Ya dentro del main definimos una variable de tipo SC que se llama model ( la definimos pero no la incializamos) . Llamamos a la funcin entregndole esta variable y a travs de los scanf inicializamos sus componentes. Por ltimo retornamos la misma variable. Debe ser claro para ustedes que el paso de la variable model se hace por valor. Esto hace que sea ineficiente porque debemos disponer de almacenamiento adicional para la variable. Mejor sera trabajar por referencia, esto es, apuntadores. Al igual que los apuntadores a int, char etc. debemos definir apuntadores a variables del tipo que se ha creado . Veamos el ejemplo: #include <stdio.h> #include<conio.h> %t&0ct co'(0te& S 1)o$t co%tD int <e$&D int c(0U%(eedD c;$& c(0Ut<(eOR-PD TD t<(ede1 %t&0ct co'(0te& SCD oid D$t$Receie"SC Q(t&U%#D void main(void) { SC model; DataReceive(&model); printf("Here are what you entered:\n"); printf("Year: %d\n", model.year); printf("Cost: $%d\n", model.cost); printf("CPU type: %s\n", model.cpu_type); printf("CPU speed: %d MHz\n", model.cpu_speed); getch(); } /* function definition */ void DataReceive(SC *ptr_s) { printf("The type of the CPU inside your computer?\n"); Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1/* gets((*ptr_s).cpu_type); printf("The speed(MHz) of the CPU?\n"); scanf("%d", &(*ptr_s).cpu_speed); printf("The year your computer was made?\n"); scanf("%d", &(*ptr_s).year); printf("How much you paid for the computer?\n"); scanf("%d", &(*ptr_s).cost); } La estructura y la definicin del tipo es similar al ejemplo anterior, pero el prototipo de la funcin declara que el argumento es una apuntador a SC llamado ptr_s, ntese el asterisco (*). Al llamar a la funcin colocamos con argumento la direccin de model . Y dentro de la funcin usaremos gets y scanf para leer de teclado los valores. Como solo tengo el apuntador referenciaramos a las variables como *ptr_s.cost . Para que no haya ambigedad en esto usaremos el apuntador entre parntesis , caso contrario podra entenderse como la direccin de cost y no la direccin de model. OPERADOR 5LEC6A GB C incluye un operador "flecha (guin y mayor que) que nos ayudan a referencias directamente un miembro de la estructura siempre que tenga su apuntador. Ejemplo ptr_s -> cpu_type sera equivalente a (*ptr_s).cpu_type &(ptr_s->cpu_speed) sera equivalente a &(*ptr_s).cpu_speed Esto hace mucho ms claro el programa .Veamos un ejemplo: #include<stdio.h> #include<string.h> struct emp { int ecode; char ename[30]; int esal; }; void modify(struct emp*); void main() { struct emp e={1023,"Vijay",25000};
Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg1/6 modify(&e); printf("Details of Employee\n"); printf("Name:\t%s\n",e.ename); printf("Ecode:\t%d\n",e.ecode); printf("Sal:\t%d\n",e.esal); getchar(); } void modify(emp *p) { p->ecode=1025; strcpy(p->ename,"Hari"); (*p).esal=30000; } Este programa define en lneas 4 a la 8 una estructura llamada emp , compuesta por 3 datos , el cdigo del empleado, el nombre y el salario . La lnea 3 contiene la declaracin de la funcin , la cual no devuelve nada y tomo como argumento un apuntador a la variable del tipo emp. La lnea 12 crea una variable llamada e y asigna los valores a cada uno de los miembros de la estructura. En la lnea 14 se llama a la funcin modify con el argumento la direccin de e. La funcin modify cambia los valores , en las lneas 23 y 24 lo hace con el operador flecha y en la lnea 25 a travs del apuntador . Ambos casos son iguales , el operador flecha y el apuntador a una variable de la estructura funcionan de igual forma. UNIONES Una unin es un bloque de memoria que sirve para encerrar distintos tipos de datos. Es similar a una estructura , excepto que los distintos componentes de datos comparten la misma localidad de memoria. Como se mencion anteriormente una estructura como tal no reserva memoria , es solo un plantilla, pero cuando ya se inicializa en una variable cada elemento de la estructura tiene una localidad diferente ( similar a un arreglo) , mientras que, en una unin no es as. Veamos un ejemplo de unin y struct similares: Estructura Union struct estudiante { int reg_no; char sname[15]; char sex; }; union estudiante { int reg_no; char sname[15]; char sex; }; Cuando se compila se reservaran 18 bytes =2+15+1 Cuando se compile reservar solo 15 bytes Debido a esta particularidad , cuando se usa unin solo un miembro puede ser Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg104 accesible en un momento determinado . Declaracin de Union unin automvil{ int anio, char modelo[8]; int motor; float costo; }; De1ini& $&i$b)e% ti(o 0ni3n Despus de declarar la unin , usted podr definir variables de dicho tipo , ( igual que struct) , ejemplo: unin automvil sedan, pickup, cuatroxcuatro; O alternativamente, usted puede declarar la unin y definir las variables, por ejemplo: unin automvil{ int anio, char modelo[8]; int motor; float costo; } sedan, pickup, cuatroxcuatro; Si usted est definiendo la unin y las variables en la misma sentencia y no existe necesidad de definir nuevas variable ms adelante en el programa , usted puede omitir el nombre la unin . Es como que la unin no tiene nombre , pero las variables si . Ejemplo : unin { int anio, char modelo[8]; int motor; float costo; } sedan, pickup, cuatroxcuatro; U%o de) o(e&$do& (0nto "8# < 1)ec;$ "GB# El operador punto se lo puede usar para referenciar los componentes: sedan.anio=2010; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg101 Usted puede definir tambin una variable tipo apuntador a una unin: union automvil *ptr; Y referencias a lo miembros como : ptr->anio=2008; Ejemplo completo: #include <stdio.h> #include <string.h> #include<conio.h> void main(void) { union menu { char name[23]; double price; } dish; clrscr(); printf("El contenido de la union : \n"); strcpy(dish.name, "Pollo asado "); printf("Dish Name: %s\n", dish.name);
dish.price = 75.95; printf("Dish Price: %5.2f\n", dish.price); getch(); } En el ejemplo anterior se ha creado una union llamada men , con la cual se crea una variable llamada dish . La union tiene dos variable , name y price . Se usa una funcin strcpy para inicializar el nombre , y la salida se realiza mediante una referencia a las variable name y price. Otro ejemplo : #include<stdio.h> #include<conio.h> union person { int id; char sex; }; void main() { union person p; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg10/ clrscr(); p.id=15; printf("d is %d\n",p.id); p.sex='M'; printf("Sex is %c \n",p.sex); (&int1"YSiEe o1 0nion i% [d\nY+%iEeo1"0nion (e&%on##D getch(); } En el anterior ejemplo , la union comprende 2 variables un entero y un char , la primeras lneas crean la union y dentro del main se procede a unicializar la variable p del tipo person. Hasta ah no hay nada nuevo. Fjese que luego de inicializar las variables id y sex se ejecuta un printf para obtener el tamao de la estructura . Si usted ejecuta el programa la salida del sizeof indicar 2 , porque el espacio asignado es el mismo , como el id usa 2 bytes , en el mismo espacio cabe el char de sex. Ntese que el programa usa el espacio primero para el id y luego ejecuta el printf. Lo mismo para sex. Pero que pasa si inicializamos las dos variable primero y luego las desplegamos?? Vea el siguiente programa: #include<stdio.h> #include<conio.h> union person { int id; char sex; }; void main() { union person p; clrscr(); p.id=12; p.sex='M'; (&int1"YID i% [d\nY+(8id#D (&int1"YSE/ i% [c\nY+(8%e.#D getch(); } El primer printf desplegara 77 y el segundo la letra M , esto porque 77 es el ASC de la M. Solo una variable podr ser usada a las vez. Esto tiene una consecuencia , vemos el siguiente ejemplo : typedef union { char code; int quan; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg100 } item; item i1= { 'L',20}; La construccin anterior es correcta, pero debido a lo anterior no es til. Unione% < A&&e2)o%: Al igual que con estructuras usted puede crear un arreglo de uniones. Veamos el ejemplo siguiente: #include<stdio.h> #include<conio.h> 0nion intc;$& S int noD c;$& c;D TD void main() { 0nion intc;$& $&&OVPD int i; clrscr(); printf("Size of arr is %d\n",sizeof(arr)); for(i=0;i<=4;i++) arr[i].no=i; printf("Numbers are\n"); for(i=0;i<=4;i++) printf("arr[%d].no=%d\n",i,arr[i].no); for(i=0;i<=4;i++) arr[i].ch='A'+i; printf("Characters are \n"); for(i=0;i<=4;i++) printf("arr[%d].ch=%c\n",i,arr[i].ch); getch(); } En el ejemplo anterior , creamos una union llamada intchar y creamos un arreglo de intchars llamado arr con 5 elementos . Luego procedemos inicializar la variable no con nmeros del 1 al 5 , desplegamos lo recin ingresado y luego hacemos lo mismo con la variable ch. En consecuencia , no tiene sentido inicializar todas las variables a la vez , porque el ltimo valor es el que quedara. Por este motivo la incializacin se ve generalmente as: union u { char ch; int x; Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg10. } a_union = {'H'}; La pregunta que se debe hacer es : Para que sirve esto , como es esto mejor que crear una estructura o un espacio tipo malloc.? Union puede servir para dos tipos de aplicaciones : 1.- Referenciar el mismo espacio como tipos distintos: 2.- Crear estructuras ms flexibles. Veamos un ejemplo de la primera: #include <stdio.h> #include<conio.h> union u{ char ch[2]; int num; }; int Unionnitialize(union u val,int i);// function declaration. main(void) { union u val; int x; clrscr(); x = Unionnitialize(val, 1); printf("The two character constants held by the union:\n"); printf("%c\n", x & 0x00FF); printf("%c\n", x >> 8); x=Unionnitialize(val,2); printf("ahora el siguiente miembro %d",x); getch(); } /* function definition */ int Unionnitialize(union u val, int a) { if (a==1) {val.ch[0] = 'H'; val.ch[1] = 'i';}else{ val.num=666;} return val.num; } En este ejemplo del primer uso : -Definimos una union llamada u con 2 miembros, un arreglo de chars y un int. El tamao final es de 2 bytes . -Creamos una funcin para inicializar los valores de los miembros, la funcin pasa como argumento una variable de tipo u llamada val , y devuelve un entero Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg102 -La funcin inicializa el arreglo de chars con las letras "H e "i y retorna el valor que est en el val. -De regreso al main , el valor es recogido como x , Se procede al printf . Fijese que para obtener el segundo char es necesario recorrer la data ocho posiciones a la derecha. -Cuando se repite el proceso con a=2, entonces el rea sirve para tratar el valor del num. Un ejemplo de una estructura ms flexible: #include <stdio.h> #include <string.h> #include <conio.h> struct encuesta { char nombre[20]; char c_d_p; int edad; int horas_ala_semana; union { char cable [16]; char dish [16]; } proveedor; }; void DataEnter(struct encuesta *s); void DataDisplay(struct encuesta *s); void main(void) { struct encuesta tv; DataEnter(&tv); DataDisplay(&tv); getch(); } /* funccion de entrada*/ void DataEnter(struct encuesta *ptr) { char is_yes[3]; printf("Usa cable (Si o No)\n"); gets(is_yes); if ((is_yes[0] =='S') ||(is_yes[0] == 's')) { printf("Entre la compaa de cable:\n"); gets(ptr->proveedor.cable); ptr->c_d_p = 'c'; } else { printf("Usa satelite? (Si o No)\n"); Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg10' gets(is_yes); if ((is_yes[0] == 'S')||(is_yes[0] == 's')) { printf("Entre compaia de satellite \n"); gets(ptr->proveedor.dish); ptr->c_d_p = 'd'; } else { ptr->c_d_p = 'p'; } } if (ptr->c_d_p != 'p'){ printf("Entre su nombre:\n"); gets(ptr->nombre); printf("Su edad:\n"); scanf("%d", &ptr->edad); printf("Cuantas horas ve la TV por semana:\n"); scanf("%d", &ptr->horas_ala_semana);} } /* funcin despiegue */ void DataDisplay(struct encuesta *ptr) { if (ptr->c_d_p=='p') { printf("NO estas en nada\n"); }else{ printf("\Esto es lo entrado:\n"); printf("Nombre: %s\n", ptr->nombre); printf("Edad: %d\n", ptr->edad); printf("Horas que ve : %d\n", ptr->horas_ala_semana); if (ptr->c_d_p == 'c') printf("Su compaia de cable es: %s\n", ptr->proveedor.cable ) ; if (ptr->c_d_p == 'd') printf("Su compaa de satellite es: %s\n", ptr->proveedor.dish); }
} En el ejemplo anterior, tenemos una estructura que refleja una encuesta que se realiza en lnea. La encuesta trata de obtener si usted usa cable o satlite. Con una estructura normal tendramos que usar dos variables una para cada caso . Usando una variable como union usted puede tener una sola variable en la estructura, que puede ser cable o satlite . Programacin Bsica Preparado por : M.Sc Alfonso Prado Pg10#