Ejercicio dado en clases que emplea estructuras y archivos.

Anuncio
#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");
}
Descargar