Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Beginner Web

#371
Cita de: YreX-DwX en 12 Diciembre 2018, 21:12 PM
Con el segundo código, cuando te quede un nodo sólo:
Código (cpp) [Seleccionar]

while(lista.inicio!=NULL){ // lista.inicio apunta al ultimo nodo
borrado=lista.inicio; // borrado apunta al ultimo nodo
lista.inicio=borrado->sig; // lista.inicio apunta al siguiente al ultimo que es NULL
lista.inicio->ant=NULL; // lista.inicio->ant no existe porque lista.inicio esta apuntando a NULL, no a un nodo
borrado->sig=NULL;
delete(borrado);
}


Creo que ahora es más fácil de ver porque el segundo no funcionaría. :-X
ahhhhhhhhhhhhhhhhhhh! eso responde muchas dudas sobre elimininacion de nodos , muchas gracias ;)
#372
Primero que nada perdon por el spam y... bueno lo he dejado asi porque es mas estetico para mi no se, de que funciona funciona pero seguro muchos diran que no es buena practica lo se perdon  :-(
Código (cpp) [Seleccionar]
bool iguales(punto_geografico p, punto_geografico q)
{
bool igual=true;
if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
igual=false;
if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
igual=false;
if(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados)
igual=false;
if(p.latitud.minutos!=q.latitud.minutos || p.longitud.minutos!=q.longitud.minutos)
igual=false;
if(p.latitud.segundos!=q.latitud.segundos || p.longitud.segundos!=q.longitud.segundos)
igual=false;
return igual;
}

Si alguien me sugiere algo mas de buenas tecnicas de programacion o estetica me lo hace saber, mi compañero puso todo en un solo if pero vaya que quedo un chorizo de codigo y a mi no me gusto pero era eficiente igual, se que esto esta mal porque al encontrar la primer condicion que no se cumple ya deberia retornar un false y dejar de verificar las siguientes condiciones :(  :laugh:
#373
Asi?
Código (cpp) [Seleccionar]
bool iguales(punto_geografico p, punto_geografico q)
{
if(p.latitud.direccion==q.latitud.direccion && p.longitud.direccion==q.longitud.direccion)
if(p.latitud.grados==q.latitud.grados && p.longitud.grados==q.longitud.grados)
if(p.latitud.minutos==q.latitud.minutos && p.longitud.minutos==q.longitud.minutos)
if(p.latitud.segundos==q.latitud.segundos && p.longitud.segundos==q.longitud.segundos)
return true;

return false;
}
#374
Necesito algo de ayuda con los modulos de validacion de puntos geograficos, latitud, longitud y comparacion de dos puntos geograficos , me parece que algo estoy haciendo mal en el segundo y no quiero colocar todo en un solo if  :(
Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

typedef struct coordenadas{
int grados;
int minutos;
int segundos;
char direccion;
};
typedef struct punto_geografico{
coordenadas latitud;
coordenadas longitud;
};

void crear(coordenadas &c, bool latitud);
bool validar(coordenadas p, bool latitud);
bool iguales(punto_geografico p, punto_geografico q);
void determinar_ubicacion(punto_geografico p);

int main()
{
punto_geografico p, q;
cout<<"Crear primer punto geografico"<<endl;
cout<<"Latitud"<<endl;
crear(p.latitud,1);
cout<<"Longitud"<<endl;
crear(p.longitud,0);
cout<<"Crear segundo punto geografico"<<endl;
cout<<"Latitud"<<endl;
crear(q.latitud,1);
cout<<"Longitud"<<endl;
crear(q.longitud,0);
if(iguales(p,q)==true)
cout<<"Son iguales"<<endl;
else
cout<<"Son diferentes"<<endl;
determinar_ubicacion(p);
system("pause");
}

void crear(coordenadas &c, bool latitud)
{
do{
cout<<"Ingrese grados   : ";
cin>>c.grados;
cout<<"Ingrese minutos  : ";
cin>>c.minutos;
cout<<"Ingrese segundos : ";
cin>>c.segundos;
cout<<"Ingrese direccion: ";
cin>>c.direccion;
}while(validar(c,latitud)==false);
}
//Aqui
bool validar(coordenadas c, bool latitud)
{
if(latitud==true){
if(c.direccion=='N' || c.direccion=='S'){
if(c.grados==90 && c.minutos==0 && c.segundos==0)
return true;
else{
if(c.grados<0 || c.grados>89 || c.minutos<0 || c.minutos>59 || c.segundos<0 || c.segundos>59)
return false;
else
return true;
}
}
else
return false;
}
else{
if(c.direccion=='E' || c.direccion=='O'){
if(c.grados==180 && c.minutos==0 && c.segundos==0)
return true;
else{
if(c.grados<0 || c.grados>179 || c.minutos<0 || c.minutos>59 || c.segundos<0 || c.segundos>59)
return false;
else
return true;
}
}
else
return false;
}
}
//Y aqui
bool iguales(punto_geografico p, punto_geografico q)
{
if(p.latitud.direccion==q.latitud.direccion && p.longitud.direccion==q.longitud.direccion){
if(p.latitud.grados==q.latitud.grados && p.longitud.grados==q.longitud.grados)
if(p.latitud.minutos==q.latitud.minutos && p.longitud.minutos==q.longitud.minutos)
if(p.latitud.segundos==q.latitud.segundos && p.longitud.segundos==q.longitud.segundos)
return true;
}
else
return false;
}

void determinar_ubicacion(punto_geografico p)
{
cout<<"El punto geografico se ubica en";
if(p.latitud.direccion=='N')
cout<<" el hemisferio Norte ";
else
cout<<" el hemisferio Sur ";
if(p.longitud.direccion=='E')
cout<<"Oriental"<<endl;
else
cout<<"Occidentel"<<endl;
}
#375
eres lo mas! esta superentendible, ya habia visto esta tecnica en otros posts pero no me gusta evaluar todo en un solo if por tema de que por ahi tengo muchas cosas que evaluar por ejemplo comparar 8 o mas condiciones en lugar de 6 , ni modo tendre que ceder  :laugh:
#376
ahh masomenos voy entendiendo lo de los 2^n casos, y suponiendo que quiera validar una hora que va desde 0:00:00 a 23:59:59 esta funcion que devuelve true o false estaria bien o me faltan llaves en el segundo if?  :huh:

Código (cpp) [Seleccionar]
bool validar_hora(thora hora)
{
if(hora.hora>=0 && hora.hora<=23){
if(hora.minuto>=0 && hora.minuto<=59)
if(hora.segundo>=0 && hora.segundo<=59)
return true;
}
else
return false;
}
#378
No entendi pero creo suponer que no importa el puntero anterior de la lista.inicio y si importa que el puntero nodo a eliminar deben apuntar en ambas direcciones a NULL antes de ser eliminado  :xD
#379
Código (cpp) [Seleccionar]
typedef struct ambito{
bool local;
};

Eso porque la consigna pedia una estructura ambito(local,global) y bueno ... pero si tienes razon, y con lo de  validar que solo sea 1 o 0 el dato entero est bien queda mejor asi como lo hiciste, muchas gracias
Código (cpp) [Seleccionar]
do{
cout<<"Ingrese ambito local(0)/global(1): ";
cin>>auxiliar;
if(auxiliar==0)
nuevo->dato.global.local=false;
else if(auxiliar==1)
        nuevo->dato.global.local=true;
}while(auxiliar!=0 && auxiliar!=1);

#380
Queria saber si esta bien el modulo crear(nuevo) donde asigno enteros a una variable logica o hay otra forma mas "estetica"? gracias
Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

const int MAX=32;
typedef char tcad[MAX];
typedef struct ambito{
bool local;
};
typedef struct simbolo{
tcad nombre;
tcad tipo_dato;
int tamanyo;
int valor;
ambito global;
};
typedef struct tnodo *pnodo;
typedef struct tnodo{
simbolo dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
pnodo final;
};

void iniciar(tlista &tabla);
void crear(pnodo &nuevo);
bool validar(tcad cadena);
void agregar_final(tlista &tabla, pnodo nuevo);
int cantidad(pnodo i);
int total_bytes(pnodo i);
void ordenar(tlista &tabla);
void mostrar(tlista tabla);
void nueva_cadena(tcad &cadena);

int main()
{
int opcion;
tlista mitabla;
pnodo nuevo;
iniciar(mitabla);
do{
system("cls");
cout<<"1. Agregar variable a la tabla"<<endl;
cout<<"2. Mostrar cantidad de variables"<<endl;
cout<<"3. Calcular bytes de la tabla"<<endl;
cout<<"4. Ordenar tabla"<<endl;
cout<<"5. Mostrar tabla"<<endl;
cout<<"6. Salir"<<endl;
cin>>opcion;
switch(opcion){
case 1: crear(nuevo);
if(nuevo!=NULL)
agregar_final(mitabla,nuevo);
break;
case 2: cout<<"Cantidad de variables: "<<cantidad(mitabla.inicio)<<endl;break;
case 3: cout<<"Bytes totales de la tabla: "<<total_bytes(mitabla.inicio)<<endl;break;
case 4: ordenar(mitabla);break;
case 5: mostrar(mitabla);break;
case 6: cout<<"FIN DEL PROGRAMA"<<endl;break;
default: cout<<"Opcion incorrecta"<<endl;
}
system("Pause");
}while(opcion!=6);
}

void iniciar(tlista &tabla)
{
tabla.inicio=NULL;
tabla.final=NULL;
}
//Aca es donde quiero que vean si esta bien lo de asignar valor entero  a esa variable logica nuevo->dato.global.local ya que ...
void crear(pnodo &nuevo)
{
        int auxiliar;
bool valido;
nuevo=new tnodo;
if(nuevo!=NULL){
do{
cout<<"Ingrese nombre variable: ";
nueva_cadena(nuevo->dato.nombre);
}while(validar(nuevo->dato.nombre)==false);
cout<<"Ingrese tipo de dato: ";
nueva_cadena(nuevo->dato.tipo_dato);
cout<<"Ingrese  tamaño: ";
cin>>nuevo->dato.tamanyo;
cout<<"Ingrese valor: ";
cin>>nuevo->dato.valor;
do{
cout<<"Ingrese ambito local(0)/global(1): ";
cin>>auxiliar;
if(auxiliar==0 || auxiliar==1){
nuevo->dato.global.local=auxiliar;
valido=true;
}
else
valido=false;
}while(valido==false);
nuevo->sig=NULL;
}
else
cout<<"MEMORIA INSUFICIENTE"<<endl;
}
//... de esta forma no me funciona :(
void crear(pnodo &nuevo)
{
nuevo=new tnodo;
if(nuevo!=NULL){
do{
cout<<"Ingrese nombre variable: ";
nueva_cadena(nuevo->dato.nombre);
}while(validar(nuevo->dato.nombre)==false);
cout<<"Ingrese tipo de dato: ";
nueva_cadena(nuevo->dato.tipo_dato);
cout<<"Ingrese  tamaño: ";
cin>>nuevo->dato.tamanyo;
cout<<"Ingrese valor: ";
cin>>nuevo->dato.valor;
//JUSTO DESDE AQUI
do{
cout<<"Ingrese ambito local(0)/global(1): ";
cin>>nuevo->dato.global.local;
}while(nuevo->dato.global.local<0 || nuevo->dato.global.local>1);
nuevo->sig=NULL;
}
else
cout<<"MEMORIA INSUFICIENTE"<<endl;
}

bool validar(tcad cadena)
{
int i;
bool validado=true;
if(islower(cadena[0]) || isupper(cadena[0])){
for(i=1;i<strlen(cadena) && !validado;i++){
if(isdigit(cadena[i]) || isupper(cadena[i]) || islower(cadena[i]) || cadena[i]=='_')
validado=true;
else
validado=false;
}
}
else
validado=false;
return validado;
}

void agregar_final(tlista &tabla, pnodo nuevo)
{
if(tabla.inicio==NULL){
tabla.inicio=nuevo;
tabla.final=nuevo;
}
else{
tabla.final->sig=nuevo;
tabla.final=nuevo;
}
}

int cantidad(pnodo i)
{
if(i==NULL)
return 0;
else
return cantidad(i->sig)+1;
}

int total_bytes(pnodo i)
{
if(i==NULL)
return 0;
else
return i->dato.tamanyo+total_bytes(i->sig);
}

void ordenar(tlista &tabla)
{
pnodo i, j;
simbolo cambio;
bool ordenado=true;
if(tabla.inicio!=NULL){
while(ordenado){
ordenado=false;
for(i=tabla.inicio;i->sig!=NULL;i=i->sig){
j=i->sig;
if(i->dato.tamanyo>j->dato.tamanyo){
cambio=i->dato;
i->dato=j->dato;
j->dato=cambio;
ordenado=true;
}
}
}
}
}

void mostrar(tlista tabla)
{
pnodo i;
if(tabla.inicio!=NULL){
for(i=tabla.inicio;i!=NULL;i=i->sig){
cout<<"Nombre variable: "<<i->dato.nombre<<endl;
cout<<"Tipo de dato: "<<i->dato.tipo_dato<<endl;
cout<<"Tamaño: "<<i->dato.tamanyo<<" Bytes"<<endl;
cout<<"Valor: "<<i->dato.valor<<" Bytes"<<endl;
cout<<"Ambito: ";
if(i->dato.global.local==true)
cout<<"Global"<<endl;
else
cout<<"Local"<<endl;
cout<<endl;
}
}
else
cout<<"Tabla vacia"<<endl;
}

void nueva_cadena(tcad &cadena)
{
fflush(stdin);
gets(cadena);
fflush(stdin);
}