You are on page 1of 96

INDICE

UNIDAD 1: C++ ELEMENTOS BASICOS


1.- INTRODUCCION 2.- MODELO DE SOLUCION 3.- VARIABLES 4.- TIPOS DE DATOS 5.- OPERADORES ARITMETICOS 6.- OPERADOR CAST 7.- JERARQUIA DE OPERACIONES 8.- COMPILADOR-EDITOR C C++ 9.- APLICACIONES 10.- OTRAS FUNCIONES DE ENTRADA/SALIDA 11.- FORMATO DE PANTALLA APENDICE A) PALABRAS RESERVADAS DE C++ APENDICE B) FUNCIONES C++

UNIDAD 2: C++ INSTRUCCIONES DE CONTROL DE PROGRAMA


1.- INTRODUCCION 2.- INSTRUCCIONES CONDICIONALES 3.- CONDICIONES SIMPLES 4.- INSTRUCCION IF 5.- CONDICIONES COMPUESTAS 6.- INSTRUCCION SWITCH() 7.- CICLO FOR 8.- CICLO WHILE 9.- CICLO DO-WHILE 10.- CONCLUSIONES ACERCA DE CICLOS

UNIDAD 3: C++ ARREGLOS


1.- INTRODUCCION 2.- ARREGLOS EN C++ 3.- ARREGLOS TIPO LISTAS(1) 3.- LISTAS(2) 4.- STRING 5.- LISTAS DE STRING 6.- SORTEOS U ORDENAMIENTOS 7.- ARREGLOS TIPO TABLA 8.- INICIALIZACION DE ARREGLOS

UNIDAD 4: C++ PROCEDIMIENTOS Y FUNCIONES


1.- PROCEDIMIENTOS 2.- PARAMETROS

3.- VARIABLES LOCALES Y GLOBALES 4.- FUNCIONES 5.- ARREGLOS COMO PARAMETROS

UNIDAD 5: C++ REGISTROS Y ARCHIVOS SECUENCIALES


1.- INTRODUCCION 2.- ESTRUCTURAS O REGISTROS 3.- ARCHIVOS (1) 4.- ARCHIVOS (2) 5.- CREACION ARCHIVOS 6.- GRABACION Y LECTURA DISCO 7.- BUSQUEDA EN ARCHIVO DIRECTO 8.- FILTROS o CONDICIONES 9.- BAJA o ELIMINACION 10.- OPERACIONES CON CAMPOS 11.- EDICION o MODIFICACION REGISTROS

UNIDAD 6: REGISTROS Y ARCHIVOS DIRECTOS


1.- INTRODUCCION ARCHIVOS DIRECTOS 2- CREACION ARCHIVOS 3.- GRABACION Y LECTURA DISCO 4.- BUSQUEDA EN ARCHIVO DIRECTO 5.- FILTROS o CONDICIONES 6.- BAJA o ELIMINACION 7.- OPERACIONES CON CAMPOS 8.- EDICION o MODIFICACION REGISTROS

UNIDAD 7.- VARIABLES APUNTADORES


1.- INTRODUCCION 2.- APUNTADORES A ESCALARES 3.- APUNTADORES A STRINGS 4.- APUNTADORES A ARREGLOS 5.- APUNTADORES A TABLAS

UNIDAD 8.- PROGRAMACION ORIENTADA A OBJETOS


1.- INTRODUCCION

Programacin Lenguaje C++


UNIDAD 1: C++ ELEMENTOS BASICOS:
Introduccin
Los nuevos sistemas de informacin son costosos en tiempos y recursos, la solucin moderna de sistemas de informacin exigen nuevas herramientas y metodologas para resolver rpida, econmica y eficiente los problemas de informacin planteados por las organizaciones. An ms el pleno potencial del hardware no es aprovechado plenamente y existe un considerable retraso con el software y sus aplicaciones, generando lo que se conoce como crisis del software. En programacin tradicional, modular o estructurada un programa describe una serie de pasos a ser realizados para la solucin de un problema, es decir es un algoritmo, en particular este modelo de programacin se us mucho para generar programas o aplicaciones en ambientes pc's y con consolas, es decir el programa se ejecutaba en una consola de msdos por ejemplo, y el programa o aplicacin se tena que portar fsicamente a otras pc's, al final de su ciclo de vida de este modelo se haba mejorado y ya era posible que se ejecutara en alguna ventana-consola de ambientes windows, con mejor interface como fonts, colores, background, etc. En programacin orientada a objetos ( OOP ) un programa es considerado como un sistema de objetos interactuando entre s, ambientes de desarrollo visuales facilitan an ms la construccin de programas y solucin de problemas, porque permiten abstraer al ingeniero de software de todo el GUI (interface grfica) del problema, que constituye ms del 60% del cdigo normal de un programa, en general este ambiente permiti una mejora en la interface del programa con el usuario de la aplicacin ya que en este caso solo se manejaban formas o ventanas llenas de componentes o controles especializados en alguna tarea especfica. A este modelo de programacin o construccin de programas los compiladores modernos se adaptaron rpidamente y tenemos aplicaciones fantsticas, en donde alguna forma o ventana est llena de controles visibles e invisibles que realizan muchas tareas donde adems de los componentes o controles que proporciona directamente el compilador cuando se instala, existen miles de controles o componentes extras en muchas partes del mundo realizados por programadores talentosos y que enriquecen el contenido de nuestros programas y aplicaciones visuales. Al principio estas aplicaciones, se construan pensando en que se ejecutaban en una pc con ambiente grafico o en una serie de pc's prximas fsicamente sin embargo el rpido avance de las redes dentro de las empresas u organizaciones conllevan a que los fabricantes de compiladores cada vez incluyeran mas y mas controles o componentes que permitan ejecutar el programa o aplicacin simultneamente en una red de pc's. Sin embargo cuando se habla de redes actuales estamos hablando de la red de redes (internet) y si en redes internas o intranets el retraso en el tiempo de comunicacin entre sus pc's internas y la cantidad de informacin a trasmitir entre las mismas no es algo muy importante o inmanejable, este problema de tiempo de trasmisin y cantidad de

informacin, si es un factor muy importante cuando se pretende construir programas o aplicaciones que deban compartirse o usarse por muchas pc's conectadas a internet, desgraciadamente como factor externo que es, no est bajo control de la empresa o del programador. C o C++, son los compiladores que permiten usar cualquiera de los tres enfoques en la solucin de problemas de informacin que puedan y deban ser resueltos empleando el computador y el lenguaje aunque se repite este curso est enfocado al primer modelo.

MODELO DE SOLUCION
En general un problema de informacin es posible entenderlo, analizarlo y descomponerlo en todos sus componentes o partes que de una u otra manera intervienen tanto en su planteamiento como en su solucin. Una herramienta rpida que nos permite descomponer en partes un problema para su solucin, es el llamado modelo de solucin, este consiste de una pequea caja que contiene los tres elementos ms bsicos en que se puede descomponer cualquier problema sencillo de informacin, estas tres partes son: 1. LA PRIMERA PARTE son todos los datos que el computador ocupa para resolver el problema, estos datos son almacenados internamente en la memoria del computador en las llamadas variables de entrada. 2. LA SEGUNDA PARTE son todas las operaciones generalmente algebraicas necesarias para solucionar el problema, generalmente esta parte del modelo es una formula (o igualdad matemtica, ej. X= y + 5). 3. LA TERCERA PARTE es el resultado o solucin del problema que generalmente se obtiene de la parte de operaciones del modelo y dichos datos estn almacenados en las llamadas variables de salida. En resumen para todo problema sencillo de informacin es necesario plantearse las siguientes preguntas: Qu datos ocupa conocer el computador para resolver el problema y en cuales variables de entrada se van a almacenar? Qu procesos u operaciones debe realizar el computador para resolver el problema planteado? Qu informacin o variables de salida se van a desplegar en pantalla para responder al problema planteado originalmente? Cmo nota importante no confundir los trminos datos, variables e informacin; Datos se refiere a informacin en bruto, no procesada ni catalogada, por ejemplo Tijuana, calle primera # 213,15 aos, $2,520.00, etc.?

Variables es el nombre de una localidad o direccin interna en la memoria del computador donde se almacenan los datos, ejemplo de variables para los casos del inciso anterior, CIUDAD, DIRECCION, EDAD, SUELDO, ETC. Informacin son datos ya procesados que resuelven un problema planteado.

EJEMPLO DE MODELO DE SOLUCIN


Construir un modelo de solucin que resuelva el problema de calcular el rea de un tringulo con la formula rea igual a base por altura sobre dos. o Variable(s) de Entrada Proceso u Operacin Variable(s) de Salida o BASE AREA= BASE * ALTURA / 2 AREA o ALTURA

VARIABLES
Identificadores son conjuntos de letras y/o nmeros que se utilizan para simbolizar todos los elementos que en un programa, son definibles por el usuario (programador o ingeniero de software) del mismo, como son las variables donde se almacenan datos, funciones (pequeos mdulos con cdigo), etiquetas, clases, objetos, etc. En C++ un identificador es una palabra compuesta de letras y/o nmeros de hasta 32 caracteres significativos, empezando siempre con una letra. Una variable se define como un identificador que se utiliza para almacenar todos los datos generados durante la ejecucin de un programa. Existen ciertas reglas en cuanto a variables: Claras y con referencia directa al problema. No espacios en blanco, ni smbolos extraos en ellas. Se pueden usar abreviaturas, pero solo de carcter general. No deben ser palabras reservadas del lenguaje. Ejemplos de buenas variables: Nombre, Edad, SdoDiario, IngMensual, Permetro, Calif1, etc.

TIPOS DE DATOS
A toda variable que se use en un programa, se le debe asociar (generalmente al principio del programa) un tipo de dato especfico. Un tipo de dato define todo el posible rango de valores que una variable puede tomar al momento de ejecucin del programa y a lo largo de toda la vida til del propio programa.

Los tipos de datos ms comunes en C++ son: TIPO DATO unsigned char char short int unsigned int int unsigned long enum long float double long double void ESPACIO MEMORIA RANGO 8 bits 0 a 255 8 bits -128 a 127 16 bits -32,768 a 32,767 32 bits 0 a 4,294,967,295 32 bits -2,147,483,648 a 2,147,483,647 32 bits 0 a 4,294,967,295 16 bits -2,147,483,648 a 2,147,483,647 32 bits -2,147,483,648 a 2,147,483,647 32 bits 3.4 x 10-38 a 3.4 x 10+38(6 dec) 64 bits 1.7 x 10-308 a 1.7*10+308(15 dec) 80 bits 3.4 x 10-4932 a 1.1 x 10+4932 sin valor

Para manejar cadenas de caracteres (strings), se deber usar un arreglo de caracteres con el siguiente formato. Char nombre_string[cant de elementos]; Ejemplo: Char nombre[30]; Char ciudad[20]; Para cargar con un dato se usa el siguiente codigo; strcpy(carrera,ing sistemas); Variables arreglos de caracteres, tienen que usar sus funciones de manipulacin que vienen en la libreria string.h, algunas de estas funciones son: strcpy(), strcat(), strcmp(), strlen(), etc.

OPERADORES ARITMETICOS
Un operador es un smbolo especial que indica al compilador que debe efectuar una operacin matemtica o lgica. C++ reconoce los siguientes operadores aritmticos: Operador Operacin SUMA + RESTA MULTIPLICACION * DIVISION / MODULO O RESIDUO %

Como notas importantes a recordar siempre; En problemas de divisin entre enteros, C++ trunca la parte residual, es decir; </code> rea de declaracin de variables float a; rea de operaciones a = 10 / 4; rea de despliegue de resultados desplegar a; En pantalla sale ( 2.000000 ) </code> El problema no es el tipo float, sino que por definicin de la divisin entre enteros C++ siempre trunca la parte residual, ms adelante se indica cmo se resolver este problema. El operador (%) devuelve el residuo entero de una divisin entre enteros, ejemplo: <code> rea de declaracin int alfa; rea de operaciones alfa = 23 % 4; rea de despliegue desplegar alfa; El resultado en pantalla es 3 Otro ejemplo; alfa = 108 % 10; desplegar alfa; El resultado en pantalla es 8 </code> Para resolver los problemas de potencias y races, se usan ciertas instrucciones especiales que proporciona el lenguaje, llamadas funciones matemticas, en C++ existe toda una librera de instrucciones o funciones matemticas. Recordar que todas las funciones reciben uno o ms datos o valores y regresan siempre un resultado, una de estas funciones matemticas es: #include <math.h> double pow(double base, double exp); Esta funcin ocupa dos valores o datos (base y exponente) ambos de tipo double, y regresa un resultado tambin de tipo doubl. Ejemplo; Resolver el problema de calcular 53
#include <math.h> // rea de declaracin de variables double base, exponente, potencia; // rea de asignacin o carga o inicializacin de // variables base=5; exponente=3; // rea de operaciones potencia =pow( base, exponente); // Despliegue desplegar potencia; -> El resultado en pantalla es 125.000000000

Para resolver el problema de races, se aprovecha una de las ms elementales y conocida de las leyes de exponentes que dice: Es decir una raz cualquiera se puede transformar a una potencia con un exponente fraccionario. Ejemplo: El problema <m> y = 3sqrt{x} </m> esto es equivalente a usando funcin pow y= 3*pow(x, 0.5); entonces

En este ejemplo se est dando por supuesto que no interesa el tipo de dato que requiere la funcin pow() para trabajar correctamente RESUMEN: En C++ se pueden resolver con la ayuda de estos operadores toda clase de problemas, ya sean financieros, algebraicos de negocios, contables, etc.

OPERADOR CAST
Se puede forzar un dato, variable o una expresin a convertirse o cambiarse a un nuevo tipo de dato. El operador cast realiza este proceso, es decir convierte datos, variables o expresiones a un nuevo tipo de dato, su formato es: nvotipo (dato , var, exp); Ejemplo:
// declaracin int alfa; // Asignacin alfa=20; // Cambio de tipo float (alfa);

Ejemplo: int (3.1416); En este ejemplo se est convirtiendo un float a int, recordar que en este caso ya no se tendrn los decimales. Como nota importante este operador resuelve los dos problemas pendientes: 1. El de la divisin entre enteros. 2. El tipo de dato especifico que requieren las funciones.

Ejemplos:
a) // Declaracin float alfa; // Operacin alfa = float (23)/5; // Pero en estos casos es preferible alfa=23/5.0;

En toda divisin recordar agregar a uno de los dos valores el (.0), solo que los dos elementos sean variables entonces usar el operador cast con una de ellas.
b)// Declaracin double potencia; // Operacin potencia = pow ( double (5), double (3));

Como se observa en el ejemplo, se puede usar pow(), directamente con los datos, argumentos o parmetros requeridos , si estos son numricos, pero transformndolos con el operador cast. Esto tambin va a permitir evaluar expresiones matemticas de manera ms directa y sencilla, solo recordando usar un pow() por cada potencia y cada raz de la ecuacin, ejemplo: Sea dentro de un programa esto se resuelve con;

// rea de declaracin de variables double y, x; // rea de captura de datos capturar el valor de x; // rea de operaciones y = 3 * pow(x, double (3)) - pow(x, (1/3.0)) + 4 * pow(x, double(2) ); // rea de despliegue de resultados desplegar x, y

JERARQUIA DE OPERACIONES
El problema de no tomar en cuenta la jerarqua de los operadores al plantear y resolver una operacin casi siempre conduce a resultados muchas veces equivocados como estos:

Ejemplos: 2+ 3* 4 = 20(incorrecto) = 14 (correcto) b) si calif1=60 y calif2=80 y si entonces en programa se usa promedio = calif1 + calif2/2 la pc dara como resultado promedio = 100 Recordar siempre, que antes de plantear una formula en un programa se deber evaluar contra el siguiente: Orden de operaciones: 1. Parntesis 2. Potencias y races 3. Multiplicaciones y divisiones 4. Sumas y restas 5. Dos o ms de la misma jerarqua u orden, entonces resolver de izquierda a derecha Nota: Si se quiere alterar el orden normal de operaciones, entonces usar parntesis. Tampoco es bueno usar parntesis de ms en una operacin, esto solo indica que no se evalo bien la formula, como en el siguiente ejemplo; En el ejemplo los parntesis estn de ms, porque por orden de operaciones, multiplicacin y divisin tienen la misma jerarqua y entonces se resuelven de izquierda a derecha, en otras palabras ni que falten parntesis ni que sobren parntesis.

COMPILADOR
Para poder construir programas o aplicaciones se usara el compilador turboc++ que se encuentra en la siguiente direccin de internet: http://community.borland.com/museum/ El compilador tiene el nombre de: Antique Software - Turbo C++ versin 1.01 Bajarlo, descomprimirlo en un folder o subdirectorio temporal, dentro se encontraran tres folders llamados disk1, disk2, disk3, copiar el contenido de disk2 y disk3 al folder disk1, luego correr un programa llamado install, esto creara un nuevo folder en el disco duro llamado tc, que ya contendr nuestro compilador a usar. Para correr el compilador y el editor de programas que trae integrado, solo abrir una sesin de msdos prompt en la barra de start de windows y luego navegar al directorio tc\bin con la orden: cpp:\CD TC\BIN Luego cargar el compilador con la orden: cpp:\TC\BIN\TC Deber mostrarse la siguiente pantalla con el editor:

Recordar que dentro de este compilador no funciona el ratn o mouse, todas las opciones se cargan con la tecla ALT y la letra en rojo correspondiente, tambin se podrn usar las teclas de flechas del teclado para navegar por las opciones de los mens.

APLICACIONES
Prog1.cpp </code> #include <stdio.h> void main() { //area declaracion variables int base1, altura; float area; //area captura de datos printf(dame base:); scanf(%d,&base1); printf(dame altura:); scanf(%d,&altura); //area de operaciones area=base1 * altura / 2.0; //area despliegue printf(el area es =%0.2f,area); getchar();getchar(); } </code>

Reglas para escribir un programa en CPP: a) Comienza con las instrucciones #include y cada una de ellas es una librera de instrucciones especializadas en tareas especficas. b) Todas las palabras reservadas del lenguaje deben ser minsculas. (main, include, printf, etc.) c) Todo programa comienza con una funcin llamada void main(). d) El cuerpo de instrucciones del programa deber encerrarse entre llaves. e) Todas las instrucciones ejecutables terminan con punto y coma. f) Los comentarios se ponen encerrados entre /* comentario */ g) La declaracin de variables ocupa la primera posicin. h) Se utiliza una instruccin llamada printf() para desplegar mensajes u otros elementos en el dispositivo de salida estndar (pantalla). i) Se utiliza una instruccin llamada scanf() para capturar datos desde el dispositivo de entrada estndar (teclado). j) Se usa una instruccin getchar(); al final para detener la pantalla hasta que el usuario pulse la tecla any key para continuar o el programa responde tan aprisa que no se alcanza a ver y se regresa al editor. k) C es case-sensitive, es decir trata a maysculas y minsculas como caracteres diferentes. Ya creadas y cargadas las variables normales se efectan los procesos u operaciones normales con ellas y al final se construye una pgina normal html con los resultados. Este programa se debera crear usando el editor del turboc y grabarlo como prog1.cpp en el folder de su preferencia, para ejecutarlo usar la opcin RUN del propio editor.

Corrida:

INSTRUCCION PRINTF() Es una de las ms poderosas herramientas de despliegue de datos que posee el lenguaje. Su formato completo es: Printf (string de control, lista de variables); Donde string de control puede ser: a) Mensaje o texto b) Secuencias de escape c) Codigos de formato

d) Combinacin de los tres ejemplos; I. MENSAJE O TEXTO: Printf(pato) Printf(%d, varentera); Printf( los datos son %d %0.f %s ,varent,varfloat,varstring); ver programa ejemplo. Nota: Se recomienda no ms de 70 caracteres. SECUENCIAS DE ESCAPE: Estas instrucciones proveen de mecanismos de control para diversas tareas, existe una gran variedad de secuencias de escape, las ms usuales son: nuevo rengln \n tabulador horizontal \t backspace o retroceso \b carriage return \r campanilla \a despliega comillas \ despliega apstrofe \` despliega diagonal inversa \\

II.

\a \f \v
III.

Alarma avance de pagina tabulacin vertical

CODIGOS DE FORMATO: Estos cdigos de formatos dentro de la string de control le indican al compilador que deber sustituir en esa posicin el valor de la variable indicada, adems se deber recordar que existe un cdigo de formato apropiado para cada tipo de dato existente. CODIGO TIPO DE DATO SALIDA: entero enteros con signo Unsignedint (enteros sin signo) Float y double (parte entera y decimal) Float y double (notacin exponencial usando e minscula) Float y double (notacin exponencial usando E %E mayscula) el compilador decide si usa f o e %g

IV.

%d %u %f %e

%G %c %s

el compilador decide si usa f o E Char un solo caracter variable string conjunto de caracteres

Para el caso de estos cdigos porcientos tambin es posible agregar la cantidad de entero y decimales que se quiere que se despliegue en la salida con el siguiente formato: %cantentero.cantdecimal caracter apropiado V. INSTRUCCION SCANF(); Esta instruccin permite que el dato entrado desde el teclado sea capturado y almacenado en la variable correspondiente, su formato completo es: scanf(string de control, lista de variables); los cdigos de formato o cdigos %.Observar que a diferencia de printf(), scanf() solo puede llevar los cdigos % , dentro de las comillas ( ). En el caso ms sencillo dentro del string de control se pone el porciento con el caracter apropiado al tipo de dato y en la lista de variables una variable ya declarada de ese mismo tipo. Se deber tener en cuenta siempre lo siguiente: a) La cantidad de variables de lista de variables debe ser igual en cantidad que los cdigos porciento %. b) Todas las variables de tipo numrico dentro de scanf, no de printf, debern ser precedidas del signo ampersand (&). EJemplo; scanf(%d, &area); >ver programa ejemplo. c) %s en scanf solo alcanza a capturar de la string hasta el primer espacio en blanco. d) El formato porciento (%) en scanf y printf para tipos long int sera (%ld). e) El formato porciento (%) para tipos doubles en scanf y printf es (%lf).

OTRAS FUNCIONES DE ENTRADA Y SALIDA (I/O)


CAPTURA: Getchar(); Getch(); Getche(); Estas tres instrucciones estn especializadas en captura de un solo carcter y sustituyen a scanf %c en situaciones especiales. Estas funciones trabajan por igualacin, es decir para usarse varchar=getchar(); ejemplo; char vocal; vocal=getchar();

NOTA: DEPENDIENDO DEL SISTEMA OPERATIVO EN OCACIONES UN GETCHAR() NO ATRAPA EL CARACTER A LA PRIMERA VEZ, EN ESTE CASO USAR MAS DE UN GETCHAR EN FORMA CONTINUA. En este caso poner ms getchar(); despus de getchar() hasta que capture el caracter o tambin para detener la corrida. A. Getchar es una macro que lee un caracter del teclado y regresa el caracter ledo. La diferencia es que getchar y getche devuelven el caracter ledo a la pantalla y el getch no devuelve el caracter a la pantalla. Estas instrucciones debern usarse en las siguientes situaciones: a) Cuando la captura es de un solo caracter b) Tambin para retener pantallas en este caso sin igualdad c) Para evitar los saltos en capturas, cuando se captura un entero y una string despus, es este caso es conveniente usar una serie de getchar() para quitar el caracter de return del teclado, en particular es conveniente usar un getchar despus de un scanf(entero) como lo muestra el ejemplo de abajo prog2.cpp B. GETS(); Esta funcin es la alternativa para captura de strings que tengan espacios en blanco intermedios cosa que scanf %s no puede hacer. Su formato completo es: gets(variable string); DESPLIEGUE: a) Putch(); Putchar(); Estas instruciones despliegan directamente un caracter en el dispositivo de salida standar. A diferencia de getchar, getch y getche, estas instrucciones si llevan un argumento. Ejemplo; putchar(alfa); putchar('\n'); putchar('\064'); b) Puts(variable string); Es la funcin complemento de gets esta funcin despliega una string en el dispositivo de salida standar y debe llevar el argumento o parametro. puts(nombre); puts(pato);

PROG2.CPP #include <stdio.h> void main() { //declaracion int var1, var2,var3; char var4[15], var5[15]; //captura y observar donde se ponen getchars //unos para limpiar return y otros para parar la pantalla printf("dame entero1:"); scanf("%d",&var1);getchar(); printf("dame string1:"); scanf("%s",&var4); printf("dame entero2:"); printf("dame string2:"); scanf("%d",&var2); printf("dame entero3:"); scanf("%d",&var3); getchar();

gets(var5); //despliegue printf("entero1 printf("string1 printf("entero2 printf("entero3 printf("string2 getchar(); } Recordar que scanf(%s) no quiere espacios en blanco, por eso es mejor usar gets(var string). Observar que despus de un scanf(entero) que este antes de un gets(varstring) debern usar un getchar() para quitar el return del teclado o la pc no va a capturar la string sino que va a saltarse. El ltimo getchar es para parar o detener la pantalla.

%d %s %d %d %s

\n",var1); \n",var4); \n" ,var2); \n",var3); \n",var5);

Corrida:

FORMATO PANTALLA PROGRAMACION C++


#include<conio.h> Libreria a usar 1. clrscr(); Limpia pantalla ESTA INSTRUCCION NO OCUPA ACLARACION 2. gotoxy(#de col,#de ren); posiciona cursor en lugar indicado RECORDAR QUE UNA CONSOLA NORMAL TIENE 24 RENGLONES Y 80 COLUMNAS En particular poner un gotoxy(); antes de cada printf() en el programa.

PALABRAS RESERVADAS EN C++


auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

Algunas de las palabras clave en C tienen significados nuevos o se han reemplazado en el mundo de C + +, la siguiente lista muestra las palabras clave que han cambiado. struct const static enum La siguiente lista muestra las palabras clave que se han aadido a C + +. bool inline protected catch new public class namespace tempate delete operator this friend private throw try template

FUNCIONES C++
abort() Abort Process and Return Error abs() Calculate Absolute Value of Integer absread() Read Disk Sectors abswrite() Write Disk Sectors access() Check File Permission Setting acos() Calculate Arc Cosine alloca() Allocate Memory Block on Stack allocmem() Allocate DOS Memory Segment asctime() Convert Time from Structure to String asin() Calculate Arc Sine assert() Diagnostic Message Generator atan() Calculate Arc Tangent atan2() Calculate Arc Tangent of y/x atexit() Register Exit Function atof() Convert String to Double farcoreleft() Return Measure of Unused Memory in Far Heap farfree() Free a Block from Far Heap farmalloc() Allocate Memory from Far Heap farrealloc() Adjust Allocated Block in Far Heap fclose() Close a Stream fcloseall() Close All Open Streams fcvt() Convert Double to String fdopen() Open a Stream Using a Handle feof() Detect Stream End-of-File (Macro) ferror() Test for Error on a Stream (Macro) fflush() Flush a Stream fgetc() Read a Character from a Stream fgetchar() Read a Character from Stdin fgets() Read a String from Stream filelength() Return File Length int86x() Set Segment Registers and Execute Software Interrupt intdos() Invoke DOS Function, Long Form intdosx() Set Seg Regs and Invoke DOS Function, Long Form ioctl() Control I/O Device isalnum() Test for Alphanumeric Character (Macro) isalpha() Test for Alphabetic Character (Macro) isascii() Test for ASCII Character (Macro) isatty() Check for Character Device iscntrl() Test for Control Character isdigit() Test for Digit isgraph() Test for Printable Character Except Space islower() Test for Lowercase isprint() Test for Printable Character ispunct() Test for Punctuation Character isspace() Test for White-Space Character rewind() Reposition File Pointer to Beginning of Stream rmdir() Remove a Directory sbrk() Reset Break Value for Calling Process scanf() Read Formatted Data from Stdin searchpath() Search the DOS Path segread() Return Current Values of Segment Registers setblock() Modify Size of DOS Memory Segment setbuf() Control Stream Buffering setcbrk() Set Control-Break Setting setdate() Set MS-DOS Date setdisk() Set Current Disk Drive setdta() Set Disk Transfer Address setftime() Set File Date and Time setjmp() Save Program State setmem() Assign a Value to Memory

atoi() Convert String to Integer atol() Convert String to Long bdos() Invoke DOS Function, Short Form bdosptr() MS-DOS System Call bioscom() Communications I/O biosdisk() Hard Disk / Floppy I/O biosequip() Check Equipment bioskey() Keyboard Interface biosmemory() Return Memory Size biosprint() Printer I/O biostime() Return the Time of Day brk() Change Data-Segment Space Allocation bsearch() Perform Binary Search cabs() Calculate Absolute Value of Complex Number calloc() Allocate and Zero Memory ceil() Calculate Ceiling of Value

fileno() Get File Handle Associated with Stream (Macro) findfirst() Search Disk Directory findnext() Fetch Files That Match findfirst() floor() Calculate Floor of Value flushall() Flush All Streams and Clear All Buffers fmod() Calculate Floating-Point Remainder fnmerge() Make New File Name fnsplit() Split a Full Path Name into Its Components fopen() Open a File

isupper() Test for Uppercase isxdigit() Test for Hexadecimal Digit itoa() Convert Integer to String kbhit() Check Keyboard Input Buffer for Character Waiting keep() Exit and Remain Resident labs() Calculate Absolute Value of Long Integer ldexp() Convert Mantissa and Exponent to Floating Point lfind() Linear Search for Key

setmode() Set File-Translation Mode settime() Set System Time setvbuf() Control Stream Buffering and Buffer Size setvect() Set Interrupt Vector Entry setverify() Set Verify State sin() Calculate Sine sinh() Calculate Hyperbolic Sine sleep() Suspend Execution for Interval spawn() An Overview of the Eight Spawn Functions spawnl() Execute Program Using: Arg List spawnle() Execute Program Using: Arg List, Environment spawnlp() Execute Program Using Arg List, PATH spawnlpe() Execute Program Using Arg List, PATH, Environment spawnv() Execute Program Using Arg Array spawnve() Execute Program Using Arg Array, Environment spawnvp() Execute Program Using Arg Array, PATH

localtime() Convert Time from Int to StructureLocal Correction FP_OFF() Get or Set Offset Portion lock() Set File Sharing Locks of a Far Pointer (Macro) FP_SEG() Get or Set Segment log() Calculate Natural Logarithm Portion of a Far Pointer (Macro) _fpreset() Reinitialize Floatinglog10() Calculate Base 10 Point Math Package Logarithm fprintf() Write Formatted Data to longjmp() Restore Program State Stream fputc() Write a Character to a lsearch() Linear Search for Key; Stream Add Key If Not Found fputs() Write a String to Stream lseek() Reposition File Pointer to Specified Location fread() Read Unformatted Data ltoa() Convert Long to String from Stream

cgets() Get a Character String from the Console chdir() Change Current Working Directory chmod() Change File Permission Setting _chmod() Change Access Mode of File _clear87() Get and Clear 8087/80287 Status Word clearerr() Clear Error Indicator for a Stream close() Close File _close() Close a File Handle coreleft() Return a Measure of Unused Memory cos() Calculate Cosine cosh() Calculate Hyperbolic Cosine country() Return CountryDependent Information cprintf() Formatted Write to Console cputs() Write a String to the Console creat() Create a New File _creat() Create a New File

free() Deallocate Memory Block

malloc() Allocate Memory Block

freemem() Free a Previously Allocated DOS Memory Block freopen() Reassign a File Pointer frexp() Get Mantissa and Exponent of Floating-Point Value fscanf() Read Formatted Data from Screen fseek() Reposition File Pointer to Given Location fstat() Get Information about Open File ftell() Get Current File Pointer Position fwrite() Write Unformatted Data to Stream gcvt() Convert Double to String geninterrupt() Generate Software Interrupt getc() Read a Character from a Stream (Macro) getchar() Read a Character from 'Stdin' getch() Get a Character from the Console without Echo getche() Get a Character from Console with Echo getcwd() Get Path Name of Current Working Directory

matherr() Handle Math Error _matherr() Floating-Point Error Handling Routine memccpy() Copy Characters from Buffer memchr() Find Character in Buffer memcmp() Compare Characters from Two Buffers memcpy() Copy Characters between Buffers memicmp() Compare Characters in Two Buffers memmove() Move a Block of Bytes memset() Initialize Buffer mkdir() Create a New Directory MK_FP() Make a Far Pointer mktemp() Create a Unique File Name modf() Split Floating Point into Mantissa and Exponent movedata() Copy Characters to a Different Segment movmem() Move a Block of Bytes

spawnvpe() Execute Program Using Arg Array, PATH, Environment sprintf() Write Formatted Data to String sqrt() Calculate Square Root srand() Set Random Starting Point sscanf() Read Formatted Data from String ssignal() Implement Software Signals stackavail() Return Size of Available Stack Memory stat() Get File-Status Information on Named File _status87() Get 8087/80287 Floating-Point Status Word stime() Set Time strcat() Append a String strchr() Find a Character in a String strcmp() Compare Two Strings, Case Sensitive strcmpi() Compare Two Strings, Case Insensitive stricmp() Compare Two Strings, Case Insensitive strcpy() Copy One String to Another

creatnew() Create a New File creattemp() Create a New File or Rewrite an Existing One cscanf() Read Formatted Data from Console ctime() Convert Time from Long Integer to String ctrlbrk() Set Control-Break Handler difftime() Find the Difference between Two Times disable() Disable Interrupts dosexterr() Get DOS Extended Error Values dostounix() Convert Date and Time to UNIX Time Format dup() Create Second Handle for Open File dup2() Reassign a File Handle ecvt() Convert Double to String enable() Enable Interrupts eof() Test for End of File exec() An Overview of the Eight Exec Functions execl() Execute Program Using: Arg List

getenv() Get a Value from the Environment Table getpid() Get Process ID getcbrk() Get Control-Break Setting getcurdir() Get Current Directory getdate() Get Date getdfree() Get Disk Free Space getdisk() Get Current Drive

open() Open a File _open() Open a File For Reading or Writing outport() Output to a Hardware Port outportb() Output to a Hardware Port parsfnm() Parse File Name peek() Examine Memory Location

strcspn() Scan One String for Another strdup() Duplicate String strerror() Save System Error Message strlen() Get String Length strlwr() Convert String to Lower Case strncat() Append Specified Number of Characters to a String strncmp() Compare n Characters of Two Strings, Case Sensitive strnicmp() Compare n Characters of Strings, Case Insensitive strncpy() Copy a Specified Number of Characters strnset() Initialize n Characters of String strpbrk() Scan String for Character from Character Set strrchr() Scan String for Last Occurrence of Character strrev() Reverse Characters in String strset() Set All Characters in String strspn() Find First Substring strstr() Find Substring

peekb() Examine Memory Location getdta() Get Disk Transfer Address perror() Print Error Message getfat() Get File Allocation Table Information getfatd() Get File Allocation Table Information getftime() Get File Date and Time getpass() Read a Password getpsp() Get the Program Segment Prefix gets() Read a Line from 'Stdin' gettime() Get System Time getvect() Get Interrupt Vector Entry poke() Store Value at a Given Memory Location pokeb() Store Value at a Given Memory Location poly() Generate a Polynomial from Arguments pow() Calculate X Raised to the Yth Power pow10() Power Function printf() Write Formatted String to Stdout putc() Write a Character to Stream putchar() Write a Character to Stdout

execle() Execute Program Using: Arg List, Environment execlp() Execute Program Using: Arg List, PATH execlpe() Execute Program Using: Arg List, PATH, Environment execv() Execute Program Using: Arg Array execve() Execute Program Using: Arg Array, Environment execvp() Execute Program Using: Arg Array, PATH execvpe() Execute Program Using: Arg Array, PATH, Environment exit() Terminate Process after Cleanup _exit() Terminate Process without Cleanup exp() Calculate Exponential fabs() Calculate Absolute Value of Floating-Point farcalloc() Allocate Memory from Far Heap

getverify() Get Verify State getw() Read an Integer from a Stream gmtime() Convert Time from Long Integer to Structure gsignal() Software Signals harderr() Establish a Hardware Error Handler hardresume() Hardware Error Handler Function hardretn() Hardware Error Handler Function hypot() Calculate the Hypotenuse of a Right Triangle inport() Input from Hardware Port inportb() Input from Hardware Port intr() Alternate 8086 Software Interrupt Interface int86() Execute 8086 Software Interrupt

putch() Write a Character to the Console putenv() Create New Environment Variables puts() Write String to Stdout putw() Write an Integer to Stream qsort() Perform Quick Sort rand() Get Pseudorandom Integer randbrd() Random Block Read randbwr() Random Block Write read() Read Data from File _read() Read Data from a File realloc() Reallocate Memory Block rename() Rename a File or Directory

strtod() Convert String to Double strtol() Convert String to Long Decimal Integer strtok() Finds Next Token in String strupr() Convert String to Uppercase swab() Swap Bytes system() Execute DOS Command tan() Calculate Tangent tanh() Calculate Hyperbolic Tangent tell() Get Current File Pointer Position time() Get Current System Time as Long Integer toascii() Convert 'c' to ASCII Character tolower() Convert 'c' To Lowercase, If Appropriate

_tolower() Convert 'c' to Lowercase toupper() Convert 'c' to Uppercase, If Appropriate _toupper() Convert 'c' to Uppercase tzset() Set External Time Variables, Environment Variables ultoa() Convert Unsigned Long to String ungetc() Push Character Back onto the Stream ungetch() Push Back the Last Character Read from the Console unixtodos() Convert Date and Time to DOS Format unlink() Delete a File unlock() Release File-Sharing Locks va_arg() Access Variable Number of Arguments, ANSI C Style vfprintf() Write Formatted Data to Stream vfscanf() Perform Formatted Input from a Stream vprintf() Write Formatted Data to Stdout vscanf() Perform Formatted Input from Stdin vsprintf() Write Formatted Data to String vsscanf() Perform Formatted Input from String write() Write Data to a File _write() Write Data to a File

OPERADORES C++
Operador ( ) [ ] . -> ! -++ & * / % + < > <= >= == != && || ?: = , sizeof Funcin llamada a funcin subndice de un arreglo Punto. Acceso a miembro de una estructura. Flecha. Apunta a miembro " " " Inversor Lgico Resta Decremento en uno Incremento en uno Obtener la direccin de memoria Obtiene la indireccin (contenido de) divisin modulo (resto de la divisin) suma menor que mayor que menor igual mayor igual igualdad de comparacin desigualdad operador lgico AND operador lgico OR condicional evala dos expresiones asignacin separador de variables, constantes y expresiones dentro de funciones, estructuras de control, etc. Determina el tamao de una variable o una estructura.

UNIDAD 2: C++ INSTRUCCIONES DE CONTROL DE PROGRAMA


INTRODUCCION
Instrucciones de control de programa permiten alterar la secuencia normal de ejecucin de un programa. Estas instrucciones se dividen en tres grandes categoras: Instrucciones Condicionales que en C++ CPP se implementan con las instrucciones if() y switch(). Instrucciones de ciclos con: for, while, do-while. Instruccin de salto incondicional goto.

INSTRUCCIONES CONDICIONALES
Una de las ms poderosas caractersticas de cualquier computador es la capacidad que tiene de tomar decisiones. Es decir al comparar dos alternativas diferentes el computador puede tomar una decisin, basndose en la evaluacin que hace de alguna condicin. Ejemplo de instrucciones condicionales; a) si sueldo > 3000 desplegar rico si no desplegar pobre fin-si b) si sexo = 'm' imprime mujer si no imprime hombre fin-si De los ejemplos observar que los caminos por el computador dependern de la evaluacin que el computador hace de la condicin. Todo lenguaje de programacin debe tener instrucciones que permitan formar condiciones e instrucciones que pueden evaluar esas condiciones. El formato general de una instruccin condicional es:

Como se observa son cuatro partes bien diferenciadas entre s; La propia instruccin condicional en si La condicin El grupo cierto de instrucciones El grupo falso de instrucciones Cuando el computador evala una condicin, el resultado de esa evaluacin solo es evaluado de dos maneras o la condicin es CIERTA o la condicin es FALSA. Esto depender del valor que tenga asignado o que se haya capturado para la variable que est en la condicin, por ejemplo si se capturo 6000 en sueldo en el ejemplo a), entonces el computador indicara que la condicin es CIERTA, pero en otro caso, si a la variable sueldo primero se le asign un valor de 250 entonces el computador indicara que la condicin es FALSA. Ya dependiendo del resultado de la evaluacin, el computador ejecuta las instrucciones contenidas en la parte CIERTA o en la parte FALSA de la condicin. Empezaremos el anlisis por la CONDICION.

CONDICIONES SIMPLES
En general todas las condiciones simples se forman con: variables operadores relacinales constante o var. sexo = 'm' sueldo > 300000 Una condicin siempre se define como el conjunto de variables y/o constantes unidas por los llamados operadores relacinales. Los operadores relacinales que reconoce el lenguaje CPP son: OPERADOR SIGNIFICADO Igual que ' == ' Mayor que ' > ' Menor que ' < ' Mayor o igual que ' >= ' Menor o igual que ' <= ' No es igual que o es diferente que ' != ' Observar y tener cuidado sobre todo con el operador de igualdad y el operador relacional de comparacin por igualdad, es decir; sueldo = 500; Se est pidiendo cargar o asignar la variable sueldo con el valor 500 sueldo == 500; Se est pidiendo que se compare el valor o dato que se encuentra en la variable sueldo, contra el numero 500. Solo este ltimo formato es vlido dentro de una condicin en una instruccin condicional.

NOTA IMPORTANTE, Para el caso de objetos de tipo string, los operadores mencionados arriba funcionan, es decir es vlido usar la siguiente condicin: string carrera; if (carrera==informatica) etc, etc, etc, PERO para el caso de arreglos de caracteres, se tendra que usar la funcin strcmp(str1,str2) que regresa cero si str1=str2, regresa un positivo si str1>str2 y regresa un negativo si str1<str2, el mismo ejemplo: char carrera[20]; if ( strcmp(carrera,informatica)== 0 ) etc, etc, etc.

INSTRUCCION IF
Es la instruccin condicional ms usada en los diversos lenguajes de programacin, su formato completo y de trabajo en CPP es: Cargar o asignar la variable de condicin; if (condicin) - { grupo cierto de instrucciones;} else - { grupo falso de instrucciones; }; Primero.- Observar donde van y donde no van los puntos y comas; Secundo.- La condicin va entre parntesis; Tercero.- Si un if no ocupa un grupo falso de instrucciones, entonces no se pone el else, y la llave antes del else si terminara con punto y coma. PROG4.CPP
#include <stdio.h> #include <conio.h> #include <string.h> void main() { // declaracion variables int edad; char ciudad[30]; //capturando clrscr(); gotoxy(10,5);printf("dame edad : "); scanf("%d",&edad);getchar(); gotoxy(10,7);printf("dame ciudad : "); gets(ciudad); //comparando if( edad>20) { gotoxy(30,5);puts("mayor de 20"); } else{ gotoxy(30,5);puts("menor de 20"); }; if( strcmp(ciudad,"tijuana")==0) { gotoxy(35,7);puts("es de tijuana"); }; getchar(); }

CORRIDA:

CONDICIONES COMPUESTAS
En muchas ocasiones es necesario presentar ms de una condicin para su evaluacin al computador. Por ejemplo que el computador muestre la boleta de un alumno, si este estudia la carrera de medicina y su promedio de calificaciones es mayor de 70. Una condicin compuesta se define como dos o ms condiciones simples unidas por los llamados operadores lgicos. Los operadores lgicos que CPP reconoce son: OPERADOR SIGNIFICADO TIPO && Y LOGICO ! NO NEGACION Ejemplo: if ( (sueldo> 700) && ( sexo=='m') ) etc, etc, etc. Notas: Observar que cada condicin simple lleva sus propios parntesis. Si la variable es de tipo string el dato va entre comillas ( ), pero si la variable es de tipo char el dato va entre apostrofes ('). Recordar adems que para comparar arreglos de chars se deber usar strcmp(). Para que el computador evale como CIERTA una condicin compuesta que contiene el operador lgico y, las dos condiciones simples deben ser ciertas. Para que el computador evale como CIERTA una condicin compuesta que contiene el operador lgico o, basta con que una de las condiciones simples sea cierta. La cantidad total de casos posibles cuando se unen dos o ms condiciones simples est dada por la relacin donde n = cantidad de condiciones, la primera mitad de ellos ciertos y la segunda mitad falsos. Ejemplo, si formamos una condiciona compuesta con dos condiciones simples y el operador lgico y, la cantidad total de casos posibles serian la siguiente tabla de verdad. y se puede construir

Tabla de verdad con y 1RA COND SIMPLE EVALUACION C C C C F F C C C C F F C F C F F F F F C F F F F F 2DA COND SIMPLE

La evaluacin final se obtiene usando la regla anteriormente descrita para una condicin compuesta que contiene el operador y. Esta tabla significa lo siguiente; 1.- Cualquiera que san la cantidad de datos procesados, siempre caer en uno de estos cuatro posibles casos. La tabla de verdad para una condicin compuesta con O es la siguiente; La tabla de verdad con O 1RA COND SIMPLE EVALUACION C C C C F C C C C C F C C F C C F F F F C C F F F F 2DA COND SIMPLE

Como se observa, una condicin compuesta con O, es menos restrictiva, o el 75% de los casos terminaran ejecutando el grupo CIERTO de instrucciones de la instruccin condicional.

Construir una tabla de verdad para una condicin compuesta de tres o ms condiciones simples, es tambin tarea sencilla, solo recordar que; 1.- La cantidad posible de casos posibles es la mitad empiezan con cierto y la otra mitad empiezan con falso. 2.- Para evaluar esta condicin triple, primero se evalan las dos primeras incluyendo su operador bajo las reglas ya descritas y luego se evala el resultado parcial contra la ltima condicin y el ultimo operador para obtener la evaluacin final. Ejemplo una condicin compuesta de tres condiciones simples, donde el primer operador lgico es el y y el segundo operador lgico es el O, dara la siguiente tabla de verdad. tabla de verdad para una condicin compuesta de tres o ms condiciones simples 1ra cond 2da cond 3ra cond Evaluacin 1a Y 2a Evaluacin eval O 3ra C C F C C F C F F C F F C F F C F C C F C C C F F F F C C F C C F F F F F C C F En la prctica cada condicin simple debe ir encerrada en su propio parntesis y las dos condiciones simples tambin deben encerrarse entre sus propios parntesis, como en el siguiente ejemplo; if((sueldo> 500)%%(strcmp(departamento,VENTAS)==0 ) {aqu se construye la pgina que despliega su cheque semanal} else {aqu se construye y despliega la pgina del bono de despensa o un oficio de motivacin} ; Recordar, cada condicin simple debe estar entre parntesis y las dos condiciones simples tambin deben estar entre parntesis. Observar donde se deben incluir los puntos y comas y donde no se deben incluir los puntos y comas.

INSTRUCCION SWITCH
Tambin existen ocasiones o programas donde se exige evaluar muchas condiciones a la vez, en estos casos o se usa una condicin compuesta muy grande o se debe intentar convertir el problema a uno que se pueda resolver usando la instruccin switch(); La instruccin switch() es una instruccin de decisin mltiple, donde el compilador prueba o busca el valor contenido en una variable contra una lista de constantes ints o chars, cuando el computador encuentra el valor de igualdad entre variable y constante, entonces ejecuta el grupo de instrucciones asociados a dicha constante, si no encuentra el valor de igualdad entre variable y constante, entonces ejecuta un grupo de instrucciones asociados a un default, aunque este ultimo es opcional. El formato de esta instruccin es el siguiente; capturar o asignar variable de condicin; switch(var int o char) { case const1: instruccin(es); break; case const2: instruccin(es); break; case const3: instruccin(es); break; default: instruccin(es); };
Ejemplo prctico:

Prog5.cpp #include <stdio.h> #include <conio.h> #include <string.h> void main() { // declaracion variables char letra; //capturando clrscr(); gotoxy(10,5);printf("dame una letra : "); letra=getchar();getchar(); //empieza switch() switch(letra)

{ case 'a': gotoxy(30,5);puts("aguila");break; case 'b': case 'B': gotoxy(30,5);puts("baca");break; case 'c': gotoxy(30,5);puts("caballo ");puts("camello");break; default:gotoxy(30,5);puts("no hay"); } getchar(); } Corrida:

Notas: 1. Solo se puede usar como variable de condicin una variable entera o variable char. 2. Las constantes que estamos buscando y comparando son de tipo char, por eso se deben encerrar entre apstrofes ( '). 3. Si se quiere resolver el problema de maysculas o minsculas en el teclado, observar que se usan dos case, pero con un solo break; 4. Recordar que switch() solo trabaja con constantes y variables de tipo char o int, en este ltimo caso, solo usar una variable de opcin de tipo entero y en los case poner la constante numrica, sin apstrofes decir por ejemplo case 5: instrucciones; break; En particular, instrucciones de tipo switch() se usan para construir programas de seleccin de mens, donde al usuario se le plantean dos o tres problemas distintos y el propio usuario seleccionaba cul de ellos se ejecuta .

CICLO FOR
Instrucciones para ciclos resuelven el problema de repetir todo el programa o cierta parte del programa ms de una vez. Este ciclo es uno de los ms usados para repetir una secuencia de instrucciones, sobre todo cuando se conoce la cantidad exacta de veces que se quiere que se ejecute una instruccin simple o compuesta.

Su formato general es: for (inicializacin; condicin; incremento) { instruccin(es); }; Ejemplo: for(x=1;x10;x=x+1) { puts( MAMA ); }; En su forma simple la inicializacin es una instruccin de asignacin que carga la variable de control de ciclo con un valor inicial. La condicin es una expresin relacional que evala la variable de control de ciclo contra un valor final o de parada que determina cuando debe acabar el ciclo. El incremento define la manera en que la variable de control de ciclo debe cambiar cada vez que el computador repite un ciclo. Se deben separar esos 3 argumentos con punto y coma (;) Codigo prog6.cpp #include <stdio.h> #include <conio.h> #include <string.h> void main() { clrscr(); // declaracion variables int x; // instruccion for for(x=1;x<=10;x=x+1) { gotoxy(10, x+4); printf("%d MAMA",x); }; getchar(); }

Corrida:

Casos Particulares del ciclo for; 1. El ciclo comienza en uno y se incrementa de uno en uno este es el caso mas general. 2. Pero el valor inicial puede se diferente de uno, ejemplo; for(x=5;x15;x=x+1){ etc.}; 3. Incluso el valor inicial puede ser negativo, ejemplo; for (x = -3 ;x 8; x=x+1) { etc.}; 4. Los incrementos tambin pueden ser diferentes al de uno en uno, ej.; for (x=1; x 20; x=x+3){ etc. }; 5. Incluso pueden ser decrementos, solo que en este caso, recordar; 5.1 el valor inicial de la variable debe ser mayor que el valor final. 5.2 cambiar el sentido de la condicin. Ejemplo; for (x= 50 ; x >= 10; x= x-4 ) { etctera }; 6. Solo para los casos de incrementos y decrementos de una en una UNIDAD sustituir en el for: el x = x + 1 por x++ el x = x - 1 por x

CICLO WHILE
En este ciclo el cuerpo de instrucciones se ejecuta mientras una condicin permanezca como verdadera en el momento en que la condicin se convierte en falsa el ciclo termina. Su formato general es: cargar o inicializar variable de condicin; while(condicin) { grupo cierto de instrucciones; instruccin(es) para salir del ciclo; };

Un error muy comn con el while, es poner un punto y coma (;) despus de la (condicin) ejemplo while(condicion); -esto es y causa un error. Prog7.cpp #include <stdio.h> #include <conio.h> #include <string.h> void main() { clrscr(); // declaracion variables int x=1; // instruccion while while(x<=10) { gotoxy(10, x+3); printf("%d PATO",x); x++; }; getchar(); } Corrida:

While puede llevar dos condiciones en este caso inicializar 2 variables de condicin y cuidar que existan 2 de rompimiento o terminacin de ciclo. El grupo cierto de instrucciones puede ser una sola instruccin o todo un grupo de instrucciones. La condicin puede ser simple o compuesta. Los casos generales de for tambin se aplican a while.

A este ciclo tambin se le conoce tambin como ciclo de condicin de entrada o prueba por arriba porque este ciclo evala primero la condicin y posteriormente ejecuta las instrucciones.

CICLO DO WHILE
Su diferencia bsica con el ciclo while es que la prueba de condicin es hecha al finalizar el ciclo, es decir las instrucciones se ejecutan cuando menos una vez porque primero ejecuta las instrucciones y al final evala la condicin; Tambin se le conoce por esta razn como ciclo de condicin de salida. Su formato general es: cargar o inicializar variable de condicin; do { grupo cierto de instruccin(es); instruccin(es) de rompimiento de ciclo; } while (condicin); prog8.cpp #include <stdio.h> #include <conio.h> #include <string.h> void main() { clrscr(); // declaracion variables int x=1; // instruccion do while do{ gotoxy(10, x+3); printf("%d GATO",x); x++; } while(x<=10); getchar(); }

Corrida prog

Otra diferencia bsica con el ciclo while es que, aunque la condicin sea falsa desde un principio el cuerpo de instrucciones se ejecutara por lo menos una vez.

CONCLUSIONES ACERCA DE CICLOS EN C++


El problema, de un problema dado, cualesquiera cual ciclo se debe usar se resuelve con: 1. Si se conoce la cantidad exacta de veces que se quiere que se ejecute el ciclo o si el programa de alguna manera puede calcularla usar for. 2. Si se desconoce la cantidad de veces a repetir el ciclo o se quiere mayor control sobre la salida o terminacin del mismo entonces usar while. 3. Si se quiere que al menos una vez se ejecute el ciclo entonces usar do while.

UNIDAD 3: C++ ARREGLOS


INTRODUCCION ARREGLOS
Uno de los problemas ms comunes en los diversos sistemas de informacin es el tratamiento o procesamiento de un gran volumen de datos o de informacin. Las variables manejadas hasta ahora no pueden ayudar a resolver este problema. Las variables usadas hasta ahora reciben propiamente el nombre de variables escalares, porque solo permiten almacenar o procesar un dato a la vez. No confundir esto con el tipo de dato o rango de datos que una variable tiene la capacidad de almacenar. Por ejemplo si se quiere almacenar nombre y edad de 15 personas con el mtodo tradicional se ocuparan 30 variables y esto solo es nombre y edad de 15 personas, agreguen ms datos y ms personas y ya es tiempo de empezar a analizar otro tipo de variables. Se ocupan entonces variables que sean capaces de almacenar y manipular conjuntos de datos a la vez. Variables de tipo arreglo si permiten almacenar y procesar conjuntos de datos del mismo tipo a la vez. Cada dato dentro del arreglo se le conoce como elemento del arreglo y se simboliza y procesa (captura, operacin, despliegue ) usando el nombre del arreglo respectivo y un subndice indicando la posicin relativa del elemento con respecto a los dems elementos del arreglo, solo recordar que en cpp la primera posicin, elemento o rengln es el 0 (cero), ejemplo: NOMBRES Juan nombres(0) Pedro nombres(1) Rosa nombres(2) Jose nombres(3) Sin embargo sus problemas son similares a los de variables normales es decir hay que declararlos, capturarlos, hacer operaciones con ellos, desplegarlos, compararlos, etc.

ARREGLOS
En programacin tradicional siempre se manejan dos tipos de arreglos los arreglos tipo listas, vectores o unidimensionales y los arreglos tipo tablas, cuadros, concentrados, matrices o bidimensionales en ambos casos son variables que permiten almacenar un conjunto de datos del mismo tipo a la vez, su diferencia es en la cantidad de columnas que cada uno de estos tipos contiene, como en los siguientes ejemplos: a. LISTAS EDAD 18 34 22 15 b. TABLAS CIA ACME INGRESOS MENSUALES VENTAS (MILES DE $) SUC A SUC B SUC D 10 50 90 20 60 100 30 70 110 40 80 120 50 90 130

MES ENE FEB MAR ABR MAY

Como se observa la diferencia principal entre un arreglo tipo lista y un arreglo tipo tabla son las cantidades de columnas que contienen. NOTA IMPORTANTE.- LOS CONCEPTOS MANEJADOS AQUI ESTAN ENFOCADOS A LOS SISTEMAS DE INFORMACION CONTABLES FINANCIEROS ADMINISTRATIVOS EN ALGEBRA MATRICIAL, SI SON IMPORTANTES LOS CONCEPTOS DE VECTORES Y MATRICES, PERO LAS OPERACIONES Y METODOS SON PRECISAMENTE LOS DEL ALGEBRA MATRICIAL.

ARREGLO TIPO LISTA


Un arreglo tipo lista se define como una variable que permite almacenar un conjunto de datos del mismo tipo organizados en una sola columna y uno o ms renglones. Tambin reciben el nombre de vectores en lgebra o arreglos unidimensionales en programacin. Los procesos normales con una lista o con sus elementos incluyen declarar toda la lista, capturar sus elementos, desplegarlos, realizar operaciones con ellos, desplegarlos, etc. Para declarar una lista se usa el siguiente formato; tipodato nomlista[cant de elementos o renglones];

Ejemplos; int edades[12]; float sueldos[10]; Char carreras[10][30]; Para crear e inicializar una lista usar el siguiente formato: Tipodato nomlista[cant reng]={elementos}; Ejemplo: Int edad[5] = { 12,18,20,23,30 }; Float sueldo[3] = { 1.36, 23.67, 77.90 }; Strcpy(carrers[0],informatica);strcpy(carreras[1],sistemas);etc; etc. Recordar que la primera posicin o rengln en una lista es la posicin o rengln 0 (cero).

LISTAS
Prog9.cpp
#include <stdio.h> #include <conio.h> #include <string.h> void main() { clrscr(); // declaracion listas char nombre[3][20]; int edad[3]; // capturando for (int r=0; r<=2; r++) { gotoxy(5, r*2+2); printf("%d NOMBRE: ",r); gets(nombre[r]); gotoxy(5, r*2+3); printf("%d EDAD: ",r); scanf("%d",&edad[r]); getchar(); }; //operando for ( r=0; r<=2; r++) edad[r]=edad[r] *12; //desplegando for ( r=0; r<=2; r++) { gotoxy(5, r*2+9); printf("NOMBRE:= %s", nombre[r]);

gotoxy(5, r*2+10); printf("EDAD:=%d",edad[r]); }; getchar(); }

Corrida:

Captura este procedimiento es similar para despliegue. Se deber usar siempre un ciclo for con una variable de control llamada renglon, misma que tambin se usa como ndice del arreglo. Recordar que el primer renglon o ndice en CPP es el renglon 0. Siempre que se use un elemento de una lista en Cpp con cualquier proceso (captura, despliegue, operaciones) deber acompaarse de su ndice respectivo. Para procesar (hacer operaciones con ellos, o comparaciones, etc.) los elementos de la lista, se debern usar un ciclo for con una variable de control llamada rengln, misma que se usara tambin como ndice de la lista. Para desplegar los elementos de la lista, tambin se usa un ciclo for con su variable de control rengln, tal como se muestra en el ejemplo. El mismo ciclo de proceso o despliegue se puede utilizar para procesar o desplegar los elementos de ms de una lista, siempre y cuando las listas sean del mismo tamao.

STRING
STRING COMO ARREGLO DE CARACTERES
Las strings no son ms que un caso especial de arreglo de caracteres y como tales presentan ciertas peculiaridades que no son posibles de resolver con mtodos tradicionales. Por ejemplo no es vlido usar simples sentencias de asignacin o comparacin. 1. char nombre [30],copia[nombre]; copia = nombre; esto no es vlido en CPP 2. if(opcion==`si`) Tampoco es vlido en CPP

Para casos como estos se debern usar ciertas funciones de manipulacin de strings que provee el lenguaje C, estas funciones son: #include <string.h> a) STRCPY(string destino,string original); Se utiliza para copiar el contenido de un string original en un string de destino. Ejemplo: char nombre[30],copia[30]; nombre= getstring(nombre); strcpy(copia,nombre); strcpy(nombre,pato); b) STRCAT(string1,string2); Encadena o agrega al final de la string1 la string2. Ejemplo: char nombre[30],copia[30]; strcpy(nombre,pepe); strcat(nombre,lopez); c) STRCMP(string1,string2); Se utiliza para comparar 2 strings, esta funcin regresa cero si ambas strings son iguales, regresa un nmero mayor que cero si string1 es mayor que string2 y regresa un nmero menor que cero si string1 es menor alfabticamente que string2. Ejemplo: char opcion[3]; strcmp(opcion,si); if(strcmp(opcion,si)==0) d) STRLEN(string); Esta funcin regresa la cantidad de caracteres que tiene la string. Ejemplo: char nombre[30]; strcpy(nombre,juan); printf(%d,sizeof(nombre)); REGRESA 30 printf%d,strlen(nombre)); REGRESA 4

LISTAS DE STRINGS
Las listas de strings en C++ tambin dependern del tipo de string que se est usando, es decir como un arreglo de caracteres o como una lista de strings, en cada caso se ocupara sus propias instrucciones o mtodos de tratamiento de strings: 1. Como arreglo de caracteres: rosa juan jose maria

Se deber usar un arreglo bidimensional de chars donde el primer subndice referenciara la cantidad de strings que tendr el arreglo y el segundo subndice indicara el tamao mximo de cada string. Ejemplo: char nombres[4][30]; Para efectuar cualquier proceso (captura, comparacin, despliegue), se deber usar el nombre de la lista y nada ms el primer subndice. Ejemplo: char nombres[4][30]; int ren; // capturar o inicializar los elementos // despliegue for(ren=0;ren<=3;ren++) printf("%s",nombres[reng]);

SORTEOS U ORDENAMIENTOS
Un proceso muy comn en C++ con listas es el llamado sorteo u ordenamiento. Este proceso consiste en reacomodar los elementos de la lista en un nuevo orden, de acuerdo a algn criterio. Lista original Orden crece - Orden decrece 15 2 15 2 8 10 10 10 8 8 15 3 Existen muchos mtodos u algoritmos de sorteos, el ms comn de ellos, es el denominado sorteo de burbuja que se basa en el siguiente algoritmo: /*area de ordenamiento*/ n=cantidad de elementos de la lista; for(k=1;k<=n-1;k++) { renglon=0; while(renglon< n-k)

{ if(lista[renglon]>lista[renglon+1]) { temp=lista[renglon]; lista[renglon]=lista[renglon+1]; lista[renglon+1]=temp; }; renglon=renglon+1; }; }; Las notas a considerar con respecto al algoritmo son: - Las variables n, k, rengln, son variables de control y debern ser declaradas de tipo int. - La variable temp, deber ser declarada de acuerdo al tipo de dato de los elementos de la lista. - Todas las referencias a LISTA, debern ser cambiadas por el nombre verdadero de la lista real. - Es el smbolo del if, quien determina el tipo de sorteo, es decir, ascendente (>), descendente (<). - Para el caso de listas de strings, la comparacin en el if y el intercambio en la parte cierta de abajo se deber hacer usando las instrucciones o mtodos que se analizaron en el tema de strings.

ARREGLOS TIPO TABLA


Un arreglo tipo tabla se define como un conjunto de datos del mismo tipo organizados en dos o ms columnas y uno o ms renglones. Para procesar (recordar solo operaciones y comparaciones) internamente todos los elementos de la tabla se ocupan dos ciclos for() uno externo para controlar rengln y uno interno para controlar columna. Los elementos de la tabla se debern simbolizar con el nombre de la tabla y 2 subndices, el primer subndice referencia al renglon y el siguiente subndice referencia la columna. La declaracin de una tabla ser de acuerdo al siguiente formato. tipo nomtabla[cant ren][cant col]; Ejemplo: int calif[3][4]; long int ingresos [3][4];

Para efectuar procesos tales como operaciones despliegue con todos los elementos de la tabla se debern usar 2 ciclos un for externo para controlar renglon y un for interno para controlar columna. prog10.cpp #include <stdio.h> #include <conio.h> #include <string.h> void main() { clrscr(); // declaracion tabla int calif[3][4]; int r,c,nc=5; // capturando printf("CALIFICACIONES \n"); for (r=0; r<=2; r++) { for(c=0;c<=3;c++) { gotoxy(nc,r+2); printf("%d %d: ",r,c); scanf("%d",&calif[r][c]);getchar(); nc=nc+10; }; nc=5; }; //operando for ( r=0; r<=2; r++) for(c=0;c<=3;c++)calif[r][c]=calif[r][c]+10; //desplegando for (r=0; r<=2; r++) { for(c=0;c<=3;c++) { gotoxy(nc,r+6); printf("%d ",calif[r][c]); nc=nc+10; }; nc=5; }; getchar(); }

Corrida:

INICIALIZACION DE ARREGLOS
Se permite la inicializacin de arreglos en C++ de acuerdo al siguiente formato: static tipo numarreglo[cant de elementos]={valores}; Ejemplo: static int edades[5]={18,20,19,17,23}; static long int tabla num[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; static char nombres [3][30]={juan, jose, rosa};

UNIDAD 4: C++ PROCEDIMIENTOS Y FUNCIONES


PROCEDIMIENTOS
Un camino para dividir un gran programa en partes ms pequeas es el uso de los llamados procedimientos. Un procedimiento es un grupo de instrucciones, variables, constantes, etc., que estn diseados con un propsito particular y tiene su nombre propio. Es decir un procedimiento es un mdulo de un programa que realiza tareas especficas y que no puede regresar valores a la parte principal del programa u otro procedimiento que lo est invocando. Despus de escribir un procedimiento se usa su propio nombre como una sola instruccin o llamada al procedimiento. Los procedimientos se podrn escribir despus del cuerpo principal del programa utilizando el formato: void NomProc(){instrucciones;}; Pero tambin los procedimientos debern declararse antes del main como lo muestra el programa ejemplo. Sin embargo el procedimiento se construye antes del main() entonces no hay necesidad de declararlo antes. Un programa puede tener tantos procedimientos como se deseen para hacer una llamada o invocacin al procedimiento durante la ejecucin de un programa solo se deber escribir el nombre del procedimiento y los parntesis en blanco. Prog11.cpp #include <stdio.h> #include <conio.h> #include <string.h> void main() { clrscr(); // recordar declarar primero proc y funciones void proc1(); //llamando o activando procedimiento proc1(); } // fin del main

void proc1() { // area de declaracion de variables y captura de datos int base1,altura; float area; //area de captura printf("dame base: "); scanf("%d",&base1); printf("dame altura: "); scanf("%d",&altura); // area de operaciones area = base1 * altura / 2; // area de despliegue printf("area=%0.2f",area); getchar(); getchar(); } // fin proc Recordar que se pueden crear el procedimiento o los procedimientos (aunque realmente es una funcin) arriba o abajo de la parte principal del programa. Recordar tambin que un programa puede tener muchos procedimientos, y estos pueden llamarse o invocarse entre s. MUCHO OJO con la nota anterior, es vlido que un procedimiento se llame o invoque o se active a s mismo o usando una referencia circular, por ejemplo proc1, activa proc2 que a su vez llama a proc1 esto se llama recursin y si no se controla con una instruccin if(condicin)break; se va a obtener un hermoso ciclo infinito, muy divertido cuando le pasa a los programas de los compaeros, estn avisados. Como se observa un procedimiento puede ser un programa completo.

PARAMETROS EN C++
Un parmetro en C++ es una variable que puede pasar su valor a un procedimiento desde el principal o desde otro procedimiento. Existen ocasiones en que es necesario mandar al procedimiento ciertos valores para que los use en algn proceso. Estos valores que se pasan del cuerpo principal del programa o de un procedimiento a otros procedimientos se llaman parmetros. Entonces la declaracin completa de un procedimiento es: Void Nom_Proc(lista de parametros) { cuerpo de instrucciones;};

Donde lista de parmetros es una o ms variables separadas por coma, como lo muestra el programa ejemplo. prog12.cpp #include <stdio.h> #include <conio.h> #include <string.h> // recordar declarar primero proc y funciones // y observar como se pasa como parametro una string void proc1(char nom[], int suma); void main() { clrscr(); //llamando o activando procedimiento // y pasando dos parametros uno de ellos string proc1("juan perez", 3 + 4); } //fin main // ya se fijaron como se pasa la string void proc1(char nom[], int suma) { //declarando variables int edad; // capturando printf("dame edad: "); scanf("%d",&edad); // operaciones sumando parametro edad = edad + suma; //construyendo y desplegando la pagina de salida printf("%s \n",nom); printf("EDAD= %d", edad); getchar(); getchar(); } // fin proc

Y no olvidar declarar el procedimiento antes del main() incluyendo sus parmetros como lo muestra el ejemplo. Recordar tambin que se pueden mandar como parmetros, datos, variables y expresiones algebraicas (no formulas o ecuaciones algebraicas) Corrida:

Observar que en el procedimiento los parmetros son dos variables locales es decir variables que solo se pueden usar dentro del procedimiento estas variables son quienes reciben los datos o valores. REGLAS PARA EL USO DE PARAMETROS 1. Cuando se usan variables como parmetros, la variable que se manda debe ser declarada dentro del principal o del procedimiento de donde se est enviando. 2. La variable que se manda tiene un nombre, la que se recibe puede tener otro nombre o el mismo nombre por claridad de programa, pero recordar que internamente en la memoria del computador existirn dos variables diferentes. 3. La cantidad de variables que se envan deben ser igual en cantidad, orden y tipo a las variables que reciben. 4. La variable que se recibe tiene un mbito local dentro del procedimiento, es decir solo la puede usar ese procedimiento. 5. Se puede mandar a un procedimiento un dato, una variable (como lo muestran los ejemplos) o una expresin algebraica (no ecuacin o formula, pero siempre se debern recibir en una variable.

VARIABLES LOCALES Y GLOBALES


El lugar donde sea declarada una variable afectara el uso que el programa quiera hacer de esa variable. Las reglas bsicas que determinan como una variable puede ser usada dependen de 3 lugares donde se puede declarar una variable. En primer lugar es dentro de cualquier funcin o procedimiento a estas se les llama variables locales y solo pueden ser usadas por instrucciones que estn dentro de esa funcin o procedimiento. En segundo lugar es como parmetro de una funcin donde despus de haber recibido el valor podr actuar como variable local en esa funcin o procedimiento. En esencia una variable local solo es conocida por el cdigo de esa funcin o procedimiento y es desconocida por otras funciones o procedimientos. En tercer lugar es fuera de todas los procedimiento o funciones a este tipo de variables se les llama variables globales y podrn ser usadas por cualquier funcin o procedimiento del programa, sin embargo hay que agregarle la palabra reservada STATIC y a partir del momento en que se declara, acompaada de dicha palabra reservada static se considera y puede usarse como variable global.

En programacin en serio no es acostumbrado usar muchas variables globales por varias razones, una de ellas es que variables globales estn vivas todo el tiempo de ejecucin del programa y si una global solo la ocupan unos cuantos procedimientos no tiene caso que este viva para todo el resto, otra razn es que es peligroso tener variables globales porque todo el conjunto de procedimiento y funciones que componen un programa tienen acceso o comparten su valor y se corre el riesgo de que inadvertidamente alguno de ellos modifiquen su valor. prog13.cpp #include <stdio.h> #include <conio.h> #include <string.h> // recordar declarar primero proc y funciones void proc1(); // variables globales float base, altura, area; void main() { clrscr(); //capturando datos printf("dame base: ");scanf("%f",&base); printf("dame altura: ");scanf("%f",&altura); //llamando procedimiento proc1(); } void proc1(){ // area de operaciones area = base * altura / 2; // rea de construccin de pgina de salida printf(" area =%0.2f",area); getchar();getchar(); } Es muy agradable trabajar sin parmetros pero recordar la nota de arriba que no es muy bueno usar muchas variables globales. Corrida:

FUNCIONES
Una funcin es un mdulo de un programa separado del cuerpo principal, que realiza una tarea especfica y que puede regresar un valor a la parte principal del programa u otra funcin o procedimiento que la invoque. La forma general de una funcin es: Tipodato Nomfun(parametros) { cuerpo de instrucciones; return [dato,var,expresion]; } Donde tipodato especifica el tipo de dato que regresara la funcin. La instruccin RETURN es quien regresa un y solo un dato a la parte del programa que la est llamando o invocando, sin embargo es de considerar que return puede regresar un dato, una variable o una expresin algebraica (no ecuacin o formula) como lo muestran los siguientes ejemplos; a) return 3.1416; b) return area; c) return x + 15/2; La lista de parmetros formales es una lista de variables separadas por comas (,) que almacenaran los valores que reciba la funcin, estas variables actan como locales dentro del cuerpo de la funcin. Aunque no se ocupen parmetros los parntesis son requeridos.

INSTRUCCION RETURN
Dentro del cuerpo de la funcin deber haber una instruccin return cuando menos para regresar el valor, esta instruccin permite regresar datos. Recordar adems que cuando se llame una funcin deber haber una variable que reciba el valor que regresara la funcin, es decir generalmente se llama una funcin mediante una sentencia de asignacin, por ejemplo resultado=funcion(5, 3.1416); prog14.cpp <code> #include <stdio.h> #include <conio.h> #include <string.h> //todos los proc y funciones deben declararse antes del main float fun1(float b, float, a); void main() { clrscr(); //capturando datos //area de declaracion de variables y captura de datos int base, altura; float area;

//area de captura printf(dame base: );scanf(%d,&base); printf(dame altura: );scanf(%d,&altura); //llamando o invocando la funcion fun1 area= fun1(base, altura); //desplegando printf( area =%0.2f,area); getchar();getchar(); } float fun1(float b, float a) { return b * a / 2; } </code Corrida:

Usar de preferencia solo int y double como parmetros. Es permitido poner ms de un return en el cuerpo de instrucciones sobre todo en condiciones, pero solo un return se ejecutara, ejemplo; if (suma >= 10) { return 10; } else { return 20; } EXISTEN 3 CLASES USUALES DE FUNCIONES. Las primeras son de tipo computacional que son diseadas para realizar operaciones con los argumentos y regresan un valor basado en el resultado de esa operacin. Las segundas funciones son aquellas que manipulan informacin y regresan un valor que indican la terminacin o la falla de esa manipulacin. Las terceras son aquellas que no regresan ningn valor, es decir son estrictamente procedurales. Esto quiere decir que en general toda operacin o calculo en un programa deber convertirse a una o muchas funciones y el resto debern ser procedimientos.

ARREGLOS COMO PARAMETROS


Para pasar un arreglo completo como parmetro a un procedimiento a una funcin solo se manda el nombre del arreglo sin corchetes e ndices, en el procedimiento o funcin que recibe solo se declara un arreglo del mismo tipo y se puede usar el mismo o diferente nombre del arreglo sin corchetes e ndices. Sin embargo es conveniente aclarar, que a diferencia de variables escalares normales, c++ no genera una nueva variable en memoria ni tampoco copia los datos al arreglo que recibe, en su lugar cpp sigue usando los datos que estn en el arreglo original, es por esta razn que cambios que se le hagan a los datos del arreglo que recibe realmente se est haciendo al arreglo original como lo muestra el siguiente ejemplo: Prog15.cpp #include <stdio.h> #include <conio.h> #include <string.h> void proc1(int vector[]); void main() { clrscr(); //creando arreglo y cargandolo int lista[5]= {10,11,12,13,14}; // mandandolo a procedimiento recordar como se manda sin [] proc1(lista); // desplegando arreglo lista y observar que datos salen for(int reng=0; reng<=4; reng++) printf("%d \n",lista[reng]); getchar(); } // termina main void proc1(int vector[]) { // sumandole 50 a lo que se tenia en arreglo lista // es decir vector queda cargado con 60,61,62,63,64 for(int reng=0; reng<=4; reng++) vector[reng]=vector[reng]+ 50; // observar que no se regresa nada } //termina proc1

Corrida:

Es de recordar que los cambios que le hagan al arreglo dentro de la funcin se reflejaran en el arreglo original, es por esto que si se quiere modificar un arreglo en una funcin no hay necesidad de regresar ningn valor.

UNIDAD 5: C++ REGISTROS Y ARCHIVOS SECUENCIALES


INTRODUCCION
Antes de empezar a programar en serio se estudian en esta UNIDAD dos problemas. Problema A: Variables que puedan almacenar un conjunto de valores y no necesariamente del mismo tipo. Problema B: Resolver el problema de almacenar en forma permanente los datos que se generan dentro de un programa ya sea por captura, proceso, etc. El problema (A) se resuelve usando el concepto de estructuras o registros el problema (B) se resuelve usando el concepto de archivos.

ESTRUCTURAS O REGISTROS
En este tema exploramos en C la estructura ms comn de representacin de datos la llamada estructura. Variables simples o escalares pueden almacenar un datum de informacin y arreglos pueden almacenar conjuntos de ellos del mismo tipo y al mismo tiempo, estos dos mecanismos pueden manejar una gran variedad de situaciones pero a menudo se necesita trabajar sobre datos de diversos tipos en este caso ni variables escalares ni arreglos son adecuados. Para resolver este problema C provee de un tipo de dato especial llamado estructura. Los elementos individuales de una variable estructura reciben el nombre de campos. Ejemplo: struct alumno nombre campo1 direccion campo2 edad campo3 etc. EL FORMATO GENERAL DE UNA ESTRUCTURA ES: tipo de almacenamiento struct { tipo campo1; tipo campo2; }lista de variables; Es el registro completo quien se declara en cualquiera de los lugares adecuados para ello. Son los campos del registro a quienes se les va a asignar, inicializar, capturar, etc., y de esta manera a los campos se les considera como variables normales.

Para indicar a C durante cualquier proceso que la variable a utilizar es un campo de una estructura se utiliza el siguiente formato. nomregistro.nombredelcampo Ejemplo. prog16.cpp #include <stdio.h> #include <conio.h> #include <string.h> struct { int matricula; char nombre[30]; int edad;}alumno; void main() { clrscr(); // captura de campos printf("dame matricula:");scanf("%d",&alumno.matricula);getchar(); printf("dame nombre :");gets(alumno.nombre); printf("dame edad :");scanf("%d",&alumno.edad); // rea de operaciones alumno.edad = alumno.edad * 12; // rea de salida printf("MATRICULA =%d \n",alumno.matricula); printf("NOMBRE =%s \n",alumno.nombre); printf("MESES =%d \n",alumno.edad); getchar();getchar(); } Corrida:

Las operaciones ms elementales con los campos de una estructura incluyen captura e inicializacin.

ARCHIVOS
Si bien es cierto que ya se pueden manejar gran cantidad de datos del mismo y diferente tipo al mismo tiempo el problema es que al terminar de ejecutarse el programa los datos se pierden. De esta situacin nace el concepto de archivos que son medios que facilita el lenguaje para almacenar los datos en forma permanente, normalmente en los dispositivos de almacenamiento estndar. En general es necesario entender algunos conceptos elementales de sistemas de archivos tradicionales. Como nota a tomar en cuenta los datos que se van almacenando en un archivo de disco, se almacenan en renglones consecutivos y cada rengln en disco, se conoce como registro del archivo, favor de no confundir el concepto de registro de archivo y registro o estructura como variable ya analizada, son dos cosas totalmente diferentes aunque desafortunadamente se llamen igual. Primero: Operaciones con archivos ESCRIBIR O GRABAR: Es la operacin ms elemental con un archivo, consiste en tomar un o unos datos en variables de cualquier tipo (escalar, mezcla de datos, arreglos, estructuras) y almacenarlas en un archivo de datos en disco. LEER: Operacin consistente en sacar los datos del archivo en disco y mandarlos o cargar la variable respectiva Segundo: Organizacin de archivos En general existen dos tipos de archivos: Archivos Secuenciales.- En este caso los datos se almacenan en forma consecutiva y no es posible leer (recuerdan que significa esta operacin) ningn registro (recuerdan la nota de arriba) directamente, es decir para leer el registro n se deber recorrer o acezar los n-1 registros anteriores. Archivos Directos o Random.- Para este caso si se puede acceder o leer un rengln n cualquiera. Tercero: Tipo de archivos En general existen tantos tipos de archivos como tipos de datos existen, es decir: El paquete estndar de input/output de C, hace disponible 4 mtodos o maneras diferentes de leer y escribir los datos a disco. Tres de ellas corresponden exactamente a lo aprendido de leer y escribir datos desde el teclado hacia la pantalla. 1. Datos a ser grabados o ledos como un caracter a la vez, se utilizaran funciones anlogas a getchar y putchar.

2. Datos que pueden ser ledos o grabados como una string se usaran funciones anlogas a gets y puts. 3. Datos que se capturen o desplieguen con formatos parecidos a los usados por scanf y printf se usaran funciones similares, es decir sern problemas que involucran mezclas de strings, caracteres, floats, etc. 4. Tambin se podrn leer y escribir datos de tipo arreglo y registros utilizando instrucciones apropiadas, en resumen: caracter string Formateado Registros y arreglos Leer Escribir getc() putc() fgets() fputs() fscanf() fprintf() fread() fwrite() ATENCION: Ya que se decide utilizar algn archivo especifico de datos(caracteres, strings, formateados, registros o arreglos) solo utilizar las funciones de escritura y lectura de ese tipo de archivo, por ningn motivo mezcle funciones de lectura y escritura de otro tipo de archivos. Cuarto: Almacenamiento en archivos Modo Texto: en este caso los datos son almacenados usando Ascii y por tanto son plenamente visibles usando cualquier editor. Modo Binario: en este caso los datos son almacenados en notacin hexadecimal y por tanto se ocupa un editor binario para reconocerlos, sin embargo un archivo binario es ms compacto que un archivo texto.

ARCHIVOS DISCO
Existen muchas operaciones asociadas a archivos en C++, las ms elementales son: 1. Creacin de Archivo.- En este proceso se pretende solamente crear un archivo nuevo en disco con su nombre tipo y especialidad de almacenamiento de datos apropiado. 2. Apertura de Archivos.- En este caso se pretende abrir un archivo ya existente en disco para procesarlo ya sea para cargar o grabar estructuras en sus registros o leer algn registro en especial para mandarlo a una variable de cualquier tipo. No confundir creacin con apertura, creacin es un proceso que solo se ejecuta una sola vez en la vida de un archivo, mientras que apertura, siempre se est realizando por los programas especializados en algn proceso. 3. Cierre de archivos: Es la operacin ms importante en cualquier programa que maneje archivos, o se cierra el archivo como ultima instruccin del programa o se ver el anuncio ABORT, RETRY, FAIL. Windows 98, /s, scandisk

4. Altas en archivo.- En este proceso se captura una estructura en memoria con sus datos pertinentes y despus se graba la estructura al archivo en disco. 5. Lectura de archivo.- En este proceso se abre el archivo, se manda el registro de disco a una estructura en memoria para su procesamiento. 6. Consulta de archivos: En este proceso se pretende desplegar todos los registros del archivo en disco a la pantalla ya sea consola o mejor an, a una pgina html 7. Bsqueda en archivos: Una de las operaciones ms comunes consiste en que el usuario pide toda la informacin de algn rengln en disco proporcionando la informacin de algn campo generalmente el campo clave de la estructura. 8. Filtros.- En este proceso el usuario est interesado en algn conjunto de renglones con caractersticas comunes (condicin), por ejemplo todos los alumnos de sistemas o todos los empleados que ganen ms de $500.00 pesos, o todos los clientes que sean de Tijuana, etc. 9. Modificaciones de registros o archivos: Problema muy comn, donde los datos originales ya grabados se tienen que cambiar o actualizar, por ejemplo el nombre no era juan es juana, o la calificacin no es 100 es 20, etc. 10. Bajas de registros: tambin muy comn este proceso, por ejemplo el alumno ya egreso, el cliente huyo, etc.

CREACION ARCHIVOS SECUENCIAL DISCO


En este proceso se pretende solamente crear un archivo secuencial en disco. Prog17.cpp #include <stdio.h> #include <conio.h> #include <string.h> struct { int matricula; char nombre[30]; int edad;}alumno; void main() { clrscr(); //creando y cerrando el archivo en disco FILE *archdisco; archdisco = fopen("cpp:\\ac\\alumnos.dat","w"); fclose(archdisco); printf("ARCHIVO CREADO"); getchar();getchar(); }

CORRIDA:

Recordar que la estructura que se us para crear el archivo se deber usar siempre y con el mismo orden cuando se acceda al archivo con los procesos u operaciones anteriormente mencionados. Lo primero que se crea es una variable de tipo puntero o apuntador a un archivo a disco (instruccin FILE y debe ser en MAYUSCULAS) llamada archdisco(muy original). Variables apuntadores son tipos especiales de variables que tienen la capacidad de almacenar no datos, pero si direcciones ya sean de la memoria del computador o como en este caso de una direccin fsica del disco. En C una variable apuntador se declara anteponiendo un asterisco antes del nombre. En el programa se est creando una variable apuntador bautizada con el nombre de archdisco que almacenara la direccin fsica del archivo en disco, en algn cilindro, track , sector deber quedar el archivo no es verdad??. Como segundo paso se abre el archivo con la instruccin fopen(): archdisco = fopen(cpp:\\ac\\alumnos.dat,w); Observar que el path es la direccin fsica de tu sitio en TU PC. Observar el doble diagonal (\\) en el parmetro. La funcin fopen() cuando realiza el trabajo de abrir un archivo, regresa la direccin fsica donde crea o graba el archivo en disco. El primer parmetro o argumento en esta funcin es la UNIDAD de disco y el nombre del archivo. El segundo parmetro o argumento es llamado modo y es una de los varios modos que podemos usar.

r w a r+ w+ a+

Lectura. Escritura. Append, si el archivo ya existe append empieza a aadir los nuevos datos al final del archivo ya existente. Lectura y escritura, ya debe existir el archivo. Crea para lectura y escritura y si ya existe, sobrescribe. Crea o abre para lectura y append, sino existe el archivo ser creado.

En adicin a los valores listados tambin es permitido agregar uno de los siguientes caracteres, pero insertndolo antes del signo + modo significado.

t b

lo abre en modo texto. lo abre en modo binario.

Cuando se ha finalizado de escribir al archivo se debe cerrar y esto se hace con la instruccin: fclose(archdisco);

GRABACION Y LECTURA DISCO


Como ya se mencion grabar y lectura de registros o estructuras a renglones o registros de archivos en disco. Estos dos procesos son los casos ms comunes y frecuentes que se pueden realizar con un archivo de disco. GRABACION DE UNA ESTRUCTURA A UN ARCHIVO EN DISCO prog18.cpp #include <stdio.h> #include <conio.h> #include <string.h> struct { int matricula; char nombre[30]; int edad;} alumno; void main() { clrscr(); // captura de campos printf("dame matricula :"); scanf("%d",&alumno.matricula); getchar(); printf("dame nombre :"); gets(alumno.nombre); printf("dame edad :"); scanf("%d",&alumno.edad); // grabando a disco FILE *archdisco; archdisco = fopen("cpp:\\ac\\alumnos.dat","at+"); fwrite(&alumno,sizeof(alumno),1,archdisco); fclose(archdisco); //avisando usuario printf("alumno insertado"); getchar(); getchar(); }

Corrida:

La primera observacin es que se est usando el fopen() en modo at+ en lugar de modo w pero es para matar dos pjaros de un tiro, reestudiar la clase anterior de modos de apertura. La nica instruccin nueva es: fwrite(&persona,sizeof(alumno),1,archdisco); Como se observa ocupa 4 parmetros que son: Con apuntadores se manejan dos operadores diferentes que son ( * y &) el asterisco como ya se indic se usa para crear una variable apuntador, es decir variables que almacenaran direcciones fsicas de algn lugar de la memoria del computador. Por supuesto tambin que en ese espacio o bodega en memoria se almacenaran datos o informacin, es el operador & (ampersand) quien se usa para accesar a esos datos, ejemplo: Float *pi; aqu se crea una variable apuntador que guardara la direccin donde se almacenara un valor de tipo float. Si en ese programa, se usa: pi= 3.1416, el compilador protesta porque se est pretendiendo almacenar un valor float en una variable que solo puede almacenar direcciones de memoria. Pero si es vlido &pi=3.1416, es decir cuando usamos el operador ampersand estamos trabajando con el contenido de una direccin de memoria, es por eso que: 1. PRIMER PARAMETRO: fwrite() ocupa primero conocer cuales datos va a almacenar en disco, aqu se le est indicando que es el dato que se tiene en la direccin de memoria donde est el registro alumno. 2. SEGUNDO PARAMETRO: fwrite(), ocupa conocer cuntos bytes de informacin debe grabar, para esto se tienen dos opciones o se le da el valor exacto por ejemplo 64 bytes o 39 bytes o ms fcil an se usa sizeof() que regresa el tamao del dato. 3. TERCER PARAMETRO: fwrite(), necesita conocer tambin cuantas estructuras o registros a la vez debe grabar por lo general es un solo registro, pero ms adelante estudiaran que es posible grabar ms de un registro a la vez y esto es de mucho provecho, porque por ejemplo si en un sistema se ocupa grabar 1000 registros y usamos fwrite() de uno en uno, quiere decir que habra mil accesos a disco. 4. CUARTO PARAMETRO: fwrite() tambin ocupa conocer exactamente en que cluster, sector y byte exacto del disco duro debe grabar el registro, la primera opcin sera desarmar el disco duro y ver donde hay lugar para poner el archivo J o mejor an usar la variable archdisco que ya tiene esa direccin fsica del archivo en disco.

LECTURA DE REGISTROS Prog19.CPP <code> #include <stdio.h> #include <conio.h> #include <string.h> struct { int matricula; char nombre[30]; int edad; } alumno; void main() { clrscr(); // leyendo disco FILE *archdisco; archdisco = fopen(cpp:\\ac\\alumnos.dat,at+); //aqui siempre debe empezar el ciclo de lectura y fread() regresa siempre cuantas estructuras leyo while(fread(&alumno,sizeof(alumno),1,archdisco)==1) { //desplegando estructuras printf(MATRICULA =%d ,alumno.matricula); printf( NOMBRE =%s ,alumno.nombre); printf( MESES =%d ,alumno.edad); printf(\n); }; //aqui termina while //no olvidar cerrar archivo y siempre fuera de while fclose(archdisco); getchar(); getchar(); } </code>

Corrida:

Las nicas notas son: En fopen() se us modo a+. En lugar de fwrite(), se usa fread() con los mismos cuatro parmetros. Tambin recordar que fread(), nos regresa la cantidad de registros que ley del disco, por eso el ciclo while se convierte en falso cuando fread() regresa 0 y esto indica que se lleg al fin del archivo. Y sera bueno que el despliegue fuese en una tabla pero esto queda de tarea.

BUSQUEDA ARCHIVOS DIRECTOS


En este tema se analiza la bsqueda de un registro o rengln determinado. En este proceso el usuario del programa quiere que se despliegue un y solo un registro de informacin proporcionando un dato de bsqueda generalmente la clave del registro. Recordar que en esta operacin se muestra la diferencia fundamental entre archivos secuenciales y archivos directos, es decir aqu se puede accesar directamente un registro n cualesquiera. Prog28.cpp #include <stdio.h> #include <conio.h> #include <string.h> struct { int clave; char nombre[30]; int edad;} animalito; void main() { clrscr(); // cargando clave a buscar printf("dame clave buscar:"); int claveb; scanf("%d",&claveb); //abriendo, leyendo,cargando estructura FILE *archdisco; archdisco = fopen("cpp:\\ac\\archivo1.dat","ab+");

// usar fseek() para posicionarse al principio de registro //buscado fseek (archdisco, (long)(claveb)* sizeof(animalito), 0 ); // ahora se lee el registro fread(&animalito,sizeof(animalito),1,archdisco); // desplegando estructura y asegurndose printf("%d ",animalito.clave); printf("%s ",animalito.nombre); printf("%d ",animalito.edad); printf("\n"); // no olvidar cerrar archivo fclose(archdisco); getchar();getchar(); } Corrida:

Como se desprende del programa usando fseek() es posible posicionarse en cualquier byte del archivo. El formato completo de fseek() es: fseek(apuntador,(long)(clave)*(sizeof(registro)),0); Donde los parmetros son: 1. Apuntador al archivo en disco 2. El segundo parmetro es el BYTE donde se quiere que empiece la lectura o grabacin al archivo en disco. 3. Este BYTE debe ser de tipo LONG as que si en algn programa de ejemplo ven fseek( , 387L, ); que no les llame la atencin, es otra manera de hacerle cast a un dato. Como va a estar difcil que se le atine a un byte determinado, es por eso que en el programa mejor se deja que sea el propio servidor quien calcule el byte donde empieza un registro determinado con clave * sizeof o tamao de registro. 4. El tercer parmetro es a partir de donde se quiere posicionar el apuntador interno del archivo, los valores pueden ser: 0 SEEK_SET principio del archivo. 1 SEEK_CUR posicin actual. 2 SEEK_END fin del archivo.

RECORDAR QUE ES MUY IMPORTANTE QUE LAS CLAVES GRABADAS EN UN ARCHIVO DIRECTO TENGAN LA SECUENCIA 0,1,2,3,4,5..N

FILTROS O CONDICIONES
Otro problema similar al anterior es el de filtros o condiciones, es decir en muchas ocasiones es necesario obtener informacin acerca de un subconjunto de renglones del archivo. Por ejemplo todos los estudiantes que sean mayores de 17 aos, o todos los clientes que sean de Tijuana, etc. a esto le llamamos filtros o condiciones. Tambin se resuelve de manera similar a los de archivos secuenciales es decir usando un ciclo de lectura de todo el archivo e ir desplegando todos los registros que cumplan la condicin. Prog29.cpp #include <stdio.h> #include <conio.h> #include <string.h> struct { int clave; char nombre[30]; int edad;} animalito; void main() { clrscr(); // cargando clave a buscar printf("EDAD MAYOR QUE >= :"); int edad; scanf("%d",&edad);getchar(); //abriendo, leyendo,cargando estructura FILE *archdisco; archdisco = fopen("cpp:\\ac\\archivo1.dat","at+"); // aqui siempre debe empezar el ciclo de lectura // y fread() regresa siempre cuantas estructuras leyo while(fread(&animalito,sizeof(animalito),1,archdisco)==1) { // desplegando estructura buscada if (animalito.edad >= edad)

{ printf("%d ",animalito.clave); printf(" %s ",animalito.nombre); printf(" %d ",animalito.edad); printf("\n");}; }; // aqui termina while // no olvidar cerrar archivo y siempre fuera de while fclose(archdisco); getchar(); } Corrida:

Como se observa es un problema y una solucin similar al tema anterior de bsquedas.

BAJAS O ELIMINACIONES
Eliminacin o bajas es el proceso por medio del cual algunos registros del archivo son purgados del archivo, existen dos maneras por las cuales se puede realizar ese proceso. En la primera manera se usan dos archivos, el archivo original y un archivo temporal, el procedimiento o algoritmo es muy sencillo, se lee el registro del archivo original y si no es el registro a eliminar entonces se almacena en el archivo temporal, cuando se termina de procesar todo el archivo original, el archivo temporal solo contendr todos los registros que no se quisieron eliminar, ya con estos dos archivo se procede a eliminar o borrar usando la instruccin remove el archivo original y se procede a renombrar usando la instruccin rename del archivo temporal como nuevo archivo original. Sin embargo en archivos directos no se puede ni se debe eliminar fsicamente registros de los archivos porque recordar que la clave del registro esta enlazada directamente a la posicin que dicho registro tiene en disco y no sera muy conveniente estarle cambiando la matricula al alumno cada rato o el nmero de serie al auto, etc. Aparte de que con esta manera de eliminar incluso fsicamente los registros del archivo es que no hay manera de recuperar esa informacin posteriormente. Es por eso que otra tcnica comn de eliminacin es incluir un campo de estado, status o bandera o semforo en el registro y conforme se va cargando el registro y antes de mandarlo a disco se le agrega a dicho campo el carcter 'A' alta, as que cuando se quiera una baja solo se pondra dicho campo en 'B' y todos los programas de lectura,

bsqueda y filtros debern revisar esta campo de estado antes de hacer algo con el registro.

OPERACIONES CON CAMPOS


En este tema se analiza la manera de poder realizar operaciones o procesos con los campos de los registros en el archivo DIRECTO, lo nico importante a considerar es que los campos del registro son en cierta medida igual que variables normales y por tanto se pueden procesar de manera normal como lo muestra el ejemplo. prog30.cpp #include #include #include #include <stdio.h> <io.h> <conio.h> <string.h>

struct { int clave; char nombre[30]; int edad;} animalito; void main() { clrscr(); FILE *arch1; long r=0; arch1 = fopen("cpp:\\ac\\archivo1.dat","rb+"); while (fread(&animalito,sizeof(animalito),1,arch1)==1) { // sumando 100 a edad animalito.edad = animalito.edad + 100 ; // como ya se leyo se regresa el apuntador al principio del registro fseek(arch1,r*sizeof(animalito),0 ); // y se escribe el registro modificado al archivo fwrite(&animalito,sizeof(animalito),1,arch1); r=r+1; //turboc no permite i/o archivos sin un rewind, fseek, etc fseek(arch1,r*sizeof(animalito),0); }; // aqui termina for

//cerrando archivo fclose(arch1); //avisando puts("EDADES + 100"); getchar();getchar(); } Corrida prog27:

Corrida prog30

Corrida prog27

Como se observa la solucin es muy sencilla solo se ocupa: 1. leer fread() el registro, esto mueve el apuntador al siguiente registro. 2. modificar registro 3. regresar a posicin anterior con fseek() 4. grabar fwrite() el registro corregido 5. volver a usar un fseek() porque turboc no acepta i/o sin rewind, fseek, etc ver ayuda del compilador y no se ocupan los dos archivos como en el caso secuencial.

EDICION MODIFICACION DE REGISTROS


Modificar o editar un registro es uno de los procesos ms comunes con archivos en disco, generalmente despus de un fuerte proceso de captura de registros, una revisin o consulta general muestra muchos de ellos con errores de captura. Vamos a editar el segundo registro. Prog31.cpp #include <stdio.h> #include <conio.h> #include <string.h> struct { int clave; char nombre[30]; int edad;} animalito; void main() { clrscr(); // cargando clave a buscar printf("dame clave editar:"); int claveb; scanf("%d",&claveb); //abriendo, leyendo, cargando estructura FILE *archdisco; archdisco = fopen("cpp:\\ac\\archivo1.dat","rb+"); // usar fseek() para posicionarse al principio de registro // buscado fseek (archdisco, (long)(claveb)* sizeof(animalito), 0 ); // ahora se lee el registro fread(&animalito,sizeof(animalito),1,archdisco); // desplegando estructura y asegurandose printf("%d ",animalito.clave); printf("%s ",animalito.nombre); printf("%d ",animalito.edad); printf("\n");getchar(); //recapturando los nuevos datos printf("dame nuevo nombre :");gets(animalito.nombre); printf("dame nueva edad :");scanf("%d",&animalito.edad); // regresando a apuntador para regrabar

fseek (archdisco, (long)(claveb)* sizeof(animalito), 0 ); fwrite(&animalito,sizeof(animalito),1,archdisco); // no olvidar cerrar archivo fclose(archdisco); //avisando printf("REGISTRO EDITADO"); getchar();getchar(); } Corrida:

Observar que es el programa normal de bsqueda pero ya desplegado el registro se piden los nuevos datos, posteriormente se regresa el apuntador de registros a la posicin original para volverse a regrabar el registro pero con los datos ya editados.

UNIDAD 6: REGISTROS Y ARCHIVOS DIRECTOS


INTRODUCCION REGISTROS ESTRUCTURAS
SE DICE QUE UN ARCHIVO ES DE ACCESO U ORGANIZACION DIRECTA CUANDO PARA ACCEDER A UN REGISTRO N CUALESQUIERA NO SE TIENE QUE PASAR POR LOS N-1 REGISTROS ANTERIIORES. Como se observa de esta definicin los archivos directos tienen una gran ventaja (son mucho ms rpidos) cuando se comparan con los archivos de acceso u organizacin secuencial estudiados en la UNIDAD anterior. Aunque lo anterior no quiere decir que son mejores que los secuenciales, es decir es el propio problema planteado quien exigir una solucin u otra, por ejemplo si se quiere construir un archivo para almacenar los datos de un guestbook, si se construye de manera directa sera muy rpido pero si lo construimos de manera secuencial, se podrn almacenar datos con cantidades de informacin ms adecuados al problema. Es decir un archivo de acceso directo tiene que tener sus registros o renglones de un tamao fijo o predeterminado de antemano. Un archivo de acceso directo permite posicionar el apuntador de interno de registros, a cualquier registro determinado sin necesidad de pasar por todos los registros anteriores, usando las siguientes funciones. 1) int fseek(apuntador,long offset,origen); Esta funcin posiciona el apuntador de registro en el byte indicado. Regresa 0 si se pudo posicionar. apuntador=fopen(a:archivo.dat,r+); fseek(apuntador,(long)(clave)*(sizeof(registro)),0); 0 SEEK_SET principio del archivo. 1 SEEK_CUR posicin actual. 2 SEEK_END fin del archivo. 2) long ftell(apuntador); Regresa un valor long indicando la posicin actual del cursor interno de registros de archivo. 3) int rewind(apuntador); Regresa el apuntador al principio del archivo. Ejemplo para hacer modificaciones. fseek(apuntador,(long)(clave)*(sizeof(registro)),0); fread(&registro,sizeof(registro),1,apuntador); Hacer las modificaciones. rewind(apuntador); fseek(apuntador,(long)(clave)*(sizeof(registro)),0); fwrite(&registro,sizeof(registro),1,apuntador);

CREACION DE ARCHIVOS DIRECTOS DISCO


En este proceso se pretende solamente crear un archivo directo en disco. Prog25.cpp #include <stdio.h> #include <conio.h> #include <string.h> struct { int clave; char nombre[30]; int edad;} animalito; void main() { clrscr(); //creando y cerrando el archivo en disco FILE *archdisco; archdisco = fopen("cpp:\\ac\\archivo1.dat","wb"); fclose(archdisco); printf("ARCHIVO CREADO"); getchar();getchar(); } corrida:

Recordar que la estructura que se us para crear el archivo se deber usar siempre y con el mismo orden cuando se acceda al archivo con los procesos u operaciones anteriormente mencionados. Observar que es completamente similar a la creacin de archivos secuenciales. Lo primero que se crea es una variable de tipo puntero o apuntador a un archivo a disco(instruccin FILE y debe ser en MAYUSCULAS) llamada archdisco(muy original). Variables apuntadores son tipos especiales de variables que tienen la capacidad de almacenar no datos, pero si direcciones ya sean de la memoria del computador o como en este caso de una direccin fsica del disco. En C una variable apuntador se declara anteponiendo un asterisco antes del nombre.

En el programa se est creando una variable apuntador bautizada con el nombre de archdisco que almacenara la direccin fsica del archivo en disco, en algn cilindro, track , sector deber quedar el archivo no es verdad??. Como segundo paso se abre el archivo con la instruccin fopen(): archdisco = fopen(cpp:\\ac\\archivo1.dat,wb); Observar que el path es la direccin fsica de tu PC. Recordar tambin que archivos y directorios msdos deben respetar 8.3 letras. Observar el doble diagonal(\\) en el parmetro. La funcin fopen() cuando realiza el trabajo de abrir un archivo, regresa la direccin fsica donde crea o graba el archivo en disco. El primer parmetro o argumento en esta funcin es la UNIDAD de disco y el nombre del archivo. El segundo parmetro o argumento es llamado modo y es una de los varios modos que podemos usar. r Lectura. w Escritura. a Append, si el archivo ya existe append empieza a aadir los nuevos datos al final del archivo ya existente. r+ Lectura y escritura, ya debe existir el archivo. w+ Crea para lectura y escritura y si ya existe, sobrescribe. a+ Crea o abre para lectura y append, sino existe el archivo ser creado. En adicin a los valores listados tambin es permitido agregar uno de los siguientes caracteres, pero insertndolo antes del signo + modo significado. t b Lo abre en modo texto. Lo abre en modo binario.

Cuando se ha finalizado de escribir al archivo se debe cerrar y esto se hace con la instruccin: fclose(archdisco);

GRABACION Y LECTURA DE ARCHIVOS DISCO


Como ya se mencion grabar y lectura de registros o estructuras a renglones o registros de archivos en disco. Estos dos procesos son los casos ms comunes y frecuentes que se pueden realizar con un archivo de disco.

GRABACION DE UNA ESTRUCTURA A UN ARCHIVO EN DISCO


prog26.cpp #include <stdio.h> #include <conio.h> #include <string.h> struct { int clave; char nombre[30]; int edad;} animalito; void main() { clrscr(); // captura de campos printf("dame clave :");scanf("%d",&animalito.clave);getchar(); printf("dame nombre :");gets(animalito.nombre); printf("dame edad :");scanf("%d",&animalito.edad); // grabando a disco FILE *archdisco; archdisco = fopen("cpp:\\ac\\archivo1.dat","ab+"); fwrite(&animalito,sizeof(animalito),1,archdisco); fclose(archdisco); //avisando usuario printf("animalito insertado"); getchar();getchar(); } CORRIDA:

Observar que es completamente similar al programa de archivos secuenciales, solo se recomienda y exige que las claves sigan la secuencia 0,1,2,3,4,5.. Otra observacin es que se est usando el fopen() en modo ab+ en lugar de modo w pero es para matar dos pjaros de un tiro, reestudiar la clase de modos de apertura. La instruccin de grabacin es: fwrite(&animalito,sizeof(animalito),1,archdisco); que ya se estudi anteriormente.

LECTURA CONSULTA DESPLIEGUE DE REGISTROS


Prog27.CPP #include <stdio.h> #include <conio.h> #include <string.h> struct { int clave; char nombre[30]; int edad;} animalito; void main() { clrscr(); // leyendo disco FILE *archdisco; archdisco = fopen("cpp:\\ac\\archivo1.dat","rb+"); // aqu siempre debe empezar el ciclo de lectura // y fread() regresa siempre cuantas estructuras ley while(fread(&animalito,sizeof(animalito),1,archdisco)==1) { // desplegando estructuras printf("%d ",animalito.clave); printf("%s ",animalito.nombre); printf("%d ",animalito.edad); printf("\n"); }; // aqui termina while // no olvidar cerrar archivo y siempre fuera de while fclose(archdisco); getchar();getchar(); } CORRIDA:

Sera bueno que el despliegue fuese en una tabla pero esto queda de tarea.

BUSQUEDA DE ARCHIVOS
En este tema se analiza la bsqueda de un registro o rengln determinado. En este proceso el usuario del programa quiere que se despliegue un y solo un registro de informacin proporcionando un dato de bsqueda generalmente la clave del registro. Recordar que en esta operacin se muestra la diferencia fundamental entre archivos secuenciales y archivos directos, es decir aqu se puede accesar directamente un registro n cualesquiera. Prog28.cpp #include <stdio.h> #include <conio.h> #include <string.h> struct { int clave; char nombre[30]; int edad;} animalito; void main() { clrscr(); // cargando clave a buscar printf("dame clave buscar:"); int claveb; scanf("%d",&claveb); //abriendo, leyendo, cargando estructura FILE *archdisco; archdisco = fopen("cpp:\\ac\\archivo1.dat","ab+"); // usar fseek() para posicionarse al principio de registro buscado fseek (archdisco, (long)(claveb)* sizeof(animalito), 0 ); // ahora se lee el registro fread(&animalito,sizeof(animalito),1,archdisco); // desplegando estructura y asegurndose printf("%d ",animalito.clave); printf("%s ",animalito.nombre); printf("%d ",animalito.edad); printf("\n"); // no olvidar cerrar archivo fclose(archdisco); getchar();getchar(); }

Corrida:

Como se desprende del programa usando fseek() es posible posicionarse en cualquier byte del archivo. El formato completo de fseek() es: fseek(apuntador,(long)(clave)*(sizeof(registro)),0); donde los parmetros son: 1. Apuntador al archivo en disco 2. El segundo parmetro es el BYTE donde se quiere que empiece la lectura o grabacin al archivo en disco. 3. Este BYTE debe ser de tipo LONG as que si en algn programa de ejemplo ven fseek( , 387L, ); que no les llame la atencin, es otra manera de hacerle cast a un dato. Como va a estar difcil que se le atine a un byte determinado, es por eso que en el programa mejor se deja que sea el propio servidor quien calcule el byte donde empieza un registro determinado con clave * sizeof o tamao de registro. 4. El tercer parmetro es a partir de donde se quiere posicionar el apuntador interno del archivo, los valores pueden ser: 0 SEEK_SET principio del archivo. 1 SEEK_CUR posicin actual. 2 SEEK_END fin del archivo. RECORDAR QUE ES MUY IMPORTANTE QUE LAS CLAVES GRABADAS EN UN ARCHIVO DIRECTO TENGAN LA SECUENCIA 0,1,2,3,4,5..N.

FILTROS O CONDICIONES
Otro problema similar al anterior es el de filtros o condiciones, es decir en muchas ocasiones es necesario obtener informacin acerca de un subconjunto de renglones del archivo. Por ejemplo todos los estudiantes que sean mayores de 17 aos, o todos los clientes que sean de Tijuana, etc. a esto le llamamos filtros o condiciones. Tambin se resuelve de manera similar a los de archivos secuenciales es decir usando un ciclo de lectura de todo el archivo e ir desplegando todos los registros que cumplan la condicin.

Prog29.cpp #include <stdio.h> #include <conio.h> #include <string.h> struct { int clave; char nombre[30]; int edad;} animalito; void main() { clrscr(); // cargando clave a buscar printf("EDAD MAYOR QUE >= :"); int edad; scanf("%d",&edad);getchar(); //abriendo, leyendo,cargando estructura FILE *archdisco; archdisco = fopen("cpp:\\ac\\archivo1.dat","at+"); // aqu siempre debe empezar el ciclo de lectura // y fread() regresa siempre cuantas estructuras ley while(fread(&animalito,sizeof(animalito),1,archdisco)==1) { // desplegando estructura buscada if (animalito.edad >= edad) { printf("%d ",animalito.clave); printf(" %s ",animalito.nombre); printf(" %d ",animalito.edad); printf("\n");}; }; // aqui termina while // no olvidar cerrar archivo y siempre fuera de while fclose(archdisco); getchar(); }

Corrida:

Como se observa es un problema y una solucin similar al tema anterior de bsquedas.

BAJAS O ELIMINACIONES
Eliminacin o bajas es el proceso por medio del cual algunos registros del archivo son purgados del archivo, existen dos maneras por las cuales se puede realizar ese proceso. En la primera manera se usan dos archivos, el archivo original y un archivo temporal, el procedimiento o algoritmo es muy sencillo, se lee el registro del archivo original y si no es el registro a eliminar entonces se almacena en el archivo temporal, cuando se termina de procesar todo el archivo original, el archivo temporal solo contendr todos los registros que no se quisieron eliminar, ya con estos dos archivo se procede a eliminar o borrar usando la instruccin remove el archivo original y se procede a renombrar usando la instruccin rename del archivo temporal como nuevo archivo original. Sin embargo en archivos directos no se puede ni se debe eliminar fsicamente registros de los archivos porque recordar que la clave del registro esta enlazada directamente a la posicin que dicho registro tiene en disco y no sera muy conveniente estarle cambiando la matricula al alumno cada rato o el nmero de serie al auto, etc. Aparte de que con esta manera de eliminar incluso fsicamente los registros del archivo es que no hay manera de recuperar esa informacin posteriormente. Es por eso que otra tcnica comn de eliminacin es incluir un campo de estado, status o bandera o semforo en el registro y conforme se va cargando el registro y antes de mandarlo a disco se le agrega a dicho campo el caracter 'A' alta, as que cuando se quiera una baja solo se pondra dicho campo en 'B' y todos los programas de lectura, bsqueda y filtros debern revisar esta campo de estado antes de hacer algo con el registro.

OPERACIONES CON CAMPOS


En este tema se analiza la manera de poder realizar operaciones o procesos con los campos de los registros en el archivo DIRECTO, lo nico importante a considerar es que los campos del registro son en cierta medida igual que variables normales y por tanto se pueden procesar de manera normal como lo muestra el ejemplo.

prog30.cpp #include #include #include #include <stdio.h> <io.h> <conio.h> <string.h>

struct { int clave; char nombre[30]; int edad;} animalito; void main() { clrscr(); FILE *arch1; long r=0; arch1 = fopen("cpp:\\ac\\archivo1.dat","rb+"); while (fread(&animalito,sizeof(animalito),1,arch1)==1) { // sumando 100 a edad animalito.edad = animalito.edad + 100 ; // como ya se ley se regresa el apuntador al principio del registro fseek(arch1,r*sizeof(animalito),0 ); // y se escribe el registro modificado al archivo fwrite(&animalito,sizeof(animalito),1,arch1); r=r+1; //turboc no permite i/o archivos sin un rewind, fseek, etc. fseek(arch1,r*sizeof(animalito),0); }; // aqui termina for //cerrando archivo fclose(arch1); //avisando puts("EDADES + 100"); getchar();getchar(); }

Corrida prog27:

Corrida prog30

Corrida prog27

Como se observa la solucin es muy sencilla solo se ocupa: 1. leer fread() el registro, esto mueve el apuntador al siguiente registro. 2. modificar registro 3. regresar a posicin anterior con fseek() 4. grabar fwrite() el registro corregido 5. volver a usar un fseek() porque turboc no acepta i/o sin rewind, fseek, etc. ver ayuda del compilador y no se ocupan los dos archivos como en el caso secuencial.

EDICION O MODIFICACION DE REGISTROS


Modificar o editar un registro es uno de los procesos ms comunes con archivos en disco, generalmente despus de un fuerte proceso de captura de registros, una revisin o consulta general muestra muchos de ellos con errores de captura. Vamos a editar el segundo registro.

Prog31.cpp #include <stdio.h> #include <conio.h> #include <string.h> struct { int clave; char nombre[30]; int edad;} animalito; void main() { clrscr(); // cargando clave a buscar printf("dame clave editar:"); int claveb; scanf("%d",&claveb); //abriendo, leyendo,cargando estructura FILE *archdisco; archdisco = fopen("cpp:\\ac\\archivo1.dat","rb+"); // usar fseek() para posicionarse al principio de registro buscado fseek (archdisco, (long)(claveb)* sizeof(animalito), 0 ); // ahora se lee el registro fread(&animalito,sizeof(animalito),1,archdisco); // desplegando estructura y asegurndose printf("%d ",animalito.clave); printf("%s ",animalito.nombre); printf("%d ",animalito.edad); printf("\n");getchar(); //recapturando los nuevos datos printf("dame nuevo nombre :");gets(animalito.nombre); printf("dame nueva edad :");scanf("%d",&animalito.edad); // regresando a apuntador para regrabar fseek (archdisco, (long)(claveb)* sizeof(animalito), 0 ); fwrite(&animalito,sizeof(animalito),1,archdisco); // no olvidar cerrar archivo fclose(archdisco);

//avisando printf("REGISTRO EDITADO"); getchar();getchar(); } cCrrida:

Observar que es el programa normal de bsqueda pero ya desplegado el registro se piden los nuevos datos, posteriormente se regresa el apuntador de registros a la posicin original para volverse a regrabar el registro pero con los datos ya editados.

UNIDAD 7: VARIABLES APUNTADORES


INTRODUCCION PUNTEROS MEMORIA
Todas las variables se almacenan en una direccin predeterminada en memoria. El monto del rea de memoria es determinada por el tipo de variable, es decir; una variable int ocupa 2 bytes, un float 4 bytes, un arreglo ocupara el tipo del arreglo multiplicado por la cantidad de elementos, una estructura es igual a la suma de los campos. En C++ existe una nueva clase de variables llamadas apuntadores o punteros, que permiten almacenar la direccin de memoria de alguna otra variable normal. En el caso de variables apuntadores a strings o arreglos esta variable solo podr almacenar lo posicin ms relevante del arreglo es decir la ocupada por el primer elemento del arreglo, mismo caso para estructuras. Las utilidades principales de las variables apuntadores es la facilidad que tienen para accesar y manipular datos estructurados ms rpidamente, tambin son muy tiles para permitir pasar y recibir valores en funciones. Para declarar una variable de tipo apuntador se usa: tipo *var_apuntador; Donde tipo especifica el tipo de dato al que apuntara la variable. main() { int x = 7; float y = 4.5; int *x1; float *y1; } Existen dos operadores especficos que se utilizan para manejar variables apuntadores, estos son: * Sirve para crear y manipular el valor hexadecimal que representa esa direccin. & Se utiliza para procesar directamente el dato que se encuentra en dicha direccin. En resumen en C++ con el operador (*) se crea la variable apuntador o puntero y con el operador (&) se procesa el dato que est dentro de esa direccin, o que creen que hace el ampersand (&) en scanf().

APUNTADORES A ESCALARES
Variables apuntador deben ser siempre inicializadas y recordar que ellas almacenan direcciones FISICAS DE MEMORIA RAM Existen 2 mtodos: a) inicializar con la direccin de una variable escalar existente. main() { int x,*y; y = &x; scanf("%d",&x); printf("%d %d %d",x,*y,*y+30); } scanf("%d",y); *y = *y+x-8; b) usar funcin malloc() para reservar un espacio determinado en memoria, aqu solo se inicializa con la direccin reservada y devuelta por el compilador. #include <stdlib.h> main() { float *y = malloc(sizeof(float)); *y = 3.14159; printf("%f",*y); free(y); } Nota: tipo float no permite captura.

APUNTADORES A STRINGS
Caso A. Solo se necesita inicializar una variable char. main() { char nombre[30]; char *ch; ch = nombre; gets(nombre); puts(ch); } Caso B. main() { char *nombre = malloc(30); gets(nombre); puts(nombre); free(nombre); }

APUNTADORES A ARREGLOS
Tambin solo se ocupa una variable apuntador normal. Caso A. main() { int x[5]={1,2,3,4,5}; int *y,renglon; y = x; printf("%d %d %d",x[1],*y,*(y+1)); for(renglon =0; renglon <= 4; renglon ++) printf("%d",*(y+renglon)); } Caso B. main() { int reng; float *x = malloc(5*sizeof(float)); *(x+2) = 3.14159; printf("%f",*(x+2); for(reng = 0; reng <=4; reng ++) printf("%f",*x++); free(x); }

APUNTADORES A TABLAS
a) main() { int x[3][5],*y; y = x; *(y+8) = 20; printf("%d %d",*(y+8),x[1][3]); }

b) main() { char *nombre[6]; int reng; for(reng = 0; reng <= 5; reng++) gets(nombre[reng]); puts(*(nombre+1); }

UNIDAD 8: PROGRAMACION ORIENTADA A OBJETOS


INTRODUCCION PROGRAMACION OBJETOS
Podemos decir que en C++ un objeto es una estructura de datos (coleccin de datos organizados eficientemente para su fcil manipulacin en memoria), este objeto contiene los llamados campos, como en registros, campos que pueden ser de diferente tipo. Para declarar y trabajar normalmente con los elementos o campos del objeto se usaran las reglas ampliamente aprendidas para los campos de los tipos registros. #include <iostream.h> #include <stdio.h> class { public : int x; char nombre[30]; }obj; main() { clrscr(); gets(obj.nombre); scanf("%d",obj.x); puts(obj.nombre); return 0; } En adicin los objetos pueden contener campos especiales llamados mtodos. Los mtodos son procedimientos o funciones que representan simples campos dentro del objeto.

#include <iostream.h> class{ publicpp: int x; char nombre[30]; int proc1(void) }obj; void main(void) { obj.proc1(); } Un mtodo podr recibir parmetros, tambin podr accesar a los otros campos del objeto, incluso a otros mtodos. class { publicpp: int x; void proc(int y) { for( x = 1; x <= y; x++) printf("Pato); } }obj; void main(void) { obj.proc(5); }; El real poder de OOP es la habilidad que tienen para heredar mucha de su naturaleza a otro objeto. Por ejemplo. 1. Pueden utilizar los elementos o campos del objeto del cual descienden, a esta propiedad se le llama herencia.

2. #include <iostream.h> #include <stdio.h> class papa { public : int x; }; class hijo : public papa { int z; }; void main(void) { hijo hijo1; hijo1.x = 5; printf("%d",hijo1.x); } 3. pasar parmetros al objeto del cual desciende.

4. #include <iostream.h> #include <stdio.h> class papa { public : void funcion(int x) { printf("%d",x+6); } }; class hijo : public papa { int z; }; void main(void) { hijo hijo1; hijo1.funcion(5); }

5. Si el mtodo del padre es una funcin podr recibir dicho valor. #include <iostream.h> #include <stdio.h> class papa { public : int funcion(int n) { return n+5; } }; class hijo : public papa { int z; }; void main(void) { hijo hijo1; char nombre[30]; int parametro; clrscr(); cout <<"Dame tu nombre.. "; cin >>nombre; cout <<"Dame el parametro"; cin >>parametro; hijo.z = hijo.funcion(parametro); cout <<"\n"<<nombre<<"la funcion regreso : "<<hijo.z; getch(); };

You might also like