Hola
Estoy haciendo un ejercicio de punteros. El ejercicio consta en el que tengamos un struct con el numero de una carta, su valor y el tipo de carta (espada,copa,oro,basto,etc). Lo que tengo que hacer es cargar 3 variables de este tipo y con punteros, ordenarlas de manera que si una carta es de mayor valor, tiene que mostrarse primero y el espacio de memoria debe ser intercambiado por la carta que tiene un valor menor. No se si me explico.
En el struct va ordenado ( numero de la carta (Ejemplo 1), valor de la carta (Si es un ancho de espadas va un 10 por ejemplo), y el palo de la carta (e = espada, c= copa, o = oro , b = basto)
Hasta ahora hice lo siguiente
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int numero;
int valor;
char palo;
}
t_carta;
void INTERCAMBIO(t_carta *,t_carta * ,t_carta * );
int main()
{
t_carta c1,c2,c3;
c1.numero=3;
c1.palo='c'; ///Cargo las 3 Cartas
c1.valor=6;
c2.numero=1;
c2.valor=10;
c2.palo='e';
c3.numero=3;
c3.valor=6;
c3.palo='c';
printf ("Cartas Sin Ordenar\n");
printf ("%d - %d - %c",c1.numero,c1.valor,c1.palo);
printf ("%d - %d - %c",c2.numero,c2.valor,c2.palo); ///Imprimo las 3 CARTAS SIN ORDENARLAS
printf ("%d - %d - %c\n",c3.numero,c3.valor,c3.palo);
INTERCAMBIO(&c1,&c2,&c3); /// Le paso la direccion de memoria de las 3 cartas a la funcion!
printf ("Ordenado:\n");
printf ("%d - %d - %c",c1.numero,c1.valor,c1.palo);
printf ("%d - %d - %c",c2.numero,c2.valor,c2.palo);
printf ("%d - %d - %c\n",c3.numero,c3.valor,c3.palo);
return 0;
}
void INTERCAMBIO(t_carta *pa,t_carta *pb ,t_carta *pc) ///Y ACA SALE TODO ERROR!!! T_T
{
t_carta aux;
if ((*pa->valor)<(*pb->valor))
{
aux=*pb.valor;
*pb.valor=*pa.valor;
*pa.valor=aux;
}
if (*pb.valor<*pc.valor)
{
aux=*pc.valor;
*pc.valor=*pb.valor;
*pb.valor=aux;
}
if (*pa.valor<*pc.valor)
{
aux=*pc.valor;
*pc.valor=*pa.valor;
*pa.valor=aux;
}
}
Tienes que ver un poco mas el tema de los punteros pues tienes varios problemas de concepto. Primero, al simbolo "*" antepuesto a una variable declarada como puntero es el simbolo derreferenciador de dicho puntero, o en otras palabras si usas esto:
int *p; // direccion de memoria de una variable entera
int a = 3; // variable entera
Solo puedes asignar un valor de la forma:
*p = a; // derreferenciando el puntero, o lo que es lo mismo refiriendote directamente a la memoria de dicha variable y no a su direccion
p = &a; // asignando la direccion de memoria de la variable entera
O sea, lo que estas haciendo en esta linea por ejemplo:
Cita de: palacio29 en 15 Septiembre 2016, 01:49 AM
if ((*pa->valor)<(*pb->valor))
Es un error total, pues estas usando otro simbolo "->" que se usa para referirse al valor al que apunta tu direccion de memoria (en este caso pa/pb), pero a la vez lo estas derreferenciando, o lo que vendria siendo lo mismo, estas tratando una variable "no puntero" como puntero al utilizar luego el "->". Siendo las dos formas correctas:
if ((pa->valor) < (pb->valor)) // Forma 1
if (((*pa).valor) < ((*pb).valor)) // Forma 2
Luego ese error lo sigues cometiendo a traves de el resto del codigo y hay algo mas en estas lineas:
Cita de: palacio29 en 15 Septiembre 2016, 01:49 AM
aux=*pb.valor;
*pa.valor=aux;
Tienes otro error de concepto. Primero declaras aux como variable de tipo structura t_carta y despues intentas asignar un valor tipo entero (pb->valor) a la variable aux que es tipo estructura. La forma correcta es:
aux = *pc; // Asignas la estructura completa derreferenciando el puntero
aux.valor = pc->valor; // Asignas una variable entera a su igual en la estructura
Con esos arreglos deberian solucionarse los errores
Saludos