INFORMATICAII–PRIMERPARCIAL Ejercicio 1 Se tiene un archivo binario llamado “datos” que posee información que responden a la siguiente estructura: struct data Se pide: { a. Ingresar un número entero que representa la posición de un juego int nro; de datos. double valor; b. Levantar los datos en dicha posición a una instancia de la char detalle[30]; estructura y mostrarlos. }; c. Modificarlos utilizando la estructura y volverlos a guardar en la misma posición. SOLUCION #pragma hdrstop #include <stdio.h> //--------------------------------------------------------------------------struct data { int nro; double valor; char detalle[30]; }; #pragma argsused main() { FILE * f; int pos; data xdatos; f = fopen( "datos", "r+b" ); if( f ) { printf("Entre posicion " ); scanf("%d", &pos ); fseek( f, sizeof(data)*(pos-1), SEEK_SET ); fread( &xdatos, sizeof(data), 1, f ); printf( "nro %d\nvalor %lf\n, detalle %s\n"); printf( "nuevos valores\n" ); printf("nro ");scanf("%d", &xdatos.nro); printf("valor ");scanf("%lf", &xdatos.valor); printf("detalle " ); gets(xdatos.detalle ); fseek( f, sizeof(data)*(pos-1), SEEK_SET ); fwrite( &xdatos, sizeof(xdatos), 1, f ); fclose(f); } } Ejercicio 2 Se tiene el siguiente código: #include <iostream.h> int comparevalores( void * a, void * b ) { //esta función devuelve //1 si el valor contenido en a es mayor que el valor contenido en b //0 si son iguales //-1 si el valor contenido en a es menor que el valor contenido en b. } main() { double * a, double * b; int n; cout << "entre terminos "; cin >> n; //alocar en memoria dinámica espacio para n términos para los vectores a y b //llenarlos con números aleatorios comprendidos entre 0.00 y 99.99 //comparar término a término los dos vectores llamando a la función compararvalores() y mostrar //si cada término de a es mayor menor o igual a cada término de b. } Realizar lo que está comentado dentro del programa. SOLUCION #include <iostream.h> #include <stdlib.h> #include <stdio.h> #pragma hdrstop #pragma argsused int comparevalores( void * a, void * b ) { double x, y; x = *((double *) a); y = *((double *) b); if( x >y ) { return 1; } if( x < y ) { return -1; } return 0; } main() { } double *a, *b; int i,n, r; cout << "entre terminos "; cin >> n; a = new double[n]; b = new double[n]; randomize(); for( i = 0; i < n; i++ ) { a[i] = (double)random(10000)/100.00; b[i] = (double)random(10000)/100.00; printf( "%lf\t%lf ", a[i], b[i] ); r = comparevalores(&a[i], &b[i]); if( r > 0 ) { printf("a[%d] es mayor que b[%d]\n", i, i ); } else if( r < 0 ) { printf("a[%d] es menor que b[%d]\n", i, i ); } else { printf("Son Iguales\n" ); } } delete []a; delete []b; system("pause"); Ejercicio 3 Construir el siguiente algoritmo: Ingresar cuatro valores de tipo unsigned char. (Sugerencia: cin>>). Mediante operaciones binarias copiarlos a una variable de tipo int de modo que el primer byte ingresado sea el menos significativo y el cuarto el más significativo. Mostrar el resultado como un valor hexadecimal. SOLUCION #pragma hdrstop #include <stdio.h> #include <iostream.h> #include <stdlib.h> #pragma argsused main() { unsigned char c; unsigned d, x; int i, n = sizeof( unsigned char )*8; d = 0; for( i = 0; i < 4; i++ ) { printf("entre valor %d ", i+1); cin >>c; x=0; x |= c; x <<= n * i; d |= x; } } printf("%x\n", d ); system("pause" ); Ejercicio 4 Se tiene el siguiente código: class fuerza { }; main() { fuerza f1, f2(150,30), f3, f4; double prodesc; f1.modulo()=180.23; f1.angulo()=-32.2; f3 = f1 + f2; //f1 + f2 da la resultante de componer //los vectores y se asigna a f3 prodesc = f1 * f2; //producto escalar f4 = f2 ^ f3; //producto vectorial Este código utiliza la clase fuerza que representa una fuerza definida por su intensidad en kilos y por su ángulo al origen en grados sexagesimales. Se pide implementar la clase fuerza SIN DESARROLLARLA (declararla únicamente) con los atributos y métodos necesarios para que pueda utilizarse en el programa. NOTA. TODOS LOS ATRIBUTOS NO PODRAN SER ACCEDIDOS DESDE EL PROGRAMA. } SOLUCION class fuerza { private: double ang, mod; public: fuerza(); fuerza(double m, double a ); double & modulo(void); double & angulo(void); fuerza operator=(fuerza f); // no es necesario pero se considera bien fuerza operator + (fuerza f ); double operator * (fuerza f ); fuerza operator ^ (fuerza f ); }; Ejercicio 5 En clase se implementó la clase lista con los siguientes métodos y atributos. struct nodo { class lista void vaciar(void); int dato; { int & operator[](int pos); struct nodo *sig; private : int cantidad(void) }; struct nodo *h; void eliminar( int pos); int cant; void insertar( int pos, int public: x); lista(); lista(lista &l); void agregar(int d); lista operator=(lista l); void achicar(); lista operator +(lista l); ~lista(); }; UTILIZANDO la clase lista construir un programa en C++ que realice lo siguiente: a. Crear una lista enlazada e ingresar 10 valores aleatorios. b. Leer el primer término de la lista, mostrarlo y luego eliminarlo. c. Repetir el paso b hasta que la misma quede vacía. Solución #pragma hdrstop #include "classlista.h" #include <stdlib.h> #include <iostream.h> main() { lista l; int i; int x; randomize(); for( i = 0; i < 10; i++ ) { x = random(1000); l.agregar(x); } while( !l.cantidad() > 0) { x = l[0]; l.eliminar(0); printf( "%d\t", x ); } printf("\n\n" ); }