APUNTES
LENGUAJE C
- Ao 2010 UNIVERSIDAD NACIONAL DE MISIONES - FACULTAD DE INGENIERA
OBER MISIONES ARGENTINA
INDICE
PRLOGO. ................................................................................................................... - 1 CAPITULO 1. INTRODUCCIN. ............................................................................... - 2 Por qu usar C? ............................................................................................................ - 2 CAPITULO 2. LENGUAJE C. ..................................................................................... - 4 2.1. Operaciones bsicas de programacin.................................................................... - 4 2.1.1. Creacin del fichero fuente. ................................................................................ - 4 2.1.2. Creacin del fichero objeto. ................................................................................ - 4 2.1.3. Creacin del fichero ejecutable. .......................................................................... - 4 2.1.3.1. Uso de libreras................................................................................................. - 4 2.1.3.2. Ficheros ejecutables y enlazadores................................................................... - 5 2.2. Manejo de Errores. ................................................................................................. - 5 2.2.1. Errores de sintaxis. .............................................................................................. - 5 2.2.2. Warnings o Avisos. ............................................................................................. - 5 2.2.3. Errores de enlazado. ............................................................................................ - 6 2.2.4. Errores de ejecucin. ........................................................................................... - 6 2.2.5. Errores de diseo. ................................................................................................ - 6 CAPITULO 3. ESTRUCTURA DE UN PROGRAMA. .............................................. - 7 3.1. Directivas del preprocesador. ................................................................................. - 7 3.2. Declaracin de variables globales. ......................................................................... - 8 3.3. Prototipos de funciones. ......................................................................................... - 8 3.4. Declaracin de clases. ............................................................................................ - 8 3.5. Funcin main(). ...................................................................................................... - 8 3.6. Definicin de funciones.......................................................................................... - 8 3.7. Definicin de clases................................................................................................ - 8 CAPITULO 4. DATOS, VARIABLES Y CONSTANTES.......................................... - 9 4.1 Datos........................................................................................................................ - 9 4.2. Variables................................................................................................................. - 9 4.2.1. Identificadores. .................................................................................................. - 10 4.2.2. Declaracin de variables.................................................................................... - 10 4.2.2.1. Declaracin de una variable de tipo entero (integer)...................................... - 11 4.2.2.2. Declaracin de una variable de tipo punto flotante (float). ............................ - 11 4.2.2.3. Declaracin de una variable de tipo punto flotante doble precisin (double).- 11 4.2.2.4. Declaracin de una variable sin tipo (void).................................................... - 11 -1-
4.2.2.5. Declaracin de una variable de tipo enumerado (enum). ............................... - 11 4.2.2.6. Declaracin de una variable de tipo boleana (boolean).................................. - 12 4.2.3. Inicializacin de variables ................................................................................. - 12 4.2.4. Ejercicios sobre Variables ................................................................................. - 12 4.3. Constantes............................................................................................................. - 13 4.3.1. Normas para la notacin.................................................................................... - 13 4.3.1.1. Constantes "int". ............................................................................................. - 13 4.3.1.2. Constantes "long". .......................................................................................... - 14 4.3.1.3. Constantes "long long". .................................................................................. - 15 4.3.1.4. Constantes "unsigned".................................................................................... - 15 4.3.1.5. Constantes "unsigned long"............................................................................ - 15 4.3.1.6. Constantes "unsigned long long".................................................................... - 15 4.3.1.7. Constantes "float". .......................................................................................... - 16 4.3.1.8. Constantes "double". ...................................................................................... - 16 4.3.1.9. Constantes "long double". .............................................................................. - 16 4.3.1.10. Constantes "char". ........................................................................................ - 16 4.3.2. Recomendaciones en el uso de la notacin. ...................................................... - 16 4.3.2.1. Constantes enteras. ......................................................................................... - 16 4.3.2.2. Constantes punto flotante. .............................................................................. - 16 4.3.3 Constantes carcter. Comentario adicional. ....................................................... - 17 4.3.3.1. Cdigo ASCII. ................................................................................................ - 17 4.3.3.2. Carcter nulo. ................................................................................................. - 18 4.3.3.3. Carcter EOF. ................................................................................................. - 18 4.3.4. Ejercicios ........................................................................................................... - 19 CAPITULO 5. OPERADORES. ................................................................................. - 20 5.1. Operadores aritmticos. ........................................................................................ - 20 5.1.1. Operadores aritmticos unitarios. ...................................................................... - 20 5.1.1.1. Operadores '+' y '- ...................................................................................... - 20 5.1.1.2. Operadores '++' y '--'....................................................................................... - 20 5.1.2. Operadores aritmticos binarios. ....................................................................... - 21 5.2. Operadores relacionales........................................................................................ - 22 5.3. Operadores lgicos. .............................................................................................. - 22 5.3.1. Operador && o AND. ....................................................................................... - 22 5.3.2. Operador || u OR............................................................................................... - 23 5.3.3. Operador ! o NOT. ............................................................................................ - 23 5.4. Operadores de asignacin..................................................................................... - 23 5.5. Operador "sizeof". ................................................................................................ - 24 5.6. Operador condicional (?). ..................................................................................... - 24 5.7. Operador coma (,)................................................................................................. - 25 CAPITULO 6. EXPRESIONES.................................................................................. - 26 6.1. Expresiones aritmticas. ....................................................................................... - 26 6.1.1. Reglas de Precedencia. ...................................................................................... - 27 6.2. Expresiones lgicas. ............................................................................................. - 27 6.2.1. Expresiones comparativas. ................................................................................ - 28 6.2.1.1. Aplicacin en datos tipo carcter.................................................................... - 28 6.2.1.2. Aplicacin en datos tipo lgico. ..................................................................... - 28 6.2.1.3. Aplicacin en datos tipo punto flotante.......................................................... - 28 -2-
6.2.2. Expresiones lgicas. .......................................................................................... - 28 6.3. Ejercicios con operadores y expresiones .............................................................. - 29 CAPITULO 7. INSTRUCCIONES............................................................................. - 31 7.1. Bloques. ................................................................................................................ - 31 7.2. Expresiones........................................................................................................... - 32 7.2.1. Llamadas a funcin............................................................................................ - 32 7.2.2. Asignacin......................................................................................................... - 32 7.2.3. Nula. .................................................................................................................. - 32 7.3. Bucles. .................................................................................................................. - 32 7.3.1. Bucle "while"..................................................................................................... - 33 7.3.2. Bucle "do while"................................................................................................ - 33 7.3.3. Bucle "for"......................................................................................................... - 34 7.4. Etiquetas. .............................................................................................................. - 34 7.4.1. Etiquetas de identificacin................................................................................. - 34 7.4.2. Etiquetas "case" y "default"............................................................................... - 34 7.5. Sentencias de Seleccin........................................................................................ - 35 7.5.1. Sentencia "if...else"............................................................................................ - 35 7.5.2. Sentencia "switch"............................................................................................. - 35 7.6. Sentencias de salto................................................................................................ - 36 7.6.1. Sentencia de ruptura "break". ............................................................................ - 36 7.6.2. Sentencia continue". ........................................................................................ - 37 7.6.3. Sentencia de salto "goto"................................................................................... - 37 7.6.4. Sentencia de retorno "return". ........................................................................... - 37 7.6.5. Sobre las sentencias de salto y la programacin estructurada. .......................... - 38 7.7. Comentarios.......................................................................................................... - 38 7.8. Ejercicios con sentencias. ..................................................................................... - 39 CAPITULO 8. FUNCIONES. ..................................................................................... - 40 8.1. Declaracin de funcin. El Prototipo. .................................................................. - 40 8.1.1. Funciones extern y static. .................................................................................. - 41 8.2. Definicin de funcin. .......................................................................................... - 41 8.2.1. Tipo de almacenamiento.................................................................................... - 41 8.2.2. Tipo de valor de retorno. ................................................................................... - 41 8.2.3. Modificadores opcionales.................................................................................. - 41 8.2.4. Nombre de la funcin. ....................................................................................... - 42 8.2.5. Lista de parmetros............................................................................................ - 42 8.2.6. Cuerpo de funcin. ............................................................................................ - 42 8.3. Funcin main(). .................................................................................................... - 42 8.4. mbito de variables. ......................................................................................... - 43 8.4.1. Variables locales................................................................................................ - 43 8.4.2. Variables globales. ............................................................................................ - 43 8.5. Ejercicios. ............................................................................................................. - 44 CAPITULO 9. ARREGLOS. ...................................................................................... - 47 9.1. Cadena de caracteres. ........................................................................................... - 47 9.2. Arreglos. ............................................................................................................... - 48 9.2.1. Inicializacin de un arreglo. .............................................................................. - 49 9.2.2. Operadores utilizados con arreglos.................................................................... - 49 9.3. Algoritmos de ordenacin: mtodo de la burbuja. ............................................... - 50 -3-
9.4. Ejercicios: cadenas de caracteres.......................................................................... - 51 9.5. Ejercicios: arreglos. .............................................................................................. - 51 CAPITULO 10. PUNTEROS...................................................................................... - 54 10.1. Declaracin de punteros ..................................................................................... - 55 10.2. Obtener punteros a variables .............................................................................. - 56 10.3. Diferencia entre punteros y variables ................................................................. - 57 10.4. Correspondencia entre arrays y punteros............................................................ - 58 10.5. Operaciones con punteros................................................................................... - 58 10.5.1. Asignacin....................................................................................................... - 59 10.5.2. Operaciones aritmticas................................................................................... - 59 10.5.3. Comparacin entre punteros............................................................................ - 59 10.6. Punteros genricos.............................................................................................. - 60 10.7. Punteros a estructuras ......................................................................................... - 61 10.8. Ejemplos de uso de punteros .............................................................................. - 61 10.8.1. Ejemplo 1......................................................................................................... - 61 10.8.2. Ejemplo 2......................................................................................................... - 62 10.9. Variables dinmicas............................................................................................ - 63 10.10. Ejercicios .......................................................................................................... - 64 CAPITULO 11. ESTRUCTURAS. ............................................................................. - 66 11.1. Estructuras. ......................................................................................................... - 66 11.2. Funciones en el interior de estructuras ............................................................... - 67 11.3. Inicializacin de estructuras ............................................................................... - 69 11.4. Asignacin de estructuras................................................................................... - 69 11.5. Arrays de estructuras .......................................................................................... - 70 11.6. Estructuras anidadas ........................................................................................... - 71 11.7. Operador "sizeof" con estructuras ...................................................................... - 72 11.8. Campos de bits ................................................................................................... - 73 11.9. Punteros a estructuras ......................................................................................... - 75 11.9.1. Ejemplo Gestion dinmica de Memoria y Lista Enlazada simple................... - 76 11.9.2. Ejemplo Gestin dinmica de Memoria y Lista Enlazada Doble.................... - 77 11.10. Ejercicios .......................................................................................................... - 78 CAPITULO 12. MS OPERADORES. ..................................................................... - 82 12.1. Operadores de Referencia (&) e Indireccin (*) ................................................ - 82 12.2. Operadores . y -> ................................................................................................ - 82 12.3. Operador de preprocesador................................................................................. - 82 12.4. Operadores de manejo de memoria "new" y "delete" ........................................ - 82 12.4.1. Operador new .................................................................................................. - 83 12.4.1.1 Ejemplo Gestion dinmica de Memoria y Lista Enlazada Doble.................. - 83 12.4.2-Operador delete ................................................................................................ - 85 CAPITULO 13. PASAJE DE VALORES A FUNCIONES. ...................................... - 86 13.1. Parmetros por valor y parmetros por referencia.............................................. - 86 13.1.1. Referencias a variables .................................................................................... - 87 13.2. Paso de parmetros por referencia...................................................................... - 87 13.3. Punteros como parmetros de funciones ............................................................ - 89 13.4. Funciones que devuelven referencias ................................................................. - 90 13.5. Arrays como parmetros de funciones ............................................................... - 91 -
-4-
TALLER DE INFORMTICA
Prlogo
PRLOGO.
El objetivo de este apunte es proporcionar de una gua para aprender a programar bajo el Entorno
Grfico del Sistema Operativo Linux en Lenguaje C.
Para ello, luego de varios intentos y pruebas sobre las aplicaciones a utilizar en el mbito del
Software Libre, se opt por la Distribucin de Linux Ubuntu y, como interface de IDE (Integrated
Development Environment), el Anjuta. Este apunte est destinado a los alumnos de los cursos de
Taller de Informtica y Computacin de la Facultad de Ingeniera de Ober.
Como aclararacin se expone que el apunte fue realizado mediante la compilacin / edicin de
materiales extrados fundamentalmente de Internet. En algunos casos con modificaciones parciales
y, en otros, modificaciones totales. Otro aporte utilizado, sobre todo en la organizacin de los
temas, fue obtenido de Libros; finalmente, se utilizaron los ejemplos de guas y apuntes de las
Ctedras de aos anteriores. En conclusin, este apunte es el resultado del trabajo de muchas
personas, organizado de la manera ms apropiada para el dictado de las asignaturas mencionadas
y poder conseguir los objetivos propuestos en las mismas.
Los ejemplos de cdigo de este apunte fueron probados sobre:
gcc versin 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
Ubuntu 6.06 LTS - la versin Dapper Drake - publicada en junio de 2006.
Anjuta 1.2.4a (http://anjuta.org/ )
El libro se divide en partes, la Parte 1 incluye los captulos que se desarrollan en la Materia Taller de
Informtica. La Parte 2 y 3 son los temas que conjuntamente con la Parte 1 deben ser vistos en la
Materia Computacin.
En los Apndices fueron dispuestos materiales que se considera pueden ser importantes como
consulta o complemento.
Imgenes utilizadas a lo largo del texto
-1-
TALLER DE INFORMTICA
CAPITULO 1. Introduccin
CAPITULO 1. INTRODUCCIN.
EL lenguaje C fue creado por Dennis Ritchie en los laboratorios de la Bell Telephone en 1972. El
mismo fue pensado para desarrollar un Sistema Operativo llamado UNIX. Este lenguaje es el
sucesor del lenguaje llamado B (de all el nombre C).
Debido a la flexibilidad y poder de programacin, se extendi rpidamente y empezaron a surgir
distintas versiones. Como consecuencia de esto nace un comit llamado ANSI (American National
Estndar Institute) el cul define lo que se conoce como Standard C o como Estndar ANSI C.
Por qu usar C?
Es un lenguaje comn: como est muy difundido su uso, existe una amplia variedad de
compiladores y accesorios tiles para el programador.
Posee pocas palabras clave: la base sobre la cual est construida la funcionalidad del
lenguaje tiene pocas palabras claves.
Es modular: el cdigo puede y debe ser escrito en mdulos llamado funciones que pueden
ser utilizadas y re-utilizadas por otras aplicaciones o programas.
El lenguaje C++ es una versin mejorada del C, lo que significa que tiene todo lo que tiene
el Estndar C ms agregados para la Programacin Orientada a Objetos.
Que diferencia hay entre C y C++? C++ es sper conjunto de C, es decir que C es un
conjunto de C o C est contenido por C++.
El C++ incorpora nuevas caractersticas sin comprometer ninguna de las bondades del C,
entre las cosas que se agreg son el concepto de clases, herencia, funciones virtuales del
lenguaje Simula67 y sobrecarga de operadores del Algol68 (caractersticas que veremos en
detalle en el curso).
-2-
TALLER DE INFORMTICA
CAPITULO 1. Introduccin
cumpla la norma ANSI. Se puede considerar como una homologacin o etiqueta de calidad de un
compilador.
Hay caractersticas no estndares en C++?
Si, todos los compiladores incluyen, adems del ANSI, ciertas caractersticas no ANSI, por ejemplo
libreras para grficos. Pero mientras no usemos ninguna de esas caractersticas, sabremos que
nuestros programas son transportables, es
decir, que podrn ejecutarse en cualquier ordenador y con cualquier sistema operativo. Por eso el
desarrollo de un programa bajo, por ejemplo Dev C++ de Bloodshed, podra no compilarse bajo
Anjuta.
-3-
TALLER DE INFORMTICA
CAPITULO 2. Lenguaje C
CAPITULO 2. LENGUAJE C.
Para poder crear un programa en lenguaje C debemos realizar una serie de pasos que nos
permitirn pasar de nuestro programa escrito en cdigo fuente a nuestro archivo ejecutable.
El lenguaje C es compilado, esto significa que un programa compilador lee el cdigo fuente
completo escrito por el programador, lo convierte en cdigo objeto tambin conocido como cdigo
binario o cdigo mquina. Una vez compilado, el linker enlazar las libreras dentro de su cdigo
objeto y as obtendr, finalmente el programa ejecutable. Veamos en detalle cada uno de estos
conceptos.
de ordenador.
Estas tareas las realizaremos, como mencionamos con anterioridad, con el IDE Anjuta, pero se
podran realizar en modo de consola, utilizando un compilador por ejemplo g++.
-4-
TALLER DE INFORMTICA
CAPITULO 2. Lenguaje C
Errores de sintaxis.
Warnings o avisos.
Errores de enlazado.
Errores de ejecucin.
Errores de diseo.
-5-
TALLER DE INFORMTICA
CAPITULO 2. Lenguaje C
programador pretende. Las decisiones se basan en las directivas que los creadores del compilador
decidieron durante su creacin.
-6-
TALLER DE INFORMTICA
Todos los programas poseen una funcin main() que indica el punto donde se inicia la
ejecucin. La ejecucin finaliza cuando se encuentra el final de main.
Debe declarar todas las variables antes de usarlas.
Prototipos de funciones.
Declaracin de clases.
Funcin main.
Definicin de funciones.
Definicin de clases.
preprocesador.
Sintaxis:
#include <archivo.h>
La directiva include le indica al compilador que lea y compile el contenido del archivo con extensin
.h que contiene las descripciones de las funciones de librera utilizadas a lo largo del programa.
Por ejemplo:
#include <stdio.h>
-7-
TALLER DE INFORMTICA
Por ejemplo:
Le indica al compilador que cada vez que aparezca NMERO en el programa sea sustituido por 5.3.
-8-
TALLER DE INFORMTICA
Para obtener informacin ms detallada acerca de los tipos de datos, la cantidad de memoria
reservada remitirse al APENDICE Tipos de datos
Cuando se desea definir tems de datos que almacenen palabras (dos o ms caracteres) nos
encontramos ante el tipo de dato string o cadena de caracteres.
Por ejemplo:
`hola
Juan Prez
Este tipo de datos merece un desarrollo especial por ello se ver en el captulo 9 que estudia el
tema de arreglos.
4.2. Variables.
El tem de dato llamado variable, se refiere a un espacio de memoria cuyo contenido se modificar
de acuerdo a las circunstancias durante la ejecucin del programa.
Cada variable utilizada en el programa deber ser declarada antes de ser utilizada.
La declaracin de una variable le indica al lenguaje que se pretende utilizar una variable particular y
qu tipo de dato almacenar. La declaracin se forma por un tipo de dato seguido de uno o ms
nombres de variables.
La inicializacin de una variable significa asignarle al espacio de memoria reservado un valor
particular. Resulta conveniente realizarlo porque cuando se declara una variable, el espacio de
memoria reservado, podr contener cualquier valor.
-9-
TALLER DE INFORMTICA
4.2.1. Identificadores.
Un identificador es el nombre que permite identificar un espacio de memoria mediante un nombre
vlido para el lenguaje.
El lenguaje C es flexible pero posee ciertas reglas que debemos respetar cuando definimos
identificadores para las variables que utilizaremos en el programa.
Reglas para dar nombre a las variables:
[tipo] [lista_de_identificadores];
Tipo debe ser un tipo de datos vlido y lista_de_identificadores puede ser uno o ms identificadores
separados por coma (,). La declaracin de variables puede considerarse como una sentencia.
Desde este punto de vista, la declaracin terminar con un ";".
Por ejemplo:
int numero;
float promedio, final;
char letra;
int a = 1234;
bool seguir = true, encontrado;
char letra = k;
Se declarara las variables "a", "seguir", "encontrado" y letra; y adems se inicia los valores de
"a" en 1234, seguir en "true" y letra con k.
- 10 -
TALLER DE INFORMTICA
tipo enumerado.
Las variables declaradas de este tipo slo podrn tomar valores entre los definidos.
El identificador de tipo es opcional, y nos permitir declarar ms variables del tipo enumerado en
otras partes del programa. La lista de variables tambin es opcional. Sin embargo, al menos uno de
los dos componentes opcionales debe aparecer en la definicin del tipo enumerado.
Varios identificadores pueden tomar el mismo valor, pero cada identificador slo puede usarse en
un tipo enumerado.
Por ejemplo:
enum tipo_horas {una=1, dos, tres, cuatro, cinco, seis, siete, ocho, nueve, diez, once,
doce, trece=1, catorce, quince, dieciseis, diecisiete, dieciocho, diecinueve, veinte,
veintiuna, veintids, veintitrs, veinticuatro =0};
En este caso, una y trece valen 1, dos y catorce valen 2, etc. Y veinticuatro vale 0. Como se ve en
el ejemplo, una vez se asigna un valor a un elemento de la lista, los siguientes toman valores
correlativos. Si no se asigna ningn valor, el primer elemento tomar el valor 0.
- 11 -
TALLER DE INFORMTICA
Por ejemplo:
No
c) unsigned float
S
No
d) double char
S
No
e) signed long
S
No
f) unsigned short
S
No
g) signed long int
S
No
h) long double
S
No
- 12 -
TALLER DE INFORMTICA
No
4.3. Constantes.
Las constantes son muy similares a las variables, con la diferencia que stas solo pueden tomar un
valor en el momento de la declaracin, luego cualquier intento de modificacin ser tomado como
un error por parte del compilador.
Las constantes se declaran del mismo modo que las variables, solamente se debe anteponer la
sentencia const antes del tipo de dato.
Por ejemplo:
float x = 0.0;
if(x <= 1.0f) x += 0.01f;
Si en el ejemplo hubiramos escrito "if(x <= 1)...", el compilador almacenara el 1 como un entero,
y durante la fase de ejecucin se convertir ese entero a float para poder compararlo con x, que es
float. Al poner "1.0" estamos diciendo al compilador que almacene esa constante como un valor en
coma flotante.
Lo mismo se aplica a las constantes long, unsigned y char.
- 13 -
TALLER DE INFORMTICA
maysculas o minsculas. Sus valores son 10 para la 'A', 11 para la 'B', y sucesivamente, hasta 15
para la 'F'.
Segn el ejemplo el nmero 0x7f, donde "0x" es el prefijo que indica que se trata de un nmero en
notacin hexadecimal, sera el nmero 7F, es decir,
7F=7*16+15=127. Del mismo modo que el nmero 127 en notacin decimal sera,
1*10+2*10+7=127.
En octal se usa como prefijo el dgito 0. El nmero 0177 equivale a 0177=1*8+7*8+7=127.
Hay que tener mucho cuidado con las constantes numricas, en C y C++ no es el mismo nmero el
0123 que el 123, aunque pueda parecer otra cosa. El primero es un nmero octal y el segundo
decimal.
La ventaja de la numeracin hexadecimal es que los valores enteros requieren dos dgitos por cada
byte para su representacin. As un byte puede tomar valores hexadecimales entre 0x00 y 0xff, dos
bytes entre 0x0000 y 0xffff, etc. Adems, la conversin a binario es casi directa, cada dgito
hexadecimal se puede sustituir por cuatro bits, el '0x0' por '0000', el '0x1' por '0001', hasta el '0xf',
que equivale a '1111'. En el ejemplo el nmero 127, o 0x7f, sera en binario '01111111'.
Con la numeracin octal es anlogo, salvo que cada dgito agrupa tres bits.
As un byte se puede tomar valores octales entre 0000 y 0377, dos bytes entre 0000000 y
0177777, etc. Adems, la conversin a binario es casi directa, cada dgito octal se puede sustituir
por tres bits, el '0' por '000', el '1' por '001', hasta el '7', que equivale a '111'. En el ejemplo el
nmero 127, o 0177, sera en binario '01111111'.
De este modo, cuando trabajemos con operaciones de bits, nos resultar mucho ms sencillo
escribir valores constantes usando la notacin hexadecimal u octal.
Por ejemplo, resulta ms fcil predecir el resultado de la siguiente operacin:
Que:
long x = 123L;
if(x == 0L) cout << "Valor nulo" << endl;
Puede suceder que el compilador nos seale un error cuando usemos constantes long sin aadir el
sufijo L.
- 14 -
TALLER DE INFORMTICA
Por ejemplo:
Esta sentencia har que el compilador emita un error ya que no puede usar un tamao mayor sin
una indicacin explcita.
Hay casos en los que los tipos "long" e "int" tienen el mismo tamao, en ese caso no se producir
error, pero no podemos predecir que nuestro programa se compilar en un tipo concreto de
compilador o plataforma.
Como cuando se utilizan constantes long, a menudo recibiremos errores del compilador cuando
usemos constantes long long sin aadir el sufijo LL.
Por ejemplo:
Esta sentencia har que el compilador emita un error ya que no puede usar un tamao mayor sin
una indicacin explcita.
- 15 -
TALLER DE INFORMTICA
float x = 0.0;
if(x <= 1.0f) x += 0.01f;
double x = 0.0;
if(x <= 1.0) x += 0.01;
double x = 10e4;
double y = 4.12e2;
double pi = 3.141592e0;
- 16 -
TALLER DE INFORMTICA
x = 10 x 104 = 100000
y = 4,12 x 102 = 412
pi = 3.141592 x 100 = 3.141592
Al igual que con los enteros, es indiferente usar los sufijos en maysculas o minsculas, pero es
preferible usar maysculas, sobre todo con la "L", ya que la 'l' minscula puede confundirse con un
uno '1'.
- 17 -
TALLER DE INFORMTICA
Los tres ltimos son realmente comodines para la representacin de cualquier carcter.
El \nnn sirve para la representacin en notacin octal. Para la notacin octal se usan tres dgitos.
Hay que tener en cuenta que, anlogamente a lo que sucede en la notacin hexadecimal, en octal
se agrupan los bits de tres en tres. Por lo tanto, para representar un carcter ASCII de 8 bits, se
necesitarn tres dgitos. En octal slo son vlidos los smbolos del '0' al '7'.
Segn el ejemplo anterior, para representar el carcter 127 en octal usaremos la cadena '\177', y
en hexadecimal '\x7f'. Tambin pueden asignarse nmeros decimales a variables de tipo char.
Por ejemplo:
char A;
A = 'a';
A = 97;
A = 0x61;
A = '\x61';
A = '\141';
#include <iostream>
using namespace std;
int main()
{char opc0='A'; //Ascii de A expresado como Caracter
char opc1=65 ; //Ascii de A expresado en Decimal
char opc2= 0101; //Ascii de A expresado en Octal
char opc3 = 0x41; //Ascii de A expresado en Hexadecimal
cout << opc0 <<endl;
cout << opc1 <<endl;
cout << opc2 <<endl;
cout << opc3 <<endl;
return 0;
}
La salida de este programa muestra por pantalla 4 veces la A.
- 18 -
TALLER DE INFORMTICA
4.3.4. Ejercicios
1) si debe almacenar el dato, qu tipo de constante debera utilizar en cada caso? Marcar la opcin
correcta.
a) '\x37'
1. char
2. long
3. int
4. float
b) 123UL
1. unsigned
2. int
3. long
4. unsigned long
c) 34.0
1.
2.
3.
4.
int
double
float
long
d) 6L
1.
2.
3.
4.
int
long
double
char
e) 67
1.
2.
3.
4.
char
unsigned
int
float
f) 0x139
1. char
2. unsigned
3. int
4. float
g) 0x134763df23LL
1.
2.
3.
4.
long
unsigned
int
long long
Para la creacin de identificadores en la escritura del cdigo fuente se recomienda ver APENDICE
ESTILOS DE NOTACIN.
- 19 -
TALLER DE INFORMTICA
CAPITULO 5. Operadores
CAPITULO 5. OPERADORES.
Los operadores son elementos que disparan ciertos clculos cuando son aplicados a variables o a
otros objetos en una expresin.
Un operador es un smbolo que le dice al compilador que realice manipulaciones matemticas o
lgicas especficas.
El lenguaje C tiene las siguientes clases de operadores: aritmticos, relacionales, lgicos y sobre
bits.
Hay varios tipos de operadores, clasificados segn el tipo de objetos sobre los que actan.
Los tipos de operadores que veremos son:
Operadores Aritmticos.
Operadores Relacionales.
Operadores Lgicos.
Operadores de Asignacin.
Operador sizeof.
Operador condicional.
Operador coma.
+ <expresin>
- <expresin>
<variable> ++ /* post-incremento */
++ <variable> /* pre-incremento */
<variable>-- /* post-decremento */
-- <variable> /* pre-decremento */
- 20 -
TALLER DE INFORMTICA
CAPITULO 5. Operadores
Existen dos modalidades, dependiendo de que se use el operador en la forma de prefijo o de sufijo.
En su forma de prefijo, el operador es aplicado antes de que se evale el resto de la expresin; en
la forma de sufijo, se aplica despus de que se evale el resto de la expresin.
Por ejemplo:
c = a + b++;
En este segundo ejemplo primero se avala la expresin "a+b", que dar como resultado 110, y se
asignar este valor a c, que valdr 110.
Finalmente se aplica en post-incremento, y b valdr 11.
Los operadores unitarios sufijos (post-incremento y post-decremento) se evalan despus de que
se han evaluado el resto de las expresiones.
En el primer ejemplo primero se evala ++b, despus a+b y finalmente c=<resultado>.
En el segundo ejemplo, primero se evala a+b, despus c = <resultado> y finalmente b++.
Es muy importante no pensar o resolver las expresiones C como ecuaciones matemticas, NO SON
EXPRESIONES MATEMATICAS.
No veas estas expresiones como ecuaciones, NO SON ECUACIONES.
<expresin>
<expresin>
<expresin>
<expresin>
<expresin>
El operador mdulo '%', devuelve el resto de la divisin entera del primer operando entre el
segundo. Por esta razn no puede ser aplicado a operando en coma flotante (ya que al ser
nmeros de punto flotante no hay resto!!).
- 21 -
TALLER DE INFORMTICA
CAPITULO 5. Operadores
En las expresiones, "E1 <operador_relacional> E2, los operandos (E1, E2) tienen algunas
restricciones, pero de momento nos conformaremos con que sean de tipo aritmtico. El resto de las
restricciones las veremos cuando conozcamos los punteros y los objetos.
Es un error frecuente utilizar el = en lugar del ==, observar que el = es para ASIGNAR; y el
== es para COMPROBAR LA IGUALDAD.
- 22 -
TALLER DE INFORMTICA
CAPITULO 5. Operadores
- 23 -
TALLER DE INFORMTICA
CAPITULO 5. Operadores
sizeof <expresin>
sizeof (nombre_de_tipo)
En ambos casos, el resultado es una constante entera que da el tamao en bytes del espacio de
memoria usada por el operando, que es determinado por su tipo.
El espacio reservado por cada tipo depende de la plataforma.
En el primer caso, el tipo del operando es determinado sin evaluar la expresin, y por lo tanto sin
efectos secundarios.
Por ejemplo:
En la expresin E1? E2:E3, primero se evala la expresin E1, si el valor es verdadero ("true"), se
evaluar la expresin E2 y E3 ser ignorada, si es falso ("false"), se evaluar E3 y E2 ser ignorada.
Hay ciertas limitaciones en cuanto al tipo de los argumentos:
E1 debe ser una expresin lgica.
E2 y E3 deben ser de tipo aritmtico.
E2 y E3 deben ser de estructuras o uniones compatibles.
E2 y E3 deben ser de tipo "void".
Por ejemplo:
max = (a >=b) ? a : b;
De este ejemplo slo nos interesa la parte de la derecha. La interpretacin es: si "a" es mayor que
"b", se debe evaluar "a", en caso contrario evaluar "b", en resumen, evala siempre el mximo!!
- 24 -
TALLER DE INFORMTICA
CAPITULO 5. Operadores
En una expresin "de coma", cada operando es evaluado como una expresin, pero los resultados
obtenidos se tienen en cuenta en la prxima evaluacin.
Por ejemplo:
x = (y=3,y+1);
- 25 -
TALLER DE INFORMTICA
CAPITULO 6. Expresiones
CAPITULO 6. EXPRESIONES.
La combinacin de variables, constantes definidas o nmeros con uno o ms operadores dan como
resultado un valor. Esta combinacin recibe el nombre de expresin.
Una expresin es, segn el diccionario, un "conjunto de trminos que representan una cantidad",
entre nosotros es cualquier conjunto de operadores y varios operando, que dan como resultado
una cantidad.
Operando es cada una de las cantidades, constantes, variables o expresiones que intervienen en
una expresin.
Existe una divisin, en los operadores, atendiendo al nmero de operando que afectan. Segn esta
clasificacin pueden ser unitarios, binarios o ternarios, los primeros afectan a un solo operando, los
segundos a dos y los ternarios como era de esperar a tres.
Las variables y constantes se pueden procesar utilizando operaciones y funciones adecuadas a sus
tipos.
Cada expresin toma un valor que se determina tomando los valores de las variables y constantes
implicadas y la ejecucin de las operaciones indicadas.
Las expresiones se pueden clasificar, segn los tipos de objetos que manipulan, en:
El operador / produce un cociente entero si los dos operando son enteros. Esto significa
que se pierde la parte decimal si la divisin no es exacta. Esta es una consecuencia de la
nota 1.
El operador / produce un cociente float si uno o los dos operando son float. Esta es una
consecuencia de la nota 2.
Por ejemplo:
resultado
de
la
TALLER DE INFORMTICA
CAPITULO 6. Expresiones
En cambio:
7.0 / 2 es igual a 3.5 ya que si uno o los dos operando son reales, entonces el resultado
es real. En este caso 7.0 es real.
Las operaciones que estn encerradas entre parntesis se evalan primero. Si aparecen
varios parntesis anidados, se evalan primero los parntesis interiores.
Las operaciones aritmticas dentro de una expresin suelen seguir el siguiente orden de
prioridad:
- 27 -
TALLER DE INFORMTICA
CAPITULO 6. Expresiones
Si A = 4 y B = 3
A > B da como resultado Verdadero
(A 2) < (B 4) da como resultado Falso.
Los operadores de relacin se pueden aplicar a los tipos de datos estndar: entero, punto flotante,
carcter lgico.
- 28 -
TALLER DE INFORMTICA
CAPITULO 6. Expresiones
not 4 > 6 da como resultado ERROR, ya que el operador NOT no se aplica sobre
el 4.
not(4 > 6) da como resultado Verdadero
c) r /=
b;
9
13
30
0;
infinito
1
error
d) y += x + 10;
8
12
18
e) z -=
a*b;
-36
-18
36
10 + x - y;
x += 10-y
x -= y+10
x += 10+y
- 29 -
TALLER DE INFORMTICA
b) r =
100*r;
r *= 100*r
r *= 100
r += 100
c) y =
y/(10+x);
y /= 10*x
y /= 10 + y/x
y /= 10+x
d) z =
3 * x + 6;
z += 6
z *= 3
no es posible
CAPITULO 6. Expresiones
x - y, t = z - y;
z=-10, t=-30
t=10
z=30, t=-30
- 30 -
TALLER DE INFORMTICA
CAPITULO 7. Instrucciones
CAPITULO 7. INSTRUCCIONES
El elemento que nos est faltando para poder comenzar a escribir nuestros propios programas son
las sentencias o instrucciones.
Un programa contiene las acciones o instrucciones que resolvern el problema. Las instrucciones
describen la secuencia de pasos con el que se quiere solucionar el problema planteado.
Existen instrucciones de diversos tipos que nos permitirn enfrentarnos a todas las situaciones
posibles en programacin.
Los tipos de sentencias son:
Bloques
Expresiones
Llamadas a funcin
Asignacin
Nula
Bucles
while
do while
for
Etiquetas
Etiquetas de identificacin
case
default
Seleccin
if...else
switch
Saltos
break
continue
goto
return
7.1. Bloques.
Una sentencia compuesta o un bloque es un conjunto de sentencias, que puede estar vaca,
encerrada entre llaves " {} ".
Sintcticamente, un bloque se considera como una nica sentencia.
Tambin se usa en variables compuestas, como veremos en el captulo de variables II, y en la
definicin de cuerpo de funciones.
Los bloques pueden estar anidados hasta cualquier profundidad.
- 31 -
TALLER DE INFORMTICA
CAPITULO 7. Instrucciones
7.2. Expresiones.
Una expresin seguida de un punto y coma (;), forma una sentencia de expresin.
La forma en que el compilador ejecuta una sentencia de este tipo es evaluando la expresin.
Cualquier efecto derivado de esta evaluacin se completar antes de ejecutar la siguiente
sentencia.
Sintaxis:
<expresin>;
7.2.2. Asignacin.
Una instruccin de asignacin consiste en dar a una variable el valor de una expresin, el valor de
otra variable o el valor de una constante.
La sentencia de asignacin se utiliza para almacenar valores a variables o constantes.
Es una operacin que sita un valor determinado en una posicin de memoria.
Sintaxis:
7.2.3. Nula.
La sentencia nula consiste en un nico ";". Sirve para usarla en los casos en los que el compilador
espera que aparezca una sentencia, pero en realidad no pretendemos hacer nada. Veremos
ejemplos de esto cuando lleguemos a los bucles.
7.3. Bucles.
Un bucle es la estructura de control que permite la repeticin de una serie determinada de
sentencias. Es importante tener en cuenta cuntas veces se repite el bucle y cul es el cuerpo del
bucle.
El cuerpo del bucle lo constituyen la serie de sentencias que pueden ser de cualquier tipo
(secuencial, de decisin o repetitivo) las cuales sern repetidas n veces, pudiendo ser n conocido o
desconocido. Cuando n es desconocido, el nmero de veces que debe repetirse el cuerpo del bucle
estar condicionado por una expresin lgica.
Un bucle no es ms que una serie de instrucciones que se repiten.
- 32 -
TALLER DE INFORMTICA
CAPITULO 7. Instrucciones
A la hora de utilizar un bucle, sea del tipo que sea, debemos ir con cuidado y pensar cuando debe
acabar ya que si no tuviramos en cuenta esto podramos entrar en un bucle sin fin, iramos
repitiendo las mismas lneas teniendo que abortar la aplicacin, para poder finalizar la ejecucin del
programa.
Por esto, es de suma importancia que pensemos, antes de hacer nada, en qu momento, cmo,
dnde y por qu debe acabar el bucle.
Este ejemplo puede escribirse, usando el C con propiedad y elegancia, de un modo ms compacto:
do <sentencia/s> while(<condicin>);
do
x = x + 1;
while (x < 100);
- 33 -
TALLER DE INFORMTICA
CAPITULO 7. Instrucciones
La/s sentencia/s es ejecutada repetidamente hasta que la evaluacin de la condicin resulte falsa.
Antes de la primera iteracin se ejecutar la iniciacin del bucle, que puede ser una expresin o
una declaracin.
En este apartado se iniciarn las variables usadas en el bucle. Estas variables pueden ser
declaradas en este punto, pero en ese caso tendrn validez slo dentro del bucle "for".
Despus de cada iteracin se ejecutar el incremento de las variables del bucle.
Todas las expresiones son opcionales, si no se especifica la condicin se asume que es verdadera.
Por ejemplo:
for(;;);
7.4. Etiquetas.
Los programas C y C++ se ejecutan secuencialmente, aunque esta secuencia puede ser
interrumpida de varias maneras.
Las etiquetas son la forma en que se indica al compilador en qu puntos ser reanudada la
ejecucin de un programa cuando haya una ruptura del orden secuencial.
<identificador>: <sentencia>
Estas etiquetas tienen el mbito restringido a la funcin dentro de la cual estn definidas.
Veremos su uso con ms detalle al analizar la sentencia "goto".
switch(<variable>)
{
case <expresin_constante>: [<sentencias>][break;]
...
[default: [<sentencias>]]
}
- 34 -
TALLER DE INFORMTICA
CAPITULO 7. Instrucciones
if (<condicin>) <sentencia1>;
if (<condicin>) <sentencia1>; else <sentencia2>;
En este caso, la variable "val" slo estar accesible dentro del mbito de la sentencia "if" y, si
existe, del "else".
switch (<variable>)
{
case <expresin_constante>: [<sentencias>] [break;]
...
[default : [<sentencia>]]
}
Por ejemplo:
switch(letra)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
EsVocal = true;
- 35 -
TALLER DE INFORMTICA
CAPITULO 7. Instrucciones
break;
default:
EsVocal = false;
}
En este ejemplo letra es una variable de tipo "char" y EsVocal de tipo "bool".
Si el valor de entrada en el "switch" corresponde a una vocal, EsVocal saldr con un valor
verdadero, en caso contrario, saldr con un valor falso.
El ejemplo ilustra el uso del "break", si letra es 'a', se cumple el primer "case", y la ejecucin
contina en la siguiente sentencia, ignorando el resto de los "case" hasta el "break".
Otro ejemplo:
break
Ejemplo:
y = 0;
x = 0;
while (x < 1000)
{
if (y == 1000) break;
y++;
}
x = 1;
- 36 -
TALLER DE INFORMTICA
CAPITULO 7. Instrucciones
En este ejemplo el bucle no terminara nunca si no fuera por la lnea del "break", ya que x no
cambia.
Despus del "break" el programa continuara en la lnea "x = 1".
continue
Ejemplo:
y = 0;
x = 0;
while (x < 1000)
{
x++;
if (y >= 100) continue;
y++;
}
En este ejemplo la lnea "y++" slo se ejecutara mientras "y" sea menor que 100, en cualquier
otro caso el control pasa a la lnea "}", con lo que el bucle volvera a evaluarse.
goto <identificador>
Ejemplo:
x = 0;
Bucle:
x++;
if (x < 1000) goto Bucle;
return [<expresin>]
- 37 -
TALLER DE INFORMTICA
CAPITULO 7. Instrucciones
Ejemplo:
int Paridad(int x)
{
if (x % 2) return 1;
return 0;
}
Este ejemplo ilustra la implementacin de una funcin que calcula la paridad de un parmetro. Si el
resto de dividir el parmetro entre 2 es distinto de cero, implica que el parmetro es impar, y la
funcin retorna con valor 1. El resto de la funcin no se ejecuta. Si por el contrario el resto de
dividir el parmetro entre 2 es cero, el parmetro ser un nmero par y la funcin retornar con
valor cero.
7.7. Comentarios.
Los comentarios ayudan a seguir el funcionamiento del programa durante la depuracin o en la
actualizacin del programa, adems de documentarlo.
No se trata propiamente de un tipo de sentencias, pero me parece que es el lugar adecuado para
introducir este concepto.
En C pueden introducirse comentarios en cualquier parte del programa, Los comentarios en C se
delimitan entre /* y */, cualquier cosa que escribamos en su interior ser ignorada por el
compilador, slo est prohibido su uso en el interior de palabras reservadas o en el interior de
identificadores.
Por ejemplo:
- 38 -
TALLER DE INFORMTICA
CAPITULO 7. Instrucciones
b)
c)
d)
e)
f)
int x=0;
while(x < 5) x += 2;
0,2,4,6
0,2,4
0,2,4,6,8
10
10,11
11
13,14
13,14,15
13
6,10,17
6,10,17,5
6,10,17,10,5
0,1,2,3,4,5,1,2,3,4,5,1
0,1,2,3,4,5,1,2,3,4,5
0,1,2,3,4,5,1,2,3,4,5,1,2
int x=10;
do x++; while(x < 10);
int x = 6;
do {
switch(x%3) {
case 0: x=10; break;
case 1: x=17; break;
case 2: x=5; break;
}
} while(x != 5);
0,1,2,3,1,2,3,2,3
0,1,2,3,1,2,3,2
0,1,2,3,1,2,3,2,3,2
- 39 -
TALLER DE INFORMTICA
CAPITULO 8. Funciones
CAPITULO 8. FUNCIONES.
Las funciones son un conjunto de instrucciones que realizan una tarea especfica. En general toman
unos valores de entrada, llamados parmetros y proporcionan un valor de salida o valor de retorno;
aunque tanto unos como el otro pueden no existir.
Al igual que con las variables, las funciones pueden declararse y definirse.
Una declaracin es simplemente una presentacin.
Una definicin contiene las instrucciones con las que realizar su trabajo la funcin.
Por ejemplo:
El prototipo sirve para indicar al compilador los tipos de datos de retorno y los tipos de datos de los
parmetros que recibe la funcin, de modo que compruebe si son del tipo correcto cada vez que se
use esta funcin dentro del programa, o para hacer las conversiones de tipo cuando sea necesario.
Los nombres de los parmetros son opcionales, y se incluyen como documentacin y ayuda en la
interpretacin y comprensin del programa.
El ejemplo de prototipo anterior sera igualmente vlido y se podra poner como:
Normalmente se aconseja:
Copiar el prototipo de la funcin y pegar como una definicin eliminando el ; del final de lnea de
esta manera no se comenten errores.
PERO si hacemos esto utilizando la ltima forma de indicar el prototipo de la funcin (es decir sin
dar nombres a las variables) no sirve, ya que en la definicin de la funcin necesitamos dar un
nombre a la variable para poder usarla.
Las funciones se declaran como prototipos dentro del programa, o se incluyen estos prototipos
desde un fichero externo, (usando la directiva "#include")
La definicin de la funcin se hace ms adelante; lo habitual es hacerlo despus de la funcin
"main".
Los programas complejos se escriben normalmente usando varios ficheros fuente. Estos ficheros se
compilan separadamente y se enlazan juntos. Esto es una gran ventaja durante el desarrollo y
- 40 -
TALLER DE INFORMTICA
CAPITULO 8. Funciones
depuracin de grandes programas, ya que las modificaciones en un fichero fuente slo nos
obligarn a compilar ese fichero fuente, y no el resto, con el consiguiente ahorro de tiempo.
La definicin de las funciones puede hacerse dentro de los ficheros fuente o enlazarse desde
libreras precompiladas. La diferencia entre una declaracin y una definicin es que la definicin
posee un cuerpo de funcin.
Tipo de almacenamiento
Modificadores opcionales
Nombre de la funcin
Cuerpo de la funcin
- 41 -
TALLER DE INFORMTICA
CAPITULO 8. Funciones
- 42 -
TALLER DE INFORMTICA
CAPITULO 8. Funciones
int EnteroGlobal;
// Declaracin de una variable global
int Funcion1(int a);
// Declaracin de un prototipo
int main()
{
int EnteroLocal;
// Declaracin de una variable local de main:
// Acceso a una variable local:
EnteroLocal = Funcion1(10);
EnteroGlobal = Funcion1(EnteroLocal); // Acceso a una valiable global:
return 0;
}
int Funcion1(int a)
{ char CaracterLocal; // Variable local de funcion1
// Desde aqu podemos acceder a EnteroGlobal, y tambin
//a CaracterLocal pero no a EnteroLocal
if (EnteroGlobal != 0)
//EnteroGlobal;
return a
else
return 0;
}
<tipo> funcion(parmetros)
{
<tipo> var;
for(<tipo> var;...)
...
return var;
}
// (1)
// (2)
// (3)
- 43 -
TALLER DE INFORMTICA
CAPITULO 8. Funciones
8.5. Ejercicios.
1-) En el ejemplo, qu mbito tiene cada una de las variables? Marcar la opcin correcta.
float s,i;
int main()
{
int x;
x=10;
for(int i=0; i<x; i++)
Mostrar(i);
i = 0.0;
while(x>0) {
i *= 10.3;
x--;
}
return 0;
a)
b)
c)
d)
2-)
- 44 -
TALLER DE INFORMTICA
CAPITULO 8. Funciones
5-) Escribir el cdigo fuente de un programa que contenga una funcin que reciba un entero y
devuelva P si es POSITIVO y N si es NEGATIVO.
6-) Escribir el cdigo fuente de un programa que desde main se llame a una funcin que recibe
dos argumentos enteros y devuelve un valor booleano, siendo TRUE si el mayor argumento es
divisible por el menor o FALSE si el mayor argumento no es divisible por el mayor.
7-) Escribir el cdigo fuente de un programa que desde main se llame a una funcin que recibe
como argumento dos nmeros reales, y retorna el menor que es mostrado en main.
8-) Escribir el cdigo fuente de un programa que desde main se llame a una funcin pasando como
argumento un valor entero, esta funcin calcula los coeficientes de la serie de Fibonacci hasta el
entero pasado; y retorna la suma de los trminos que se muestra desde main.
9-) Escribir el cdigo fuente de un programa que permita definir tres funciones, una que detecta si
un carcter es una Vocal , otra que detecta si es Consonante y otra si es un Dgito, todas devuelven
el valor TRUE o FALSE y desde main se debe indicar si el tipo de char ingresado es : vocal,
consonante dgito.
Se puede suponer en principio para simplificar que los caracteres ingresados son TODO minsculas.
Sugerencia: Mirar la tabla de caracteres ASCII.
10-) Escribir el cdigo fuente de un programa que desde main se llame a una funcin la cual recibe
un par de nmeros y retorna el resto de la divisin del mayor dividido el menor.
Sugerencia: usar el operador () ? : .
11-) Escribir el cdigo fuente de un programa que desde main se llame a una funcin que recibe
como argumento un nmero entero, calcula y muestra desde la misma funcin los divisores de ese
nmero retornando un valor TRUE, si el nmero no es primo y FALSE si es primo.
12-) Se dice que un nmero entero es perfecto, si la suma de sus divisores incluyendo el 1 es igual
a s mismo.
Ej: 6 = 3 + 2+ 1 , ver que 3,2,1 son divisores de 6.
Escribir una funcin que reciba un entero, y retorne TRUE para el caso de que el nmero sea un
entero perfecto.
- 45 -
TALLER DE INFORMTICA
CAPITULO 8. Funciones
13-) Escribir el cdigo fuente de un programa que desde main se llame a una funcin men que
no recibe ningn argumento y que retorne la opcin de men elegida, sta se mostrar desde
main. Los tems del men deberan ser por ej. 1,2,3,4 y 5 para salir, o A,B,.. y F para Finalizar.
Controlar que slo salga con la opcin indicada.
14-) Escribir el cdigo fuente de un programa que desde main se llame a una funcin men
(similar al ejercicio 13), las opciones del men sern:
1: Cargar un vector y luego presentar nuevamente el men, (todas las funciones refieren al vector)
2: Ordenar.
3:Buscar el mayor.
4:Calcular el promedio.
5:Salir.
Cada uno de estos puntos se debe realizar con una funcin. No usar variables globales. Usar pasaje
de valores a funciones por referencia para el caso de ordenar!!.
15-) Escribir el cdigo fuente de un programa que desde main llame a una funcin la cual itera (sin
hacer nada) mientras se introduzca la letra s y se detiene cuando se introduce la letra n.
Ver que s y n son MINUSCULAS!!.
16-) Escribir el cdigo fuente de un programa que desde main copie usado la funcin strcpy de
un string.
17-) Escriba una funcin que reciba la cantidad de elementos a acumular y retorne el valor
acumulado.
Ej: recibe 4, y luego se ingresan, dentro de la funcin cuatro nmeros, 1, 3, 3, 2 deber retornar a
main el total acumulado=9.
18-) Escriba una funcin que reciba la cantidad de elementos a promediar y retorne el promedio.
Ej: recibe 3, luego se ingresan, dentro de la funcin tres valores, 10, 5, 15 y deber retornar a
main el promedio=10.
- 46 -
TALLER DE INFORMTICA
CAPITULO 9. Arreglos
CAPITULO 9. ARREGLOS.
Un arreglo es un conjunto de elementos del mismo tipo agrupados en una sola variable. Es una
estructura de datos en la que se almacena una coleccin de datos del mismo tipo
Los arreglos poseen ciertas caractersticas particulares:
Tienen un nico nombre de variable, que representa todos los elementos, los cuales se
diferencian por un ndice o subndice.
Por s mismo, el nombre del arreglo apunta a la direccin del primer elemento del arreglo.
- 47 -
TALLER DE INFORMTICA
CAPITULO 9. Arreglos
Por ejemplo:
La asignacin directa slo est permitida cuando se hace junto con la declaracin.
Por ejemplo:
char Saludo[5];
Saludo = "HOLA"
Esta modalidad producir un error en el compilador, ya que una cadena definida de este modo se
considera una constante, como veremos en el captulo de "arrays" o arreglos.
La manera correcta de asignar una cadena es:
char Saludo[5];
Saludo[0] = 'H';
Saludo[1] = 'O';
Saludo[2] = 'L';
Saludo[3] = 'A';
Saludo[4] = '\000';
O bien:
funciones que
que permiten
en disco, etc.
funciones que
9.2. Arreglos.
Empezaremos con los tipos de datos estructurados, los arrays.
Los arrays o arreglos permiten agrupar datos usando un mismo identificador.
Todos los elementos de un array son del mismo tipo, y para acceder a cada elemento se usan
subndices.
Sintaxis:
<tipo> <identificador>[<nm_elemen>][[<nm_elemen>]...];
Los valores para el nmero de elementos deben ser constantes, y se pueden usar tantas
dimensiones como queramos, limitado slo por la memoria disponible.
Cuando slo se usa una dimensin se suele hablar de listas o vectores, cuando se usan dos, de
tablas o matrices.
Ahora podemos ver que las cadenas de caracteres son un tipo especial de arrays. Se trata en
realidad de arrays de una dimensin de objetos de tipo char.
Los subndices son enteros, y pueden tomar valores desde 0 hasta <nmero de elementos>-1.
- 48 -
TALLER DE INFORMTICA
CAPITULO 9. Arreglos
int Vector[10];
Crear un array con 10 elementos enteros; podremos acceder a los elementos Vector[0] a
Vector[9].
Como subndice podremos usar cualquier expresin entera.
En general C++ no verifica el mbito de los subndices. Si declaramos un array de 10 elementos,
no obtendremos errores al acceder al elemento 11.
Sin embargo, si asignamos valores a elementos fuera del mbito declarado, estaremos accediendo
a zonas de memoria que pueden pertenecer a otras variables o incluso al cdigo ejecutable de
nuestro programa, con consecuencias generalmente desastrosas.
Por ejemplo:
int Tabla[10][10];
char DimensionN[4][15][6][8][11];
...
DimensionN[3][11][0][4][6] = DimensionN[0][12][5][3][1];
Tabla[0][0] += Tabla[9][9];
En estos casos no es obligatorio especificar el tamao para la primera dimensin, como ocurre en
los ejemplos de las lneas 2, 3, 4, 5 y 6.
En estos casos la dimensin que queda indefinida se calcula a partir del nmero de elementos en la
lista de valores iniciales.
En el caso 2, el nmero de elementos es 10, ya que hay diez valores en la lista.
En el caso 3, ser 4.
En el caso 4, ser 3, ya que hay 9 valores, y la segunda dimensin es 3: 9/3=3.
Y en el caso 5, el nmero de elementos es 17, 16 caracteres ms el cero de fin de cadena.
- 49 -
TALLER DE INFORMTICA
CAPITULO 9. Arreglos
Por ejemplo:
#include <iostream>
using namespace std;
int main()
{
int array[231];
cout << "Nmero de elementos: " << sizeof(array)/sizeof(int) << endl;
cout << "Nmero de elementos: " << sizeof(array)/sizeof(array[0]) << endl;
cin.get();
return 0;
}
Las dos formas son vlidas, pero la segunda es, tal vez, ms general.
- 50 -
TALLER DE INFORMTICA
CAPITULO 9. Arreglos
5) 1 | 3 | 6| 8 | 15 | 18
No
b)
No
c)
No
Ej: la funcin debe ser capaz de incrementar tanto la cadena "3423", como "00002323".
La funcin "main" llamar a la funcin Incrementar con diferentes cadenas.
- 51 -
TALLER DE INFORMTICA
CAPITULO 9. Arreglos
#include <iostream>
using namespace std;
int main()
{
int i=1;
char mensaje [21];
cout << " Ingrese un texto de no mas de 20 caracteres" << endl;
cin.getline (mensaje,21);
while (mensaje[i]!=0)i++;
cout <<endl <<"El arreglo tiene: " << i << " caracteres";
return 0;
}
6-) Escribir un cdigo de programa que llame desde main a una funcin pasando por referencia el
nombre de un array y desde esa funcin se mostrar por pantalla el array escrito de atrs para
adelante.
Ej: se ingresa desde main Juan Pablo y desde la funcin se deber mostrar: olbaP nauJ.
#include <iostream>
using namespace std;
int main()
{
int i=1;
char mensaje [21];
cout << " Ingrese un texto de no mas de 20 caracteres" << endl;
cin.getline (mensaje,21);
while (mensaje[i]!=0)i++;
cout <<endl <<"El arreglo tiene: " << i << " caracteres"<< endl;
while((i+1)!=0){cout << mensaje[i] ;--i;}
cout << endl;
return 0;
}
- 52 -
TALLER DE INFORMTICA
CAPITULO 9. Arreglos
9-) Hacer un programa que cargue 25 valores enteros en un arreglo de 5 x 5, y luego muestre
primero la suma de cada fila y luego la suma de cada columna.
10-) Escribir el cdigo que permita cargar un vector y luego ordenar de mayor a menor.
11-) Escribir el cdigo que permita la carga de una arreglo de dos dimensiones de 3 x 3 y que
luego ordene todas las filas de mayor a menor.
12-) Escribir el cdigo que permita cargar un arreglo de 3 x 3 y que busque el menor elemento de
cada columna y muestre su valor y posicin (fila, columna).
13-) Escribir el cdigo que permita cargar un arreglo de 3 x 3, luego busque los elementos que se
repiten, y los muestre.
14-) Escribir el cdigo que permita cargar un arreglo de 10 elementos, primero se deber ingresar
la posicin y luego el valor. Se deber controlar que el ndice o posicin del arreglo no exceda al
valor mximo del arreglo.
Alternativa: Verificar si el elemento ya ha sido cargado.
15-) Escribir el cdigo que permita la carga de los 5 primeros elementos de un arreglo de 10
elementos y luego lo complete copiando el primero al ultimo lugar, el segundo al ante ultimo lugar.
Luego deber mostrar el arreglo cargado.
16-) Escribir el cdigo que permita cargar un arreglo de 3 x 3, pero que slo permita cargar los
elemento de la diagonal principal; el resto lo complete con ceros.
17-) Escribir el cdigo que permita cargar un arreglo de 3 x 3, pero que slo permita cargar los
elemento de la diagonal principal y el tringulo superior, luego deber completar el tringulo
inferior de manera de lograr una matriz simtrica.
Si se ingresan: 1, 2, 3, 7, 5 ,4.
Ej de matriz simtrica:
1
2
3
2
7
5
3
5
4
18-) Escribir el cdigo que permita cargar un arreglo de 3 x 3, y que luego cargue un vector
columna con el promedio de cada fila.
19-) Escribir el cdigo que permita cargar dos arreglos de 3 x 3 de nombre MatA y MatB y, que
luego, presente un men, como el siguiente:
1) Suma las Matrices MatA+MatB.
2) Resta las Matrices MatA-Matb.
3) Cargar MatA.
4) Cargar MatB.
5) Salir.
- 53 -
TALLER DE INFORMTICA
- 54 -
TALLER DE INFORMTICA
<tipo> *<identificador>;
Por ejemplo:
int *entero;
char *carcter;
struct stPunto *punto;
Los punteros siempre apuntan a un objeto de un tipo determinado, en el ejemplo, "entero" siempre
apuntar a un objeto de tipo "int".
La forma:
<tipo>* <identificador>;
con el (*) junto al tipo, en lugar de junto al identificador de variable, tambin est permitida.
Veamos algunos matices.
Por ejemplo:
int *entero;
equivale a:
int* entero;
Debes tener muy claro que "entero" es una variable del tipo "puntero a int", que "*entero" NO es
una variable de tipo "int".
Como pasa con todas las variables en C++, cuando se declaran slo se reserva espacio para
almacenarlas, pero no se asigna ningn valor inicial, el contenido de la variable permanecer sin
cambios, de modo que el valor inicial del puntero ser aleatorio e indeterminado. Debemos suponer
que contiene una direccin no vlida.
Si "entero" apunta a una variable de tipo "int", "*entero" ser el contenido de esa variable, pero no
olvides que "*entero" es un operador aplicado a una variable de tipo "puntero a int", es decir
"*entero" es una expresin, no una variable, que significa: el contenido a donde apunta el
puntero contenido de la direccin a la que apunta.
- 55 -
TALLER DE INFORMTICA
int A;
int *pA;
pA = &A;
Segn este ejemplo, pA es un puntero a int que apunta a la direccin donde se almacena el valor
del entero A. Trataremos de graficar lo visto hasta ahora.
Veamos como sera solicitando espacio o memoria de un modo dinmico para almacenar un entero,
es importante destacar que en este ejemplo SOLO SE USA EL PUNTERO, NO EXISTE NOMBRE
DE VARIABLE.
- 56 -
TALLER DE INFORMTICA
int A, B;
int *entero;
...
B = 213;
entero = &A;
*entero = 103;
B = *entero;
...
/* B vale 213 */
/* entero apunta a la direccin de la variable A */
/* equivale a la lnea A = 103; */
/* equivale a B = A; */
En este ejemplo vemos que "entero" puede apuntar a cualquier variable de tipo "int", y que
podemos hacer referencia al contenido de dichas variables usando el operador de indireccin (*).
Como todas las variables, los punteros tambin contienen "basura" cuando son declaradas. Es
costumbre dar valores iniciales nulos a los punteros que no apuntan a ningn sitio concreto:
entero = NULL;
caracter = NULL;
NULL es una constante, que est definida como cero en varios ficheros de cabecera, como "cstdio"
o "iostream", y normalmente vale 0.
- 57 -
TALLER DE INFORMTICA
Declaramos un puntero del mismo tipo que los elementos del array, y que apunta al primer
elemento del array.
Reservamos memoria para todos los elementos del array. Los elementos de un array se
almacenan internamente en el ordenador en posiciones consecutivas de la memoria.
int vector[10];
int *puntero;
puntero = vector;
*puntero++;
puntero++;
struct stComplejo {
float real, imaginario;
} Complejo[10];
stComplejo *p;
p = Complejo;
/* Equivale a p = &Complejo[0]; */
p++;
/* p == &Complejo[1] */
En este caso, al incrementar p avanzaremos las posiciones de memoria necesarias para apuntar al
siguiente complejo del array "Complejo". Es decir avanzaremos sizeof(stComplejo) bytes.
- 58 -
TALLER DE INFORMTICA
10.5.1. Asignacin
Ya hemos visto cmo asignar a un puntero la direccin de una variable.
Tambin podemos asignar un puntero a otro, esto har que los dos apunten a la misma posicin:
Por ejemplo:
int *q, *p;
int a;
q = &a;
p = q;
/* q apunta al contenido de a */
/* p apunta al mismo sitio, es decir, al contenido de a */
int vector[10];
int *p, *q;
p = vector;
/* Equivale a p = &vector[0]; */
q = &vector[4];
/* apuntamos al 5 elemento */
cout << q-p << endl;
if(NULL != p)
if(p)
if(NULL == p)
if(!p)
- 59 -
TALLER DE INFORMTICA
void *<identificador>;
Recordemos que el cambio o conversin de tipo de dato que se realiza de forma implcita en el
procesador cuando encuentra expresiones que contienen diferentes tipos de dato, pero podemos
hacerlo de una forma en que programador puede forzar un cambio de tipo de forma explcita. Este
cambio se llama cambio por promocin, o casting.
Por ejemplo:
#include <iostream>
using namespace std;
int main() {
char cadena[10] = "Hola";
char *c;
int *n;
//puntero a un entero
void *v;
c = cadena;
// c apunta a cadena
n = (int *)cadena;
// usa casting, n tambin apunta a cadena
v = (void *)cadena;
// v tambin
cout << "carcter: " << *c << endl;
cout << "entero: " << *n << endl;
cout << "float: " << *(float *)v << endl;
cin.get();
return 0;
}
El resultado ser:
Carcter: H
Entero: 1634496328
float: 2.72591e+20
Vemos que tanto "cadena" como los punteros "n", "c" y "v" apuntan a la misma direccin, pero
cada puntero tratar la informacin que encuentre all de modo diferente, para "c" es un carcter y
para "n" un entero. Para "v" no tiene tipo definido, pero podemos hacer "casting" con el tipo que
queramos, en este ejemplo con float.
El tipo de lnea del tercer "cout" es lo que suele asustar a los no iniciados en C y C++, y se parece
mucho a lo que se conoce como cdigo ofuscado. Parece como si en C casi cualquier expresin
pudiese compilar.
- 60 -
TALLER DE INFORMTICA
#include <iostream>
using namespace std;
struct stEstructura {
int a, b;
} estructura, *e;
int main()
{
estructura.a = 10;
estructura.b = 32;
e = &estructura;
cout << "variable" << endl;
cout << e->a << endl;
cout << e->b << endl;
cout << "puntero" << endl;
cout << estructura.a << endl;
cout << estructura.b << endl;
cin.get();
return 0;
}
#include <iostream>
using namespace std;
int main() {
char cadena1[] = "Cadena 1";
char *cadena2 = "Cadena 2";
cout << cadena1 << endl;
cout << cadena2 << endl;
//cadena1++;
// Ilegal, cadena1 es constante
cadena2++;
// Legal, cadena2 es un puntero
cout << cadena1 << endl;
cout << cadena2 << endl;
cout << cadena1[1] << endl;
cout << cadena2[0] << endl;
cout << cadena1 + 2 << endl;
cout << cadena2 + 1 << endl;
cout << *(cadena1 + 2) << endl;
cout << *(cadena2 + 1) << endl;
cin.get();
return 0;
}
- 61 -
TALLER DE INFORMTICA
Aparentemente, y en la mayora de los casos, cadena1 y cadena2 son equivalentes, sin embargo
hay operaciones que estn prohibidas con los arrays, ya que son punteros constantes.
10.8.2. Ejemplo 2
#include <iostream>
using namespace std;
int main() {
char Mes[][11] = { "Enero", "Febrero", "Marzo", "Abril",
"Mayo", "Junio", "Julio", "Agosto",
"Septiembre", "Octubre", "Noviembre", "Diciembre"};
char *Mes2[] = { "Enero", "Febrero", "Marzo", "Abril",
"Mayo", "Junio", "Julio", "Agosto",
"Septiembre", "Octubre", "Noviembre", "Diciembre"};
cout << "Tamao de Mes: " << sizeof(Mes) << endl;
cout << "Tamao de Mes2: " << sizeof(Mes2) << endl;
cout << "Tamao de cadenas de Mes2: "
<< &Mes2[11][10]-Mes2[0] << endl;
cout << "Tamao de Mes2 + cadenas : "
<< sizeof(Mes2)+&Mes2[11][10]-Mes2[0] << endl;
cin.get();
return 0;
}
En este ejemplo declaramos un array "Mes" de dos dimensiones que almacena 12 cadenas de 11
caracteres, 11 es el tamao necesario para almacenar el mes ms largo (en caracteres):
"Septiembre".
Despus declaramos "Mes2" que es un array de punteros a char, para almacenar la misma
informacin. La ventaja de este segundo mtodo es que no necesitamos contar la longitud de las
cadenas para calcular el espacio que necesitamos, cada puntero de Mes2 es una cadena de la
longitud adecuada para almacenar cada mes.
Parece que el segundo sistema es ms econmico en cuanto al uso de memoria, pero hay que
tener en cuenta que adems de las cadenas tambin se almacenan los doce punteros.
El espacio necesario para almacenar los punteros lo dar la segunda lnea de la salida. Y el espacio
necesario para las cadenas lo dar la tercera lnea.
Si las diferencias de longitud entre las cadenas fueran mayores, el segundo sistema sera ms
eficiente en cuanto al uso de la memoria.
- 62 -
TALLER DE INFORMTICA
Hay una regla de oro cuando se usa memoria dinmica, toda la memoria que se reserve durante el
programa hay que liberarla antes de salir del programa. No seguir esta regla es una actitud muy
irresponsable, y en la mayor parte de los casos tiene consecuencias desastrosas. No se fen de lo
que diga el compilador, de que estas variables se liberan solas al terminar el programa, no siempre
es verdad. Veremos con mayor profundidad los operadores "new" y "delete" en otros captulos, por
ahora veremos un ejemplo.
Por ejemplo:
#include <iostream>
using namespace std;
int main() {
int *a;
char *b;
float *c;
struct stPunto {
float x,y;
} *d;
a = new int;
b = new char;
c = new float;
d = new stPunto;
*a = 10;
*b = 'a';
*c = 10.32;
d->x = 12; d->y = 15;
cout << "a = " << *a << endl;
cout << "b = " << *b << endl;
cout << "c = " << *c << endl;
cout << "d = (" << d->x << ", " << d->y << ")" << endl;
delete a;
delete b;
delete c;
delete d;
cin.get();
return 0; }
- 63 -
TALLER DE INFORMTICA
int main()
{
int *a;
a = new int;
*a = 10;
a = new int;
*a = 20;
delete a;
return 0;
}
// variable dinmica
// nueva variable dinmica,
// se pierde el puntero a la anterior
// slo liberamos la ltima reservada
En este ejemplo vemos cmo es imposible liberar la primera reserva de memoria dinmica. Si no la
necesitbamos habra que liberarla antes de reservarla otra vez, y si la necesitamos, hay que
guardar su direccin, por ejemplo con otro puntero.
10.10. Ejercicios
1-) Escribir un programa con una funcin que calcule la longitud de una cadena de caracteres.
El nombre de la funcin ser LongitudCadena, debe devolver un "int", y como parmetro de
entrada debe tener un puntero a "char".
En "main" probar con distintos tipos de cadenas: arrays y punteros.
2-) Escribir un programa con una funcin que busque un carcter determinado en una cadena.
El nombre de la funcin ser BuscaCaracter, debe devolver un "int" con la posicin en que fue
encontrado el carcter, si no se encontr volver con -1.
Los parmetros de entrada sern una cadena caracteres.
3-) De qu tipo es cada una de las siguientes variables?
a) int*
a,b;
a puntero, b puntero
a puntero, b entero
a entero, b puntero
a entero, b entero
b) int *a,b;
a puntero, b puntero
a puntero, b entero
a entero, b puntero
a entero, b entero
c) int *a,*b;
a puntero, b puntero
a puntero, b entero
a entero, b puntero
a entero, b entero
- 64 -
TALLER DE INFORMTICA
d) int*
a,*b;
a puntero, b puntero
a puntero, b puntero doble
a entero, b puntero
a entero, b puntero doble
- 65 -
TALLER DE INFORMTICA
struct Persona {
char Nombre[65];
char Direccion[65];
int AnyoNacimiento;
} Fulanito;
Este ejemplo declara a Fulanito como una variable de tipo Persona. Para acceder al nombre de
Fulanito, por ejemplo para visualizarlo, usaremos la forma:
- 66 -
TALLER DE INFORMTICA
struct Punto {
int x, y;
Punto() {x = 0; y = 0;} // Constructor
} Punto1, Punto2;
Forma 2:
struct Punto {
int x, y;
Punto(); // Declaracin del constructor
} Punto1, Punto2;
// Definicin del constructor, fuera de la estructura
Punto::Punto() {
x = 0;
y = 0;
}
Para aquellos que usen un teclado espaol, el smbolo "~" se obtiene pulsando las teclas del
teclado numrico 1, 2, 6, mientras se mantiene pulsada la tecla ALT, ([ALT]+126).
Tambin mediante la combinacin [Atl Gr]+[4] (la tecla [4] de la zona de las letras, no del teclado
numrico).
TALLER DE INFORMTICA
Bueno eso es incierto, algo parecido sucede en el lenguaje C, donde se pueden definir tipos de
variables personales.
S, eso mismo podemos darle el nombre que queramos. Pero qu sucedera si queremos crear un
tipo de datos y tenemos la mala suerte que dentro de una librera que usamos ese tipo de dato ya
existe?
Es difcil saber si el nombre para el tipo de variables que queremos usar ya fue usado, en este caso
el compilador tirara un error y deberamos cambiar el nombre, para evitar esto se definen espacios
en los que se deben tener en cuenta determinados nombres. Sera algo parecido al ejemplo de
Juan Perez.
Esto se soluciona ubicando explcitamente a cada alumno en una comisin distinta.
Solo con fines didcticos veremos un cdigo en cual no compilara pero la idea es destacar la
referencia a distintos espacios de nombres.
Por ejemplo:
Mencionar aqu, slo a ttulo de informacin, que el constructor no tiene por qu ser nico. Se
pueden incluir varios constructores, pero veremos esto mucho mejor y con ms detalle cuando
veamos las clases.
Usando constructores nos aseguramos los valores iniciales para los elementos de la estructura.
Veremos que esto puede ser una gran ventaja, sobre todo cuando combinemos estructuras con
punteros, en captulos posteriores.
Tambin podemos incluir otras funciones, que se declaran y definen como las funciones que ya
conocemos, salvo que tienen restringido su mbito al interior de la estructura.
Por ejemplo:
#include <iostream>
using namespace std;
struct stPareja {
int A, B;
int LeeA() { return A;}
int LeeB() { return B;}
void GuardaA(int n) { A = n;}
void GuardaB(int n) { B = n;}
} Par;
int main()
{ Par.GuardaA(15);
Par.GuardaB(63);
cout << Par.LeeA() << endl;
cout << Par.LeeB() << endl;
cin.get();
return 0;
}
// Devuelve el valor de A
// Devuelve el valor de B
// Asigna un nuevo valor a A
// Asigna un nuevo valor a B
- 68 -
TALLER DE INFORMTICA
En este ejemplo podemos ver cmo se define una estructura con dos campos enteros, y dos
funciones para modificar y leer sus valores. El ejemplo es muy simple, pero las funciones de
guardar valores se pueden elaborar para que no permitan determinados valores, o para que hagan
algn tratamiento de los datos.
Por supuesto se pueden definir otras funciones y tambin constructores ms elaborados y
sobrecarga de operadores. Y en general, las estructuras admiten cualquiera de las caractersticas
de las clases, siendo en muchos aspectos equivalentes.
Veremos estas caractersticas cuando estudiemos las clases, y recordaremos cmo aplicarlas a las
estructuras.
struct A {
int i;
int j;
int k;
};
struct B {
int x;
struct C {
char c;
char d;
} y;
int z;
};
A ejemploA = {10, 20, 30};
B ejemploB = {10, {'a', 'b'}, 20};
Cada nueva estructura anidada deber inicializarse usando la pareja correspondiente de llaves "{}",
tantas veces como sea necesario.
struct Punto {
int x, y;
Punto() {x = 0; y = 0;}
} Punto1, Punto2;
int main()
{ Punto1.x = 10;
Punto1.y = 12;
Punto2 = Punto1;
}
- 69 -
TALLER DE INFORMTICA
La lnea:
Punto2 = Punto1;
equivale a:
Punto2.x = Punto1.x;
Punto2.y = Punto1.y;
struct Persona {
char Nombre[65];
char Direccion[65];
int AnyoNacimiento;
} Plantilla[200];
Vemos en este ejemplo lo fcil que podemos declarar el array Plantilla que contiene los datos
relativos a doscientas personas.
Podemos acceder a los datos de cada uno de ellos:
Plantilla[0] = Plantilla[99];
Veamos un ejemplo de un Array de instancias 2 dimensiones o dicho de otra manera una matriz de
instancias de una Estructura.
#include <iostream>
using namespace std;
struct prueba {int x; char nombre[11];};
int main()
{int i,j,k=1;
prueba datos[3][3];
//Instacia de Estructura de 2 dimensiones.
for ( i=0; i < 3; i++)
{
for (j=0; j < 3; j++)
{
datos[i][j].x=k;
cout<< endl << "Ingrese Nombre: " << endl;
cin.getline(datos[i][j].nombre,10);
//Permite ingresar hasta 10
k++;
}
}
for (i=0; i < 3; i++)
{ for (j=0; j < 3; j++)
{cout << datos[i][j].x <<" "<< datos[i][j].nombre <<endl;}
}
return 0;
}
- 70 -
TALLER DE INFORMTICA
struct stDireccion {
char Calle[64];
int Portal;
int Piso;
char Puerta[3];
char CodigoPostal[6];
char Poblacion[32];
};
struct stPersona {
struct stNombre {
char Nombre[32];
char Apellidos[64];
} NombreCompleto;
stDireccion Direccion;
char Telefono[10];
};
En general, no es una prctica corriente definir estructuras dentro de estructuras, ya que resultan
tener un mbito local, y para acceder a ellas se necesita hacer referencia a la estructura ms
externa.
Por ejemplo para declarar una variable del tipo stNombre hay que utilizar el operador de acceso
(::):
stPersona::stNombre NombreAuxiliar;
Sin embargo para declarar una variable de tipo stDireccion basta con declararla:
stDireccion DireccionAuxiliar;
- 71 -
TALLER DE INFORMTICA
#include <iostream>
using namespace std;
struct A {
int x;
char a;
int y;
char b;
};
struct B {
int x;
int y;
char a;
char b;
};
int main()
{
cout << "Tamao de int: " << sizeof(int) << endl;
cout << "Tamao de char: " << sizeof(char) << endl;
cout << "Tamao de estructura A: " << sizeof(A) << endl;
cout << "Tamao de estructura B: " << sizeof(B) << endl;
cin.get();
return 0;
}
de
de
de
de
int: 4
char: 1
estructura A: 16
estructura B: 12
Si hacemos las cuentas, en ambos casos el tamao de la estructura debera ser el mismo, es decir,
4+4+1+1=10 bytes. Sin embargo en el caso de la estructura A el tamao es 16 y en el de la
estructura B es 12, por qu?
La explicacin es algo denominado alineacin de bytes (byte-aling). Para mejorar el rendimiento del
procesador no se accede a todas las posiciones de memoria. En el caso de microprocesadores de
32 bits (4 bytes), es mejor si slo se accede a posiciones de memoria mltiplos de 4, y el
compilador intenta alinear las variables con esas posiciones.
En el caso de variables "int" es fcil, ya que ocupan 4 bytes, pero con las variables "char" no, ya
que slo ocupan 1.
Cuando se accede a datos de menos de 4 bytes la alineacin no es tan importante. El rendimiento
se ve afectado sobre todo cuando hay que leer datos de cuatro bytes que no estn alineados.
- 72 -
TALLER DE INFORMTICA
En el caso de la estructura A hemos intercalado campos "int" con "char", de modo que el campo
"int" "y", se alinea a la siguiente posicin mltiplo de 4, dejando 3 posiciones libres despus del
campo "a". Lo mismo pasa con el campo "b".
En el caso de la estructura B hemos agrupado los campos de tipo "char" al final de la estructura, de
modo que se aprovecha mejor el espacio, y slo se desperdician los dos bytes sobrantes despus
de "b".
Hay algunas limitaciones, por ejemplo, un campo de bits no puede ocupar dos variables distintas,
todos sus bits tienen que estar en el mismo valor entero.
Por ejemplo:
struct mapaBits {
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
};
struct mapaBits2 {
unsigned short int campo1:3;
unsigned short int campo2:4;
unsigned short int campo3:2;
unsigned short int campo4:1;
unsigned short int campo5:6;
};
- 73 -
TALLER DE INFORMTICA
struct mapaBits3 {
unsigned char campo1:5;
unsigned char campo2:5;
};
En el primer caso se divide un valor char sin signo en ocho campos de un bit cada uno:
En el segundo caso dividimos un valor entero sin signo de diecisis bits en cinco campos de
distintas longitudes:
Los valores del campo5 estarn limitados entre 0 y 63, que son los nmeros que se pueden
codificar con seis bits. Del mismo modo, el campo4 slo puede valer 0 1, etc.
En este ejemplo vemos que como no es posible empaquetar el campo2 dentro del mismo char que
el campo1, se aade un segundo valor char, y se dejan sin usar los bits sobrantes.
Tambin es posible combinar campos de bits con campos normales.
Por ejemplo:
struct mapaBits2 {
int numero;
unsigned short int campo1:3;
unsigned short int campo2:4;
unsigned short int campo3:2;
unsigned short int campo4:1;
unsigned short int campo5:6;
float n;
};
Los campos de bits se tratan en general igual que cualquier otro de los campos de una estructura.
Se les puede asignar valores (dentro del rango que admitan), pueden usarse en condicionales,
imprimirse, etc.
- 74 -
TALLER DE INFORMTICA
#include <iostream>
#include <cstdlib>
using namespace std;
struct mapaBits2 {
unsigned short int campo1:3;
unsigned short int campo2:4;
unsigned short int campo3:2;
unsigned short int campo4:1;
unsigned short int campo5:6;
};
int main()
{
mapaBits2 x;
x.campo2 = 12;
x.campo4 = 1;
cout << x.campo2 << endl;
cout << x.campo4 << endl;
cin.get();
return 0;
}
No es normal usar estas estructuras en programas, salvo cuando se relacionan con ciertos
dispositivos fsicos, por ejemplo, para configurar un puerto serie en MS-DOS se usa una estructura
empaquetada en un unsigned char, que indica los bits de datos, de parada, la paridad, etc, es
decir, todos los parmetros del puerto. En general, para programas que no requieran estas
estructuras, es mejor usar estructuras normales, ya que son mucho ms rpidas.
Otro motivo que puede decidirnos por estas estructuras es el ahorro de espacio, ya sea en disco o
en memoria. Si conocemos los lmites de los campos que queremos almacenar, y podemos
empaquetarlos en estructuras de mapas de bits podemos ahorrar mucho espacio.
punt->dia
Por ejemplo:
struct stComplejo {
float real, imaginario;
} Complejo[10];
stComplejo *p;
p = Complejo;
p++;
/* Equivale a p = &Complejo[0]; */
/* p == &Complejo[1] */
En este caso, al incrementar p avanzaremos las posiciones de memoria necesarias para apuntar a
la siguiente instancia o conjuntos de variables del array de estructura llamado "Complejo" o si.
Es decir avanzaremos sizeof(stComplejo) bytes.
- 75 -
TALLER DE INFORMTICA
Por ejemplo:
#include <iostream>
using namespace std;
struct stEstructura {
int a, b;
};
int main() {
stEstrucutra estructura, *e;
estructura.a = 10;
estructura.b = 32;
e = &estructura;
cout << "variable" << endl;
cout << e->a << endl;
cout << e->b << endl;
cout << "puntero" << endl;
cout << estructura.a << endl;
cout << estructura.b << endl;
cin.get();
return 0;
}
TALLER DE INFORMTICA
else (punterodato+i)>
pdato=(punterodato+i+1);
}
/*for (i=0; i< cantidad_instancias ; i++)
{
cout << punterodato>
tel;
cout << punterodato>
legajo;
punterodato++;
}*/
do
{
cout << punterodato << endl;
cout << punterodato>
tel<< endl;
cout << punterodato>
legajo <<endl;
cout << punterodato>
pdato << endl;
cout << endl << endl;
punterodato++;
}while (((punterodato1)
>
pdato)!=0);
return 0;
}
Este tipo de Lista se puede recorrer en un solo sentido desde el principio hacia el fin. Vemos otra
que no tiene este inconveniente.
#include <iostream>
using namespace std;
struct dato {int tel; int legajo; struct dato *pprox; struct dato *pant;};
int main()
{
int i,cantidad_instancias;
struct dato *punterodato ;
cout<< " Ingrese un nro entero para definir la cantidad de
instancias"<< endl;
cin >> cantidad_instancias;
punterodato= new struct dato[cantidad_instancias];
for (i=0; i< cantidad_instancias ; i++)
{
cout << " Telefono: " << endl;
cin >> (punterodato+i)>
tel;
cout << " Legajo : " << endl;
- 77 -
TALLER DE INFORMTICA
11.10. Ejercicios
Carga y muestra de Estructura de una sola Instancia
1-) Realizar un Programa en C que cargue una Estructura llamada Alumno de una sola instancia de
nombre Electronica del siguiente tipo: Nombre (char de 10 elementos), edad (entero), fecha de
nacimiento(arreglo de 3 enteros).
Luego de cargar esta estructura desde teclado deber mostrarla.
Carga y muestra de Estructura de 5 instancias
2-) Realizar un Programa en C que cargue una Estructura llamada Alumno de 5 instancias de
nombre Electronica del siguiente tipo: Nombre (char de 10 elementos), edad (entero), fecha de
nacimiento (arreglo de 3 enteros).
Luego de cargar esta estructura desde teclado deber mostrarla.
Carga y muestra de Estructura de 5 instancias usando puntero
3-) Realizar un Programa en C que cargue una Estructura llamada Alumno de 5 instancias de
nombre Electronica del siguiente tipo: Nombre (char de 10 elementos), edad (entero), fecha de
nacimiento(arreglo de 3 enteros).
Luego de cargar esta estructura desde teclado deber mostrarla. La carga y la muestra debern
realizarse usando punteros.
- 78 -
TALLER DE INFORMTICA
Carga y muestra de Estructura de una sola instancia usando puntero a la estructura y funciones.
4-) Realizar un Programa en C que cargue una Estructura llamada Alumno de una sola instancia de
nombre Electronica del siguiente tipo: Nombre (char de 10 elementos), edad (entero), fecha de
nacimiento(arreglo de 3 enteros). La carga de la Instancia se deber hacer en una funcin llamada
carga que recibe como argumento un puntero a la Estructura. La muestra de la Instancia se deber
hacer en una funcin llamada muestra que recibe como argumento un puntero a la Estructura.
Carga y muestra de Estructura de 5 instancias usando puntero a la estructura y funciones.
5-) idem anterior pero para 5 instancias.
6-) Escribir un programa que almacene en un array los nombres y nmeros de telfono de 10
personas. El programa debe leer los datos introducidos por el usuario y guardarlos en memoria.
Despus debe ser capaz de buscar el nombre correspondiente a un nmero de telfono y el
telfono correspondiente a una persona. Ambas opciones deben se accesibles a travs de un men,
as como la opcin de salir del programa. El men debe tener esta forma, ms o menos:
a) Buscar por nombre
b) Buscar por nmero de telfono
c) Salir
Pulsa una opcin:
Nota: No olvides que para comparar cadenas se debe usar una funcin, no el operador ==.
7-) Para almacenar fechas podemos crear una estructura con tres campos: ano, mes y da. Los
das pueden tomar valores entre 1 y 31, los meses de 1 a 12 y los aos, dependiendo de la
aplicacin, pueden requerir distintos rangos de valores. Para este ejemplo consideraremos
suficientes 128 aos, entre 1960 y 2087. En ese caso el ao se obtiene sumando 1960 al valor de
ao. El ao 2003 se almacena como 43.
Usando estructuras, y ajustando los tipos de los campos, necesitamos un char para da, un char
para mes y otro para ao.
Disear una estructura anloga, llamada "fecha", pero usando campos de bits. Usar slo un entero
corto sin signo (unsigned short), es decir, un entero de 16 bits. Los nombres de los campos sern:
dia, mes y anno.
8-) Basndose en la estructura de bits del ejercicio anterior, escribir una funcin para mostrar
fechas: void Mostrar(fecha);. El formato debe ser:
"dd de mmmmmm de aaaa", donde dd es el da, mmmmmm el mes con letras, y aaaa el ao. Usar
un array para almacenar los nombres de los meses.
9-) Basndose en la estructura de bits del ejercicio anterior, escribir una funcin bool
ValidarFecha(fecha);, que verifique si la fecha entregada como parmetro es vlida. El mes tiene
que estar en el rango de 1 a 12, dependiendo del mes y del ao, el da debe estar entre 1 y 28, 29,
30 31.
El ao siempre ser vlido, ya que debe estar en el rango de 0 a 127.
Para validar los das usaremos un array int DiasMes[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30,
31};. Para el caso de que el mes sea febrero, crearemos otra funcin para calcular si un ao es o
no bisiesto: bool Bisiesto(int); Los aos bisiestos son los divisibles entre 4, al menos en el rango de
1960 a 2087 se cumple.
Nota: los aos bisiestos son cada cuatro aos, pero no cada 100, aunque s cada 400. Por ejemplo,
el ao 2000, es mltiplo de 4, por lo tanto debera haber sido bisiesto, pero tambin es mltiplo de
100, por lo tanto no debera serlo; aunque, como tambin es mltiplo de 400, finalmente lo fue.
10-) Seguimos con el tema de las fechas. Ahora escribir dos funciones ms.
La primera debe responder a este prototipo: int CompararFechas(fecha, fecha);. Debe comparar las
dos fechas suministradas y devolver 1 si la primera es mayor, -1 si la segunda es mayor y 0 si son
iguales. La otra funcin responder a este prototipo: int Diferencia(fecha, suministradas.
- 79 -
TALLER DE INFORMTICA
struct ejemplo1 {
unsigned char c1:7;
unsigned char c2:6;
unsigned char c3:3;
unsigned char c4:4;
};:
struct A {
struct B {
int x,y;
float r;
} campoB;
float s;
struct {
int z;
float t;
} campoC;
} E;
Si tenemos la variable "E", indicar la forma correcta de acceder a las siguientes variables:
a) x
A.B.x
E.campoB.x
E.x
E.b.x
b) s
A.s
E.s
E.a.s
c) t
A.t
E.t
A.campoC.t
E.campoC.t
- 80 -
TALLER DE INFORMTICA
struct A {
struct {
int x;
int y;
} campoB;
} *estructuraA;
- 81 -
TALLER DE INFORMTICA
&<expresin simple>
*<puntero>
Por ejemplo:
int A, *pA;
pA=&A;
int a, b;
b=&a;
<variable_estructura>.<nombre_de_variable>
<puntero_a_estructura>-><nombre_de_variable>
- 82 -
TALLER DE INFORMTICA
struct dato {int tel; int legajo; struct dato *pprox; struct dato *pant;}
recorrerla por teclado de manera que con P o p se pase a la proxima instancia y con A o a se pase
a la instancia anterior , con f o F se sale.
#include <iostream>
using namespace std;
void menu();
void recorre ( struct dato *p);
struct dato {int tel; int legajo; struct dato *pprox; struct dato *pant;};
int main()
{
int i,cantidad_instancias;
struct dato *punterodato ;
cout<< " Ingrese un nro entero para definir la cantidad de
instancias"<< endl;
cin >> cantidad_instancias;
// Solicito al sistema el espacio en memoria
punterodato= new struct dato[cantidad_instancias];
for (i=0; i< cantidad_instancias ; i++)
{
cout << " Telefono: " << endl;
cin >> (punterodato+i)>
tel;
cout << " Legajo : " << endl;
cin >> (punterodato+i)>
legajo;
if(i==0) (punterodato+i)>
pant=0;
else (punterodato+i)>
pant=(punterodato+i1);
- 83 -
TALLER DE INFORMTICA
if(i==(cantidad_instancias1))(
punterodato+i)>
pprox=0;
else (punterodato+i)>
pprox=(punterodato+i+1);
}
menu();
recorre (punterodato);
return 0;
}
void menu()
{
cout << " Para recorrer las instacias presione "<< endl;
cout << " presione P >
proxima A>
anterior F >
Finaliza";
}
void recorre(struct dato *p)
{ char opc;
do{
cin>> opc;
switch (opc)
{
case 'a':
case 'A':p=p>
pant;
cout << " Direccion de esta instacia : ";cout << p << endl;
cout << " Telefono : " << p>
tel<< endl;
cout << " Legajo : ";cout << p>
legajo <<endl;
cout << " Direccion de la insta. anterior: ";cout << p>
pant<< endl;
cout << " Direccion de la insta. proxima: ";cout << p>
pprox<< endl;
cout << endl << endl;
break;
case 'p':
case 'P':p=p>
pprox;
cout << " Direccion de esta instacia : ";cout << p << endl;
cout << " Telefono : " << p>
tel<< endl;
cout << " Legajo : ";cout << p>
legajo <<endl;
cout << " Direccion de la insta. anterior: ";cout << p>
pant<< endl;
cout << " Direccion de la insta. proxima: ";cout << p>
pprox<< endl;
cout << endl << endl;
break;
case 'f':
- 84 -
TALLER DE INFORMTICA
12.4.2-Operador delete
El operador delete se usa para liberar la memoria dinmica reservada con new.
Sintaxis:
[::]delete [<expresin>]
[::]delete [<expresin>]
La expresin ser normalmente un puntero, el operador delete[] se usa para liberar memoria de
arrays dinmicas. Es importante liberar siempre usando delete la memoria reservada con new.
Existe el peligro de prdida de memoria si se ignora esta regla. Cuando se usa el operador delete
con un puntero nulo, no se realiza ninguna accin. Esto permite usar el operador delete con
punteros sin necesidad de preguntar si es nulo antes.
Los operadores new y delete son propios de C++. En C se usan las funciones malloc y free para
reservar y liberar memoria dinmica y liberar un puntero nulo con free suele tener consecuencias
desastrosas.
Por ejemplo:
int main() {
char *c;
int *i = NULL;
float **f;
int n;
c = new char[123];
f = new float *[10]; (1)
f es un puntero que apunta a un puntero que a su vez apunta a un float. Un puntero puede
apuntar a cualquier tipo de variable, incluidos los propios punteros. Este ejemplo nos permite crear
arrays dinmicos de dos dimensiones. La lnea (1) crea un array de 10 punteros a float. La (2) crea
10 arrays de floats. El comportamiento final de f es el mismo que si lo hubiramos declarado como:
float f[10][10];
- 85 -
TALLER DE INFORMTICA
#include <iostream>
using namespace std;
int extremo_intervalo(int menor, int mayor);
int main() {
int a, b;
/*a y b locales de main */
cout << endl << "Ingrese el extremo de un intervalo: ";
cin >> a;
cout << endl << "Ingrese el extremo de un intervalo: ";
cin >> b;
cout << "a,b valen ->" << a << ", " << b << endl;
cout << "llamo a la funcion control pasando a y b y retorna: ";
if (extremo_intervalo(a, b)) cout << "Intercambiados !!";
else cout << "NO Intercambiados !!";
cout << endl;
/* llamo a la funcin */
cout << "a,b siguen valiendo ->" << a << ", " << b << endl;
return 0;
}
/* Esta funcin controla que el extermo inferior del intervalo sea menor o
igual que el extremo mayor */
- 86 -
TALLER DE INFORMTICA
&a
La primera forma es la que se usa para declarar variables de referencia, la asignacin es obligatoria
ya que no pueden definirse referencias indeterminadas. La segunda forma es la que se usa para
definir parmetros por referencia en funciones, en las que las asignaciones son implcitas.
Por ejemplo :
#include <iostream>
using namespace std;
int main() {
int a;
/* defino una variable */
int &r = a;
/* aca vemos que la direccin de la variable r es igual a la
de la varaible a => son lo mismo!! pero con otro nombre */
a = 10;
/* le doy un valor a a */
cout << " a vale ="<< a << endl;
cout << " el valor de de r es ="<< r << endl;
/*muestro el valor de r */
cin.get();
return 0;
}
En este ejemplo las variables a y r se refieren al mismo objeto, cualquier cambio en una de ellas se
produce en ambas. Para todos los efectos, son la misma variable.
#include <iostream>
using namespace std;
int extremo_intervalo(int & menor, int & mayor);
/* ver que existe & */
int main() {
int a, b;
/*a y b locales de main */
cout << endl << "Ingreso el extremo de un intervalo: ";
cin >> a;
cout << endl << "Ingreso el otro extremo de un intervalo: ";
cin >> b;
cout << "a,b valen ->" << a << ", " << b << endl;
- 87 -
TALLER DE INFORMTICA
/* esta funcin controla que el extermo inferior del intervalo sea menor o igual
que el extremo mayor */
En este caso, las variables "a" y "b" tendrn valores distintos despus de llamar a la funcin.
Cualquier cambio que realicemos en los parmetros dentro de la funcin, se har tambin en las
variables referenciadas.
- 88 -
TALLER DE INFORMTICA
#include <iostream>
using namespace std;
void funcion(int *q);
int main() {
int a;
int *p;
a = 100;
p = &a;
// Llamamos a funcion con un puntero funcion(p);
cout << "Variable a: " << a << endl;
cout << "Variable *p: " << *p << endl;
// Llamada a funcion con la direccin
de "a" (constante)
funcion(&a);
/*Sera Equivalente poner funcion(p) */
cout << "Variable a: " << a << endl;
cout << "Variable *p: " << *p << endl;
cin.get();
return 0;
}
void funcion(int *q) {
// Cambiamos el valor de la variable apuntada por el puntero
*q += 50;
q++;
/* vemos que cambio el valor de q, pero no tiene efecto */
}
Dentro de la funcin se modifica el valor apuntado por el puntero, y los cambios permanecen al
abandonar la funcin. Sin embargo, los cambios en el propio puntero son locales, y no se
conservan al regresar. Con este tipo de parmetro para funcin pasamos el puntero por valor.
Y cmo haramos para pasar un puntero por referencia?:
- 89 -
TALLER DE INFORMTICA
Esto nos permite trabajar con los elementos que nos pasan no con una copia.
Por ejemplo:
Esta es una potente herramienta de la que disponemos, aunque ahora no se nos ocurra ninguna
aplicacin interesante.
- 90 -
TALLER DE INFORMTICA
#include <iostream>
using namespace std;
#define TamanioArray 10
#include <iostream>
using namespace std;
int BuscaMenor(int x[]); //prototipo de la funcin
int main()
{
int arreglo[10];
for (int i=0; i < 10; i++)
{
cout << endl << "Ingrese un numero : " << endl;
cin >> arreglo[i];
cout << "El menor valor es: " << BuscaMenor(arreglo)<< endl;
}
return 0;
}
int BuscaMenor(int x[])
//defincin de la funcin
{
int menor=x[0];
// asigno como el menor al 1er elemento del array
for (int i=0; i < 10; i++)
if(x[i]< menor) menor=x[i];
return menor;
}
En este caso el array es de una dimensin, sin embargo, si slo pasamos el nombre del array de
ms de una dimensin no podremos acceder a los elementos del array mediante subndices, ya que
la funcin no tendr informacin sobre el tamao de cada dimensin.
Para tener acceso a arrays de ms de una dimensin dentro de la funcin se debe declarar el
parmetro como un array.
#include <iostream>
using namespace std;
#define N 3
#define M 3
void funcion(int [][M]);
int main() {
int Tabla[N][M]; // arreglo local Tabla;
for (int i=0; i < N; i++)for (int j=0; j<M ; j++)
{cout << "Ingrese un valor : " ;
cin >> Tabla[i][j];
}
funcion(Tabla);
//llamo a la funcion
for (int i=0; i < N; i++)for (int j=0; j<M ; j++)cout << Tabla[i][j] <<
" ";
- 91 -
TALLER DE INFORMTICA
return 0;
}
//Esta funcion solo cambia el valor de un elemento del arreglo
// pasado como referencia
void funcion(int arreglolocal[][M])
{
cout << "Ingrese un valor para cambiar el valor de
arreglolocal[1][1]" << endl;
cin >> arreglolocal [1][1] ;
}
Las estructuras tambin pueden ser pasadas por valor y por referencia.
Las reglas se les aplican igual que a los tipos fundamentales: las estructuras pasadas por valor no
conservarn sus cambios al retornar de la funcin. Las estructuras pasadas por referencia
conservarn los cambios que se les hagan al retornar de la funcin. Por el momento no
profundizaremos en esto.
- 92 -