LECTURAS COMPLEMENTARIAS 1. Estructuras de Datos http://cuhwww.upr.clu.edu/~jse/cursos/4097/notas/ 2. versión electrónica y en línea de uno de los libros sobre estructuras de datos de mayor interés (Baeza-Yates). http://www.dcc.uchile.cl/~rbaeza/handbook/hbook.html 3. Algorithms and Data Structures Research & Reference Material". Muchas implementaciones, algoritmos y material de referencia http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/index.html 4. Estructuras arbóreas http://www.infor.uva.es/~jmrr/TAD2003/home.htm 5. MANUAL DE C++ http://kataix.umag.cl/~mmarin/topinf/cs23/c++/pagina022a.htm 6. Recursividad http://www.conclase.net/c/curso/index.php?cap=024 http://decsai.ugr.es/~lcv/Docencia/mp2/apuntes/tema3.pdf. 7. Tutorial de estructuras de datos en C++ interactivo http://decsai.ugr.es/~jfv/ed1/c++/cdrom5/index.htm 8. Metodología de la Programacion II ARCHIVOS BINARIOS EN C++ //Ejemplo de ficheros de acceso aleatorio. #include <iostream> #include <fstream> #include <iomanip> #include <cstdlib> #include <cstring> using namespace std; // Funciones auxiliares: int Menu(); long LeeNumero(); // Clase registro. class Registro { public: Registro(char *n=NULL, int d1=0, int d2=0, int d3=0, int d4=0) : valido('S') { if(n) strcpy(nombre, n); else strcpy(nombre, ""); dato[0] = d1; dato[1] = d2; dato[2] = d3; dato[3] = d4; } void Leer(); void Mostrar(); void Listar(long n); const bool Valido() { return valido == 'S'; } const char *Nombre() { return nombre; } private: char valido; // Campo que indica si el registro es válido // S->Válido, N->Inválido char nombre[34]; int dato[4]; }; // Implementaciones de clase Registro: // Permite que el usuario introduzca un registro por pantalla void Registro::Leer() { system("cls"); cout << "Leer registro:" << endl << endl; valido = 'S'; cout << "Nombre: "; cin.getline(nombre, 34); for(int i = 0; i < 4; i++) { cout << "Dato[" << i << "]: "; dato[i] = LeeNumero(); } } // Muestra un registro en pantalla, si no está marcado como borrado void Registro::Mostrar() { system("cls"); if(Valido()) { cout << "Nombre: " << nombre << endl; for(int i = 0; i < 4; i++) cout << "Dato[" << i << "]: " << dato[i] << endl; } cout << "Pulsa una tecla"; cin.get(); } // Muestra un registro por pantalla en forma de listado, // si no está marcado como borrado void Registro::Listar(long n) { int i; if(Valido()) { cout << "[" << setw(6) << n << "] "; cout << setw(34) << nombre; for(i = 0; i < 4; i++) cout << ", " << setw(4) << dato[i]; cout << endl; } } // Clase Datos, almacena y trata los datos. class Datos :public fstream { public: Datos() : fstream("alea.dat", ios::in | ios::out | ios::binary) { if(!good()) { open("alea.dat", ios::in | ios::out | ios::trunc | ios::binary); cout << "fichero creado" << endl; cin.get(); } } ~Datos() { Empaquetar(); } void Guardar(Registro &reg); bool Recupera(long n, Registro &reg); void Borrar(long n); private: void Empaquetar(); }; // Implementación de la clase Datos. void Datos::Guardar(Registro &reg) { // Insertar al final: clear(); seekg(0, ios::end); write(reinterpret_cast<char *> (&reg), sizeof(Registro)); cout << reg.Nombre() << endl; } bool Datos::Recupera(long n, Registro &reg) { clear(); seekg(n*sizeof(Registro), ios::beg); read(reinterpret_cast<char *> (&reg), sizeof(Registro)); return gcount() > 0; } // Marca el registro como borrado: void Datos::Borrar(long n) { char marca; clear(); marca = 'N'; seekg(n*sizeof(Registro), ios::beg); write(&marca, 1); } // Elimina los registros marcados como borrados void Datos::Empaquetar() { ofstream ftemp("alea.tmp", ios::out); Registro reg; clear(); seekg(0, ios::beg); do { read(reinterpret_cast<char *> (&reg), sizeof(Registro)); cout << reg.Nombre() << endl; if(gcount() > 0 && reg.Valido()) ftemp.write(reinterpret_cast<char *> (&reg), sizeof(Registro)); } while (gcount() > 0); ftemp.close(); close(); remove("alea.bak"); rename("alea.dat", "alea.bak"); rename("alea.tmp", "alea.dat"); open("alea.dat", ios::in | ios::out | ios::binary); } int main() { Registro reg; Datos datos; int opcion; long numero; do { opcion = Menu(); switch(opcion) { case '1': // Añadir registro reg.Leer(); datos.Guardar(reg); break; case '2': // Mostrar registro system("cls"); cout << "Mostrar registro: "; numero = LeeNumero(); if(datos.Recupera(numero, reg)) reg.Mostrar(); break; case '3': // Eliminar registro system("cls"); cout << "Eliminar registro: "; numero = LeeNumero(); datos.Borrar(numero); break; case '4': // Mostrar todo numero = 0; system("cls"); cout << "Nombre Datos" << endl; while(datos.Recupera(numero, reg)) reg.Listar(numero++); cout << "pulsa return"; cin.get(); break; } } while(opcion != '0'); return 0; } // Muestra un menú con las opciones disponibles y captura una opción del usuario int Menu() { char resp[20]; do { system("cls"); cout << "MENU PRINCIPAL" << endl; cout << "--------------" << endl << endl; cout << "1- Insertar registro" << endl; cout << "2- Mostrar registro" << endl; cout << "3- Eliminar registro" << endl; cout << "4- Mostrar todo" << endl; cout << "0- Salir" << endl; cin.getline(resp, 20); } while(resp[0] < '0' && resp[0] > '4'); return resp[0]; } // Lee un número suministrado por el usuario long LeeNumero() { char numero[6]; fgets(numero, 6, stdin); return atoi(numero); } Anexo A Programas // Programa 1. Ejemplo de Precedencia #include <iostream.h> void main (void) { int iuno, idos, isum; float ftres, fdiv; variables cout << "\n Teclee el entero uno: "; cin >> iuno; // Declaración de // Lectura del primer entero cout << "\n Teclee el entero dos: "; cin >> idos; cout << "\n Teclee el flotante tres: "; cin >> ftres; isum = (int) (iuno + idos + ftres); cout << "\n La suma de los tres datos es: " << isum; fdiv = iuno + idos / ftres; cout << "\n La division es: " << fdiv << endl; } // Programa 3. Ejemplo Operadores de relación y lógicos #include <iostream.h> void main (void) int { iuno, idos, itres; cout << "\n Teclee el primer entero: " ; cin >> iuno; cout << "\n Teclee el segundo entero: " ; cin >> idos; cout << "\n Teclee el tercer entero: " ; cin >> itres; if (( iuno >= idos ) && ( itres <= iuno )) cout << "\n El numero mayor es: " << iuno << endl; else { idos += itres; // Suma itres--; // Decremento cout << "\n Entero dos: " << idos << ", entero tres: " << itres << endl; } } // Programa 4. Ejemplo switch #include <iostream.h> int main(void) int in; { cout << "\n Teclee el dígito decimal a convertir: "; cin >> in; cout << endl; if ((in < 0) || (in > 15)) { cout << " \n *** ERROR en el dígito de entrada *** " << endl; return 1; } else { cout << "\n La conversión a hexadecimal es: "; switch (in) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: cout << in << endl; break; case 10: cout << 'A' << endl; break; case 11: cout << 'B' << endl; break; case 12: cout << 'C' << endl; break; case 13: cout << 'D' << endl; break; • • default: cout << "*** ERROR ***" << endl; } } return 0; } // Programa 5. Ejemplo while #include <iostream.h> int main(void) { int in, otro = 1; while (otro) { otro = 0; cout << "\n Teclee el dígito decimal a convertir: "; cin >> in; if ((in < 0) || (in > 15)) { cout << " \n *** ERROR en el dígito de entrada *** " << endl; otro = 1; } else { cout << " \n La conversión a hexadecimal es: "; switch (in) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: cout << in << endl; break; case 10: cout << 'A' << endl; break; case 11: cout << 'B' << endl; break; • • • default: cout << "*** ERROR ***" << endl; otro = 1; } } } return 0; } // Programa 6. Ejemplo for #include <iostream.h> int main(void) { int x; cout << "\n ¿Sucesión Fibonacci de? "; cin >> x; if ( x == 0 || x == 1) cout << "Fib(" << x << ")= " << x << endl; else { unsigned long int j = x-1; t0 = 0, t1 = 1, sum = 0; for (int i=0; i<j; i++) sum=t0+t1; t0=t1; t1=sum; } { cout << "Fib(" << x << ")= " << sum << endl; } return 0; } /* Programa 7. Programa con funciones */ #include <iostream.h> double elevar_cuadrado(double); Prototipo void main(void) // { int num; cout << " \n Numero a elevar al cuadrado: "; cin >> num; cout << endl; cout << " \n El cuadrado de " << num << " es " << elevar_cuadrado(num) función << endl; } double elevar_cuadrado(double x) la función { return x*x; } // Llamada a la // Definición de /* Programa 8. Ejemplo de alcances */ #include <iostream.h> void a (void); void b (void); void c (void); int x = 1; main( ) // Prototipos de funciones // variable global { int x = 5; // variable local de main cout << "Variable local x en el alcance externo de main es " << x << endl; { // empieza nuevo alcance int x = 7; cout << "Variable local x en el alcance interno de main es " << x << endl; } // termina nuevo alcance cout << "Variable local x en el alcance externo de main es " << x << endl; a ( ); // a tiene una variable local x b ( ); estática x c ( ); global x a ( ); local x b ( ); mantiene su valor c ( ); también retiene su valor // b tiene una variable local // c utiliza la variable // a reinicializa la variable // la variable estática x // la variable global x cout << "Variable local x en la función main es " << x << endl; return 0; } void a (void) { int x = 25; cout << endl << "Variable local x en a es " << x << " después de entrar a a \n"; ++x; cout << "Variable local x en a es " << x << " antes de salir de a" << endl; } void b (void) { static int x = 50; primera vez que // inicialización estática (sólo la // se llama a b cout << endl << "Variable estática local x es " << x << " al entrar a b" << endl; ++x; cout << "Variable estática local x es " << x << " al salir de b" << endl; } void c (void) { cout << endl << "Variable global x es " << x << " al entrar a c" << endl; x *= 10; cout << "Variable global x es " << x << " al salir de c" << endl; } /* Programa 9. Funciones sin argumentos */ #include <iostream.h> void f1( ); void f2 (void); main ( ) { f1 ( ); f2 ( ); return 0; } void f1 ( ) { cout << "La función f1 no recibe argumentos" << endl; } void f2 ( ) { cout << "La función f2 tampoco recibe argumentos" << endl; } /* Programa 10. referencia */ Comparación de llamada por valor y llamada por #include <iostream.h> int squareByValue ( int ); void squareByReference ( int & ); void main ( ) { int x = 2, z = 4; cout << "x = " << x << " antes de squareByValue " << endl << " Valor regresado por squareByValue: " << squareByValue ( x ) << endl << "x = " << x << " después de squareByValue" << endl << endl; cout << "z = " << z << " antes de squareByReference " << endl; squareByReference ( z ); cout << "z = " << z << " después de squareByReference" << endl << endl; } int squareByValue ( int a ) { return a *= a; no se // argumento del que llama // modifica } void squareByReference ( int &cRef ) { cRef *= cRef; } // argumento del que llama se modifica /* Programa 11. Utilizando el operador de resolución de alcance unario */ #include <iostream.h> float value = 1.2345; main ( ) { int value = 7; cout << " Valor local = " << value << end << " Valor global = " << ::value << endl; return 0; } /* Programa 12. Utilizando function overloading /* #include <iostream.h> int square (int x) { return x *x; } double square (double y) { return y * y; } main ( ) { cout << "El cuadrado del número entero 7 es " << square ( 7 ) << endl << "El cuadrado del número real << square ( 7.5 ) << endl; return 0; } 7.5 es " /* Programa 13. Utilizando Templates */ #include <iostream.h> template <class T> T { maximum ( T value1, T value2, T value3 ) T max = value1; if ( value2 > max ) max = value2; if ( value3 > max ) max = value3; return max; } main ( ) { int int1, int2, int3; cout << " Teclea tres enteros: " ; cin >> int1 >> int2 >> int3; cout << " El mayor de los tres enteros es: " << maximum ( int1, int2, int3 ); enteros // versión de double double1, double2, double3; cout << endl << " Teclea tres dobles: " ; cin >> double1 >> double2 >> double3; cout << " El mayor de los tres dobles es: " << maximum ( double1, double2, double3 ); // versión de dobles char char1, char2, char3; cout << endl << " Teclea tres caracteres: cin >> char1 >> char2 >> char3; " ; cout << " El mayor de los tres caracteres es: " << maximum ( char1, char2, char3 ) << endl; caracteres return 0; } // versión de /* Programa 14. Inicializando un arreglo */ #include <iostream.h> #include <iomanip.h> main ( ) { int n[10]; for ( int i = 0; i < 10; i++ ) arreglo n[i] = 0; // inicializando cout << "Elemento " << setw ( 13 ) << "Valor " << endl; for ( i = 0; i < 10; i ++) cout << setw ( 8 ) << i << setw ( 13 ) << n[i] << endl; return 0; } el /* Programa 15. 20 */ Inicializando el arreglo s con los números pares del 2 al #include <iostream.h> #include <iomanip.h> main ( ) { const int tamaño_arreglo = 10; int s [ tamaño_arreglo ]; for ( int j = 0; j < tamaño_arreglo; j++ ) s [ j ] = 2 + 2 * j; cout << "Elemento" << setw ( 13 ) << "Valor" << endl; for ( j = 0; j < tamaño_arreglo; j++ ) cout << setw ( 8 ) << j << setw ( 13 ) << s [ j ] << endl; return 0; } /* Programa 16. Arreglos estáticos y automáticos */ #include <iostream.h> void staticArrayInit (void); void automaticArrayInit (void); void main ( ) { cout << "Primera llamada a cada función : " << endl; staticArrayInit ( ); automaticArrayInit ( ); cout << endl << endl << "Segunda llamada a cada función : " << endl; staticArrayInit ( ); automaticArrayInit ( ); } void staticArrayInit (void) estático // Función que muestra un arreglo local { static int arreglo1[3]; cout << endl << "Valores de entrada al arreglo estático : " << endl; for (int i = 0; i < 3 ; i++) cout << "arreglo1 [" << i << "] = " << arreglo1[i] << " "; cout << endl << "Valores de salida del arreglo estático : " << endl; for (i = 0; i < 3 ; i++) cout << "arreglo1 [" << i << "] = " << (arreglo1[i] += 5 )<< " "; } void automaticArrayInit (void) automático // Función que muestra un arreglo local { int arreglo2[3] = {1, 2, 3}; cout << endl << endl << "Valores de entrada al arreglo automático : " << endl; for (int i = 0; i < 3 ; i++) cout << "arreglo2 [" << i << "] = " << arreglo2[i] << " "; cout << endl << "Valores de salida del arreglo automático : " << endl; for (i = 0; i < 3 ; i++) cout << "arreglo2 [" << i << "] = " << (arreglo2[i] += 5 )<< " "; } /* Programa 17. parámetros */ Arreglos y #include <iostream.h> #include <iomanip.h> void modifyArray (int [ ], int ) ; void modifyElement (int); void main ( ) { elementos individuales de arreglos como const int arraySize = 5; int a [arraySize] = {0, 1, 2, 3, 4}; cout << " Efecto de utilizar una llamada por referencia en un arreglo completo : " << endl << "Los valores del arreglo original son : " << endl; for (int i = 0; i < arraySize; i ++) cout << setw(3) << a[i]; cout << endl; modifyArray (a, arraySize); cout << "Los valores del arreglo modificado son : " << endl; for (i = 0; i < arraySize; i ++) cout << setw(3) << a[i]; cout << endl << endl << endl << "Efecto de utilizar una llamada por valor en un elemento del arreglo : " << endl << "El valor de a[3] es : " << a[3] << endl; modifyElement( a[3] ); cout << "El valor de a[3] es : " << a[3] << endl; } void modifyArray (int b[ ], int sizeofArray) { for (int j = 0; j < sizeofArray; j++) b[ j ] *= 2; } void modifyElement (int e) { cout << "Valor en ModifyElement es : " << (e *= 2) << endl; } /* Programa 18. Inicializando arreglos multidimensionales */ #include <iostream.h> void printArray ( int [ ][3] ); main ( ) { int array1 [2][3] = { {1, 2, 3}, {4, 5, 6} }, array2 [2][3] = { 1, 2, 3, 4, 5 }, array3 [2][3] = { {1, 2}, {4} }; cout << " Valores en el arreglo 1 por renglón : " << endl; printArray (array1); cout << " Valores en el arreglo 2 por renglón : " << endl; printArray (array2); cout << " Valores en el arreglo 3 por renglón : " << endl; printArray (array3); return 0; } void printArray (int a[ ] [3]) { for (int i = 0; i <= 1; i ++) { for (int j = 0; j <= 2; j ++) cout << a [ i ][ j ] << ' cout << endl; } } ' ; // Programa 19. valor Obtener el cubo de una variable utilizando llamada por #include <iostream.h> int cubeByValue (int); main ( ) { int number = 5; cout << "El valor original de la variable es " << number << endl; number = cubeByValue (number); cout << "El nuevo valor es " << number << endl; return 0; } int cubeByValue ( int i ) { return n * n * n; } // Programa 20. referencia Obtiene el cubo de una variable utilizando llamada por #include <iostream.h> void cubeByReference (int *); main ( ) { int number = 5; cout << "El valor original de la variable es " << number << endl; cubeByReference (&number); cout << "El nuevo valor es " << number << endl; return 0; } void cubeByReference ( int *nPtr ) { *nPtr = *nPtr * *nPtr * *nPtr; } // Programa 21. Convertir letras minúsculas a mayúsculas #include <iostream.h> #include <ctype.h> void convertToUppercase (char *); void main ( ) { char string [ ] = "caracteres y $12.4"; cout << "La cadena antes de cambiarla es : " << string << endl; convertToUppercase ( string ); cout << "La cadena después de cambiarla es : " << string << endl; } void convertToUppercase ( char *sPtr) { while ( *sPtr != ' \0 ' ) { *sPtr = toupper ( *sPtr ); ++sPtr; } } // Programa 22. Copia una cadena a otra #include <iostream.h> main( ) { char string1[10], string2[ ] = "Hola !!"; copystr(string1,string2); return 0; } void copystr(char *s1, char *s2) { for (; (*s1 = *s2) != '\0'; s1++, s2++); } // Programa 23. Uso strncat, strcat #include <iostream.h> #include <string.h> main( ) { char s1[20] = "Happy "; char s2[ ] = "New Year "; char s3[40] = ""; cout << "s1 = " << s1 << endl << "s2 = " << s2 << endl; cout << "strcat(s1, s2) = " << strcat(s1, s2) << endl; cout << "strncat(s3, s1, 6) = " << strncat(s3, s1, 6) << endl; cout << "strcat(s3, s1) = " << strcat(s3, s1) << endl; return 0; } // Programa 24. Uso de estructuras. #include <iostream.h> struct card { char *valor; char *palo; }; void main( ) { struct card a; struct card *aPtr; a.valor = "As"; a.palo = "Espadas"; aPtr = &a; cout << a.valor << " de " << a.palo << endl << aPtr->valor << " de " << aPtr->palo << endl << (*aPtr).valor << " de " << (*aPtr).palo << endl; } // Programa 25. Uso de Typedef, estructuras y memoria dinámica. #include <iostream.h> typedef struct { int x; int y; } Punto; Punto *crea_punto(int x, int y) { Punto *temp; temp = new Punto; temp->x = x; temp->y = y; return temp; } void main(void) { Punto *uno, *dos; uno = crea_punto (1,2); dos = crea_punto (5,6); cout << "x= " << uno->x << ", y= " << uno->y << endl; cout << "x= " << dos->x << ", y= " << dos->y << endl; delete uno; delete dos; } // Programa 26. Creando un archivo secuencial en C #include <stdio.h> #include <iostream.h> #include <conio.h> void main (void) { int account; char name[30]; float balance; FILE *archptr; clrscr(); if (( archptr = fopen ("archivo.dat","w")) == NULL) cout << "El archivo no puede abrirse "; else { cout << "Dame el numero de cuenta, nombre y balance. RETURN para terminar " << endl; scanf(" %d %s %f ", &account, name, &balance); while ( !feof (stdin)) { fprintf ( archptr," %d %s %f \n",account,name,balance); cout << " ? "; scanf (" %d %s %f", &account, name, &balance); } fclose (archptr); } } // Programa 27. Leyendo e imprimiendo un archivo secuencial en C #include <stdio.h> #include <iostream.h> #include <conio.h> void main (void) { int account; char name[30]; float balance; FILE *archptr; clrscr(); if (( archptr = fopen ("archivo.dat", "r" )) == NULL) cout << "El archivo no puede abrirse "; else { cout << "Cuenta Nombre Balance" << endl; fscanf ( archptr," %d %s %f ", &account, name, &balance); while ( !feof (archptr)) { cout << account << name << balance; fscanf ( archptr," %d %s %f ", &account, name, &balance); } fclose (archptr); } } // Programa 28. Creando un archivo de acceso directo en C #include <stdio.h> #include <iostream.h> #include <conio.h> struct clientdata { int accNum; char lastName[15]; char firstName[10]; float balance; }; void main (void) { int i; struct clientdata FILE *archptr; cliente = {0, "", "", 0.0}; clrscr(); if (( archptr = fopen ("archivo.dat","w")) == NULL) cout << "El archivo no puede abrirse "; else { for (i = 1; i <= 100; i++) fwrite (&cliente, sizeof (struct clientdata), 1, archptr); fclose (archptr); } } // Programa 29. Escribiendo a un archivo de acceso directo en C #include <stdio.h> #include <iostream.h> #include <conio.h> struct clientdata { int accNum; char lastName[15]; char firstName[10]; float balance; }; void main (void) { struct clientdata FILE *archptr; cliente; clrscr(); if (( archptr = fopen ("archivo.dat","r+")) == NULL) cout << "El archivo no puede abrirse "; else { cout << "Da el número de cuenta. (1 a 100, 0 para terminar)\n"; scanf(" %d ", &cliente.accNum); while (cliente.accNum != 0) { cout << "Da apellido, nombre y balance \n "; scanf(" %s %s %f", &cliente.lastName,&cliente.firstName,&cliente.balanc e); fseek (archptr, (cliente.accNum -1) * sizeof (struct clientdata), SEEK_SET); fwrite (&cliente, sizeof (struct clientdata), 1, archptr); cout << "Da el número de cuenta. (1 a 100, 0 para terminar)\n"; scanf(" %d ", &cliente.accNum); } } fclose (archptr); } // Programa 30. #include #include #include #include <iostream.h> <conio.h> <stdlib.h> <fstream.h> void main (void) { int account; char name[10]; float balance; clrscr(); Creando un archivo secuencial en C++ ofstream outClientFile("archivo.dat", ios::out); if ( !outClientFile ) { cout << "El archivo no puede abrirse "; exit (1); } cout << "Dame el numero de cuenta, nombre y balance. EOF para terminar" << endl << "? "; while (cin >> account >> name >> balance) { outClientFile << account << ' ' << name << ' ' << balance << endl; cout << "? "; } outClientFile.close(); } // Programa 31. #include #include #include #include #include Leyendo e imprimiendo un archivo secuencial en C++ <fstream.h> <iostream.h> <conio.h> <iomanip.h> <stdlib.h> void outputLine( int acc, char *name, float bal) { cout << setiosflags(ios::left) << setw(10) << acc << setw(13) << name << setw(7) << setprecision(2) << setiosflags(ios::showpoint | ios::right) << bal << endl; } void main (void) { int account; char name[30]; float balance; clrscr(); ifstream inClientFile("archivo.dat", ios::in); if ( !inClientFile ) { cout << "Error al abrir el archivo " << endl; exit(0); } cout << setiosflags(ios::left) << setw(10) << "Account" << setw(13) << "Name" << "Balance" << endl; while (inClientFile >> account >> name >> balance) outputLine(account, name, balance); } // Programa 32. #include #include #include #include Creando un archivo de acceso directo en C++ <fstream.h> <iostream.h> <conio.h> <stdlib.h> struct clientdata { int accNum; char lastName[15]; char firstName[10]; float balance; }; void main (void) { clientdata cliente = {0, "", "", 0.0}; clrscr(); ofstream outCredit ("credito.dat", ios::out); if ( ! outCredit ) { cout << "Error de apertura de archivo" << endl; exit (1); } for (int i = 1; i <= 100; i++) outCredit.write ((char *)&cliente, sizeof (cliente)); } // Programa 33. #include #include #include #include Escribiendo a un archivo de acceso directo en C++ <fstream.h> <iostream.h> <conio.h> <stdlib.h> struct clientdata { int accNum; char lastName[15]; char firstName[10]; float balance; }; void main (void) { clientdata cliente; ofstream outCredit ("credito.dat", ios::ate); if ( ! outCredit ) { cout << "Error de apertura de archivo " << endl; exit (1); } cout << "Da el numero de cuenta (1 a 100, 0 para terminar) << endl << "? "; cin >> cliente.accNum; while (cliente.accNum > 0 && cliente.accNum <= 100) { cout << "Dame el apellido, el nombre y el balance " << endl << "? "; cin >> cliente.lastName >> cliente.firstName >> cliente.balance; outCredit.seekp ((cliente.accNum - 1) * sizeof(cliente)); outCredit.write ((char *)&cliente, sizeof (cliente)); cout << "Da el numero de cuenta (1 a 100, 0 para terminar) << endl << "? "; cin >> cliente.accNum; } } // Programa 34. #include #include #include #include #include Leyendo un archivo de acceso directo en C++ <fstream.h> <iostream.h> <conio.h> <iomanip.h> <stdlib.h> struct clientData { int account; char lastName[15]; char firstName[10]; float balance; }; void outputLine(clientData c) { cout << setiosflags(ios::left) << setw(6) << c.account << setw(16) << c.lastName << setw(11) << c.firstName << setw(10) << setprecision(2) << setiosflags(ios::showpoint | ios::right) << c.balance << endl; } void main (void) { clientData cliente; clrscr(); ifstream inClientFile("archivo.dat", ios::in); if ( !inClientFile ) { cout << "Error al abrir el archivo " << endl; exit(1); } cout << setiosflags(ios::left) << setw(6) << "Acct" << setw(16) << "Last Name" << setw(11) << "First Name" << setiosflags(ios::right) << setw(10) << "Balance" << endl; inClientFile.read ((char *) &cliente, sizeof(clientData)); while ( !inClientFile.eof ( ) ) { if (cliente.account != 0) outputLine (cliente); inClientFile.read ((char *) &cliente, sizeof(clientData)); } }