Professional Documents
Culture Documents
Windows y Mac
LinuxParty se complace en compartir con vosotros este extraordinario Tutorial de C/C++
que hemos tardado ms de un ao en terminar, este tutorial naci a partir de una sugerencia
realizada en una encuesta [Link ya no disponible], y este es el fruto de un ao largo de
trabajo. No ha sido fcil, ni sencillo, pero por fin este documento ve la luz.
Como IDE (Entorno de Desarrollo Integrado) para realizar el curso de programacin, te
recomendamos encarecidamente Geany, para el desarrollo, que tendrs para Linux y
Windows.
Este es el ndice principal del curso:
01.- El compilador GNU cc, (gcc o g++) Qu es, y cmo se utiliza.
02.- Acerca de C/C++
03.- Compiladores e IDEs para C/C++
04.- Estructura de un programa en C/C++ e Introduccin al cdigo fuente.
05.- Introduccin a las sentencias condicionales en C/C++.
06.- Funciones en C/C++.
07.- Matrices en C/C++
08.- Strings, cadenas en C/C++
09.- Punteros en C/C++
10.- Estructuras "Structures" en C/C++
11.- Unions en C/C++
12.- Ficheros en C/++
13.- Programacin Orientada a Objetos en C/C++.
14.- Herencia en C/C++.
15.- Sobrecarga de Operadores en C/C++.
16.- Polimorfismo en C/C++
Recomendamos encarecidamente usar el compilador GCC tanto en Windows como en Mac.
Por supuesto en Linux se utiizar siempre gcc para compilar los programas en C y g++ para
C++, si lo desea puede utilizar en todo momento g++ que en Ubuntu lo han llamado g
El compilador GCC
Sintaxis.
Ejemplos.
Sufijos en nombres de archivo.
Opciones.
Etapas de compilacin.
1. Preprocesado.
2. Compilacin.
3. Ensamblado.
4. Enlazado.
Todo en un solo paso
Enlace dinmico y esttico.
Resumen.
Informacin adicional.
GCC es un compilador integrado del proyecto GNU para C, C++, Objective C y Fortran; es
capaz de recibir un programa fuente en cualquiera de estos lenguajes y generar un programa
ejecutable binario en el lenguaje de la mquina donde ha de correr.
La sigla GCC significa "GNU Compiler Collection". Originalmente significaba "GNU C
Compiler"; todava se usa GCC para designar una compilacin en C. G++ refiere a una
compilacin en C++.
Sintaxis.
gcc [ opcin | archivo ] ...
g++ [ opcin | archivo ] ...
Las opciones van precedidas de un guin, como es habitual en UNIX, pero las opciones en
s pueden tener varias letras; no pueden agruparse varias opciones tras un mismo guin.
Algunas opciones requieren despus un nombre de archivo o directorio, otras no.
Finalmente, pueden darse varios nombres de archivo a incluir en el proceso de
compilacin.
Ejemplos.
gcc hola.c
compila el programa en C hola.c, gener un archivo ejecutable a.out.
gcc -o hola hola.c
compila el programa en C hola.c, gener un archivo ejecutable hola.
.c
fuente en C
.m
fuente en Objective-C
.i
C preprocesado
.ii
C++ preprocesdo
.s
.o
cdigo objeto
.h
Opciones.
-c
realiza preprocesamiento y compilacin, obteniento el archivo en cdigo
objeto; no realiza el enlazado.
-E
realiza solamente el preprocesamiento, enviando el resultado a la salida
estndar.
-o archivo
indica el nombre del archivo de salida, cualesquiera sean las etapas cumplidas.
-Iruta
especifica la ruta hacia el directorio donde se encuentran los archivos
marcados para incluir en el programa fuente. No lleva espacio entre la I y la
ruta, as: -I/usr/include
-L
especifica la ruta hacia el directorio donde se encuentran los archivos de
biblioteca con el cdigo objeto de las funciones referenciadas en el programa
fuente. No lleva espacio entre la L y la ruta, as: -L/usr/lib
-Wall
muestra todos los mensajes de error y advertencia del compilador, incluso
algunos cuestionables pero en definitiva fciles de evitar escribiendo el cdigo
con cuidado.
-g
incluye en el ejecutable generado la informacin necesaria para poder rastrear
los errores usando un depurador, tal como GDB (GNU Debugger).
-v
muestra los comandos ejecutados en cada etapa de compilacin y la versin
del compilador. Es un informe muy detallado.
Etapas de compilacin.
El proceso de compilacin involucra cuatro etapas sucesivas:
preprocesamiento, compilacin, ensamblado y enlazado. Para pasar de un
programa fuente escrito por un humano a un archivo ejecutable es necesario
realizar estas cuatro etapas en forma sucesiva. Los comandos gcc y g++ son
capaces de realizar todo el proceso de una sola vez.
1. Preprocesado.
En esta etapa se interpretan las directivas al preprocesador. Entre otras cosas,
las variables inicializadas con #define son sustitudas en el cdigo por su valor
en todos los lugares donde aparece su nombre.
$ gcc -S circulo.c
realiza las dos primeras etapas creando el archivo circulo.s; examinndolo con
$ more circulo.s
puede verse el programa en lenguaje ensamblador.
3. Ensamblado.
El ensamblado transforma el programa escrito en lenguaje ensamblador a
cdigo objeto, un archivo binario en lenguaje de mquina ejecutable por el
procesador.
$ gcc -c circulo.c
donde se crea el archivo circulo.o a partir de circulo.c. Puede verificarse el tipo de archivo
usando el comando
$ file circulo.o
circulo.o: ELF 32-bit LSB relocatable, Intel 80386, version 1, not stripped
En los programas extensos, donde se escriben muchos archivos fuente en cdigo C, es muy
frecuente usar gcc o g++ con la opcin -c para compilar cada archivo fuente por separado, y
luego enlazar todos los mdulos objeto creados. Estas operaciones se automatizan
colocndolas en un archivo llamado makefile, interpretable por el comando make, quien se
ocupa de realizar las actualizaciones mnimas necesarias toda vez que se modifica alguna
porcin de cdigo en cualquiera de los archivos fuente.
4. Enlazado
Las funciones de C/C++ includas en nuestro cdigo, tal como printf() en el
ejemplo, se encuentran ya compiladas y ensambladas en bibliotecas existentes
en el sistema. Es preciso incorporar de algn modo el cdigo binario de estas
funciones a nuestro ejecutable. En esto consiste la etapa de enlace, donde se
renen uno o ms mdulos en cdigo objeto con el cdigo existente en las
bibliotecas.
Es instructivo usar la opcin -v de gcc para obtener un informe detallado de todos los pasos
de compilacin:
$ gcc -v -o circulo circulo.c
Resumen.
Para producir un ejecutable con fuente de un solo archivo:
$ gcc -o circulo circulo.c
Para crear un mdulo objeto, con el mismo nombre del fuente y extensin .o:
$ gcc -c circulo.c
Para enlazar un mdulos objeto:
$ gcc -o circulo circulo.o
Para enlazar los mdulos objeto verde.o, azul.o, rojo.o, ya compilados
separadamente, en el archivo ejecutable colores:
$ gcc -o colores verde.o azul.o rojo.o
Informacin adicional.
Sobre GCC: man gcc info gcc
pgina info de GCC, ms completa y
actualizada que la pgina man.
Sobre el depurador: man gdb info gdb
Contenido
I. Acerca de C
1.
2.
3.
4.
5.
Qu es C?
Desarrollo de lenguaje C
C como lenguaje de propsito general
Historia de C
Caractersticas de C
2.
3.
4.
5.
6.
7.
8.
9.
Constantes
Tipos de datos
Tipo de datos numricos
Tipo de datos - No numrico
Tipo de datos - Entero
Tipo de datos - real
Tipo de datos - lgicos
Tipo de datos - Enumerado
Historia de la C
Ao
Lengua
Desarrollado por:
je
1960
ALGOL
International
Committee
1963
CPL
Universidad
deCambridge
1967
BCPL
Martin Richards
1970
1972
Cerca de
los 80s
C++
Detalles
Caractersticas de C
- Simple, es un lenguaje verstil, de uso general
- Los programas son rpidos y eficientes
- Tiene amplio conjunto de operadores
- Ms general y no tiene restricciones
- Manipula fcilmente bits, bytes y direcciones
- Variedades de tipos de datos estn disponibles
- Es posible compilar las funciones de forma separada y las funciones se las
puede llamar por cualquier programa C
Constantes
Variables
Operadores
Declaraciones
Por lo tanto, antes de escribir un programa debera tener claro que son todos
los componentes anteriormente mencionados. Segn el ejemplo anterior, cada
programa es un conjunto de declaraciones, y la declaracin es una
instruccin para el equipo, que es una coleccin de constantes, variables,
operadores y sentencias.
Constantes
Una constante es un valor fijo, que nunca se altera durante la ejecucin de un
programa.
Las constantes se pueden dividir en dos categoras principales:
1. Constantes Primaria
2. Constantes Secundaria
Tipos de datos
La clase datos que pueden contener las variables usadas en un lenguaje de
programacin es conocido como el tipo de datos.
Los Tipos bsicos de datos son los siguientes:
1.
2.
3.
4.
5.
6.
Tipo
Tipo
Tipo
Tipo
Tipo
Tipo
de
de
de
de
de
de
datos
datos
datos
datos
datos
datos
numricos
No numrico
Entero
real
lgicos
Enumerado
Range: high
Keyword Range: low
Digits of
precision
Bytes of
memory
FormatoID
char
-128
127
n/a
%c
int
-32, 768
32, 767
N/a
2 (on 16 bit
processor)
%d
long
-2,147, 483,
648
%ld
float
3.4 x 10-38
3.4 x 1038
%f
double
15
%lf
19
10
%Lf
Quiero que usted consulte esta pgina para obtener ms informacin sobre el
tipo de int para diferentes procesadores:
http://www.jk-technology.com/c/inttypes.html
Para Red Hat, consiga un gcc-c RPM, por ejemplo, utilizando rpmfind y luego
instalar (como root) con
rpm -ivh gcc-c -version-release.arch.rpm
Para Fedora Core / CentOS, instalar el compilador GCC C (como root) mediante el
uso de
yum install gcc-c
Para Mandrake, instale el compilador GCC C (como root) mediante el uso de
urpmi gcc-c
DevCpp-IDE)
Vaya hacia abajo para leer la licencia y luego a los enlaces de descarga. Descargar
una versin con MinGW / GCC. Es mucho ms fcil. Con una demora muy pequea
(slo unos das) que siempre obtendr la versin ms actualizada de MinGW
empaquetado con el IDE devcpp.
Usted recibe un archivo ejecutable que puede ser ejecutado a nivel de usuario en
cualquier versin de WinNT. Si usted quiere que sea la configuracin para todos los
usuarios, necesita derechos de administrador. Se instalar devcpp y MinGW en las
carpetas deseadas
Encontrar similitudes con MSVC, incluyendo el men y ubicacin de los botones. Por
supuesto, muchas cosas son algo diferentes si estaban familiarizados con la versin antigua,
pero es tan simple como un puado de clics para que su ejecucin del primer programa.
1.4. Cmo crear, compilar y ejecutar programas
Si est utilizando Linux, para crear o editar un programa:
vi hello.cpp
/* 0001_hello.c */
#include <stdio.h>
int main()
{
printf("\nHello world");
return 0;
}
C Programa de ejemplo:
/* 0001_hello.cpp */
#include <iostream>
using namespace std;
int main()
{
cout << endl << "Hello, Happy programming";
return 0;
}
4. putch
5. getche
6. getchar
Indicarle que, cada programa es un conjunto de sentencias, y cada sentencia es una
instruccin (o ms de una) para el equipo, que es una coleccin de constantes, variables,
operadores y declaraciones.
Debemos indicar, que durante el curso, todo aquello que aparezca entre < y > indica que su
uso es opcional, y depender tanto del desarrollador como de las exigencias del programa.
No obstante, en las sentencias #include incorporan estos caracteres y su uso es obligatorio
para indicar al compilador que durante el proceso de creacin deber incluir dicho fichero
que contiene sentencias o variables fundamentales para el programa.
Estructura de un programa en C
< tipo
{
<
<
<
}
Vamos a comenzar con las sentencias de entrada / salida Estados ya que juegan un papel
fundamental en nuestros programas.
Sentencias de E/S
printf
Este comando muestra el literal dado / prompt / identificadores en la pantalla con el
formato determinado.
Sintaxis:
printf(< "prompt/cadena literal/id del formato, escape/caracter " >, id1,id2, .....);
Ejemplo:
printf("Hola");
printf("Estudiante nmero : %d", sno);
printf("Nombre del alumno: %s", name);
printf("3 Marcas importantes: %d, %d, %d", m1, m2, m3);
1. Cdigo fuente
/* 02_print.c */
#include <stdio.h >
int main( )
{
printf("Hello");
return 0;
}
Caracteres de Escape
Sentencias de escape ms comunes.
Secuencia escape
Caracter.
--------------------+-------------------------------------------\a
--------------------+-------------------------------------------\b
Borra un especio
--------------------+-------------------------------------------\f
--------------------+-------------------------------------------\n
Nueva lnea
--------------------+-------------------------------------------\r
Retorno de carro
--------------------+-------------------------------------------\t
Tabulador
--------------------+-------------------------------------------\\
--------------------+-------------------------------------------\'
--------------------+-------------------------------------------\"
--------------------+-------------------------------------------\xdd
Representaciones hexadecimales.
--------------------+--------------------------------------------
=======================================================
/* 03_esc.c */
#include <stdio.h>
int main()
{
printf("\nHello");
return 0;
}
=======================================================
/* 04_multi.c */
#include <stdio.h>
int main()
{
printf("\nNombre de la persona");
printf("\nStreet, Apartment//House No. ");
printf("\nzip, City");
printf("\nCountry");
return 0;
}
|precisin
| Bytes memoria
----------------+---------------+---------------+---------------+---------------+-----------Char
| -128
| 127
N/a
|1
| %c
----------------+---------------+---------------+---------------+---------------+-----------Int
| -32, 768
| 32.767
N/a
|2
| %d
----------------+---------------+---------------+---------------+---------------+------------
| Format-
Long
| -2.147.483.647| 2.147.483.647
N/a
|4
| %ld
--------------------------------+---------------+---------------+---------------+-----------Float
|4
| %f
----------------+---------------+---------------+---------------+---------------+-----------Double
| -1.7 x 10^308
| 1.7 x 10^308 |
15
|8
| %lf
----------------+---------------+---------------+---------------+---------------+-----------long double
19
| 10
----------------+---------------+---------------+---------------+---------------+------------
=======================================================
| %Lf
=======================================================
scanf("%d", &sno);
scanf("%s", name);
=======================================================
/* 07_scanf.c */
#include <stdio.h>
int main()
{
int a , b, c;
scanf("%d", &a);
scanf("%d", &b);
c = a + b;
printf("\nLa Suma es %d", c);
return 0;
}
=======================================================
=======================================================
/* 08_sum.c */
#include <stdio.h>
int main()
{
int a , b, c;
=======================================================
=======================================================
/* 09_formula.c */
#include <stdio.h>
int main()
{
int a, b, c;
printf("Introduzca un valor para A "); scanf("%d", &a);
=======================================================
=======================================================
/* 10_emp.c */
#include <stdio.h>
int main()
{
int eno;
char name[10];
=======================================================
=======================================================
/* 11_stud.c */
#include <stdio.h>
int main()
{
/* declaramos valores enteros */
int sno, sub1, sub2, sub3, total;
/* declaramos la variable ?name? de longitude 10 */
char name[10];
/* declaramos la variable avg, como decimal flotante */
float avg;
clrscr();
=======================================================
Ms sentencias de E/S
Gets:
Acepta una cadena desde el teclado. Acepta toda la cadena que se introduzca hasta que se
pulse intro
Sintaxis:
scanf(<format id/esc char">, id1,id2, .....);
Ejemplos:
scanf("%d", &edad);
scanf("%s", nombre);
scanf("%d%d%d", &m1, &m2, &m3);
Puts:
Muestra el valor de la cadena dada en la pantalla.
Sintaxis:
puts( <id.> / <"prompt">);
Ejemplos:
puts(nombre);
puts(calle);
Sintaxis:
putch(<char>).
Ejemplo:
putch('a');
putch(65);
Sintaxis:
char = getch().
Ejemplo:
ch = getch();
option = getch();
Ejemplo.
If( a>b )
printf("A is big");
else
printf("B is big");
Nota: No siempre sera necesario una sentencia de dos bloques, si el Segundo
bloque no es necesario que se ejecute.
/* 12_if.c */
#include <stdio.h>
int main()
{
int a, b; /* Declaracin de las variables. */
printf("\nIntroducir valor para A: "); scanf("%d", &a); /* Lee valor de
A */
printf("\nIntroducir valor para B: "); scanf("%d", &b); /* Lee valor de
B */
if( a>b ) /* Comparamos ambos */
printf("A es mayor");
else
printf("B es mayor");
return 0;
} /* End */
Operadores aritmticos
Operador
Proposito
Adicin
Subtraccin
Multiplicacin
Divisin
Operadores Unitarios
Operador
Propsito
++
Incremento en 1
--
Decremento en 1
sizeof
Tamao en bytes
(type)
Cast
Operadores relacionales
Operador
Propsito
<
Menor qu
<=
Menor o igual qu
>
Mayor qu
>=
Mayor o igual qu
Operadores de Igualdad
Operador
Propsito
==
Igual a:
!=
No igual a:
Operadores lgicos
Operador
Propsito.
&&
AND
||
OR
NOT
Purpose
&
AND
OR
NOT
XOR
<<
Desplazamiento a la izquierda
>>
Desplazamiento a la derecha
Operadores
Asociativo
Operadores unitarios
- ++ -- ! sizeof (type)
R to L
Aritmticos, multiplicacin,
division y mdulo
*/%
L to R
+-
L to R
Operadores relacionales
L to R
Operadores de igualdad
== !=
L to R
Operadores lgicos
&& ||
L to R
Operadores condicionales
?:
R to L
Operadores de asignacin
= += -= *= /= %=
R to L
Ms ejercicios
La razn que perseguimos para hacer ms ejercicios es la de familiarizarse con
las sentencias aprendidas, si est seguro, entonces no tendr que ejecutar los
siguientes programas.
3. Instruccin switch
Sentencia multicondicional que tiene la posibilidad de comprobar una variable
a travs de ms de una expresin
Sintaxis:
switch(<id>)
{
case <expr.> : <st. block>; break;
case <expr.> : <st. block>; break;
......
Default : <st. block>;
}
Ejemplo
switch(week)
{
case 1 : printf( "Lunes"); break;
case 2 : printf( "Martes"); break;
.
.
case 7: printf("Domingo"); break;
default : printf("Entrada equivocada");
}
switch */
/* 18_switch.c */
#include <stdio.h>
int main()
{
int week;
printf("Introducir el nmero del da de la semana "); scanf("%d",
&week);
switch(week)
{
case 1 : printf ("Lunes"); break;
case 2 : printf ("Martes"); break;
case 3 : printf ("Mircoles"); break;
case 4 : printf ("Jueves"); break;
case 5 : printf ("Viernes"); break;
case 6 : printf ("Sbado"); break;
case 7 : printf ("Domingo"); break;
default : printf("Wrong Entry");
}
return 0;
}
1. La sentencia controvertida:
No se recomienda utilizar la sentencia goto, no obstante es la nica forma de poderte
permitir salir de algn bloque de sentencias anidadas, evita utilzarlo siempre que puedas.
Goto: Transfiere el control del puntero de un lugar a otro en el programa actual.
Sintaxis:
goto <label>;
Note: La etiqueta debe ser definida con el caracter de dos puntos ":" y no debe exceeder el
nombre de los 32 caracteres de longitud.
Ejemplo.
abc:
printf("Hello");
goto abc;
2. Sentencias de Looping
Utilice una sentencia iterativa para ejecutar un bloque de instrucciones un nmero de veces.
Sintaxis:
for(I=1;I<=10; I++)
printf("\n%d",i);
Ejemplo:
http://www.youtube.com/watch?v=z1Zj9Yc3asQ&feature=related
{
int i, t;
clrscr();
for(t = 1; t <= 20; t++) /* Un loop ms */
for(i = 1; i <= 20; i++ )
printf("\n%d * %d = %d", i, t, i * t);
return 0;
}
For:
Algunos ejemplos ms de loops.
/* Loop infinito */
for ( ; ; )
{
printf("\nHello");
}
/* Interrupcin explcita de un loop */
for ( i=1; ; )
{
printf("\n%d", i++);
if ( i> 5 ) break;
}
while:
Una sentencia iterativa para ejecutar un bloque de sentencias hasta que la condicin sea
satisfecha.
do.. while:
Esta declaracin iterativa ejecuta un bloque de instrucciones desde el comienzo y luego
comprueba la validez de la condicin. Si la condicin es verdadera se ejecuta el bloque de
instrucciones otra vez y viceversa.
Syntax:
Syntax:
do
{
<st. block>
} while(<condition>);
Ejemplo:
Los siguientes ejemplos muestran los nmeros del 1 al 10
int main()
{
int i=1;
while( i<=10)
{
printf("\n%d",i);
i++;
}
return 0;
}
int main()
{
int i=1;
do
{
printf("\n%d",i);
i++;
}while(i<=10);
return 0;
}
i ++;
}
return 0;
return 0;
}
}
/* 17. Demostracin del comando while */ /* 18. Demostracin de do */
/* Note : Si el valor inicial es 100 cual
/* Nota : Si el valor inicial es 100 cual
ser la salida? Comprubalo */
ser la salida? Comprubalo */
/* 30_demow.c */
#include <stdio.h>
int main()
{
int i;
i = 1;
while( i<= 10 )
{
printf("\n%d", i);
i++;
}
return 0;
}
/* 31_demod.c */
#include <stdio.h>
int main()
{
int i;
i = 1;
do
{
printf("\n%d", i);
i++;
}while( i<= 10 );
return 0;
}
3. Funcin de Devoluciones
4. Funcin con recursin
VI. Punteros y funciones
1. Paso de parmetros por referencia
2. Llamada por valor
3. Llamada por referencia
VII. Local vs Global
VIII. Los especificadores de la clase de almacenamiento
Clase de Almacenamiento Automtico
Clase de almacenamiento Registro
Clase de almacenamiento Esttico
Clase de Almacenamiento Externo
I. Introduccin
Aqu hay un programa para imprimir la direccin de una persona dos veces,
lo que est escrito en la letra b
printf("\nCountry");
return 0;
}
#include <stdio.h>
void address()
{
printf("\nName of the Person");
printf("\nStreet, Apartment//House No. ");
printf("\nzip, City");
printf("\nCountry");
}
int main()
{
address();
address();
return 0;
}
II. Definicin de funciones
Un
Funcin
Sintaxis
Ejemplo
Resultado
Abs
Abs(n)
abs(-35)
35
ceil
ceil(n)
ceil(45.232)
46
floor
floor(n)
floor(45.232)
45
fmod
fmod(n,m)
fmod(5,2)
cos
cos(n)
cos(60)
0.5
sin
sin(n)
sin(60)
0.866
tan
tan(n)
tan(60)
1.732
sqrt
sqrt(n)
sqrt(25)
pow
pow(n,m)
pow(2,3)
Funciones
Sintaxis
Ejemplo.
strlen
strlen(str)
strlen("Computer")
strcpy
strcpy(target,source)
strcpy(res,Pass)
strcat
strcat(target,source)
strcat("mag","gic")
strcmp
strcmp(str1,str2)
strcmp("abc","Abc")
strrev
strrev(target,scr)
fstrrev(res,LIRIL)
Descripcin
isalnum
isalpha
isdigit
iscntrl
isascii
islower
isupper
isspace
isxdigit
es
es
es
es
es
es
es
es
es
acerca
las entraas de estas funciones.
Estas y cerca de otras 400 funciones ya estn definidos y compilados para
usted
en la biblioteca de Turbo C (por ejemplo). Para usarlos, basta con
incluir el
archivo cabecera apropiado en su programa, "La biblioteca en tiempo de
ejecucin",
consulte el manual de referencia para asegurarse de cmo llamar a las
funciones, y
qu valor (si los hay) devuelve.
Pero usted tendr que escribir sus propias funciones. Para ello, es
necesario
romper el cdigo en secciones independientes (funciones) que cada una
realiza una
tarea simple, comprensible para sus funciones, se las puede llamar a
travs de su
programa de la misma manera que las llamara a las funciones C de la
biblioteca.
Pasos para implementar una funcin
1. Declaracin
2. Funcin de llamada
3. Definicin
Todas las funciones deben ser declaradas al principio del programa.
Definir la funcin que contiene el cdigo real de ejecucin de la
tarea.
Si una funcin se define en el inicio del programa, no hay necesidad de
declarar
la funcin.
Una funcin de ejemplo para demostrar lo enseado.
/* 32_egfun.c */
#include <stdio.h>
void address();
/* Declaracin */
int main()
{
address();
address();
/* Llamada a la funcin */
/* Llamada a la funcin */
return 0;
void address()
/* Definicin */
{
printf("\nName of the Person");
printf("\nStreet, Apartment//House No. ");
printf("\nzip, City");
printf("\nCountry");
}
Funciones Simple
Function con Argumentos
Function que retornan (un valor)
Function con Recursin
1. Funciones Simple
Realizan slo una tarea especfica, sin necesidad de argumentos ni
devolver
valores.
Ejemplo de una funcin simple
/* 33_line.c */
#include <stdio.h>
void line();
/* Declaraciln */
int main()
{
line();
/* Llamada a la funcin*/
return 0;
}
void line()
/* Definicin */
{
int i;
for(i =1;i<80; i++)
putch("*");
}
/* 34_argu.c */
void line(char ch, int n)
int main()
{
line("-", 50);
line("*", 8);
return 0;
}
void line(char ch, int n)
{
int i;
for( i = 1; i<=n; i++ )
putch(ch);
}
/* 35_retu.c */
int abs(int n);
int main()
{
int res;
printf("%d", abs(-35))
res = abs(-34);
printf("%d", res);
return 0;
}
void abs(int n)
{
/* Function Call*/
if( n < 0 )
n = n * -1;
return n;
}
void disp( );
int main( )
{
disp( );
return 0;
}
void disp( )
{
printf("\nHello");
disp( );
}
/* 36_recursion.c */
int i = 1;
/* Declaring a global variable */
void disp( );
int main( )
{
disp( );
return 0;
}
void disp( )
{
printf("\nHello %d ", i);
i ++;
if( i < 10 ) /* if i value is less than 10 then call the function
again */
disp( );
}
/* 37_fact.c */
int factorial(int x);
void main
{
int a, fact;
printf("\nEnter any number "); scanf("%d", &a);
fact = factorial(a);
printf("\nFactorial is = %d", fact);
}
int factorial(int x)
{
int f = 1, i;
for( i = x; i>=1; i--)
f = f * i;
return f;
}
/* 38_fact.c */
int rec_fact(int x);
int main( )
{
int a, fact;
printf("\nEnter any number "); canf("%d", &a);
fact = rec_fact(a);
printf("\nFactorial value is = %d", fact);
return 0;
}
int f = 1;
int rec_fact(int x)
{
if( x > 1)
f = x * rec_fact(x-1);
return f;
}
#include <stdio.h>
/* #include <conio.h> */
int main()
{
int a;
/* Declaracin de la variable a */
int *dir;
/* Declaracin de un puntero a una variable */
a = 7;
dir = &a;
Cuando en alguna una parte del programa, los argumentos reales, llaman
a una funcin y los valores son alterados dentro de la funcin sern
devueltos a la parte llamada por programa principal en su forma
modificada.
Esta forma de trabajar, se denomina como llamadas por referencia o
llamadas
por su direccin. El uso de punteros como un argumento de una funcin de
este mecanismo permite a los objetos de los datos ser modificados
globalmente
es decir, tanto dentro de la funcin, como en la parte que llam del
programa.
Cuando se pasa un puntero a una funcin, la direccin del argumento se
pasa a
las funciones y el contenido de esta direccin se accede globalmente.
Los cambios realizados en los parmetros formales (parmetros utilizados
en
la funcin) afectan al valor original de los parmetros actuales (los
parmetros utilizados en la llamada de funcin en el programa de
llamada).
Por ejemplo.
/* 39_func.c */
void func_c( int *x );
int main()
{
int i = 100;
int *a;
a = &i;
printf("\nThe value is %d", i);
func_c(a);
printf("\nThe value is %d", i);
return 0;
}
void func_c( int *x )
{
(*x) ++;
printf("\nThe value in function is %d ", *x);
}
/* 40_callbyvalue.c */
void swap( int x, int y )
int main( )
{
int a = 10, b = 20;
swap( a ,b );
printf("\n a = %d, b = %d ", a, b);
*/
return 0;
}
void swap( int x, int y )
{
int t;
t = x;
x = y;
y = t;
printf("\nx = %d, y = %d", x, y);
/* Muestra a = 10, b = 20
*/
}
X = 20 y = 10
A = 10 b = 20
Tenga en cuenta que el valor de A y B permanecen sin cambios despus
de cambiar el valor de x e y.
3. Llamada por referencia
Esta vez las direcciones de los argumentos reales en la funcin de
llamada
se copian en argumentos formales de la funcin que llama. Esto significa
que
al utilizar estas direcciones tendramos un acceso a los argumentos
reales y
por lo tanto que sera capaz de manipularlos. El programa siguiente
ilustra
este hecho.
/* 41_callbyref.c */
void swap( int *x, int *y )
int main()
{
int a = 10, b = 20;
swap( &a, &b);
printf("\na = %d, b = %d", a, b);
return 0;
}
void swap( int *x, int *y )
{
int t;
t = *x; *x = *y; *y = t;
}
int main()
{
int radius;
float area, perimeter;
printf("\nEnter radius of a circle :"); scanf("%d", &radius);
areaperi(radius, &area, &perimeter);
printf("\nArea = %f ", area);
printf("\nPerimeter = %f", perimeter);
return 0;
}
void areaperi(int r, float *a, float *p)
{
*a = 3.14 * r * r;
*p = 2 * 3.14 * r;
}
Por lo tanto, hemos sido capaces de devolver dos valores de una funcin
llamada, y por lo tanto, han superado la limitacin de la instruccin
return, que puede devolver un solo valor de una funcin a la vez.
VII. Variables globales vs Locales
Segn el mbito donde las variables se declaran como identificadores de
tipos.
ser donde funcionen...
/* 42_globalid.cpp */
int i=4000; /* Global variable declaration*/
int main()
{
int a=10, b=20;
int i=100;
/* Local Variable */
/* Local Variable */
Clase
Clase
Clase
Clase
de
de
de
de
almacenamiento
almacenamiento
almacenamiento
almacenamiento
Automtico
Registro
Estticos
Externos
auto int i, j;
printf("%d %d", i, u);
return 0;
}
/* 45_static.c */
#include <stdio.h>
void add();
int main()
{
add();
add();
add();
return 0;
}
void add()
{
static int i = 1;
printf("%d\n",i++);
}
3. Elementos de la matriz
4. Pasar matrices a funciones
5. Tipos de matrices
1. Aadir elemento
2. Insertar elemento
3. Eliminar elemento
4. Reemplazar elemento
5. Buscar un elemento
6. Supresin de la matriz
7. Clasificacin de una matriz
- Arreglos multidimensionales
Matriz de Operaciones con matrices multidimensionales
1. Introduccin a las matrices
Una variable puede contener un valor constante. Slo un nico valor
constante
y no es posible llevar a cabo ms de un valor en una variable.
En el ejemplo siguiente se muestra el alcance de una variable.
#include <stdio.h>
int main()
{
int sno;
sno = 1001;
sno = 1008;
sno = 1005;
printf("%d", sno);
return 0;
}
Salida: Nada
#include <stdio.h>
int main()
{
int sno;
sno 0 = 1001;
sno 1 = 1008;
sno 2 = 1005;
printf("%d", sno);
return 0;
}
Salida: Nada
El programa mostrado encima le devolver una lista de errores, debido a
que
el enfoque est equivocado.
Vamos a continuar con el programa siguiente para obtener 0 errores de
programa
#include <stdio.h>
int main()
{
int sno[3];
sno[0] = 1001;
sno[1] = 1008;
sno[2] = 1005;
printf("%d", sno[2]);
return 0;
}
/* 3 valores insertados */
/* El primer valor insertado 1001 */
/* El siguiente valor insertado 1008 */
/* y el siguiente valor insertado 1005 */
/* Imprime el segundo valor insertado */
Salida: 1005
En el programa anterior, la variable sno puede tener ms de un nmero.
Es fcil, utilizando la tcnica multi-ubicacin, tambin conocida como
matrices.
2. Acerca de matrices
Las matrices contienen una serie de elementos de datos todos del mismo
tipo. Este
tipo puede ser un tipo de datos simple, una estructura o una clase. A los
items de
una matriz se les llama elementos. A los elementos se accede por un
nmero, a este
nmero se le denomina ndice. Los elementos pueden ser inicializados con
los valores
especficos cuando la matriz se define.
Las matrices pueden tener varias dimensiones.
Una matriz de dos dimensiones es una matriz de una matriz. La direccin
de una
matriz puede ser utilizado como un argumento a una funcin, la propia
matriz
no se copia. Las matrices pueden ser utilizadas como datos por los
miembros de las
clases.
Se debe tener cuidado para evitar que los datos que sean colocados en la
memoria
no estn fuera de la matriz.
printf("\n\n");
return 0;
Al igual que otras variables en C, una matriz debe definirse antes de que
pueda
ser utilizada para almacenar informacin. Y, al igual que otras
definiciones,
requiere un tipo de variable y un nombre.
Pero incluye otra caracterstica: el tamao. El tamao especifica cuantos
elementos contendr la matriz. Sigue inmediatamente al nombre, y est
entre
corchetes.
3. Elementos de la matriz
Los items de una matriz se denominan elementos. Una matriz unidimensional
es capaz de almacenar slo un conjunto de valores. Una matriz
bidemensional
acepta los valores tanto de una fila como en una columna.
El primer elemento se almacena en la posicin 0, el segundo en la 1 y as
sucesivamente.
El valor de la matriz se puede inicializar directamente en tiempo de
diseo.
La Inicializacin de matrices es la siguiente ..
void display (float [DISPLAY] [meses]);
4. Pasar matrices a funciones
Las matrices pueden ser utilizados como argumentos en las funciones.
En la declaracin de una funcin, el tipo de datos y el tamao de la
matriz
representan los argumentos de la matriz.
Cuando la funcin se llama, slo el nombre de la matriz se utiliza como
un argumento.
pantalla (ventas);
Programa para aceptar e imprimir 10 elementos
/* 48_ ele10.c */
#include <stdio.h>
#define MAX 10
display(int a[MAX])
{
int i;
for(i = 0;i<MAX; i++)
printf("\n%d",,a[i]);
}
int main()
{
int x[MAX], i;
for(i=0;i<MAX; i++)
scanf("%d",&x[i]);
display(x);
return 0;
}
Agregar elemento
Insertar elemento
Borrar elemento
Remplazar elemento
Buscar elemento
Borrar el array
Ordenar el array
/* ARRAY FUNCTIONS */
/* 49_sarray.c */
#include <stdio.h>
#define N 100
#define M 10
int i,j,r,c,r1,r2,c1,c2;
/* Lectura de los elementos del array */
int accept_values(int a[N])
{
int n;
printf("\nCuantos valores vas a introducir (por ejemplo, 4)..? ");
scanf("%d",&n);
printf("\nIntroducuzca los valores y pulse intro..\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
return n;
}
/* Mostrar los elementos del array */
void display(int a[N],int n)
{
printf("\n Los elementos del Array son...");
for(i=0;i<n;i++)
printf("\n%d",a[i]);
{
int temp;
for(i=0;i<n;i++)
for(j=i;j<n;j++)
if(a[i] < a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
printf("\nLos elemenos ordenados de forma descendiente son...");
}
/* Ordenar la lista de elementos de forma ascendiente */
void sort_list_ascend(int a[N],int n)
{
int temp;
for(i=0;i<n;i++)
for(j=i;j<n;j++)
if(a[i] > a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
printf("\nLos elemenos ordenados de forma descendiente son..");
}
/* Buscar el elemento ms grande y ms pequeo de un array */
void small_big(int a[N],int n)
{
int temp;
for(i=0;i<n;i++)
for(j=i;j<n;j++)
if(a[i] < a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
printf("\nEl elemento ms pequeo es : %d",a[n-1]);
printf("\nEl mayor elemento es : %d",a[0]);
}
/* Buscar un elemento en un array */
void search(int a[N],int n)
{
int target, temp=0;
printf("\n Introduzca el elemento a buscar: ");
scanf("%d",&target);
for(i=0;i<n;i++)
if(a[i] == target)
{
printf("\nEncontrado en la posicin nmero: %d",i+1);
temp = 1;
}
if(temp == 0)
printf("\n No encontrado.");
}
/* Programa principal */
/* Demostrar operaciones con arrays */
#define m 100
int main()
{
int a[m],n; char ch;
/* clrscr(); */
n = accept_values(a);
do
{
printf("\n Men principal, eliga una opcin\n\n\n");
printf("\n 1 - Append_cell");
printf("\n 2 - Delete_cell");
printf("\n 3 - Insert_cell");
printf("\n 4 - Sort_list_descend");
printf("\n 5 - Sort_list_ascend");
printf("\n 6 - Small_big");
printf("\n 7 - Search");
printf("\n 8 - Remove_list");
printf("\n 9 - Exit");
printf("\n\n Elegir una opcin: ");
ch = getchar();
printf("\n");
switch(ch)
{
case '1': n = append_cell(a,n); break;
case '2': n = delete_cell(a,n); break;
case '3': n = insert_cell(a,n); break;
case '4': sort_list_descend(a,n); break;
case '5': sort_list_ascend(a,n); break;
case '6': small_big(a,n); break;
case '7': search(a,n); break;
case '8': n = 0; break;
case '9': printf("\nDeseas terminar el programa."); break;
}
display(a,n);
printf("\nDeseas ejecutarlo nuevamente..(9 - Fin/n)?");
ch = getchar();
}
while(ch!='9');
return 0;
}
/* 50_menumat.c */
#define N 100
#define M 10
int i, j, r, c, r1, r2, c1, c2;
/* Read the values for a MATRIX */
void read_matrix(int A[M][M])
{
printf("\nHow many rows? ");
scanf("%d",&r);
printf("\nHow many columns? ");
scanf("%d",&c);
for(i=0;i<r;i++)
for(j=0;j<c;j++)
scanf("%d",&A[i][j]);
}
/* Write the values of a MATRIX */
void disp_matrix(int A[M][M])
{
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
printf("%5d",A[i][j]);
printf("\n");
}
}
/* To find the TRANSPOSE for a MATRIX of ANY ORDER */
void tra_matrix_1(int T[M][M],int A[M][M])
{
printf("\nTranspose of A is\n");
for(i=0;i<c1;i++)
{
for(j=0;j<r1;j++)
{
T[i][j] = A[j][i];
printf("%5d",T[i][j]);
}
printf("\n");
}
}
/* To ADD two MATRICES ( possible,only if they are of EQUAL ORDER ) */
void add_matrix(int C[M][M],int A[M][M],int B[M][M])
{
for(i=0;i<r;i++)
for(j=0;j<c;j++)
add_matrix(C,A,B);printf("\nMatrix C\n");
disp_matrix(C);
}
else
{
Addition.");
Multiplication.");
r2.");
} break;
case '4':
%d",c1,r1); break;
}
printf("\nDo you wish to run again...[y/n]?"); ch=getche();
}while(ch!='5');
return 0;
Definicin de Strings
Inicializacin de Strings
Leyendo e imprimiendo Strings
Leyendo blancos embebidos
Longitud de una cadena
Cadenas y funciones
Array de Strings
Introduccin.
Los Arrays son usados para examinar cadenas, Generalmente los strings son
arrays
del tipo cadena.
Una cadena es una coleccin de caracteres incluyendo el espacio donde una
palabra es una coleccin
de caracteres excluyendo el espacios. Todas las variables del tipo string deben
tenerminar con
los caracteres \ 0 null y el valor de inicio que comienza por 0
Cada cadena tiene las siguientes caractersticas:
6. Una cadena que se debe declarar con un tamao fijo, como las matrices.
1. Definicin de Strings
2. Inicializacin de Strings
3. Leyendo e imprimiendo Strings
4. Leyendo blancos embebidos
5. Longitud de una cadena
6. Cadenas y funciones
7. Array de Strings
1. Definicin de Strings
char name[10];
strcpy(name, "Ashitha");
name = "Ashitha";
char name[10];
scanf("%s", name);
C provee varios tipos de funciones de cadena para leer e imprimir una cadena
constante.
Como las listadas abajo.
Sentencias Input.
getch
getche
getchar
gets
scanf
/* no es un estandar */
/* no es un estandar */
Sentencias de salida.
putch
putchar
puts
printf
===============================================
========================
/* Program to accept and display a string */
/* 51_strings.c */
#include
int main()
{
char str[20];
scanf("%s", str);
printf("%s" str);
return 0;
}
===============================================
========================
===============================================
========================
/* Program to accept and display a string with a prompt */
/* 52_strings.c */
#include
int main( )
{
char str[20];
printf("Enter a string :"); scanf("%s", str);
printf("\nYou entered : %s", str);
return 0;
}
===============================================
========================
===============================================
========================
/*read string with embedded blanks */
/* 53_gets.c */
const int MAX = 80;
int main()
{
char str[MAX];
print("Enter a string :"); gets(str);
printf("You entered :"); puts(str);
return 0;
}
===============================================
========================
===============================================
========================
/* To find the length of a given string */
/* 53_length.c */
#include
int main()
{
int i=0;
char str[50];
printf("Enter a string "); gets(str);
while(str[i] != '\0') i++;
printf("Length is %d", i);
return 0;
}
===============================================
========================
6. Cadenas y funciones
===============================================
========================
/* Program to find the length of a string */
/* 54_len.c */
#include
int len_str(char s[]);
int main()
{
int l; char str[50];
printf("Enter a string "); gets(str);
l = len_str(str);
printf("\nLength of string : %d", l);
}
===============================================
========================
/* Program to accept and print a string */
/* 55_str.c */
#include
void disp_str(char s[]);
int main()
{
char str[50];
printf("Enter a string "); gets(str);
disp_str(str);
return 0;
}
int i=0;
while( s[i] != '\0' ) putch(s[i++]);
}
===============================================
========================
7. Array de Strings
Las matrices se utilizan para examinar cadenas, en general, las cadenas son
del tipo matriz.
As, podemos tener acceso a una matriz de cadenas.
Los siguientes ejemplos ilustran, Cmo se organiza una matriz de cadena.
===============================================
========================
/* Program to display an array of strings */
/* 56_display.c */
#include
void main()
{
char week[7][] = { "Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday" };
int i;
for( i = 0; i<7; i++) puts(week[i]);
}
===============================================
========================
===============================================
========================
/* Program to accept and display an array of strings */
/* 57_strings.c */
#include
void main()
{
char names[7][10]; int i;
for( i = 0; i<7; i++) gets(names[i]);
for( i = 0; i<7; i++) puts(names[i]);
}
1. Acerca de la memoria
2. Esquema de direccionamiento
3. Cmo encontrar la direccin de una variable
4. Punteros
5. Aritmtica de punteros
6. Punteros y matrices
7. Punteros y cadenas
8. Glosario
1. Acerca de la memoria
Acerca de la memoria
Esquema de direccionamiento
Cmo encontrar la direccin de una variable
Punteros
Aritmtica de punteros
Punteros y matrices
Punteros y cadenas
Glosario
1. Acerca de la memoria
El Equipo tiene la funcin de almacenar los datos y manipularlos. El
Almacenamiento de
datos requiere un dispositivo de almacenamiento, para un cmodo
almacenamiento y
recuperacin de datos con rapidez y precisin. Generalmente el equipo
tiene puede
comprometer los datos con los mtodos de almacenamiento.
SRAM
Memoria Esttica de acceso aleatorio (Static Random Access
Memory)
DRAM
Memoria Dinmica de acceso aleatorio (Dynamic Random
Access Memory)
EEPROM
Memoria borrable, electricamente programable, de slo
lectura.
(Electrically Erasable Programmable Read Only Memory)
Los chips de memoria pueden almacenar los datos, instrucciones y
resultados intermedios
y finales. La la memoria est organizada en bytes, cada uno capaz de
almacenar un
carcter de informacin. Cada byte de la memoria tiene una direccin o
ubicacin que es
nico y le identifica. El tamao de la memoria se mide en kilobytes (KB),
megabytes
(Mb), gigabytes o terabytes (TB).
RAM:
/* 58_address.c */
#include <stdio.h>
int main()
{
int a = 10;
/* 59_address.c */
#include <stdio.h>
void disp()
{
printf("\nHola");
printf("\nCmo");
printf("\nestas?");
}
int main()
{
disp();
printf("\nLa direccin de disp() : 0x%x", &disp);
return 0;
}
4. Punteros
De acuerdo a la ltima seccin sabemos cmo encontrar y mostrar la
direccin de un
variable o funcin.
Esta vez aprenderemos acerca de cmo almacenar la direccin de una
variable o funcin en
otra variable.
Nota: Las variables pueden contener valores constantes.
Pruebe con las siguientes:
int a, b;
a = 5;
b = &a;
/* Valida */
/* No valida */
/* Valida */
/* Valida */
int *ptr;
/* invalido */
/*
/*
/*
/*
Puntero
Puntero
Puntero
Puntero
a
a
a
a
character */
int */
float */
datos abstractos emp e */
/* 60_addr.c */
#include <stdio.h>
int main()
{
int vari1 = 11;
int *ptr;
/* variable var1 = 11 */
/* Variable ptr as pointer to */
ptr = &vari1;
almacena en ptr */
/* "a" como
/* Asigna la
%d", a);
/* Contenido
A : 0x%x", &a);
/* Direccin
0x%x", p);
/* Contenido
P : 0x%x", &p);
/* Direccin
P es : %d", *p);
/* Puntero de
5. Aritmtica de punteros.
Todas las variables soportantan operaciones aritmticas, tan bien como
pudieran soportar
las operaciones normales con variables en. C/C++ tambin soporta cuatro
metdos de adicin,
sustraccin, incrementacin e incrementacin de un smbolo.
+
++
--
Adicin
Subtractin
Incrementacin
Decrementacin
/* 62_ptr.c */
/* Demonistration of pointer arithmetic */
#include <stdio.h>
int main()
{
int a, *p;
a = 100;
p = &a;
(*p)++;
/* Increment pointer to (content at address) by 1
*/
printf("%d", *p);
return 0;
}
Salida: 101
Demostracin de la aritmtica de puntero, incrementando el valor de la
direccin.
/* 63_ptr.c */
/* Increment the address value by 1 */
#include <stdio.h>
int main()
{
int a, *p;
/* Variable a, p puntero */
a = 100;
/* Asignamos a a=100 */
p = &a;
/* Asignamos a p la direccin de "a" */
*p++;
/* Incrementador el valor direccin de p
en 1 */
printf("%d", *p);
return 0;
}
Salida: Salida inesperada.
El programa anterior muestra los operadores aritmticos incrementado el
valor
de las direccion de "A" en "p". "p" es una variable de puntero a "A" que
se le
asigna 100, as como a p se le asigna la direccin de A.
Ahora *p++ efecta un incremento, afectado a 2 bytes de memoria para
obtener una
nueva direccin y su su contenido.
*************
Si se tratara de (*p)++, incrementaramos el contenido apuntado por "p"
que es 100,
incrementando el resultando en 101.
*************
6. Matrices y Punteros
/* 64_ptrarr.c */
#include <stdio.h>
int main()
{
int i, a[5] = { 56, 43, 78, 98, 12 };
for( i = 0, i < 5; i++)
printf("\n%d", a[i]);
return 0;
}
/* 66_ptrarr.c */
#include <stdio.h>
int main()
{
int i, a[ ] = { 56, 43, 78, 98, 12 }, *p;
p = a;
for( i = 0, i < 5; i++)
printf("\n%d", *(p+ i) );
return 0;
}
/* 67_ptrarr.c */
#include <stdio.h>
int main()
{
int i, a[ ] = { 56, 43, 78, 98, 12 }, *p;
p = a;
while (*p)
/* or for(int i = 0; i<5; i++ ) */
printf("\n%d", *p++);
return 0;
}
7. Punteros y cadenas
Una cadena es un conjunto de caracteres con espacios incluidos. Esta vez
hablamos
sobre cmo manejar cadenas mediante punteros. No habr ms debate para
menor confusin.
Esta es la tarea simple de verificar tanto punteros como matriz de
cadenas.
Hay una sutil diferencia entre las cadenas y punteros, segua el programa.
/* 68_ptrstr.c */
#include <stdio.h>
int main()
{
char str1[ ] = "You would like to explore C.";
char *str2 = "You would like to explore C.";
puts(str1);
puts(str2);
/* 69_ptrarr.c */
#include <stdio.h>
void disp(char *p);
int main()
{
char str[ ] = "Hello!!..Hello!!.. Pointers can handle it?";
disp(str);
return 0;
}
void disp(char *p)
{
while(*p)
printf("%c", *p++);
}
/* 70_strings.c */
#include <stdio.h>
int main()
{
char *weeks[7 ] = { "Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday",
"Friday", "Saturday" };
int i;
for( i = 0; i<7; i++)
puts(weeks[ i ] );
return 0;
Cuando las cadenas no son parte de una matriz, C/C++ los coloca
memoria contigua,
As que no hay prdida de espacios.
en la
=
=
=
=
&i;
&j;
&k;
&l;
}
void strcpy1(char * dest, char *src)
{
while(*src)
*dest++ = *src++;
*dest = \0;
}
1. Introduccin
2. Declaracin de la Estructura
3. Definicin de una variable de estructura
4. Inicializar una variable de estructura
5. Asignacin directa de estructuras
6. Clculo del tamańo de la estructura
7. Estructuras anidadas
8. Matriz de estructuras
9. Las matrices dentro de las estructuras
10. Pasar estructuras a una funcin
11. Devolver Estructuras de Funciones
12. Punteros a estructuras
13. Estructuras que contienen punteros
14. Estructuras Auto referenciadas.
1. Introduccin
2. 10. Programacin C/C++ paso a paso - Estructuras -Structure1. Introduccin
2. Declaracin de la Estructura
3. Definicin de una variable de estructura
/* Expresin vlida */
/* Expresin invlida */
/* Expresin invlida */
3.
4. struct date
{
int day;
int month;
int year;
};
struct student
{
int sno;
char name[20];
int marks;
float avg;
};
5.
6.
3. Definicin de una variable de estructura
Para la definicin de una variable de estructura es la
misma que la de la definicin de un caulquier tipo de datos
como por ejemplo int.
Ejemplos
7.
8.
+) */
C++
int a;
date d;
/* valido */
/* valido (Pero slo en C+
struct date d;
*/
9.
10.
4. Inicializar una variable de estructura
Los miembros de la estructura se pueden inicializar al igual que
otras
variables. Esto se puede hacer en el momento de la declaracin o en
el tiempo de diseo.
1. Inicializacin en Declaracin.
11.
12. struct ddate
{
int day;
int month;
int year;
} d = { 06, 01, 2011 };
13.
14.
2. Inicializacin en Definicin
struct ddate d = { 06, 01, 2011 };
1. Iniciacin en tiempo de diseo:
ddate d;
d.day = 06;
d.month = 01;
d.year = 2011;
4. Inicializacin en tiempo de ejecucin:
scanf("%d%d%d", &d.day, &d.month, &d.year);
Ejemplo
15.
16. /* Escribir un programa para aceptar e imprimir los detalles de
un empleado */
/* 73_struct.c */
#include <stdio.h>
struct emp
{
int eno;
char name[20];
float sal;
};
int main()
{
struct emp e;
printf("Introducir el nmero de empleado
:"); scanf("%d",
&e.eno);
printf("Introducir el nombre de empleado
:"); scanf("%s",
e.name);
printf("Escriba el salario del empleado
:"); scanf("%d",
&e.sal);
printf("\n\nLos detalles del empleado son los siguientes.:\n");
printf("%d
%s
%d\n", e.eno, e.name, e.sal);
return 0;
}
17.
18.
5. Asignacin directa de estructuras
La asignacin de ms de una variable es posible utilizando
estructuras.
19.
20. struct emp a, b = {1001, "Vimal", 6700.00 };
a = b;
/* Valid */
printf("%d %s %d" , a.eno, a.name, a.sal );
21.
22.
Salida:
1001 Vimal 6700.00
6. Clculo del tamao de la estructura
Cualquier tipo de dato en C/C++ tiene un tamao especfico, por
ejemplo "int" tiene dos bytes de tamao, float tiene 4 bytes y
as, cualquier cosa. Aqu esta una forma de encontrar el tamao
de una variable de la estructura.
sizeof :tamao de
23.
24. printf("%d", sizeof(int));
printf("%d", sizeof(float));
printf("%d", sizeof(struct emp));
/* 2 */
/* 4 */
/* Muestra el tamao
de la estructura emp */
25.
26.
7. Estructuras anidadas.
Estructura con estructuras en conocido como estructuras anidadas.
Para acceder a los miembros de la estructura anidada tenemos que
aplicar el punto
operador dos veces para los miembros de la estructura de la
llamada.
Ejemplo.:
27.
28. /* programa para demostrar estructura anidada con la estructura
de los empleados */
/* 74_nested.c */
#include <stdio.h>
struct emp
{
int eno;
char name[10];
float sal;
struct
{
} addr;
/* Estructura anidada */
street char[10];
city char[10];
};
int main()
{
struct emp e;
printf("\n\nIntroduzca emp_no, emp_name, emp_sal, street, city:
");
scanf("%d%s%d%s%s", &e.eno, e.name, &e.sal, e.addr.street,
e.addr.city );
printf("\n\nLos detalles del empleado son los siguientes:\n\n");
printf("%d%s%d%s%s", e.eno, e.name, e.sal, e.addr.street,
e.addr.city );
return 0;
}
29.
30.
8. Array de Estructuras
Podemos crear una matriz de estructuras. La matriz tendr
estructuras
individuales como sus elementos.
31.
32. /* Escribir un programa para aceptar e imprimir los detalles de
un empleado */
/* 75_array.c */
#include <stdio.h>
struct emp
{
int eno;
char name[20];
float sal;
};
int main()
{
struct emp e[10];
int i;
for(i = 0; i<10; i++)
{
printf("Introducir nmero empleado
&e[i].eno);
printf("Introducir nombre empleado
e[i].name);
:"); scanf("%d",
:"); scanf("%s",
:"); scanf("%d",
return 0;
33.
34.
35.
36. /* Programa para aceptar e imprimir informacin de los
estudiantes */
/* 76_array.c */
#include <stdio.h>
struct stud
{
int sno;
char name[10];
int marks[5];
/* Array dentro de
estructura */
};
int main()
{
struct stud s;
int i;
printf("Escriba el nmero del estudiante: ");
scanf("%d", &s.sno);
printf("Escriba el nombre del estudiante: ");
scanf("%d", s.name);
for( i = 0; i<3; i++)
{
printf("Introducir estudiantes marcadas
"); scanf("%d", &s.marks[i]);
}
printf("\n\nLos registros de los estudiantes son los
siguientes.\n");
printf("%d %s %d %d %d", s.sno, s.name, s.marks[0],
s.marks[1], s.marks[2] );
return 0;
}
37.
38.
10. Pasar Structures a Functions
Es posible enviar estructuras completas a funciones como argumentos
en la llamada a una funcin. La variable de estructura es tratada
como cualquier variable ordinaria.
39.
40. /* Programa que pasa una variable de estructura a una funcin */
/* 77_funct.c */
#include <stdio.h>
struct emp
{
int eno;
char name[10];
float sal;
};
void display(struct emp temp);
int main()
{
struct emp e;
display(e);
return 0;
}
void display(struct emp temp)
{
printf("%d %s %d", temp.eno, temp.name, temp.sal );
}
41.
42.
11. Devolviendo Structures desde functions
Podemos devolver estructuras de las funciones. S, las estructuras
pueden ser devueltas desde funciones as como las variables de
cualquier
otro tipo.
43.
44. /* Returning structure object from a function */
/* 78_funct.c */
struct emprec
{
int eno;
char name[10];
};
struct emprec read();
void write(struct emprec t);
int main()
{
struct emprec e;
e = read();
write(e);
return 0;
}
void write(struct emprec t)
{
printf("\n\n%d %s", t.eno, t.name);
}
struct emprec read()
{
struct emprec t;
printf("Insertar nmero empleado
:"); scanf("%d", &t.eno);
printf("Insertar nombre empleado
:"); scanf("%s", t.name);
return t;
}
45.
46.
12. Puntero a Structure
Hasta ahora hemos visto que los miembros de una estructura
pueden ser de tipos de datos tales como int, char, float etc...
C/C++ tambin permite declarar una variable de puntero
como miembro de una estructura. Las variables puntero se pueden
utilizar para almacenar la direccin de una variable de
la estructura tambin. E puntero puede ser declarado como si
se apuntara a un tipo de estructura de datos.
47.
48. /* Programa para demostrar el proceso de puntero a la estructura
*/
/* 79_pointer.c */
#include <stdio.h>
struct employee
{
int eno;
char name[10];
};
struct employee *emp;
int main()
{
emp = (struct employee * )malloc(sizeof(emp));
printf("Introduzca detalles del empleado (nmero
nombre) ..:");
scanf("%d%s%", &emp->eno, emp->name);
printf("\n\n%d
%s", emp->eno, emp->name);
return 0;
}
49.
50.
Los marca de datos es esencial para aplicar punteros a la
estructura.
La siguiente declaracin es opcional, pero es mejor utilizar para
organizar mejor la gestin de memoria.
emp = (struct employee * )malloc(sizeof(emp));
13. Structures que contienen punteros.
Una variable puntero puede ser utilizado como un miembro en la
estructura.
El siguiente programa contiene puntero a los miembros contenidos
por una variable de puntero de la estructura.
51.
52. /* programa para demostrar el uso de estructuras que contienen
punteros */
/* 80_pointers.c */
#include <stdio.h>
struct
{
int *a;
int *b;
} *temp;
int main()
{
int x, y;
x = 20; y = 50;
rk -> a = &x;
rk -> b = &y;
53.
54.
Salida:
20
50
14. Estructuras auto referenciadas.
Las estructuras pueden tener miembros, que son del tipo de la misma
estructura en la que se incluyen. Esto es posible con los
punteros y el fenmeno se denomina estructuras auto-referenciadas.
55.
56. struct emp
{
int eno;
char name[10];
struct emp *e;
};
57.
58.
Las estructuras auto-referencial puede ser utilizados
principalmente en la
organizacin de datos, ordenar, buscar elementos, insercin,
eliminacin
de elementos y as sucesivamente.
Esta forma de planteamiento conduce a las estructuras de datos
(es decir, listas enlazadas, pilas, colas, rboles y grafos).
Introduccin
Acerca de la Union
Declaracin de la Union
Definicin de una variable de la Union
Diferencias entre Structure y Union
Operaciones con Unions
mbito de aplicacin de una Union
Introduccin
Acerca de la Union
Declaracin de la Union
Definicin de una variable de la Union
Diferencias entre Structure y Union
Operaciones con Unions
mbito de aplicacin de una Union
1. Introduccin
/* 81_union.c */
#include <stdio.h>
struct s_emp
{
int eno;
char name[20];
float sal;
};
union u_emp
{
int eno;
char name[20];
float sal;
};
int main()
{
struct s_emp se;
union u_emp ue;
printf("\nTamao de la estructura Empleados
sizeof(se));
printf("\nTamao de la Union Empleados...
sizeof(ue));
return 0;
}
%d",
%d",
Salida:
Tamao de la estrucutra Empleados : 26
Tamao de la Union Empleados
: 20
2. Acerca de la Union
Cuando un gran nmero de variables requieren utilizarse en un programa.
Estos
ocuparn gran cantidad de memoria. Las Unions ofrecen una forma ms fcil
de
ahorrar memoria utilizando la tcnica de reemplazo. Utiliza misma
posicin de
memoria para todo tipo de variables.
Una Unions es un tipo de datos en C, que permite la superposicin de ms
de una
variable en la misma rea de memoria.
2.1 Caractersticas de las Unions:
1. Union almacena valores de diferentes tipos en un solo lugar en la
memoria.
2. Una Union puede contener uno de los muchos diferentes tipos de
valores,
pero slo uno se almacena en un momento.
union ddate
{
int day;
int month;
int year;
};
union student
{
int sno;
char name[20];
int marks;
float avg;
};
/* Valido */
/* Valido tanto en C como C++ */
printf("%d", sizeof(int));
printf("%d", sizeof(float));
printf("%d", sizeof(union emp));
emp */
/* 2 */
/* 4 */
/* Muestra el tamao de la Union
Structure
Union
/* 82_union.c */
#include <stdio.h>
union u_emp
{
int eno;
char name[20];
float sal;
};
int main()
{
union u_emp ue;
printf("Nmero del empleado : "); scanf("%d", &ue.eno);
printf("Nombre del empleado : "); scanf("%s", ue.name);
printf("Sueldo del empleado : "); scanf("%f", &ue.sal);
printf("\n\nLos detalles del empleado son los siguientes...\n");
printf("%d %s %f ", ue.eno, ue.name, ue.sal);
return 0;
}
Cul es la salida?
Slo ue.sal es correcto. Qu pasa con resto de variables.
En cualquier instante slo una de las variables de la unin tendr un
valor
significativo.
Slo que ese miembro, que es el ltimo escrito, es el que se puede leer.
En este punto, las otras variables contienen basura. Es responsabilidad
del programador realizar un seguimiento de la variable activa (es decir,
las variables que se accedieron por ltima vez).
Esta es la mejor manera de aceptar y mostrar los registros de un
empleado.
/* 83_emp.c */
#include <stdio.h>
union u_emp
{
int eno;
char name[20];
float sal;
};
int main()
{
union u_emp ue;
printf("\nNmero del empleado
printf("\n%d", ue.eno);
printf("\nNombre del empleado
printf("\n%s", ue.name);
printf("\nSueldo del empleado
printf("\n%f",ue.sal);
return 0;
}
7. Alcances de la Union
El alcance de la unin es diferente a la estructura. Una variable de la
estructura puede tener acceso a sus funciones solamente. Mientras que en
el caso de la union, ella y sus miembros pueden accesibles por las
funciones
/* 84_scope.c */
#include <stdio.h>
int main()
{
union
{
int i;
char c;
float f;
};
i = 10; c = 'a'; f = 4.5;
printf("El valor de C es : %c", c);
return 0;
}
/* Union members */
Controlando ficheros.
Introduccin
return 0;
}
11. Programacin C/C++ paso a paso - Ficheros
Controlando ficheros.
Introduccin
Intente averiguar la salida del siguiente programa.
#include <stdio.h>
int main()
{
int sno, sub1, sub2, sub3;
char name[20];
printf("Introduzca un registro con los campos sno, name, sub1,
sub2, sub3, respectivamente");
scanf("%d %s %d %d %d\n", &sno, name, &sub1, &sub2, &sub3);
}
return 0;
#include <stdio.h>
int main()
{
int sno, sub1, sub2, sub3;
char name[20];
FILE *fp = fopen("emp.dat", "a+");
printf("Introduzca un registro con los campos sno, name, sub1,
sub2, sub3, respectivamente");
scanf("%d %s %d %d %d\n", &sno, name, &sub1, &sub2, &sub3);
return 0;
}
Los dos programas son los mismos, pero el segundo programa contiene una
destacada
declaracin (FILE *fp = fopen("emp.dat", "a+");) y algunas modificaciones
como
fprintf, fp. Slo unas pocas modificaciones incluidas. Estas
modificaciones afectan
a las transferencias de datos desde la consola al disco en el fichero
"stud.dat". Este proceso
se conoce como control de archivos/gestin de archivos/organizacin de
archivos.
Se trata de una forma ms fcil de transferir la salida del monitor a un
archivo usando
la declaracin del control de archivos.
En realidad, el procesamiento de archivos lleva invulcrado un montn de
operaciones, as
como los mtodos para ponerlos en prctica. Aqu est el proceso real
para manejar archivos.
Manejar Ficheros
Generalmente cada programa presenta los valores resultantes en la
pantalla
(el programa 1 ilustra esto). Pero esos valores se eliminan de la memoria
Cuando se termina el programa. Si queremos mantener registros de forma
permanente,
habr que guardarlos en un archivo. Cada archivo tiene unas pocas
operaciones.
Aqu persentamos unas cuantas.
_____________
_______
/
|
|
|
|
|
|
|
/
\ |
|
|Regis-| |
|
| Tro | |
|
\____/ |
|
\ Campo
/
|
\
\_______/
/
\
Fichero
/
\_____________/
Diagrama de Venn
|
|
|
|
____
Fichero:
Registro:
Campos:
Eno
Name
Sal
1001
Pedro
4500
1002
Maria
8900
1009
Angela
5600
fopen
fclose/close
fprintf
fscanf
fwrite
fread
fgetc/fputc,
fgetchar / fputchar
fgets / fputs
fopen
Abre la secuencia de nombre de archivo en el modo y si tuvo xito,
Devuelve un puntero al flujo de reciente apertura, o nulo de otra forma.
Syntax
FILE *fopen(const char *filename, const char *mode);
Ejemplo:
FILE *fp = fopen("stud.dat", "r");
FILE *fp = fopen("emp.dat", "w");
FILE *fp = fopen("emp.dat", "a+");
Modo:
La cadena modo utilizado en las llamadas a fopen, tendr uno de los
siguientes
valores:
Modo Descripcin
r
w
escritura)
escritura).
r+
w+
a+
si el archivo no existe.
Abre un archivo existente para actualizacin (lectura y
Crea un nuevo archivo actualizando (lectura y
Si un archivo con ese nombre ya existe, se sobrescribir.
Abre para aadir, har una actualizacin al final del
archivo, o
fclose
Cierra el fichero apuntado por fp y devuelve 0 si tiene xito, se
devuelve EOF en
caso de error
Syntax
int fclose(FILE *fp);
Ejemplo
fclose(fp);
fclose(stud);
fcloseall();
fprintf
Enva el formato de salida a un stream. Utiliza el mismo formato que los
especificadores
printf, pero enva la salida a la secuencia especificada. Devuelve el
nmero de bytes
de salida o EOF en caso de error.
Syntax
Ffrintf(fptr, "Control String", list);
Ejemplo
fscanf
Esta funcin se utiliza para leer datos de un formato de un archivo
especificado.
Syntax:
fscanf(fptr, "Control String", list);
Ejemplo
fscanf(fp, "%d %s %d %d %d", &sno, name, &sub1, &sub2, &sub3);
fscanff(emp, "%d %s %d", &eno, name, &sal);
fwrite
Fwrite agrega un nmero especificado de elementos de datos de igual
tamao a una salida
archivo.
Syntax:
Size_t fwrite(const void *ptr, size_t size, size_t n, FILE*stream);
Argumento
Qu es/Hace
Ptr
posicin ptr
Size
N
stream
Qu es/Hace
Ptr
posicin ptr
size
n
stream
fewind(fp);
fseek
El puntero de fichero para el stream es posicionado a travs del nmero
"offset"
que se calcula desde la posicin "whence". El offset puede ser cero,
negativo o
positivo. Los simbolos definidos SEEK_CUR, SEEK_SET & SEEK_END se
utilizan para
especificar la actual posicin, la posicin inicial (BOF) y final (EOF)
del
fichero respectivamente. Retorna 0 si ha habido xito y un nmero
distinto de
cero en caso de error.
Syntax
int fssek(FILE *stream, long offset, int whence);
ftell
Devuelve la actual posicin del puntero en el fichero, en caso de xito o
un valor negativo en caso de error.
Syntax
feof
Es una macro que return nonzero si se encuentra end-of-file en el stream.
Syntax
int feof(FILE *stream);
eof
Comprueba cualquier posicin marcada en el fichero y comprueba si se ha
llegado
al final del fichero. Si fuera s, devuelve 0, 1 si la posicin marcada
NO es es el
eof y un error indicado errno, si el valor es distinto de 1.
Syntax
int eof(int handle);
fgets/fputs
La funcin fgets/fputs, como gets/puts en una cada (de tamao nbytes) en
el
fichero escribe y recuera valores, devuelve end-of-file en error.
Syntax
char *fgets(char *s, int n, FILE *stream);
fgetc/fputc
Syntax
Lee / escribe un caracter desde un stream.
int fgetc/fputc(FILE *stream);
fgetchar/fputchar
Es un equivalente a fgetc/fputc
Objetos
Clases
Abstraccin (extraccin) de datos
Encapsulacin de datos
Herencia
Polimorfismo
Enlace dinmico
- El paso de mensajes
Objetos
El objeto es una instancia de una clase. Combinando ambos, datos y
miembros de
funciones.
Los objetos son las entidades bsicas de tiempo de ejecucin en un
sistema
orientado a objetos.
Clases
Una plantilla o modelo que define las caractersticas de un objeto y
describe cmo el objeto debe verse y comportarse.
Abstraccin de datos
Identificacin de las caractersticas distintivas de una clase o un
objeto sin
tener que procesar toda la informacin sobre la clase o el objeto. Cuando
usted
crea una clase n por ejemplo, un conjunto de caractersticas puede
utilizarlo
como una entidad nica en lugar de realizar el seguimiento individual de
los
componentes y su interaccin.
La encapsulacin de datos
Es un trmino de la programacin orientada a objetos sobre la capacidad
de contener y ocultar informacin acerca de un objeto, as como
estructuras internas de datos y cdigo.
La encapsulacin asla la complejidad interna sobre la operacin de un
objeto del resto de la aplicacin. Por ejemplo, al establecer el ttulo
propiedad en un botn de comando, no necesita saber cmo est la cadena
almacena.
Herencia
Es un trmino de la programacin orientada a objetos. La capacidad de una
subclase de tomar las caractersticas de la clase en la que se basa. Si
las caractersticas de la clase padre cambian, la subclase de la que
hereda
esas caractersticas. Heredar las cualidades de la clase en la que se
basa
Polimorfismo
Es Un trmino de programacin orientada a objetos. La capacidad de tener
mtodos con el mismo nombre, pero con contenidos diferentes, para las
clases
relacionadas. El procedimiento para su uso se determina en tiempo de
ejecucin
por la clase del objeto. Por ejemplo, objetos relacionados podran tener
mtodos
de dibujo. Un procedimiento, pasa un parmetro como un objeto, puede
llamar
al mtodo de dibujo sin necesidad de saber Qu tipo de objeto del
parmetro es?
Enlace dinmico
Remarks
Demasiado general,
Duro de aprender, dificil
Poda hacer frente slo a
especficos
Poda hacer frente slo a
especficos
1972
C
Dennis Ritchie AT&T Bell Labs Pierde la generalidad de
BCPL y restaura
ka de B
80s
C++
Bjarne Stroustrup AT&T
C con introduccin a OOP
C++ es un lenguaje de programacin orientado a objetos. Se denominaba
"C con clases", C++ fue desarrollado por Bjarne Stroustrup en
AT&T Bell Laboratories en Murray Hill, Nueva Jersey, EE.UU., a
principios de los ochenta.
BS, un admirador de Simula67 (un lenguaje de programacin orientada
a objetos) y una fuerte partidario de la C, quera combinar lo mejor
de ambos lenguajes y crear uno ms potente con la elegancia de C.
El resultado fue de C++.
C++ es un verdadero lenguaje orientado a objetos, as. Es una
coleccin de clases y objetos.
4. Clases y Objetos
Una clase es una forma de enlazar los datos y sus funciones asociadas
entre s. Permite que los datos se oculten, si es necesario, de uso
externo. Cuando definimos una clase, estamos creando un nuevo tipo de
datos abstractos que se pueden tratar como cualquier otro tipo de datos
integrado. Por lo general, una clase tiene dos partes:
1. Declaracin de la clase
2. Clase definicin de la funcin
La declaracin especifica el tipo y el alcance de los datos y miembros
de las funciones de la clase. Donde de definicin especifica el cdigo
ejecutable de la funcin.
La forma general de una declaracin de clase es:
class class_name
{
private:
variable
function
public:
variable
function
};
declarations;
declarations;
declarations;
declarations;
float sal;
public :
// public data, functions
void getdata();
void putdata();
};
void emp::getdata()
{
cin >> eno >> name >> sal; }
void emp::putdata()
{
cout << eno << name << sal; }
/* ------- Programa principal ------------- */
int main()
{
emp e;
e.getdata();
e.putdata();
return 0;
}
6. Array de objetos
El Compilador C++ tambin es compatible con gran variedad de objetos.
Siguiente ejemplo ilustra la ventaja de usar objetos utilizando matrices.
//
// accessing
Hemos visto objetos que se pasan como argumentos a funciones, ahora vamos
a
discutir sobre la forma de devolver los objetos de las funciones.
}
/* ------- Funcin ------------- */
emp get()
{
emp t;
t.getdata();
return t;
}
/* ------- Funcin ------------- */
void put(emp t)
{
t.putdata();
}
9. Constructor
// class definition
// private data, functions
emp() { ; }
eno = teno;
strcpy(name, tname);
sal = tsal;
void getdata()
{ cin >> eno >> name >> sal; }
void putdata()
{ cout << eno << name << sal << endl;
};
/* ------- Programa principal ------------- */
int main()
{
emp e1(1001, "Magic", 6700.45);
emp e2;
e2.getdata();
e1.putdata();
e2.putdata();
return 0;
}
------------- */
// define and initialize
// display
<< c1.get_count();
<< c2.get_count();
<< c1.get_count();
<< c2.get_count();
//
//
//
//
increment c1
increment c2
increment c2
display again
10. Destructores
Un destructor tiene el mismo nombre que el constructor (con el mismo
// Demostracin de un destructor
#include <iostream>
using namespace std;
class temp
{
private :
public :
int data;
temp() { data = 0;
Constructor (same name as class)
~temp() { }
destructor (same name with tilde)
}
//
//
// Constructor with 2
hh = h; mm = m; ss = 0;
}
argument
ttime(int h)
{
// Constructor with 1
hh = h; mm = 0; ss = 0;
}
~ttime() { }
// Destructor
void get_time()
{
cin >> hh >> mm >> ss;
}
};
void put_time()
{
cout << endl << hh << "
}
" <<
ss;
// Calling
private :
static int count;
// Only one data item for all objects
public :
temp() { count++; }
// increment count when object created
int getcount() { return count; }
// return count
};
/* ------- Programa principal ------------- */
int main()
{
temp t1, t2, t3;
// create three objects
cout << "\nCount is
" << t1.getcount( ); // each object
cout << "\nCount is
" << t2.getcount( ); // sees the same
cout << "\nCount is
" << t3.getcount( ); // value of count
return 0;
}
public:
void setcode() { code = ++count; }
void showcode() { cout << "Object number :" << code << endl; }
function
};
// static member
afectar
a su significado.
* Por lo general, tiene objetos como argumentos.
// FRIEND declared
------------- */
// s.a & s.b are the private
// of class test but they
// by friend function
}
/* ------- Programa principal ------------- */
int main()
{
test x;
x.setvalue();
cout << "Mean value = " << sum(x) << endl;
return 0;
}
#include <iostream>
using namespace std;
class second;
class first
{
int a;
public:
first(int temp) { a = temp; }
friend void max(first, second);
};
class second
{
int b;
public:
second(int temp) { b = temp; }
friend void max(first, second);
};
/* ------- Funcin Friend ------------- */
void max(first f, second s)
{
if ( f.a > s.b )
// both first, second data
members can be
cout << "Max "<< f.a;
// accessed thru friend max
function
else
cout << "Max "<< s.b;
}
/* ------- Programa principal ------------- */
int main()
{
first f(20);
second s(30);
max(f, s);
return 0;
}
Herencia
Introduccin
Clase derivada y clase base
Especificacin de la clase derivada
Derivado de Constructores de Clase
Epecificadores de acceso
Pblica
Privada
Protegidas
Especificadores de acceso sin herencia
Especificador de acceso protegido
mbito de aplicacin de especificadores de acceso
Los especificadores de acceso con herencia
Tipos de Herencia
Herencia simple
Herencia mltiple
Herencia multinivel
Herencia hbrida
Jerarqua de herencia
14. Programacin C++ paso a paso - Programacin - Herencia
Herencia
Introduccin
Clase derivada y clase base
Especificacin de la clase derivada
Derivado de Constructores de Clase
Epecificadores de acceso
Pblica
Privada
Protegidas
Especificadores de acceso sin herencia
Especificador de acceso protegido
mbito de aplicacin de especificadores de acceso
Los especificadores de acceso con herencia
Tipos de Herencia
Herencia simple
Herencia mltiple
Herencia multinivel
Herencia hbrida
Jerarqua de herencia
Introduccin
La herencia es la caracterstica ms potente de la programacin orientada
a objetos.
La herencia es el proceso de crear nuevas clases, llamados derivadas de
las clases actuales o clases base. La clase derivada hereda todas las
Clase Uno
Clase Tres
+-----------------------+
+-----------------------+
+-----------------------+
| +----------------+
|
| +----------------+
|
+----------------+
|
| |Caracteristica A|
|
| |Caracteristica A|
|
Caracteristica A|
|
| +--+----------------+ |
+-+--+-----------+-+----+
+----------------+ |
|
|Caracterstica B| |
|Caracterstica B|Carac-|
Caracterstica B| |
+----+-----------+----+ |
+----------------+Teris-|
+-----------+----+ |
|Caracterstica C|
|
|Caracterstica C|Tica D|
Caracterstica F|
|
\
\|
\| |
| +-|
+----
+-----------------------+
+----------------+------+
+-----------------------+
CLASES DERIVADAS
La herencia tiene una importante caracterstica que permite la
reutilizacin. Uno
de los resultados es la facil distribucin de las libreras de clases. Un
programador puede utilizar una clase creada por otra persona o empresa,
y, sin
modificaciones, derivar otras clases de ella que se adapten a situaciones
particulares.
Clases derivadas y clases base.
Una clase, llamada clase derivada puede heredar las caractersticas de
otra clase,
llamada clase base.
La clase derivada puede aadir otras caractersticas propias, por lo que
se convierte
en una versin especializada de la clase base. La herencia proporciona
una forma
potente de ampliar las capacidades de las clases existentes, y disear
programas que
utilizan relaciones jerrquicas.
La Accesibilidad de los miembros de la clase base desde las clases
derivadas y de
los objetos de clases derivadas es una cuestin importante. Los objetos
de clases
derivadas podran acceder a datos o funciones de la clase base que estn
precedidos
por la palabra clave protected de las clases derivadas, pero no. Las
clases pueden
ser pblicamente privadas derivadas de (otras) clases base. Los objetos
de una
clase derivadadamente pblicas puede tener acceso a miembros pblicos de
la clase
base, mientras que los objetos de una clase derivadamente privada no
puede.
Diagrama muestra cmo se hereda la clase derivada.
CLASE BASE
+-----------------------+
|
|
| +----------------+
|
| |CARACTERISTICA A|
|
| +----------------+
|
|
|
|
+----------------+ |
|
|CARACTERISTICA B| |
|
+----------------+ |
|
|
la
pero
desde
derivada
dentro
|
|
+-----------------------+
|
|
Clase Derivada
+-----------------------+
| +----------------+
|<
Definido en
| |CARACTERISTICA A|
| \
Clase Base
| +----------------+
Accesible
+----------------+ | /
|
|CARACTERISTICA B| |<
|
+----------------+ |
| +----------------+
|<
| |CARACTERISTICA C|
| \
| +----------------+
| |
|
+----------------+ | /
|
|CARACTERISTICA D| |<
|
+----------------+ |
+-----------------------+
La clase
Definido
de la clase
derivada
Una clase puede ser derivada de ms de una clase base. Esto se llama
herencia
mltiple. Una clase tambin puede ser contenida dentro de otra clase.
Especificacin de la clase derivada
La declaracin de una clase es fcil utilizando las palabras clave, as
como la
declaracin de la clase derivada, la clase base debe estar al final
precedido del
especificador, para comenzar con : y el nombre de la clase derivada.
Sintaxis para declarar una clase derivada:
Class <Class_name> : <Access_Specifier> <Base_Class_Name> .
Por ejemplo: class result
: public stud;
*/
char city[20];
int pin;
public :
void get_add()
{
cout << "Enter Address street,city,pin";
cin >> street >>city>>pin;
}
void put_data()
{
cout << "Address is
"<< str
<< endl << city << endl << pin;
}
};
class stud : public add
{
private :
int sno;
char name[20];
int m1,m2,m3;
public :
void get_data()
{
cout << "Enter Student No. "; cin >> sno;
cout << "Enter Student Name "; cin >> name;
cout << "Enter Student 3subjects marks ";
cin >> m1 << m2 << m3;
}
void put_data()
{
cout << "Student number :" << sno;
cout << "Student name
:" << name;
cout << "Student marks
:" << m1 << " " <<m2<<"
"<<m3;
}
};
int main()
{
stud s;
s.get_add();
s.get_data();
s.put_add();
s.put_data();
return 0;
}
constructor , no args
constructor , one args
return A value
increment count
// increment count,
// an unnamed temporary
// initialized to this
// Constructor, no args
// Constructor, one args
// decrement value of A,
// an unnamed temporary
//initialized to this
// class Sub
ob1.get_val();
ob2.get_val();
ob1.get_val();
ob2.get_val();
ob3.get_val();
//
//
//
//
//
//
//
//
display
display
increment ob1
display
decrement ob2
display
create ob3 from ob2
display
ESPECIFICADORES DE ACCESO
Especificadores de acceso se utilizan para controlar, ocultar, proteger
los
datos y los miembros de funciones. Los especificadores de acceso son de 3
tipos
1. Especificador de acceso pblico
2. Especificador de acceso privado
3. Especificador de acceso protegido
public :
Si un miembro o dato es pblico puede ser utilizado por cualquier
funcin en
la clase y en sus clases derivadas tambin.
En C++ los miembros de una estructura o unin son pblicas de forma
predeterminada.
Los miembros pblicos de una clase pueden heredarse a la clase derivada
cuando la
clase es heredada pblicamente, pero no (as) las funciones miembro (en
privado).
private :
Las funciones miembro y friend de la clase en la que son
declaradas slo pueden
ser utilizadas
Los miembros de una clase son privados por defecto.
Los miembros privados de una clase no pueden heredase a una clase
derivada cuando
la clase base es heredada pblica o privadamente. Tendremos que escribir
las
funciones miembro, que devuelvan, esos valores.
protected :
Es el acceso para casos particulares, adems, el miembro puede ser
utilizado
por funciones de miembros y friends de clases derivadas de la
clase declarada
pero no slo en objetos del tipo derivado.
El miembro protegido de una clase puede heredar a la siguiente clase
derivada.
Pero no a clases posteriores
Los especificadores de acceso sin herencia
+------------------------------------------------------------------------------+
|Las funciones miembros de
Clase C
|
|la Clase C, pueden acceder
+-------------------------------+
|
|a ambos miembros "public" y
|
+---------------+
|
|
|"private"
+-------|------->|PRIVATE
|<. |
|
|
|
|
+---------------+
: |
|
|
|
|
+---------------+
: |
|
|
+-------|------>|PUBLIC
|<---+ |
|
|
|
|
+---------------+
| |
|
|
|
+---+------------------------|--+
|
|
|
|
|
|
|
+-----------+ +----------------+
| Un objeto de
la
|
|
| Objeto clase C |---+ Clase C slo
|
|
+----------------+
podrn
acceder a|
|
los miembros
|
|
pblicos de
C
|
+------------------------------------------------------------------------------+
Ms sobre los especificadores de acceso protegido.
Para proporcionar la funcionalidad sin necesidad de modificar la clase.
Protected
puede acceder a si misma y a derivados de miembros de clases-protegidas,
pero slo
en los objetos o subderivados de la clase o fuera de la clase
mbito de aplicacin de especificadores de acceso:
Acceso
Accesible desde
desde
Especificador Nuestra clase
fuera de la clase
Public
Si
Protected
Si
Private
Si
Accesible desde
Accesible
Clase derivada
Objetos
Si
Si
No
Si
No
No
*/
:";
};
class N
{
protected :
int n;
public :
void getn()
{
cout << "\nEnter N value
cin >> n;
}
};
class P : public N, public M
{
public :
void disp()
{
cout << "\n
cout << "\n
cout << "\n
}
};
M
=
N
=
M*N =
:";
" << m;
" << n;
" << m*n;
int main()
{
P p;
p.getm();
p.getn();
p.disp();
return 0;
}
*/
};
a.get();
a.show();
return 0;
}
Score
:";
{
public :
void getdata()
{
getrno();
getmarks();
getscore();
}
void putdata()
{
showrno();
showmarks();
cout << "\nScore is " << score;
cout << "\n Total marks
" << m1+m2;
}
};
int main()
{
result r;
r.getdata();
r.putdata();
return 0;
}
La representacin pictrica del programa anterior:
+--------------+
|
Stud
|
+-------+------+
|
+---------------+---------------+
|
|
+---------------+
+---------------+
|
Test
|
|
Sports
|
+---------------+
+---------------+
|
|
+---------------+---------------+
|
+-------+------+
|
Results
|
+--------------+
En la clase de figura estudiante arriba heredada a consecuencia de dos
maneras. Uno de ellos es a travs de la prueba otra es a travs de los
deportes a continuacin, dos grupos de miembros, los miembros funciones
comunes para los estudiantes de la clase base son heredados de la clase
derivada resultado en el momento de la ejecucin del sistema conseguir
confundir a usar lo que el conjunto de funciones miembro de clase base.
Esto puede evitarse haciendo que la clase base comn fuera clase base
virtual.
Ejemplo
class student { };
1. Introduccin
2. Operador
* Reglas de la sobrecarga de operadores
* Restricciones de sobrecarga de operadores
3. Sobrecarga de operadores unarios
4. Sobrecarga de operadores binarios
5. Sobrecarga de operadores con cadenas
1. Introduccin
===============================================
=====
// Assign a variable to another
#include <iostream>
using namespace std;
int main()
{
int a = 10, b;
b = a;
// valid
cout << b;
return 0;
}
===============================================
=====
===============================================
=====
// Assign an object to another
#include <iostream>
using namespace std;
class emp
{
public:
int eno;
float sal;
};
int main()
{
emp e1= { 1001, 2300.45 },e2 ;
// valid
===============================================
=====
// Assign an object to another
#include <iostream>
using namespace std;
class emp
{
public:
int eno;
float sal;
};
int main()
{
emp e1= { 1001, 2300.45 },e2=e1,e3 ;
cout << endl << e1.eno << e1.sal;
e3 = e1 + e2;
programador.
===============================================
=====
// Program to assign a string to other
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class string
{
char *str;
public:
string() { }
string(char *s) { str = s; }
void putstring()
{
cout << str;
}
};
int main()
{
string s1("LinuxParty");
string s2;
s2 = s1;
s2.putstring();
return 0;
}
===============================================
=====
2. Operador
<
>
+=
-=
^=
&=
|=
<<
>>
<<=
<=
>=
&&
||
++
--
()
[]
new
delete
*=
/=
%=
!=
->
->*
&
>>= ==
.*
::
?:
Ejemplo:
El siguiente ejemplo muestra el uso del operador de incremento ++.
===============================================
=====
#include <iostream>
using namespace std;
class counter
{
private:
unsigned int count;
public:
counter(){ count = 0; }
int get_count() { return count; }
counter operator ++()
{
count++;
counter temp;
temp.count = count;
return temp;
}
};
int main()
{
counter c1, c2;
// c1 = 0, c2 = 0
// display
++c1;
c2 = ++c1 ;
// c1 = 1
// c1 = 2, c2 = 2
// display again
// c2 = 3
return 0;
}
===============================================
=====
===============================================
=====
#include <iostream>
using namespace std;
class subtract
{
int a;
int b;
public:
void getdata(int x, int y)
{
a = x; b = y;
}
void putdata()
{
cout<< endl << "A = " << a <<"B = " << b;
}
void operator -()
// operador minus
{
a = -a; b = -b;
}
};
int main()
{
subtract s;
s.getdata(34, -6);
cout << endl << "S : ";
s.putdata();
-s;
cout << endl << "S : ";
s.putdata();
return 0;
}
===============================================
=====
===============================================
=====
// Overloading + operator
#include <iostream>
using namespace std;
class time
{
int hh; int mm; int ss;
public:
time( ) { }
time(int h, int m, int s)
{
hh =h; mm = m; ss = s;
}
void disp_time()
{
time time::operator+(time t)
{
time temp;
temp.hh = hh + t.hh;
temp.mm = mm + t.mm;
temp.ss = ss + t.ss;
return temp;
}
int main()
{
time t1(12,1,24) , t2(5, 23, 45), t3;
t3 = t1 + t2;
t3.disp_time();
return 0;
}
===============================================
=====
===============================================
=====
// Program to compare two strings using operator overloading
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class string
{
char *str;
public:
string() { *str = NULL; }
string(char *s) { str = s; }
int main()
{
string s1("Computer");
string s2("Computers");
if(s1 == s2)
cout << "Equal";
else
cout << "Not Equal";
return 0;
}
===============================================
=====
===============================================
=====
// concatenation of two strings
#include <string.h>
#include <stdio.h>
#include <iostream>
class string
{
char *str;
public:
string()
{
str = new char[30] ;
*str = NULL;
}
string(char *s) { str = s; }
string operator +(string ts)
{
string t;
strcat(t.str, str);
strcat(t.str, ts.str);
return t;
}
void putstring()
{
int main()
{
string s1("LinuxParty"); string s2("Instituto");
s1.putstring(); s2.putstring();
string s3;
s3 = s1 + s2;
s3.putstring();
return 0;
}
Funcin de Sobrecarga
Polimorfismo
Tipos de polimorfismo
Accesos con punteros a miembros de funciones Normal
Funcin Virtual
Funcin Pura.
Asignacin y copia-inicializacin
El constructor COPY
El puntero "this"
1. Funcin de Sobrecarga
2. Polimorfismo
3. Tipos de polimorfismo
4. Accesos con punteros a miembros de funciones Normal
5. Funcin Virtual
6. Funcin Pura.
7. Asignacin y copia-inicializacin
8. El constructor COPY
9. El puntero "this"
===============================================
================
// Un programa ejemplo para demostrar el uso de la funcin de sobrecarga
#include <iostream>
using namespace std;
// ------------------------void printline()
{
for(int i=0;i<=80; i++) cout << "-";
}
// ------------------------void printline(int n)
{
for(int i =0 ;i<=n;i++) cout << "-";
}
// ------------------------int main()
{
printline();
printline(5);
printline(10, "*");
return 0;
}
===============================================
================
Polimorfismo
===============================================
================
#include <iostream>
using namespace std;
// ------------------------class A
{
int x;
public : void show();
};
// ------------------------class B : public A
{
int y;
public : void show();
};
// ------------------------int main()
{
B b;
b.show();
return 0;
}
===============================================
================
Dado que la funcin est enlazada con una clase particular, tras la
compilacin, este proceso se denomina como "el enlace". Tambin es
conocido como enlace dinmico o la vinculacin dinmica, porque
la seleccin de las funciones correspondientes se realiza de forma
dinmica en tiempo de ejecucin.
===============================================
================
/* Funciones Normales accedidas desde punteros */
/* Poliformismo con classes (Sin utilizar poliformismo VIRTUAL) */
#include <iostream>
using namespace std;
// ------------------------class BASE
{
public :
void disp() { cout << "\nEsts en la clase BASE class"; }
};
public :
void disp() { cout << "\nEsts en la clase DERIVED2 class\n"; }
};
// ------------------------int main()
{
DERIVED1 d1;
DERIVED2 d2;
BASE *b;
b=&d1;
b->disp();
// Llamada a disp()
b=&d2;
b->disp();
// call to disp()
Salida:
5. Funcin Virtual
Bptr = &b;
Bptr->show();
Bptr->disp();
Bptr=&d;
Bptr->show();
Bptr->disp();
Mira el ejemplo:
===============================================
================
/* Poliformismo con Clases (Virtual polymorphism) */
#include <iostream>
// ------------------------class B
{
public :
void show(){ cout << "\nclass B method Show() "; }
// ------------------------class D : public B
{
public :
void show(){cout << "\nclass D method Show() "; }
void disp(){ cout << "\nclass D method disp()"; }
};
// ------------------------int main()
{
D d1;
/* Objeto d1 de la clase D */
d1.show();
d1.disp();
B b;
/* Objeto b, de la clase B */
D d;
/* Objeto d, de la clase D */
B *Bptr;
Bptr = &b;
Bptr->show();
Bptr->disp();
Bptr=&d;
Bptr->show();
Bptr->disp();
return 0;
}
===============================================
================
(Compilamos escribiendo...)
g++ d1.cpp ; ./a.out
Salida:
6. Funcin pura
Una funcin definida en una clase base y sin definicin respecto a una
clase derivada se llama funcin pura. En palabras simples es una funcin pura
una funcin virtual con ningn cuerpo.
===============================================
================
#include <iostream>
using namespace std;
// ------------------------class B
{
public :
void show(){ cout << "\nclass B method Show() "; }
virtual void disp() = 0; // pure virtual function
};
// ------------------------class D : public B
{
public :
void show(){cout << "\nclass D method Show() "; }
void disp(){ cout << "\nclass D method disp()"; }
};
// ------------------------int main()
{
D d1;
d1.show(); // Class D method show()
d1.disp(); // Class D method disp()
D d;
B *Bptr;
Bptr=&d;
Bptr->show(); // Class B method show()
Bptr->disp(); // Class D method disp()
return 0;
}
===============================================
================
Salida:
--------------------D *Dptr;
Dptr=&d;
Dptr->show(); // Qu saldr?
Dptr->disp(); // Qu saldr?
----------------------
===============================================
================
/* Programa para desmostrar la ventaja de las funciones virtuales puras */
#include <iostream>
// ------------------------class NAME
{
protected : char name[20];
public :
void getname()
{ cout << "Introduce nombre :"; cin >> name; }
void showname()
{ cout << "\nEl nombre es: "<< name; }
boolean isGradeA()
{ return (avg>=80) ? TRUE : FALSE ; }
};
boolean isGradeA()
{ return (sal>=10000) ? TRUE : FALSE ; }
};
// ------------------------int main()
{
NAME *names[20];
// es un puntero a NAME
student *s;
// Puntero a student
employee *e;
// Puntero a employee
int n = 0;
char choice;
do{
cout << "Introduce e[S]tudiante o [E]mpleado (s/e) ";
cin >> choice;
if(choice=='s')
{
s = new student; // crea un nuevo student
s->getname();
s->getavg();
names[n++]=s;
}
else
{
e = new employee; // crea un nuevo employee
e->getname();
e->getsal();
names[n++]=e;
}
cout << " Introducir otro (y/n) ?"; // otra vez?
cin >> choice;
} while(choice=='y');
===============================================
================
7. Asignacin y copia-inicializacin
a2 = a1;
// Asignar a a2 el vaor a1
Har que el compilador copie los datos de a1, miembro por miembro, en
a2. Esta es la accin predeterminada del operador de asignacin,
alpha a2(a1);
Provoca una accin similar. El compilador crea un nuevo objeto, a2, y copia
los datos de a1, miembro por miembro, en a2. Esta es la accin
predeterminada de
el constructor de copia.
===============================================
================
// Overloading the Assignment ( = ) Operator
#include <iostream>
using namespace std;
// -------------------------
class alpha
{
private:
int data;
public:
alpha() { } // no-arg constructor
alpha( int d )
{ data = d; } // one-arg constructor
void display()
{ cout << data; } // Display data
// ------------------------int main()
{
alpha a1(37);
alpha a2;
Salida:
a2 = 37
a3 = 37
8. El constructor COPY
alpha a3(a2);
// Copy initializing
alpha a3 = a2;
===============================================
================
#include <iostream>
using namespace std;
// ------------------------class alpha
{
private :
int data;
public:
alpha( ) { }
alpha(int d) { data = d; }
alpha(alpha& a)
// no-args constructor
// one-arg constructor
// copy constructor
{
data = a.data;
cout << "\nCopy constructor invoked";
}
void display( )
{ cout << data; }
// overloaded = operator
{
data = a.data;
cout << "\nAssignment operator invoked";
}
};
// ------------------------int main()
{
alpha a1( 37 );
alpha a2;
9. El puntero "this"
C++ utiliza una palabra clave nica llamada "this" que representa un objeto
que invoca
a una funcin miembro. Este es un puntero que apunta al objeto para el que
esta funcin fue llamada.
===============================================
================
#include <iostream>
using namespace std;
// ------------------------class A
{
int a;
public:
A() { }
A(int x)
{ a = x; }
void display()
{
cout << a;
}
A get()
{
return *this; // Return it self
}
};
// -------------------------
int main()
{
A i(5);
cout << "\ni.display()\n"; i.display();
A j;
j = i.get();
cout << "\nj.display()\n"; j.display();
cout << "\n";
return 0;
}
===============================================
================
Salida:
i.display()
5
j.display()
5
Ref: Programacin Orientada a Objeto en Turbo C++: Robert Lafore
Recomendamos encarecidamente usar el compilador GCC tanto en Windows
como en Mac. Por supuesto en Linux se utiizar siempre gcc para compilar los
programas en C y g++ para C++, si lo desea puede utilizar en todo momento
g++ que en Ubuntu lo han llamado g.
EOF.