Turbo C
Turbo C
Turbo C
IDAT
SEPARATA TURBO C
1.- Ubicacin del Turbo C.2.- Uso del Turbo C
3.- Teclas de Funcion:
4.- Estructura de un Programa en C++.5.- Tipos de datos
6.- Libreras y funciones . sentencia PRINTF.Sentencia SCANF.CLRSCR()
GETCH()
7.- Algunas diferencias entre compiladores.
8.- Operadores Aritmticos, de Asignacin, relacionales y Lgicos
9.- constantes
10.- Sentencias Condicionales .if
doble if
switch
11.- Bucles .
Sentencia FOR (PARA HASTA)
Sentencia WHILE y DO WHILE (HACER MIENTRAS)
TURBO C++
IDAT
1.- Ubicacin del Turbo C.- El archivo que ejecuta el Turbo C se llama TC.EXE
esta dentro de la carpeta BIN y esta carpeta esta dentro de la carpeta TC que a la vez se
encuentra a la unidad C:
Ademas debemos de tener en cuenta que debe haber una carpeta llamada TMP que debe
encontrase tambien en la unidad C:
El lenguaje C se conoce como un lenguaje compilado. Existen dos tipos de lenguaje:
interpretados y compilados. Los interpretados son aquellos que necesitan del cdigo
fuente para funcionar (P.ej: Basic). Los compilados convierten el cdigo fuente en un
fichero objeto y ste en un fichero ejecutable. Este es el caso del lenguaje C.
Es un lenguaje estructurado, ya que permite crear procedimientos en bloques dentro de
otros procedimientos. Hay que destacar que el C es un lenguaje portable, ya que permite
utilizar el mismo cdigo en diferentes equipos y sistemas informticos: el lenguaje es
independiente de la arquitectura de cualquier mquina en particular.
Por ltimo solo queda decir que el C es un lenguaje relativamente pequeo; se puede
describir en poco espacio y aprender rpidamente.
Cuando hacemos doble clic en el archivo TC.EXE o accedemos a un acceso directo nos
saldr esta pantalla que es en la cual vamos a poder programar.
TURBO C++
IDAT
1.- Para maximizar la pantalla se presiona la tecla ALT+Enter
2.- Para acceder a cualquiera de las opciones del menu se presiona la tecla ALT + la
letra que esta de color amarillo.
Ejemplo: Si queremos ir a la opcin FILE presionamos ALT + F
Nota: El mouse no se emplea mucho en este programa.
3.- ABRIR UN ARCHIVO.- presionamos la tecla ALT + F luego escogemos la opcin
OPEN
Por ejemplo aqu se ha puesto la unidad C y en la parte inferior saldr los archivos que
estan dentro de C.
4.- NUEVO ARCHIVO.- se presiona la tecla ALT + F luego se escoge NEW
5.- GRABAR UN ARCHIVO.-
TURBO C++
IDAT
Se presiona la tecla ALT + F luego se escoge la opcin Save y se pone la ruta donde se
va a grabar por ejemplo aqu se va a grabar en la unidad A en una carpeta llamada
carpeta y el archivo se va a llamar EJER1.C
Nota: Los archivo solo pueden tener como mximo 8 caracteres para su nombre y la
extensin debe ser .C
6.- CERRAR UNA VENTANA.- Se presiona la tecla ALT + F3
7.- PARA EJECUTAR UN PROGRAMA .- Se presiona la tecla CTRL. + F9
8.- SALIR.- Se presiona la tecla ALT + X
4.- Estructura de un Programa en C++.Todo programa en C consta de una o ms funciones, una de las cuales se llama main. El
programa comienza en la funcin main, desde la cual es posible llamar a otras
funciones. Para poder llamar a esas funciones primero se debe llamar a la librera
que posee dichas funciones.
En C
Inclusin de Libreras
Declaracin de Variables
void main( ) {
Bloque
}
En Pseudocodigo
Entorno
Declaracin de Variables
Inicio
Bloque
fin
TURBO C++
IDAT
TIPO
char
int
float
double
Tamao
1 byte
2 bytes
4 bytes
8 bytes
Ejemplo:
int num1=4,num2,num3=6;//Aqu se declara 3 variables de tipo int y la variable num1
y num3 se le esta dando un valor.
char nombre[30];//Aqu se declara una variable de tipo char en la cual se podra
guardar una cadena de 30 caracteres
char sexo;//Se podra guardar un caracter
float suel;//Se podra guerdar un entero con decimales
TURBO C++
IDAT
Sentencia PRINTF.La rutina printf permite la aparicin de valores numricos, caracteres y cadenas de texto
por pantalla.
La sentencia printf maneja los sgtes caracteres especiales que se conocen como
secuencia de escape.
A continuacin vemos una tabla de las ms significativas:
\n
salto de lnea
\t
tabulacin horizontal
\\
contrabarra
\f
salto de pgina
\'
apstrofe
\"
comillas dobles
\0
fin de una cadena de caracteres
Ejemplo: printf("Arriba\n \"Peru\" \tcaracho");//el resultado seria:
Arriba
Peru
Caracho
Sentencia SCANF.Esta sentencia permite leer un dato desde el teclado
Para lo cual se necesita algunos modificadores que debemos de tomar en cuenta.
%c
%d
%f
%s
%ld
%lf
Tanto para imprimir como para leer un dato se debe usar los modificadores que son los
arriba mencionados.
NOTA IMPORTANTE : Para leer un dato nmerico siempre debemos anteponer el &
antes de la variable asi como tambin si la variable es tipo char para solo un carcter.
Si la variable es de tipo char para varios caracteres no se pone el &
Para visualizar o imprimir no se pone & en ningun tipo de variables
Ejemplo Printf
Turbo C
1.- Visualizar "Hola Mundo"
printf("hola Mundo");
2.- Visualizar "Hola "
printf("hola \nMundo");
"Mundo"
3.- Visualizar "El sueldo de ana es 150" printf("El sueldo de %s es %d",nom,suel);
Tomando en cuenta que nom="ana" y
suel = 150
-6Por Luis Arias Hidalgo
TURBO C++
IDAT
Ejemplo Scanf
1.- Leer una variable de tipo int x
2.- Leer las sgtes. variables
int a;
float b;
char cat
char nom[10]
int long num;
float long num;
Turbo C
scanf("%d",&x);
scanf("%d",&a);
scanf("%f",&b);
scanf("%c",&cat);
scanf("%s",nom);
scanf("%ld",&num);
scanf("%lf",&num);
BORLAND C
TURBO C
La pantalla se limpia Automaticamente
Se tiene que limpiar la pantalla con la funcin CLRSCR();
La funcion para leer un dato es CIN>>
La funcion para leer un dato es SCANF();
La funcion Para visualizar un dato es COUT<< La funcion para visualzar un dato es PRINTF()
El instalador ocupa 41 mb
El instalador ocupa 1.5 mb(zipeado)
Hay dificultades para usos de algunas funciones
Las funciones son faciles de acceder
CPRINTF,SOUND(),DELAY()
y los unarios:
-7Por Luis Arias Hidalgo
TURBO C++
IDAT
++
--
Incremento (suma 1)
Decremento (resta 1)
Ejemplo:
a++;
aqu la variable a se esta incrementando en 1 es lo mismo que decir a = a + 1,lo ,mismo
sucede para decrementar una variable seria a--; aqu la variable a se esta disminuyendo
en 1 que es lo mismo que decir a= a 1;
Operadores de Asignacin .=
Asignacin simple
+=
Suma
-=
Resta
*=
Multiplicacin
/=
Divisin
%=
Mdulo (resto)
Con estos operadores se pueden escribir, de forma ms breve, expresiones del tipo:
n=n+3 se puede escribir n+=3
k=k*(x-2) lo podemos sustituir por k*=x-2
x =x/3 se puede escribir x/=3
Operadores relacionales .Los operadores relacionales se utilizan para comparar el contenido de dos variables.
En C existen seis operadores relacionales bsicos:
>
Mayor que
<
Menor que
>=
Mayor o igual que
<=
Menor o igual que
==
Igual que
!=
Distinto que
Operadores Lgicos .Los operadores lgicos bsicos son tres:
&&
AND
||
OR (Alt + 124)
!
NOT (El valor contrario)
Nota : A la hora de programar es conveniente aadir comentarios (cuantos ms mejor)
para poder saber que funcin tiene cada parte del cdigo, en caso de que no lo
utilicemos durante algn tiempo. Adems facilitaremos el trabajo a otros programadores
que puedan utilizar nuestro archivo fuente.
Para poner comentarios en un programa escrito en C usamos los smbolos /* y */:
/* Este es un ejemplo de comentario */
// Este tambien es un comentario
/* Un comentario tambin puede
estar escrito en varias lneas */
TURBO C++
IDAT
El smbolo /* se coloca al principio del comentario y el smbolo */ al final.
El comentario, contenido entre estos dos smbolos, no ser tenido en cuenta por el
compilador.
Ejercicio:
Ingrese el nombre y el sueldo de un trabajador luego calcular y mostrar
A . - Una bonificacin de 20% por Navidad
B . - Un descuento de 10% por AFP
C . y su Sueldo Final.
En Pseudocodigo
Entorno
Variables
sueldo ,boni ,desc ,final numerico
nombre alfanumerico
Inicio
Ingresar sueldo,nombre
Calcular Boni=sueldo * 0.20
Calcular Desc=sueldo * 0.10
Calcular Final=sueldo + boni desc
visualizar boni,desc,final
fin
En Borland C++
#include stdio.h
void main(){
float sueldo,boni,desc,final;
char nombre[10];
clrscr();
printf(Nombre: );scanf(%s,nombre);
printf(Sueldo: );scanf(%f,&sueldo);
boni = sueldo * 0.20;
desc = sueldo * 0.10;
final = sueldo + boni desc;
printf(\nBonificacion : %f,boni);
printf(\nDescuento : %f,desc);
printf(\nFinal
: %f,final);
getch();
}
9.- Constantes
Al contrario que las variables, las constantes mantienen su valor a lo largo de todo el
programa.
Para declara una constante, se usa #define:
Ejemplo:
#include "stdio.h"
#define inicio main()
#define escribir printf
#define leer scanf
#define limpiar clrscr()
inicio{
char nom[10];
limpiar;
escribir("Ingrese Nombre :");leer("%s",nom);
escribir("\nEl nombre que ingreso es :%s",nom);
escribir("\nEl nombre que ingreso es :\b\b%s",nom);
escribir("\n\tEl nombre que ingreso es :%s",nom);
escribir("\n\"El nombre que ingreso es :%s\"",nom);
getch();
}
TURBO C++
IDAT
TURBO C++
IDAT
if(n3>n1 && n3>n1){
mayor = n3;
}
printf("El mayor es %d",mayor);
getch();
}
NOTA: && siginifica Y y || significa o.
DOBLE IF
Tambien se puede aplicar el doble IF
Ejemplo:
a=10,b=20;
ma=(a>b)?a:b;//aqu se esta preguntando si a es mayor que b en la variable ma se
guarda la variable a si no se guarda la variable b.
Sentencia SWITCH (EN CASO)
switch (variable){
case contenido_variable1:
sentencias;
break;
case contenido_variable2:
sentencias;
break;
default:
sentencias;
}
Cada case puede incluir una o ms sentencias sin necesidad de ir entre llaves, ya que se
ejecutan todas hasta que se encuentra la sentencia BREAK la variable evaluada slo
puede ser de tipo entero o caracter. default ejecutar las sentencias que incluya, en caso
de que la opcin escogida no exista.
Ejemplo1: Ingrese un nmero del 1 al 7 y visualize que da es.
#include stdio.h
void main(){
int dia;
clrscr();
printf("Introduce el da: ");scanf(%d,&dia);
switch(dia){
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("El da no existe); break;
}
getch();
}
- 11 Por Luis Arias Hidalgo
TURBO C++
IDAT
11.- Bucles .
Sentencia FOR (PARA HASTA)
FOR (Para Hasta)
Su sintaxis es:
for (inicializacin;condicin;incremento o decremento){
sentencia1;
sentencia2;
}
El FOR necesita una variable que controle las vueltas que se da
Esta variable guardara el inicio, la condicin y el incremento o decremento.
Ejemplo 1:
For(i=0;i<=10;i++){
}
En este for se esta empezando de 0 y la condicion es que mientras i sea menor o igual
que 10, finalmente i se incrementara en 1 por cada vuelta que se de.
(se dar 11 vueltas)
Ejemplo 2:
For(i=2;i<=10;i=i+2){
}
En este FOR se empieza de 2 mientras que i sea menor o igual que 10, finalmente i se
incrementara de 2 en 2. (se dar 5 vueltas).
Ejemplo 3:
For(i=10;i>0;i--){
}
En este FOR se empieza de 10 mientras que i sea mayor que 0, finalmente i se
decrementar en 1 (se dar 10 vueltas).
Ejercicio 1:
Ingrese un nmero y ver la tabla de multiplicar de ese numero.
#include "stdio.h"
void main(){
int num,i;
clrscr();
printf("Ingrese Numero a Multiplicar :");scanf(%d,&num);
for(i=1;i<=12;i++){
printf(%d * %d = %d\n,i,num,i*num);
}
getch();
}
En este ejercicio se ingresara un nmero y se almacenar en la variable num luego se
tendr que multiplicar esa variable por 1,2,3,4,5,6,7,8,9,10,11,12
La sentencia
printf(%d * %d = %d\n,i,num,i*num);
Significa que primero se escribir el valor de i luego se escribira el carcter * luego
se va a escribir el valor de num luego se escribe el carcter = luego se escribe el
valor de i * num y finalmente se escribira un salto de linea. Esto se repetira 12 veces.
Ejercicio 2
Visualizar los nmeros pares o impares hasta el 100 en forma ascendente o descendente.
- 12 Por Luis Arias Hidalgo
TURBO C++
IDAT
Para eso se ingresara por teclado que clase de numero se quiere ver P par o I impar y
tambien se ingresara por teclado la forma de visualizacion si es A ascendente y si es
D descendente.
#include "stdio.h"
void main(){
char clase,forma;
int i,vini,vfin;
clrscr();
printf("Ingrese Clase de Numero P/I(Par/Impar) :");scanf(%c,&clase);
printf("Ingrese Forma A/D (Ascendente/Descendente) :");scanf(%c,&forma);
if(clase=='P'){
vini = 2;
vfin = 100;
}else{
vini = 1;
vfin = 99;
}
if(forma=='A'){
for(i=vini;i<=vfin;i=i+2){
printf(%d\t",i);
}
}else{
for(i=vfin;i>=vini;i=i-2){
printf(%d\t",i);
}
}
getch();
}
Ejercicio 3: Visualizar la tabla de multiplicar de un numero x para lo cual se deber
ingresar primero el numero que se va a multiplicar luego desde donde empieza la tabla y
tambin hasta donde termina la tabla
#include "stdio.h"
main(){
int num,ini,fin,i;
printf("Ingrese Numero a Multiplicar =>");scanf(%d,&num);
printf("Ingrese Inicio de la tabla =>"); scanf(%d,& ini);
printf("Ingrese Fin de la tabla =>"); scanf(%d,&fin);
for(i=ini;i<=fin;i++){
printf(%d * %d = %d\n",num,i,num*i);
}
}
El resultado ser el siguiente:
TURBO C++
IDAT
TURBO C++
IDAT
Ejemplo 2:
#include <stdio.h>
main() /* Escribe los nmeros del 1 al 10 */
{
int numero=1;
while(numero<=10)
{
printf("%d\n",numero);
numero++;
}
}
TURBO C++
IDAT
12.- Funciones
Las funciones son bloques de cdigo utilizados para dividir un programa en partes ms
pequeas, cada una de las cules tendr una tarea determinada.
Su sintaxis es:
tipo_funcin nombre_funcin (tipo y nombre de argumentos)
{
bloque de sentencias
}
tipo_funcin: puede ser de cualquier tipo de los que conocemos. El valor devuelto por la
funcin ser de este tipo. Por defecto, es decir, si no indicamos el tipo, la funcin
devolver un valor de tipo entero ( int ). Si no queremos que retorne ningn valor
deberemos indicar el tipo vaco ( void ).
nombre_funcin: es el nombre que le daremos a la funcin.
tipo y nombre de argumentos: son los parmetros que recibe la funcin. Los argumentos
de una funcin no son ms que variables locales que reciben un valor. Este valor se lo
enviamos al hacer la llamada a la funcin. Pueden existir funciones que no reciban
argumentos.
bloque de sentencias: es el conjunto de sentencias que sern ejecutadas cuando se
realice la llamada a la funcin.
Las funciones pueden ser llamadas desde la funcin main o desde otras funciones.
Nunca se debe llamar a la funcin main desde otro lugar del programa. Por ltimo
recalcar que los argumentos de la funcin y sus variables locales se destruirn al
finalizar la ejecucin de la misma.
Ejemplo:
int mayor(int n1,int n2,int n3){
menor(int n1,int n2){
}
}
float calcula(char msg[255]){
char *mensaje(){
}
}
Aqu tenemos 4 funciones la primera se llama mayor y recibe 3 parametros de tipo
entero y retorna un valor de tipo entero.
La funcion mensaje es de tipo char noten que cuando es de tipo char se pone un * antes
de la funcion, en este caso no recibe parmetros.
La funcion menor viene a ser un procedimiento recibe 2 parametros y no retorna nada.
La funcion calcula recibe un parmetro de tipo char y retorna valor de tipo flota.
Ejemplo de Funciones:
/*Ingresar un numero y mediante una funcion retornar si es perfecto o no*/
#include "stdio.h"
#include "conio.h"
char *perfecto(int num){
int i,suma=0;
for(i=1;i<num;i++){
if(num%i==0)suma +=i;
}
- 16 Por Luis Arias Hidalgo
TURBO C++
IDAT
if(suma==num) return "Es perfecto";
else return "No es perfecto";
}
void main(){
int n;
clrscr();
printf("Ingrese Numero.....");scanf("%d",&n);
printf("El numero %s",perfecto(n));
getch();
}
/*Ingresar 2 numeros y mostrar los primos que hay en ese rango de numeros
mediante una funcion en este caso la funcion es un procedimiento y no retorna nada
ademas se va a repetir ese proceso varias veces*/
#include "stdio.h"
#include "conio.h"
void primos(){
int ini,fin,num,i,cd,cont=0;
printf("Ingrese numero inicial.....:");scanf("%d",&ini);
printf("Ingrese numero final.......:");scanf("%d",&fin);
for(num=ini;num<=fin;num++){
cd=0;
for(i=1;i<=num;i++){
if(num%i==0) cd++;
}
if(cd==2){
printf("%d \t",num);
cont++;
}
}
printf("\nCantidad de primos %d",cont);
}
void main(){
do{
clrscr();
primos();
printf("\n\nDesea Continuar..S/N?===>");
}while(toupper(getch())!='N');
}
13.- Funcion Random.random Retorna un valor aleatorio entre 0 y num-1.se necesita de la librera STDLIB.H
Sintaxis: valor=random(num); /* Tambin necesitamos la funcin randomize */
Ejemplo: n =random(10)+1;//Un numero aleatorio del 1 al 10
N=random(6)+1; // numero aleatorio del 1 al 6
randomize Inicializa el generador de nmeros aleatorios. Deberemos llamarlo al inicio
de la funcin en que utilicemos el random. Tambin deberemos utilizar el include
time.h, ya que randomize hace una llamada a la funcin time, includa en este ltimo
archivo.
- 17 Por Luis Arias Hidalgo
TURBO C++
IDAT
Sintaxis: randomize( );
Ejemplo: Tener un vector de 10 elementos y luego llenarlo con numeros aleatorios del 1
al 10
#include "stdio.h"
#include "stdlib.h" //Para el random
#include "conio.h"
#include "time.h"//Para el randomize
#define n 10
int i,num[n]={1,2,3,4,5,6,7,8,9,10};
void listar(){
for(i=1;i<n;i++){
printf("%d\t",num[i]);
}
printf("\n\n");
}
void ingresar(){
randomize();
for(i=1;i<n;i++){
num[i]=random(10)+1;
}
}
void main(){
clrscr();
listar();
ingresar();
listar();
getch();
}
Noten que en este ejemplo el vector por defecto esta lleno de ah se generan los numeros
aleatorios y se vuelve a llenar
TURBO C++
IDAT
#include "stdlib.h"
void main(){
int n1=10;
float n2=123.45;
char n3[10]="244.45",cad[10];
clrscr();
printf("n1 vale %d\n",n1);
printf("n2 vale %8.2f\n",n2);
printf("n3 vale %s\n",n3);
//Ahora vamos a convertir los valores
printf("n1 convertido a float vale %8.2f\n",(float)n1);
printf("n2 convertido a int vale %d\n",(int)n2);
printf("n3 convertido a float vale %8.2f\n",atof(n3));
printf("n3 convertido a int vale %d\n",atoi(n3));
printf("n1 convertido a char vale %s\n",itoa(n1,cad,10));
getch();
}
15.- ARREGLOS
Los arreglos son una coleccin de variables del mismo tipo que se referencian
utilizando un nombre comn. Un arreglo consta de posiciones de memoria contigua. La
direccin ms baja corresponde al primer elemento y la ms alta al ltimo. Un arreglo
puede tener una o varias dimensiones. Para acceder a un elemento en particular de un
arreglo se usa un ndice.
Arreglos Unidimensionales (Vectores).Es una serie de datos del mismo tipo, tambin conocidos como vectores o rangos. Una
arreglo esta constituido por varias posiciones de memoria de igual tamao consecutivas
que tienen el mismo tipo de variable y se accesan usando el mismo nombre seguido de
un subndice entre corchetes. La cantidad total de espacio que se usa por un arreglo
depende de 2 cosas: El nmero de elementos en el arreglo y El tamao del arreglo.
TURBO C++
IDAT
int vector[]={1,2,3,4,5,6,7,8};
char vector[]="programador";
char vector[]={'p','r','o','g','r','a','m','a','d','o','r'};
Una particularidad con los vectores de tipo char (cadena de caracteres), es que
deberemos indicar en que elemento se encuentra el fin de la cadena mediante el caracter
nulo (\0). Esto no lo controla el compilador, y tendremos que ser nosotros los que
insertemos este caracter al final de la cadena.
Por tanto, en un vector de 10 elementos de tipo char podremos rellenar un mximo de
9, es decir, hasta vector[8]. Si slo rellenamos los 5 primeros, hasta vector[4], debemos
asignar el caracter nulo a vector[5]. Es muy sencillo: vector[5]='\0';
Ejemplo 1:
/* Vector de tipo char. */
#include <stdio.h>
main() /* Rellenamos un vector char */
{
char cadena[20];
int i;
for (i=0;i<19 && cadena[i-1]!=13;i++){
cadena[i]=getche( );
}
if (i==19) cadena[i]='\0';
else cadena[i-1]='\0';
printf("\n%s",cadena);
}
Podemos ver que en el for se encuentran dos condiciones:
1.- Que no se hayan rellenado todos los elementos (i<19).
2.- Que el usuario no haya pulsado la tecla ENTER, cuyo cdigo ASCII es 13.
(cadena[x-i]!=13).
Tambin podemos observar una nueva funcin llamada getche( ), que se encuentra en
conio.h. Esta funcin permite la entrada de un caracter por teclado. Despus se
encuentra un if, que comprueba si se ha rellenado todo el vector. Si es cierto, coloca el
caracter nulo en el elemento n20 (cadena[19]). En caso contrario tenemos el else, que
asigna el caracter nulo al elemento que almacen el caracter ENTER.
En resumen: al declarar una cadena deberemos reservar una posicin ms que la
longitud que queremos que tenga dicha cadena.
Ejemplo 2.- Llamadas a funciones con arrays
/* Envo de un array a una funcin. */
#include <stdio.h>
void visualizar(int array[]) /* desarrollo */
{
int i;
for (i=0;i<25;i++) printf("%d",array[i]);
}
main() /* rellenamos y visualizamos */
{
- 20 Por Luis Arias Hidalgo
TURBO C++
IDAT
int array[25],i;
for (i=0;i<25;i++)
{
printf("Elemento n %d",i+1);
scanf("%d",&array[i]);
}
visualizar(array);
}
Ejemplo 3.- Mantenimiento a un Vector
#include <stdio.h>
#include <conio.h>
#define MAX 100
int vector[MAX],reg=0,i;
int buscar(int n){
int pos=-1;
for(i=0;i<reg;i++){
if(vector[i]==n){
pos=i;
break;
}
}
return pos;
}
void ingreso(){
do{
clrscr();
printf("Ingrese Elemento[%d]",reg+1);scanf("%d",&vector[reg]);
reg++;
printf("Desea Continuar..S/N?");
}while(toupper(getche())!='N');
}
void listado(){
clrscr();
for(i=0;i<reg;i++){
printf("%d\t",vector[i]);
}
}
void consulta(){
int num,pos;
clrscr();
printf("Ingrese Numero a Consultar...");scanf("%d",&num);
pos=buscar(num);
if(pos>=0)printf("\nEl numero existe");
else printf("\nEl numero no existe");
}
- 21 Por Luis Arias Hidalgo
TURBO C++
IDAT
void eliminar(){
int num,pos;
clrscr();
printf("Ingrese Numero a Eliminar...");scanf("%d",&num);
pos=buscar(num);
if(pos>=0){
for(i=pos;i<reg;i++){
vector[i]=vector[i+1];
}
reg--;
}else{
printf("\nNo se econtro el Numero...");
}
}
void modifica(){
int num,pos;
clrscr();
printf("Ingrese Numero a Modificar...");scanf("%d",&num);
pos=buscar(num);
if(pos>=0){
printf("Ingrese Nuevo Numero---->");scanf("%d",&vector[pos]);
}else{
printf("\nNo se econtro el Numero...");
}
}
void main(){
int op;
do{
clrscr();
printf("Menu Principal\n");
printf("==============\n");
printf("1.- Ingreso\n");
printf("2.- Listado\n");
printf("3.- Consulta\n");
printf("4.- Eliminacion\n");
printf("5.- Modificacion\n");
printf("6.- Salir\n");
printf("Escoga Opcion---->");scanf("%d",&op);
switch(op){
case 1:ingreso();break;
case 2:listado();break;
case 3:consulta();break;
case 4:eliminar();break;
case 5:modifica();break;
}
getch();
- 22 Por Luis Arias Hidalgo
TURBO C++
IDAT
}while(op!=6);
}
Practica de Vectores
1.- Generar numeros aleatorios del 1 al 100 y llenarlos en un vector de 10 elementos
luego mostrar el mayor de ellos y el menor
2.- Generar un vector de 30 elementos con numeros aleatorios sin que estos se repitan
3.- Generar un vector de 30 elementos con numeros aleatorios sin que estos se repitan y
luego eliminar los primos
4.- Llenar un vector de 10 elementos con cadenas y luego mostrarlas
5.- Llenar un vector con N elementos mximo(50) donde habra un menu de
ingreso(donde los numeros que se ingresan no se pueden repetir), Insercin x
Posicin(donde se ingresa la posicin donde se quiere insertar el numero), Eliminacin
x Posicin y Listado.
6.- Generar un vector de 30 elementos solo con numeros primos
7.- Generar 2 vectores de 30 elementos y de ah se debe llenar en un tercer vector la
suma de los elementos (si el elemento del vector 1 es mayor), o la resta(si el elemento
del vector2 es mayor)
8.- Teniendo 3 vectores paralelos llenar codigo,nombres de artefactos y precios
Luego se debe hacer un menu que tenga las siguientes opciones:
- Ingreso.- donde se ingresa el codigo, nombre del artefacto y precio.
- Listado.- se listan los vectores
- Consulta.- se ingresa el codigo del artefacto y salen sus datos
- Eliminar.- se ingresa el codigo del artefacto y salen sus datos y sale una opcion
desea Eliminar
- Modificar.- se ingresa el codigo del artefacto y salen sus datos y sale una opcion
desea Modificar y si se pulsa Si se ingresa por teclado el nombre y precio y se
modificaran los datos
- Ventas.- Se ingresa el codigo y se muestran los datos luego se ingresa la cantidad
a comprar y sale el monto por esa compra
Arreglos Bidimensionales(Matrices)
Un arreglos bidimensional esta compuesto, por un conjunto de elementos homogneos y
se puede acceder a los datos utilizando dos subndices, este tipo de arreglo es tambin
conocido como matriz.
Un arreglo bidimensional se define as:
int arreglo[10][10];
float matriz[10][10];
tambin podemos utilizar constantes para definir la dimensin del arreglo de dos
dimensiones:
#define N 10
int arreglo[N][N];
INICIALIZACIN
Una matriz o arreglo bidimensional se puede inicializar de este modo:
int matriz[3][3] = {1,2,3,4,5,6,7,8,9};
Con la anterior asignacin se crea en memoria una matriz igual a la de abajo
- 23 Por Luis Arias Hidalgo
TURBO C++
IDAT
Fil/Col
0
1
2
0
1
2
3
1
4
5
6
2
7
8
9
Tambin podemos utilizar una estructura for dentro de otra estructura for para
inicializar los valores de un arreglo de dos dimensiones como se muestra a
continuacin:
Leer desde teclado una matriz de nmeros enteros de dimensin 3x3.
#include <stdio.h>
#define TAM 10
void main(){
int matriz[TAM][TAM];
for( int i=0; i<TAM ; i++)
{
for( int j=0; j<TAM; j++)
{
printf(Ingrese el elemento [%d] );scanf(%d,&matriz[i][j]);
}
}
}
ACCESO A LOS ELEMENTOS DE UN ARREGLO BIDIMENSIONAL
En un arreglo de dos dimensiones necesitamos tambin dos ndices para acceder a sus
elementos.
Si utilizamos: matriz[i][j], entonces i se refiere a la fila y j a la columna.
Para acceder al elemento de la segunda fila y segunda columna de la matriz
anteriormente creada.
int nro = matriz[1][1];
En la variable nro se guardara el nmero 5.
Las matrices o arreglos bidimensionales se suelen utilizar en clculos matemticos,
operaciones con matrices, recorridos por matrices, y cualquier uso que nosotros le
podamos dar.
Se pueden definir arreglos de ms de 2 dimensiones, pero su manejo se dificultara
enormemente.
Una matriz bidimensional se podra representar grficamente como una tabla con filas y
columnas.La matriz tridimensional se utiliza, por ejemplo, para trabajos grficos con
objetos 3D.En el ejemplo puedes ver como se rellena y visualiza una matriz
bidimensional. Se necesitan dos bucles para cada una de las operaciones. Un bucle
controla las filas y otro las columnas.
/* Matriz bidimensional. */
#include <stdio.h>
main() /* Rellenamos una matriz */
{
int x,i,numeros[3][4];
/* rellenamos la matriz */
for (x=0;x<3;x++)
for (i=0;i<4;i++)
scanf("%d",&numeros[x][i]);
/* visualizamos la matriz */
for (x=0;x<3;x++)
- 24 Por Luis Arias Hidalgo
TURBO C++
IDAT
for (i=0;i<4;i++)
printf("%d",numeros[x][i]);
}
Tambin se pueden inicializar cadenas de texto:
char dias[7][10]={"lunes","martes","mircoles","jueves","viernes","sbado",
"domingo"};
Para referirnos a cada palabra bastara con el primer ndice:
printf("%s",dias[i]);
Esto no seria una matriz de cadenas si no mas bien un vector de cadenas;
TURBO C++
IDAT
for(col=0;col<c;col++){
mat[fil][col]=random(100)+1;
}
}
}
void listado(){
clrscr();
for(fil=0;fil<f;fil++){
for(col=0;col<c;col++){
gotoxy(col+5,fil+5);
cprintf("%d",mat[fil][col]);
}
}
}
void main(){
ingreso();
listado();
getch();
}
Ejemplo: Realizar un programa que permita saber el numero de un color.
#include "conio.h"
#include "stdio.h"
void main(){
int i,fil=1,col=5;
clrscr();
for(i=1;i<=200;i++){
gotoxy(col,fil);
textcolor(i);
cprintf("%d",i);
if(fil>24){
fil=0;
col +=5;
}
fil++;
}
getch();
}
NOTA: en este ejemplo hacemos un for de 1 a 200 y al poner textcolor(i) saldra impreso
el numero con el color que le corresponde,ahora el if que vemos ah sirve para que una
vez que se a impreso las 24 primeras filas en la columna 5 se vuelva a imprimir pero
ahora en la columna 10 y la fila empieza de 1 de vuelta.
Ejemplo:Ingrese un Numero y muestre la siguiente estructura.
Por Ejemplo: 3
11111
12221
12321
12221
11111
#include "stdio.h"
- 26 Por Luis Arias Hidalgo
TURBO C++
IDAT
#include "conio.h"
void main(){
int n,col,fil,i,num;
clrscr();
printf("Ingrese Numero de Elementos......");scanf("%d",&num);
n=(num*2)-1;
for(i=1;i<=num;i++){
textcolor(i);
for(col=i;col<=n+1-i;col++){
for(fil=i;fil<=n+1-i;fil++){
gotoxy(col+5,fil+5);cprintf("%d",i);
}
}
}
getch();
}
Practica de Matrices.
1.- Se requiere un programa que realice la multiplicacin de dos matrices, para tal efecto
se deben generar las dos matrices con numeros aleatorios y en una tercera matriz
se debe llenar con la multiplicacin de la matriz 1 con la matriz 2
2.- Se debe llenar un vector de 25 elementos con numeros aleatorios luego se debe listar.
Inmediatamente se debe llenar los elementos del vector a una matriz de 5 x 5 la cual se
tiene tambien que listar
3.- Llenar una matriz de 5 x 5 con numeros aleatorios y mostrar los 2 elementos
mayores y los 2 elementos menores.
4.- Tener una matriz de 3 x 3 y llenarlas con cadenas luego mostrarlas.
5.-Llenar una matriz de 5 x 5 y mostrar la suma de sus diagonales y de su periferia
6.-Llenar una matriz de 5 x 5 con nmeros aleatorios sin que estos se repitan.
7.- Los alumnos de 2 ciclo de IDAT son 20. Todos los alumnos toman inicialmente 5
cursos lo que quiere decir que al final del semestre tendrn 5 notas cada alumno.
Escribir un programa que pida las 5 notas de los 20 alumnos y luego devuelva el
promedio de todas las notas, el promedio mas bajo y el mas alto.
8.- Realizar un programa de un bingo.
Generar una matriz de 5 x 5 y de ah cada un segundo generar un numero aleatorio y
buscarlo en la matriz y si se encuentra cambiar de color para saber que ese numero ya
salio, luego cuando haya salido todos los numeros de la matriz debe salir un mensaje de
BINGO indicando cuantos aciertos tuvo y cuantos desaciertos tuvo.
TURBO C++
IDAT
9 Se debe imprimir un cuadrado mgico de tamao N, donde N es un nmero impar
comprendido entre 3 y 11. Un cuadrado mgico esta compuesto de nmeros
enteros entre 1 y N, con las siguientes caractersticas: la sumas de las filas,
columnas, diagonales son iguales, como se ve en el siguiente ejemplo:
8
1
6
3
5
7
4
9
2
El mtodo de generacin del cuadrado mgico consiste en situar el nmero 1 en la
casilla del centro de la primera fila, el siguiente nmero se debe situar en la casilla
ubicada en la fila anterior (por encima) y en la columna de la derecha. Este proceso se
repite hasta colocar los N nmeros.
Es importante saber que el cuadrado mgico es cclico, es decir, la fila anterior (encima)
de la primera fila es la ltima fila y la columna a la derecha de la ltima es la primera
columna. En caso de que un nmero se debe colocar en una casilla que ya esta ocupada,
entonces se elige la casilla que se encuentra debajo (en la siguiente fila, la misma
columna) del nmero que acabamos de ubicar.
16.- BUSQUEDAS
Una bsqueda es el proceso mediante el cual podemos localizar un elemento con un
valor especifico dentro de un conjunto de datos. Terminamos con xito la bsqueda
cuando el elemento es encontrado.
A continuacin veremos algunos de los algoritmos de bsqueda que existen.
Bsqueda Secuencial
A este mtodo tambien se le conoce como bsqueda lineal y consiste en empezar al
inicio del conjunto de elementos , e ir atravez de ellos hasta encontrar el
elemento indicado hasta llegar al final de arreglo.
Este es el mtodo de bsqueda ms lento, pero si nuestro arreglo se encuentra
completamente desordenado es el nico que nos podr ayudar a encontrar el
dato que buscamos.
void secuencial(){
int i,estado=0;
printf("\nBusqueda Secuencial....\n");
printf("Ingese Numero a buscar.....");scanf("%d",&num);
for(i=0;i<MAX;i++){
if(v[i]==num){
estado=1;
break;
}
}
if(estado==1)printf("Se encontro");
else
printf("No se encontro");
}
Bsqueda Binaria
Las condiciones que debe cumplir el arreglo para poder usar bsqueda binaria son que
el arreglo este ordenado y que se conozca el numero de elementos.
- 28 Por Luis Arias Hidalgo
TURBO C++
IDAT
Este mtodo consiste en lo siguiente: comparar el elemento buscado con el elemento
situado en la mitad del arreglo, si tenemos suerte y los dos valores coinciden, en ese
momento la bsqueda termina. Pero como existe un alto porcentaje de que esto no
ocurra, repetiremos los pasos anteriores en la mitad inferior del arreglo si el elemento
que buscamos resulto menor que el de la mitad del arreglo, o en la mitad superior si el
elemento buscado fue mayor.
La bsqueda termina cuando encontramos el elemento o cuando el tamao del arreglo a
examinar sea cero.
void binaria(){
int ini=0,fin=MAX-1,mitad,estado=0;
printf("\nBusqueda Binaria....\n");
printf("Ingese Numero a buscar.....");scanf("%d",&num);
while(ini<=fin&&estado==0){
mitad=(ini + fin) / 2;
if(v[mitad]==num)estado=1;
else{
if(v[mitad]>num) fin=mitad-1;
else ini=mitad+1;
}
}
if(estado==1)printf("Se encontro");
else
printf("No se encontro");
}
18.-ORDENAMIENTO
La importancia de mantener nuestros arreglos ordenados radica en que es mucho ms
rpido tener acceso a un dato en un arreglo ordenado que en uno desordenado.
Existen muchos algoritmos para la ordenacin de elementos en arreglos, enseguida
veremos algunos de ellos.
Seleccin Directa
Este mtodo consiste en seleccionar el elemento ms pequeo de nuestra lista para
colocarlo al inicio y as excluirlo de la lista. Para ahorrar espacio, siempre que vayamos
a colocar un elemento en su posicin correcta lo intercambiaremos por aquel que la est
ocupando en ese momento. El algoritmo de seleccin directa es el siguiente:
void seleccion(){
int i, j,pos,aux,min;
for(i=0;i<MAX-1;i++){
min=v[i];
pos=i;
for(j=i+1;j<MAX;j++){
if(v[j]<min){
min=v[j];
pos=j;
}
}
v[pos]=v[i];
v[i]=min;
}
}
- 29 Por Luis Arias Hidalgo
TURBO C++
IDAT
Ordenacin por Burbuja
Es el mtodo de ordenacin ms utilizado por su fcil comprensin y programacin,
pero es importante sealar que es el ms ineficiente de todos los mtodos .
Este mtodo consiste en llevar los elementos menores a la izquierda del arreglo los
mayores a la derecha del mismo. La idea bsica del algoritmo es comparar pares de
elementos adyacentes e intercambiarlos entre s hasta que todos se encuentren
ordenados.
void burbuja(){
int i, j,aux;
for(i=0;i<MAX;i++){
for(j=MAX-1;j>i;j--){
if(v[j]<v[j-1]){
aux=v[j-1];
v[j-1]=v[j];
v[j]=aux;
}
}
}
}
Ordenacin por insercin
De la misma forma que se aplican los algoritmos de insercin y de insercin directa
para aadir un nuevo elemento al array, se pueden aplicar para ordenar un array que
estuviera desordenado.En ambos casos, se va tomando siempre un nuevo elemento del
array (empezando por el elemento en en la posicin 1) y se aade al subarray de la
izquierda, que ya est ordenado. Se muestra en primer lugar el mtodo de ordenacin
por insercin de arrays. En este caso, en vez de buscar la posicin de forma lineal de
izquierda a derecha, se hace de derecha a izquierda, a la vez que se van desplazando los
elementos cuyo valor es mayor que el elemento a insertar una posicin a la derecha,
para ir haciendo hueco.
void inserccion(){
int i,j,min;
for(i=1;i<MAX;i++){
min=v[i];
for(j=i;j>0&&min<v[j-1];j--){
v[j]=v[j-1];
v[j-1]=min;
}
}
}
19.-FUNCIONES MATEMTICAS (math.h)
Se usa las definiciones: x,y son de tipo double y n de tipo int. Todas las funciones
regresan double.
sin(x)
seno
cos(x)
coseno
tan(x)
tangente
asin(x)
arcoseno en el rango [-Pi/2,Pi/2], x en [-1,1]
acos(x)
arcocoseno en el rango [0,Pi], x en [-1,1]
atan(x)
arcotangente en el rango [-Pi/2,Pi/2]
- 30 Por Luis Arias Hidalgo
TURBO C++
IDAT
atan2(y,x) arcotangente de (y/x) en el rango [-Pi,Pi]
sinh(x)
seno hiperblico
cosh(x)
coseno hiperblico
tanh(x)
tangente hiperblico
exp(x)
funcin exponential
log(x)
logaritmo natural x>0
log10(x) logaritmo base 10
pow(x,y) x a la y , error cuando x=0 y (y=0 o y<0) o cuando x<0 y y no es un int
sqrt(x)
raiz cuadrada
ceil(x)
menorint, no menor que x (como double)
floor(x) mayor int, no mayor que x (como double)
fabs(x)
|x|
ldexp(x,n) x por ( 2 a la n)
fmod(x,z) residuo x/y
Ejemplo:
#include "stdio.h"
#include "conio.h"
#include "math.h"
float n=12.34;
void main(){
clrscr();
printf("n vale %f",n);
printf("\nSeno de n
:%f",sin(n));
printf("\nElevado de n a la 2 :%f",pow(n,2));
printf("\nRaiz Cudrada de n :%f",sqrt(n));
getch();
}
20.-FUNCIONES DE CADENAS (string.h)
Carcter
Un carcter es el tomo de los programas de computadora, un carcter es un smbolo
que puede ser una letra del alfabeto o un carcter especial.Un carcter ocupa 8 bits
en memoria, y existen 256 caracteres diferentes. Cada carcter se lo codifica en un
nmero entero, es decir, que cada carcter tiene su correspondiente representacin
entera, el cdigo ASCII es precisamente esto. Por ejemplo el carcter a tiene
como cdigo ASCII el entero 97. Para ver todos cdigos ASCII vase el anexo A.
Cadenas
Una cadena o cadena de caracteres nos es ms que una serie de caracteres manipulados
como una unidad. Si asemejamos una cadena al lenguaje castellano sera como una
palabra, que es un conjunto de slabas y vocales en donde cada una de estas viene a
ser una carcter.Visto desde otro punto vendra a ser un arreglo de caracteres. Una
cadena puede contener cualquier carcter, puede almacenar un nombre propio una
direccin, es decir, lo que nosotros precisemos.
Declaracin
Una cadena se la define de la siguiente manera
char cadena[20];
La cadena anterior puede contener un mximo de 20 caracteres.
Inicializacin
Se puede inicializar una cadena de la siguiente manera:
cadena = "Hola" ;
- 31 Por Luis Arias Hidalgo
TURBO C++
IDAT
Cualquier valor que se le asigne a una cadena va entre comillas dobles " ", como en el
ejemplo anterior "Hola" esta entre comillas dobles.
Una cadena siempre finaliza con el carcter de fin de cadena \0, que siempre se aade
al final automticamente, en el ejemplo anterior se aade al final de Hola el carcter
de fin de cadena. Tambin podemos considerar a una cadena como un arreglo de
caracteres, y se puede inicializar de la siguiente manera:
cadena = { H, o, l, a } ;
El arreglo de caracteres se vera de esta forma:
H
o
l
a
\0
0
1
2
3
4
Ntese que en la posicin 4 se aumenta el fin de cadena
Operaciones con Cadenas
GETS.- Lee una cadena,esta funcin nos permite introducir frases enteras, incluyendo
espacios
Ejemplo:
scanf(%s,nom) con gets seria gets(nom);
PUTS.- Escribe y a la vez da un salto de linea
Ejemplo:
printf(Nombre\n) con puts seria puts(Nombre);
Existen muchas operaciones que se pueden realizar utilizando cadenas, la mayora de la
operacin que podemos requerir se encuentran ya a nuestra disposicin dentro de la
librera string.h
STRLEN.la longitud de una cadena la podemos conocer utilizando la funcin strlen.
sintaxis: strlen( cadena ) ;
ejemplo
#include "conio.h"
#include "stdio.h"
#include "string.h"
void main(){
char nom[20];
clrscr();
printf("ingresa tu nombre :");scanf("%s",nom);
printf("tu nombre tiene %d letras",strlen(nom));
getch();
}
STRCMP.para saber si dos cadenas son exactamente iguales utilizamos la funcin strcmp.
sintaxis: strcmp ( cadena1, cadena2 );
esta funcin devuelve un valor de acuerdo al resultado de la comparacin.
devuelve:
0
si la dos cadenas son exactamente iguales
mayor a 0
si la cadena1 es mayor a la cadena2
menor a 0
si la cadena1 es menor que la cadena2
TURBO C++
IDAT
#include "conio.h"
#include "stdio.h"
#include "string.h"
void main(){
char contra1[20],contra2[20];
clrscr();
printf("ingresa tu contrasea :");scanf("%s",contra1);
printf("reingresa tu contrasea :");scanf("%s",contra2);
if(strcmp(contra1,contra2)==0){
printf("\ncontrasea correcta");
}else{
printf("\ncontrasea incorrecta");
}
getch();
}
STRCAT.podemos juntar o concatenar dos cadenas una a continuacin de la otra. utilizamos la
funcin strcat.
sintaxis
strcat( cadenadestino, cadenaorigen );
todo el contenido de la cadenaorigen se aade a continuacin de la cadenadestino, si
esta ltima contiene algo entonces al final contendr lo que contena ms el contenido
de la cadenaorigen.
#include "conio.h"
#include "stdio.h"
#include "string.h"
void main(){
char nom[20],ape[20];
clrscr();
printf("ingresa tu nombre :");scanf("%s",nom);
printf("ingresa tu apellido :");scanf("%s",ape);
strcat(nom," ");//aumenta a la variable nom un " "
strcat(nom,ape);//concatena nom con ape
printf("\ntu nombre completo es %s",nom);
getch();
}
STRCPY.podemos reflejar todo el contenido de una cadena a otra, en otras palabras la copiamos
tal cual, para esto utilizamos la funcin strcpy.
sintaxis
strcpy( cadenadestino, cadenaorigen );
todo el contenido de la cadenaorigen se copia a la cadenadestino, si esta ltima tuviera
algn valor este se borra.
#include "conio.h"
#include "stdio.h"
#include "string.h"
void main(){
char copia[20],origen[20];
clrscr();
printf("ingresa tu nombre :");scanf("%s",origen);
strcpy(copia,origen);
printf("tu nombre es :");scanf("%s",copia);
- 33 Por Luis Arias Hidalgo
TURBO C++
IDAT
getch();
}
Ejemplo: Ingrese una cadena y mediante una funcion inviertala
#include stdio.h
#include conio.h
#include string.h
char *inversa(char msg[]){
char str[255];
int i,j=0;
for(i=strlen(msg)-1;i>=0;i--){
str[j]=msg[i];
j++;
}
}
str[j]='\0';
return(str);
}
void main(){
char cad[255];
clrscr();
printf("Ingrese cadena de Caracteres : ");gets(cad);
printf("\nLa cadena Invertida es %s",inversa(cad));
getch();
}
NOTA: tenemos una funcion inversa recibe un parmetro que va a ser la cadena que va
a invertir se pone * por que la funcion devuelve una cadena
Luego declaramos una variable str porque ahi vamos a guardar la cadena invertida
entonces hacemos un for desde la longitud de la cadena hasta o osea desde el ultimo
carcter hasta el primero y como vemos se pasan los valores de msg a str pero str
empieza de 0 al final str le damos \0 que es el fin de la cadena
Practica de Cadenas
1.- Ingrese una cadena y mediante una funcion muestre la longitud(sin usar strlen)
2.- Ingrese una cadena y mediante una funcin diga cuantas vocales tiene
3.- Ingrese una cadena y mediante una funcin invirtala pero solo que muestre las
vocales.Ejemplo: cad=hola el resultado seria ao
4.- Ingrese 2 cadenas y mediante una funcion concatnelas (sin usar strcat)
5.- Ingrese una cadena y muestre sus caracteres ordenados
6.- Ingrese una cadena y convirtala a mayscula y a minscula
7.- Ingrese una cadena y quitarle los espacios en blanco
8.- Ingrese una cadena y diga cuantas palabras tiene
9.- Ingresen dos cadenas y una posicion y luego junten las dos cadenas en orden de la
posicion por ejemplo: cad1=luis cad2=pedro pos=2 entonces la cadena seria
lupedrois
10.- llene un vector de n elementos con cadenas y ordenelo
11.- llene un vector de n elementos con cadenas y cuente cuantas vocales tiene ese
vector
- 34 Por Luis Arias Hidalgo
TURBO C++
IDAT
12.- llene un vector de n elementos con cadenas y diga cual elemento del vector es el
que tiene mas caracteres
NOTA: Todo la practica se presenta en un solo archivo utilize funciones
Debe realizar una pantalla de presentacion indicando su nombre y su apellido
21.-APUNTADORES
1.-Un Apuntador es una variable que contiene una direccin de memoria, la cual
corresponder a un dato o a una variable que contiene el dato. Los apuntadores tambin
deben de seguir las mismas reglas que se aplican a las dems variables, deben tener
nombre nicos y deben de declararse antes de usarse.
Cada variable que se utiliza en una aplicacin ocupa una o varias posiciones de
memoria. Estas posiciones de memoria se accesan por medio de una direccin.
TURBO C++
IDAT
El espacio de memoria requerido para un apuntador, es el nmero de bytes necesarios
para especificar una direccin de memoria, debiendo apuntar siempre al tipo de dato
correcto.
Considere el siguiente programa y observe a las variables de direccin e Indireccin
trabajar:
TURBO C++
IDAT
TURBO C++
IDAT
Las estructuras dinmicas nos permiten crear estructuras de datos que se adapten a las
necesidades reales a las que suelen enfrentarse nuestros programas. Pero no slo eso,
como veremos, tambin nos permitirn crear estructuras de datos muy flexibles, ya
sea en cuanto al orden, la estructura interna o las relaciones entre los elementos que
las componen.
Las estructuras de datos estn compuestas de otras pequeas estructuras a las que
llamaremos nodos o elementos, que agrupan los datos con los que trabajar nuestro
programa y adems uno o ms punteros autoreferenciales, es decir, punteros a objetos
del mismo tipo nodo.
Una estructura bsica de un nodo para crear listas de datos seria:
struct nodo {
int dato;
struct nodo *otronodo;
};
El campo "otronodo" puede apuntar a un objeto del tipo nodo. De este modo, cada
nodo puede usarse como un ladrillo para construir listas de datos, y cada uno
mantendr ciertas relaciones con otros nodos.
Para acceder a un nodo de la estructura slo necesitaremos un puntero a un nodo.
El nodo anterior se representar asi:
Las estructuras dinmicas son una implementacin de TDAs o TADs (Tipos
Abstractos de Datos). En estos tipos el inters se centra ms en la estructura de los
datos que en el tipo concreto de informacin que almacenan.
Dependiendo del nmero de punteros y de las relaciones entre nodos, podemos
distinguir varios tipos de estructuras dinmicas. Enumeraremos ahora slo de los
tipos bsicos:
Listas abiertas: cada elemento slo dispone de un puntero, que apuntar al siguiente
elemento de la lista o valdr NULL si es el ltimo elemento.
Pilas: son un tipo especial de lista, conocidas como listas LIFO (Last In, First Out: el
ltimo en entrar es el primero en salir). Los elementos se "amontonan" o apilan, de
modo que slo el elemento que est encima de la pila puede ser ledo, y slo pueden
aadirse elementos encima de la pila.
Colas: otro tipo de listas, conocidas como listas FIFO (First In, First Out: El primero
en entrar es el primero en salir). Los elementos se almacenan en fila, pero slo
pueden aadirse por un extremo y leerse por el otro.
Listas circulares: o listas cerradas, son parecidas a las listas abiertas, pero el ltimo
elemento apunta al primero. De hecho, en las listas circulares no puede hablarse de
"primero" ni de "ltimo". Cualquier nodo puede ser el nodo de entrada y salida.
Listas doblemente enlazadas: cada elemento dispone de dos punteros, uno a punta
al siguiente elemento y el otro al elemento anterior. Al contrario que las listas abiertas
anteriores, estas listas pueden recorrerse en los dos sentidos.
TURBO C++
IDAT
Arboles: cada elemento dispone de dos o ms punteros, pero las referencias nunca
son a elementos anteriores, de modo que la estructura se ramifica y crece igual que un
rbol.
Arboles binarios: son rboles donde cada nodo slo puede apuntar a dos nodos.
Arboles binarios de bsqueda (ABB): son rboles binarios ordenados. Desde cada
nodo todos los nodos de una rama sern mayores, segn la norma que se haya
seguido para ordenar el rbol, y los de la otra rama sern menores.
Arboles AVL: son tambin rboles de bsqueda, pero su estructura est ms
optimizada para reducir los tiempos de bsqueda.
Arboles B: son estructuras ms complejas, aunque tambin se trata de rboles de
bsqueda, estn mucho ms optimizados que los anteriores.
Tablas HASH: son estructuras auxiliares para ordenar listas.
Grafos: es el siguiente nivel de complejidad, podemos considerar estas estructuras
como rboles no jerarquizados.
.- GESTION DINAMICA DE MEMORIA
15.2.- Estructuras dinmicas de datos
En funcin de la forma en que se relacionan existen varios tipos de estructuras
de datos. Este tipo de estructuras son autorreferenciadas, es decir, contienen entre
sus campos un puntero de su mismo tipo. Las ms utilizadas son:
- pilas
- colas
- listas
Las pilas
Este tipo de estructuras se caracteriza porque todas las operaciones se realizan
en el mismo lado. Es de tipo LIFO ( Last In First Out ), el ltimo elemento en
entrar es el primero en salir.
<stdio.h>
<conio.h>
<stdlib.h>
<alloc.h>
void insertar(void);
void extraer(void);
- 39 Por Luis Arias Hidalgo
TURBO C++
IDAT
void visualizar(void);
struct pila
{
char nombre[20];
struct pila *ant;
}*CAB=NULL,*AUX=NULL;
main() /* Rellenar, extraer y visualizar */
{
char opc;
do
{
clrscr(); /* borramos la pantalla */
gotoxy(30,8); /* columna 30, fila 8 */
printf("1.- Insertar");
gotoxy(30,10);
printf("2.- Extraer");
gotoxy(30,12);
printf("3.- Visualizar la pila");
gotoxy(30,14);
printf("4.- Salir");
opc=getch( );
switch(opc)
{
case '1':
insertar( );
break;
case '2':
extraer( );
break;
case '3':
visualizar( );
}
}while (opc!='4');
}
void insertar(void)
{
AUX=(struct pila *)malloc(sizeof(struct pila));
clrscr();
printf("Nombre: ");
gets(AUX->nombre);
if (CAB==NULL)
{
CAB=AUX;
AUX->ant=NULL;
}
else
{
AUX->ant=CAB;
CAB=AUX;
}
}
void extraer(void)
{
if (CAB==NULL) return;
AUX=CAB;
- 40 Por Luis Arias Hidalgo
TURBO C++
IDAT
CAB=CAB->ant;
free(AUX);
}
void visualizar(void)
{
if (CAB==NULL) return;
clrscr();
AUX=CAB;
while (AUX!=NULL)
{
printf("Nombre: %s\n",AUX->nombre);
AUX=AUX->ant;
}
getch( );
}
Archivo: pila.c
La estructura tipo que utilizaremos ser sta:
struct pila
{
tipo variables;
struct pila *ant;
}*CAB=NULL,*AUX=NULL;
donde tipo variables sern las diferentes variables que guardaremos en la
estructura, struct pila *ant es un puntero que apunta al elemento de tipo pila
introducido anteriormente, *CAB ser donde guardaremos el ltimo elemento
insertado en la pila y *AUX nos servir para guardar elementos temporalmente y
para recorrer la pila al visualizarla.
Antes de insertar un elemento, deberemos comprobar si la pila est vaca o no.
Si lo estuviera deberemos insertar el primer elemento:
CAB=AUX;
CAB->ant=NULL;
Si ya hubiera algn elemento crearemos uno nuevo apuntado por AUX y
haremos que AUX->ant apunte a CAB, que en este momento contiene la direccin
del elemento insertado anteriormente. Tras esto haremos que CAB apunte al ltimo
elemento insertado, que ser la nueva cabeza de la pila:
AUX->ant=CAB;
CAB=AUX;
Para extraer un elemento de la pila deberemos hacer que AUX apunte a la
misma direccin que CAB, despus haremos que CAB apunte a CAB->ant, con lo
que el elemento anterior pasar a ser la cabeza de la pila. Tras esto, solo queda
liberar la memoria de la zona apuntada por AUX. No olvides controlar si existe
algn elemento ( si CAB es igual a NULL la pila est vaca ):
- 41 Por Luis Arias Hidalgo
TURBO C++
IDAT
if (CAB==NULL) return;
AUX=CAB;
CAB=CAB->ant;
free(AUX);
Por ltimo, para visualizar los elementos de la pila, haremos que el puntero
auxiliar AUX apunte a la cabeza de la pila, o sea, a CAB. Tras esto iremos
visualizando el contenido de la pila, haciendo que AUX tome la direccin de AUX>ant, mientras AUX sea distinto de NULL. Tambin es importante controlar que la
pila no est vaca.
if (CAB==NULL) return;
AUX=CAB;
while (AUX!=NULL)
{
printf("%s",AUX->nombre);
AUX=AUX->ant;
};
Estructura grfica de una pila:
Las colas
Este tipo de estructuras se caracteriza porque insertamos los elementos por un
lado y los extraemos por el otro lado. Es de tipo FIFO ( First In First Out ), el
primer elemento en entrar es el primero en salir. Para gestionar la cola utilizaremos
3 punteros ( para la pila solo eran necesarios 2 ).
<stdio.h>
<conio.h>
<stdlib.h>
<alloc.h>
void insertar(void);
void extraer(void);
void visualizar(void);
struct cola
{
char nombre[20];
struct cola *sig;
}*CAB=NULL,*AUX=NULL,*FIN=NULL;
main() /* Rellenar, extraer y visualizar */
- 42 Por Luis Arias Hidalgo
TURBO C++
IDAT
{
char opc;
do
{
clrscr();
gotoxy(30,8);
printf("1.- Insertar");
gotoxy(30,10);
printf("2.- Extraer");
gotoxy(30,12);
printf("3.- Visualizar la cola");
gotoxy(30,14);
printf("4.- Salir");
opc=getch( );
switch(opc)
{
case '1':
insertar( );
break;
case '2':
extraer( );
break;
case '3':
visualizar( );
}
}while (opc!='4');
}
void insertar(void)
{
AUX=(struct cola *)malloc(sizeof(struct cola));
clrscr();
printf("Nombre: ");
gets(AUX->nombre);
AUX->sig=NULL;
if (FIN==NULL)
FIN=CAB=AUX;
else
{
FIN->sig=AUX;
FIN=AUX;
}
}
void extraer(void)
{
if (CAB==NULL) return;
AUX=CAB;
CAB=CAB->sig;
free(AUX);
}
void visualizar(void)
{
if (CAB==NULL) return;
clrscr();
AUX=CAB;
while (AUX!=NULL)
{
- 43 Por Luis Arias Hidalgo
TURBO C++
IDAT
printf("Nombre: %s\n",AUX->nombre);
AUX=AUX->sig;
}
getch();
}
Archivo: cola.c
La estructura que utilizaremos ser:
struct cola
{
tipo variables;
struct cola *sig;
}*CAB=NULL,*AUX=NULL,*FIN=NULL;
donde tipo variables sern las diferentes variables que guardaremos en la
estructura, struct cola *sig es un puntero que apunta al elemento de tipo cola
introducido a continuacin, *CAB ser donde guardaremos el primer elemento
insertado en la cola, *AUX nos servir para guardar elementos temporalmente y
para recorrer la cola al visualizarla y *FIN tomar la direccin del ltimo elemento
insertado.
Antes de insertar un elemento, deberemos comprobar si la cola est vaca o no.
Si lo est deberemos insertar el primer elemento:
if (FIN==NULL)
CAB=FIN=AUX;
Si ya existiera algn elemento haremos que FIN->sig apunte al elemento de
AUX y a continuacin haremos que FIN tome la direccin de AUX, con lo que FIN
apuntar al ltimo elemento insertado.
FIN->sig=AUX;
FIN=AUX;
Para extraer un elemento de la cola haremos que el puntero auxiliar AUX tome
la direccin del primer elemento insertado, que hemos guardado en CAB. Tras esto
haremos que CAB apunte a CAB->sig, es decir, que tome la direccin del segundo
elemento insertado, que ahora pasar a ser el primero. Luego liberaremos la zona
de memoria apuntada por AUX:
AUX=CAB; /* Deberemos controlar que no est vaca: if
(CAB==NULL) return; */
CAB=CAB->sig;
free(AUX);
Para visualizar la cola comprobaremos que existan elementos, esto es, que FIN
sea distinto de NULL. Hecho esto asignaremos a AUX la direccin de CAB e iremos
recorriendo la cola hasta que AUX sea igual a NULL.
- 44 Por Luis Arias Hidalgo
TURBO C++
IDAT
AUX=CAB; /* Deberemos controlar que no est vaca: if
(CAB==NULL) return; */
while(AUX!=NULL)
{
printf("%s",AUX->nombre);
AUX=AUX->sig;
}
Estructura grfica de una cola:
Las listas
Este tipo de estructuras se caracteriza porque los elementos estn enlazados
entre s, de manera que adems de las acciones habituales de insertar, extraer y
visualizar tambin podremos buscar un elemento. Para gestionar la lista
utilizaremos 4 punteros.
<stdio.h>
<conio.h>
<stdlib.h>
<alloc.h>
void insertar(void);
void extraer(void);
void visualizar(void);
struct lista
{
int num;
struct lista *sig;
}*CAB=NULL,*AUX=NULL,*F=NULL,*P=NULL;
main() /* Rellenar, extraer y visualizar */
{
char opc;
do
{
clrscr( );
gotoxy(30,8);
printf("1.- Insertar");
gotoxy(30,10);
printf("2.- Extraer");
gotoxy(30,12);
printf("3.- Visualizar la lista");
gotoxy(30,14);
printf("4.- Salir");
- 45 Por Luis Arias Hidalgo
TURBO C++
IDAT
opc=getch( );
switch(opc)
{
case '1':
insertar( );
break;
case '2':
extraer( );
break;
case '3':
visualizar( );
}
}while (opc!='4');
TURBO C++
IDAT
clrscr( );
printf("Introduce el nmero a extraer: ");
scanf("%d",&var);
if (CAB->num==var)
{
P=CAB;
CAB=CAB->sig;
free(P);
}
else
{
P=F=CAB;
while (P->num != var && P!=NULL)
{
if (P==CAB) P=P->sig;
else
{
P=P->sig;
F=F->sig;
}
}
if (P==NULL) return;
F->sig=P->sig;
free(P);
}
void visualizar(void)
{
if (CAB==NULL) return;
clrscr( );
AUX=CAB;
while (AUX!=NULL)
{
printf("Nmero: %d\n",AUX->num);
AUX=AUX->sig;
}
getch( );
}
Archivo: lista.c
La estructura que utilizaremos ser:
struct lista
{
tipo variables;
struct lista *sig;
}*CAB=NULL,*AUX=NULL,*F=NULL,*P=NULL;
donde tipo variables sern las variables que guardaremos en la estructura,
struct lista *sig es un puntero que apunta al elemento de tipo lista introducido a
continuacin, *CAB ser donde guardaremos el primer elemento de la lista, *AUX
nos servir para guardar elementos temporalmente y para recorrer la lista al
visualizarla, *P para comparar los valores introducidos y ordenarlos, y *F, que
- 47 Por Luis Arias Hidalgo
TURBO C++
IDAT
TURBO C++
IDAT
struct lista_doble
{
char nombre[20];
struct lista_doble *ant;
struct lista_doble *sig;
};
Su funcionamiento es muy similar al de una lista normal. Puedes intentar hacerla
tu
mismo.
Otras estructuras, como los rboles son ms complejas y menos utilizadas.
TURBO C++
IDAT
raiz=nuevo;
printf("Otro Dato [S]i o [N]o:");
}while(toupper(getch())!='N');
}
void Listado()
{clrscr();
printf("\nListado de los Nodos\n");
ptr=raiz;
while(ptr!=NULL)
{printf("%d\t",ptr->dato);
ptr=ptr->sig;
}
printf("\nPresione cualquier tecla para continuar...");
getch();
}
void Eliminacion()
{clrscr();
printf("\nEliminacion de un Nodo");
printf("\nIngrese Dato:");scanf("%d",&xdato);
if(raiz->dato==xdato)
{ptr=raiz;
raiz=ptr->sig;
free(ptr); //liberar(ptr)
}
else
{ptr=raiz;
while(ptr!=NULL && ptr->dato!=xdato)
{ant=ptr;
ptr=ptr->sig;
}
if(ptr->dato==xdato)
{post=ptr->sig;
ant->sig=post;
free(ptr);
}
}
}
void Insercion()
{int pos,c;
clrscr();
printf("Insercion de un Nodo en una posicion dada\n");
do{
printf("Ingrese Dato:");scanf("%d",&xdato);
printf("Ingrese posicion:");scanf("%d",&pos);
nuevo=(struct Nodo *)malloc(sizeof(struct Nodo *));
nuevo->dato=xdato;
if(pos==1)
{nuevo->sig=raiz;
raiz=nuevo;
}
- 50 Por Luis Arias Hidalgo
TURBO C++
IDAT
else
{ptr=raiz;
c=1;
while(ptr!=NULL && pos!=c)
{c++; //c=c+1
ant=ptr;
ptr=ptr->sig;
}
if(pos==c)
{ant->sig=nuevo;
nuevo->sig=ptr;
}
}
printf("Otro Dato [S]i o [N]o:");
}while(toupper(getch())!='N');
}
void Ordenamiento()
{int aux;
clrscr();
ptr=raiz;
while(ptr->sig!=NULL)
{post=ptr->sig;
while(post!=NULL)
{if(ptr->dato > post->dato)
{aux=ptr->dato;
ptr->dato=post->dato;
post->dato=aux;
}
post=post->sig;
}
ptr=ptr->sig;
}
printf("\nDatos ordenados...");
printf("\nPresione cualquier tecla para continuar...");
getch();
}
main()
{int opcion;
do{
clrscr();
printf("Menu de Lista Enlazadas\n");
printf("-----------------------\n");
printf("1.- Creacion de FIFO\n");
printf("2.- Creacion de LIFO\n");
printf("3.- Listado\n");
printf("4.- Eliminacion\n");
printf("5.- Insercion\n");
printf("6.- Ordenamiento\n");
printf("7.- Fin de Programa\n");
printf("\nEliga opcion :");scanf("%d",&opcion);
- 51 Por Luis Arias Hidalgo
TURBO C++
IDAT
switch(opcion)
{case 1:Creacion_FIFO();break;
case 2:Creacion_LIFO();break;
case 3:Listado();break;
case 4:Eliminacion();break;
case 5:Insercion();break;
case 6:Ordenamiento();break;
}
}while(opcion!=7);
return 0;
}