consulta asignar enteros a un valor logico

Iniciado por Beginner Web, 12 Diciembre 2018, 19:11 PM

0 Miembros y 1 Visitante están viendo este tema.

Beginner Web

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);
}
7w7

K-YreX

#1
Por qué esto??
Código (cpp) [Seleccionar]

typedef struct ambito{
bool local;
};
typedef struct simbolo{
//...
ambito global;
};

Primero que es más simple directamente crear una variable de tipo <bool> dentro de <simbolo>. Y segundo tal y como está ahí, si asignas <true> a <bool local>; entonces <ambito global> es igual a <true>. Osea a la inversa...

Y si no quieres asignar un <int> a un <bool> comprueba cada caso con <if>.
Código (cpp) [Seleccionar]

do{
cout<<"Ingrese ambito local(0)/global(1): ";
cin>>auxiliar;
if(auxiliar==0)
nuevo->dato.global.local=true;
else if(auxiliar == 1)
               nuevo->dato.global.local = false;
}while(auxiliar != 0 && auxiliar != 1);

No sé si está bien asignado o es al revés ya que es un lio el "global.local".

PD: Hay un <system("pause")> por ahí que quedaría mejor con un <cin.get()>... :rolleyes:
Y para mí la mayor ventaja de C++ en comparación a C es el uso de <string> en vez de <char*>, así evitas tener que usar <fflush(stdin)> Y coger el valor con un <cin> o <getline()> y no tener que usar <gets()> (y mejor que <gets()> es usar <fgets()>). :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Beginner Web

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);

7w7