elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 00:44  


Tema destacado: Personaliza-Escoge el diseño del foro que más te guste.

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Calcular la intersección de dos segmentos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Calcular la intersección de dos segmentos  (Leído 888 veces)
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Calcular la intersección de dos segmentos
« en: 31 Octubre 2011, 01:43 »

Hola.

Estoy haciendo un programa en c++; el cual debe calcularme la intersección entre dos segmentos.

Tengo planteado todo el problema.  Y además, me calcula bien casi todos los tipos de intersecciones.

Mi código es:

Código:

//Este programa calcula la interseccion de dos segmentos

#include<stdio.h>
#include<stdlib.h>

int main (void){
   
    float a,b,c,d;
   
    printf("\n Introduzca el primer numero del primer segmento");
    scanf ("%f",&a);
 
    printf("\n Introduzca el segundo numero del primer segmento");
    scanf ("%f",&b);
   
    printf("\n Introduzca el primer numero del segundo segmento");
    scanf ("%f",&c);
   
    printf("\n Introduzca el segundo numero del segundo segmento");
    scanf ("%f",&d);
   
   
          if (b<c){
          printf ("La interseccion es vacia");
          }
          else { if (a>d)
          printf ("La interseccion es vacia"); 
         
          else {if (a<c, b>d)
                   printf ("La interseccion es %f,%f", c,d);
                    else
                     {if (a>c, b>d)
                 printf ("La interseccion es %f,%f", a,d);
                 
              else {
          if (a<c, b==d) {
                   printf ("La interseccion es %f,%f", c,b);
                   }
                   else {if (a==c, b==d)
                   printf ("La intersección es %f,%f", a,c);
                   
           
           
     
            else {
          if (b==c){
          printf ("La interseccion es el punto %f",b);
          }
       
   
          else { if (a==d)
          printf ("La interseccion es el punto %f",a);
                   
                   
                   
          else{
          if (a<c, b>d) {
                   printf ("La interseccion es %f,%f", c,d);
                   }
                   
                   
                   }}}}}}}}
           
   system("pause");
}



Bien; ahora planteo el problema... Me coge bien todas las intersecciones, excepto los dos tipos siguientes:

Código:
else {if (a<c, b>d)
                   printf ("La interseccion es %f,%f", c,d);
                    else
                   
                  {if (a>c, b>d)
                 printf ("La interseccion es %f,%f", a,d);

Al ir cambiando el código, siempre me sale bien uno de los dos tipos de intersecciones de arriba, pero no soy capaz de que me salgan los dos a la vez. Con eso, completaría el programa que estoy creando.

Muchas gracias.


En línea
rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: Calcular la intersección de dos segmentos
« Respuesta #1 en: 31 Octubre 2011, 01:58 »

En ese programa asumes, por alguna razón que esto:
Código
if (a<c, b>d)
Es valido y hace lo que tu esperas de el (No es así).

En C la coma es un operador secuencial, este evalúa su expresión a la izquierda y descarta su resultado. A continuación se evalúa la expresión a su derecha y ese es su resultado. Por ejemplo esto:
Código
2, 5
Es una expresión y su resultado es 5.


En tu caso esto:
Código
if ( a < c, b > d)
Es equivalente a:
Código
if ( b > d )


Lo que debes hacer es utilizar los operadores lógicos AND/OR. Cual utilizar depende del caso y su explicación la puedes encontrar en un buen libro (Revisa los temas fijos del foro).

Un saludo


En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Calcular la intersección de dos segmentos
« Respuesta #2 en: 31 Octubre 2011, 02:08 »

¡Muchísimas gracias! He estado toda la noche mirando todo el código, y al final era solo poniendo & en vez de ",".

En línea
do-while


Desconectado Desconectado

Mensajes: 604


Cuando me afeito, recuerdo porque me dejo barba.


Ver Perfil
Re: Calcular la intersección de dos segmentos
« Respuesta #3 en: 31 Octubre 2011, 14:18 »

¡Buenas!

Creo que se puede hacer mucho mas corto añadiendo dos variables mas, inf y sup que indiquen el infimo y supremo del conjunto resultante, si existe:
Código
//Este programa calcula la interseccion de dos segmentos
 
#include<stdio.h>
#include<stdlib.h>
 
int main (void){
 
   float a,b,c,d,inf,sup;
 
   printf("\n Introduzca el primer numero del primer segmento");
   scanf ("%f",&a);
 
   printf("\n Introduzca el segundo numero del primer segmento");
   scanf ("%f",&b);
 
   printf("\n Introduzca el primer numero del segundo segmento");
   scanf ("%f",&c);
 
   printf("\n Introduzca el segundo numero del segundo segmento");
   scanf ("%f",&d);
   getchar(); // leemos el salto de linea que queda en stdin
 
   //comprobamos que los intervalos esten bien definidos (a <= b y c <=d)
   if(a > b || c > d)
   {
       printf("Los intervalos no estan bien definidos.\n");
   }
   else
   {
       //si el supremo de uno de los intervalos es menor que el infimo del otro
       if(b < c || d < a)
       {
           //el conjunto es vacio
           printf("Interseccion vacia.\n");
       }
       else
       {
           inf = a; //probamos con uno de los valores candidatos a infimo
           if(c > a) //y si no es el mayor de los infimos, lo cambiamos
               inf = c;
 
           sup = b; //probamos candidato a supremo
           if(d < b) //si no es el minimo de los dos supremos, lo cambiamos
               sup = d;
 
           printf("Interseccion: %f , %f\n",inf,sup);
       }
   }
 
   printf("Pulsar intro para terminar...");
   //leemos hasta que se wencuentre intro
   while(getchar() != '\n');
 
   return 0;
}
 

Espero que entiendas la logica del programa, sino, pregunta.
Se puede acortar todavia mas si conoces el operador condicional ternario.

¡Saludos!
En línea

¡¡¡Feliz año nuevo!!!
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Calcular la intersección de dos segmentos
« Respuesta #4 en: 31 Octubre 2011, 14:40 »

Ah, muchas gracias a ti también.

Por ahora lo voy a hacer así, porque estoy empezando, supongo que en los manuales vendrá después cómo usar esos conceptos.

De todas formas voy a probar.

Gracias de nuevo.
En línea
ghastlyX
Colaborador
***
Desconectado Desconectado

Mensajes: 1.894



Ver Perfil
Re: Calcular la intersección de dos segmentos
« Respuesta #5 en: 31 Octubre 2011, 15:50 »

Esto se suele resolver con la técnica de máximos-mínimos, generalizable a más dimensiones. Si se tienen dos segmentos en R, su intersección claramente será el máximo de los extremos izquierdos y el mínimo de los extremos derechos (siempre que esta exista, es decir, que el máximo sea menor o igual que el mínimo).

De esta forma, queda un código muy simple:
Código
#include <iostream>
using namespace std;
 
int main() {
   int a1, b1, a2, b2;
   cin >> a1 >> b1 >> a2 >> b2;
   int a = max(a1, a2), b = min(b1, b2);
   if (a <= b) cout << a << " " << b << endl;
   else cout << "Interseccion vacia" << endl;
}
En línea
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Calcular la intersección de dos segmentos
« Respuesta #6 en: 31 Octubre 2011, 23:11 »

Ah, muchas gracias a ti también.

Todavía no he estudiado los tipos de librerías, así que no conocía la de <iostream>, pero muchas gracias, estoy practicando con este tipo ahora ^^
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Violación de segmentos
Programación C/C++
Blue_box 3 611 Último mensaje 17 Diciembre 2005, 06:55
por Blue_box
decodificador binario a bcd 7 segmentos
Electrónica
murdock_ 2 18,582 Último mensaje 10 Diciembre 2006, 21:16
por murdock_
INTERSECCION DE LISTAS
Programación C/C++
mapers 3 1,223 Último mensaje 11 Marzo 2010, 17:46
por Zzombi
Reto - Intersección de 2 cubos
Ejercicios
[D4N93R] 4 1,560 Último mensaje 19 Agosto 2010, 21:36
por [D4N93R]
Deberia POPear los segmentos que no utilizo.?
ASM
oPen syLar 3 1,862 Último mensaje 13 Febrero 2011, 00:20
por AleX Inc.
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines