INFORMATICA II – RECUPERATORIO PRIMER PARCIAL Ejercicio 1 Construir un programa en C o C++ que realice lo siguiente: a) Ingresar un entero sin signo. b) Mediante operaciones binarias generar otro valor sin signo tal que el bit menos significativo pase a ser el más significativo y así sucesivamente. Por ejemplo: si el número ingresado es 001011 el nuevo valor quedará 110100. Respuesta #include <iostream.h> #include <stdio.h> main() { unsigned a, b, c,d; int i; cout<<"entre valor "; cin>>a; printf("\n%x\n", a ); b = a; c = 1; d = 0; i = sizeof(unsigned)*8-1; while(b != 0 ) { c = c & b; c <<= i; d |= c; c = 1; b >>=1; i--; } printf("%x\n", d ); } Ejercicio 2 Se tiene un archivo donde hay guardados una cierta cantidad de registros donde cada uno contiene: a) b) Un vector de 20 números reales. Un número real que tiene guardado el promedio de los 20 números del vector. Se pide: Leer cada registro en una estructura, calcular el promedio del vector y luego mostrar si el promedio calculado coincide o no con el número real leído del archivo. Respuesta struct registro { double a[20]; double prom; }; main() { FILE * f; struct registro r; double promedio; int n, i; f = fopen( "datos.dat", "rb" ); if( f != NULL ) { do { n = fread( &r, sizeof(r), 1 , f ); if( n != 0 ) { promedio = 0; for( i = 0; i < 20; i++ ) { promedio += r.a[i]; } promedio /= i; if( promedio == r.prom ) { printf("promedios coinciden\n"); } } }while( n != 0 ); fclose(f); //continúa al lado } } Ejercicio 3 Se tiene el siguiente código. void cambiar( int &a, int & b ) { //hacer el cambio de variables aquí } main() { void *x, *y; int i, j; x = &i; y = &j; cout << “entre i ”; cin>>i; cout << “entre j “; cin >>j; cambiar( /*poner los parámetros x e y indireccionando x e y adecuadamente*/); } Respuesta #include <vcl.h> #pragma hdrstop #include <stdio.h> #include <iostream.h> //--------------------------------------------------------------------------#pragma argsused void cambiar( int &a, int &b ) { int aux; aux = a; a = b; b = aux; } main() { void *x, * y; int *w, * z; int i, j; x = &i; y = &j; cout << "entre i "; cin>>i; cout << "entre j "; cin>>j; w = (int *)x; z = (int *)y; cambiar( *w, *z); cout <<i<<" "<<j<<endl; } //--------------------------------------------------------------------------Ejercicio 4 Se tiene el siguiente código: //definición de las estructuras struct punto { double x, y; }; struct triangulo { punto a, b, c; }; double superficie ( triangulo t ) { double mab, alfaab; double mh, alfah; double cab, ch; double area; punto corte; //mab el coeficiente angular de la recta ab y = mx+c e yh = mh x + ch cab = t.a.y - mab * t.a.x; //c de la recta ab ch = t.c.y - mh * t.c.x; //c de la altura //ahora hallamos la intersección de la recta que pasa por c // con ab corte.x = (ch - cab ) / ( mab - mh ); corte.y = mh * corte.x + ch; //ahora hallamos el área = b * h /2 sería la distancia ab //por la distancia c corte area = sqrt( pow((t.b.x - t.a.x ), 2 ) + pow((t.b.y - t.a.y ), 2 ) ); area *= sqrt( pow((corte.x - t.c.x), 2 ) + pow((corte.y - t.c.y), 2 ) ); area /= 2; return area; } Se pide: a) Convertir la estructura triangulo en una clase teniendo mab = (t.b.y - t.a.y) / (t.b.x - t.a.x ); alfaab = atan( mab ); alfah = alfaab + M_PI / 2.0; mh = tan( alfah ); b) como método la función superficie. Los puntos deben poder ser vistos desde una aplicación. Construir una aplicación que se ingresen dos triángulos e indique cuál área es mayor. Respuesta doubletriangulo::superficie(void); { //comonosepasaparámetro(triangulot)solamentebastaconcopiarelcódigoyeliminartodoslost. doublemab,alfaab; doublemh,alfah; doublecab,ch; doublearea; puntocorte; //mabelcoeficienteangulardelarectaab mab=(b.y-a.y)/(b.x-a.x); alfaab=atan(mab); alfah=alfaab+M_PI/2.0; mh=tan(alfah); y=mx+ceyh=mhx+ch cab=a.y-mab*a.x;//cdelarectaab ch=c.y-mh*c.x;//cdelaaltura //ahorahallamoslainterseccióndelarectaquepasaporc //conab corte.x=(ch-cab)/(mab-mh); corte.y=mh*corte.x+ch; //ahorahallamoselárea=b*h/2seríaladistanciaab //porladistanciaccorte area=sqrt(pow((b.x-a.x),2)+pow((b.y-a.y),2)); area*=sqrt(pow((corte.x-c.x),2)+pow((corte.y-c.y),2)); area/=2; returnarea; } //****************************************************************************** main() { triangulot1,t2; cout<<"ingresexdelpuntoadeltriángulo1";cin>>t1.a.x; cout<<"ingreseydelpuntoadeltriángulo1";cin>>t1.a.y; cout<<"ingresexdelpuntobdeltriángulo1";cin>>t1.b.x; cout<<"ingreseydelpuntobdeltriángulo1";cin>>t1.b.y; cout<<"ingresexdelpuntocdeltriángulo1";cin>>t1.c.x; cout<<"ingreseydelpuntocdeltriángulo1";cin>>t1.c.y; cout<<"ingresexdelpuntoadeltriángulo2";cin>>t1.a.x; cout<<"ingreseydelpuntoadeltriángulo2";cin>>t1.a.y; cout<<"ingresexdelpuntobdeltriángulo2";cin>>t1.b.x; cout<<"ingreseydelpuntobdeltriángulo2";cin>>t1.b.y; cout<<"ingresexdelpuntocdeltriángulo2";cin>>t1.c.x; cout<<"ingreseydelpuntocdeltriángulo2";cin>>t1.c.y; if(t1.superficie()>t2.superficie()) { cout<<"elprimeroesmayorqueelsegundo"<<endl; } elseif(t1.superficie()<t2.superficie()) { cout<<"elsegundoesmayorqueelprimero"<<endl; } else { cout<<"losdostriangulostienenelmismoarea"<<endl; } }