#pragma hdrstop #include <condefs.h> /*Hacer un programa en C que realice lo siguiente: Primer paso Ingresar 2 valores que representan un punto que puede estar definido mediantes sus coordenadas cartesianas o polares. Guardar una cantidad n de puntos como cadenas de caracteres y especificando si las coordenadas son cartesianas mediante el caracter 'c' y polares mediante el caracter 'p' Segundo Paso Hacer otro programa en C que lea el archivo anterior y muestre la distancia que hay entre el primer punto leido à todos los demas. */ //--------------------------------------------------------------------------#include <stdio.h> #include <math.h> #include <stdlib.h> #pragma argsused /* PRIMERA PARTE SE GUARDA EN UN ARCHIVO n REGISTROS QUE RESPONDEN A LA ESTRUCTURA puntochar */ struct puntochar { char a[25]; char b[25]; char tipo; }; double ponersigno( void ) {//esta funcion genera signo negativo aleatorio (multiplicación por -1) int r; r = random(100); if( r % 2 == 0 ) { return -1.0; } return 1.0; } void generarpuntos( int n, FILE * pf ) {//procedimiento que genera los puntos y los guarda en un archivo struct puntochar pc; int i, r; double p, q; randomize(); for( i = 0; i < n; i = i+ 1) { r = random( 100 ); if( r %2 == 0 ) { pc.tipo = 'c'; } else { pc.tipo = 'p'; } if ( pc.tipo == 'c' ) { p = random(100000)/100.00; p = p * ponersigno(); q = random(100000)/100.00 * ponersigno(); } else {//coordenadas polares p = random(100000)/100.00; q = random(36001)/100.00;//sexagesimal q = q * M_PI / 180.00; //radianes } //asignarlos a la estructura gcvt(p, 7, pc.a ); gcvt(q, 7, pc.b ); printf( "a = %s, b = %s, Tipo = %c\n", pc.a, pc.b, pc.tipo ); fwrite( &pc, sizeof(pc), 1, pf ); } } main( ) { FILE * f; int n; printf ("Cantidad de puntos " ); scanf( "%d", &n ); f = fopen("datos", "wb" ); if( f != NULL ) { generarpuntos( n, f ); fclose(f); } printf( "\n\n" ); system("pause" ); } #pragma hdrstop #include <condefs.h> #include <stdio.h> #include <math.h> #include <stdlib.h> /* SEGUNDA PARTE DEL EJERCICIO Este es un programa que lee los datos del archivo creado anteriormente y calcula la distancia entre el primer punto leido del mismo con los siguientes. */ struct puntochar { char a[25]; char b[25]; char tipo; }; struct punto { double x, y; }; struct punto polaracartesiano(double mod, double arg ) {//funcion que devuelve en una estructura punto la conversión de coordenadas polares a cartesianas struct punto p; p.x = mod* cos( arg ); p.y = mod* sin( arg ); return p; } double distancia( punto p, punto q ) {//función que devuelve la distancia entre dos puntos return sqrt( pow((p.x -q.x), 2 ) + pow( (p.y - q.y), 2 ) ); } void mostrardistancias( FILE * pf ) {//procedimiento que lee los datos del archivo y muestra las distancias del primer punto a los demás struct puntochar pc; struct punto p, q; double d; int r; r = fread( &pc, sizeof( pc ), 1, pf ); p.x = atof( pc.a ); p.y = atof( pc.b ); if( pc.tipo == 'p' ) { p = polaracartesiano( atof(pc.a), atof(pc.b) ); //polaracartesiano( p.x, p.y ); } while( r != 0 ) { r = fread( &pc, sizeof( pc ), 1, pf ); if( r != 0 ) { q.x = atof( pc.a); q.y = atof( pc.b); if( pc.tipo == 'p' ) { q = polaracartesiano( q.x, q.y ); } d = distancia( p, q ); printf( "%lf\t", d ); } printf( "\n\n" ); } } //--------------------------------------------------------------------------#pragma argsused main() { FILE * f; f = fopen("datos", "rb" ); if( f != NULL ) { mostrardistancias( f ); fclose(f); } system("pause"); }