[C con Clase] Ayuda[ordenar elementos en registro]

Steven Davidson srd4121 en njit.edu
Lun Feb 15 07:14:32 CET 2010


Hola Daniel,

Rido wrote:
> Me he leído el artículo, gracias. Aunque me he perdido en más de una
> línea (vamos, o párrafo). Pero lo importante es que al final pude
> hacerlo :D. Mil gracias.
> 
> Aquí dejo el código: http://cl1p.net/agenda/
> 
> Si le veis algún error o mejora decídmelo. Creo que ya funciona a la

- Como estás usando C++, sugiero que uses constantes (variables) en 
lugar de las constantes simbólicas del precompilador. Esto es,

const int MAX = 20;
const int CDIRECCION = 40;
const int CNOMBRE = 15;

- El 'typedef' no es requerido; puedes eliminarlo.

- Implementaste un número de teléfono como un número entero. Aunque 
digamos "número" de teléfono, realmente no se trata de un número. Los 
números sirven para realizar operaciones aritméticas; esto no lo hacemos 
con los números de teléfono. Además, tienes que tener en cuenta la 
cantidad de dígitos decimales que un 'int' puede representar. Si 'int' 
ocupa 32 bits, entonces sólo puedes representar números de 9 dígitos. 
Algunos números de teléfono pueden contener más dígitos, y por tanto, no 
serán representados correctamente. También ten presente que se suele 
usar otros símbolos en un nº de teléfono como paréntesis, guiones, 
espacios e incluso letras que representan dígitos. Por ejemplo, (888) 
999 - 1111. Aconsejo usar una cadena de caracteres para representar un 
nº de teléfono. También podrías usar una estructura de datos, para una 
implementación más compleja.

- Definiste una constante para representar la cantidad máxima de 
contactos en 'agenda', pero no la usas cuando defines este array. Escribes:

Tpersona agenda[20];

Deberías escribir:

Tpersona agenda[MAX];

- Para el caso 'N', escribes:

i = libre( agenda );
nuevo( agenda, i );

Esto no es necesario. Simplemente escribe:

nuevo( agenda, libre(agenda) );

- En la función 'nuevo()', supones que el índice 'i' de 'agenda' es 
válido, si 'nombre' es una cadena nulo (o vacía). Esto no es un buen método.

Sugiero crear otra estructura para representar una agenda. Esta 
estructura contendrá el array 'agenda' y una cantidad actual de 
contactos en tal array. Por ejemplo,

struct Tagenda
{
   Tpersona agenda[MAX];
   int nCantActual;
};

Ahora podemos consultar la cantidad actual de la agenda de tipo, 'Tagenda'.

- Haz lo mismo en 'leerag()'.

- Ciertamente, puedes asignar el carácter nulo, '\0', a cada cadena en 
cada registro de la agenda, pero recomiendo usar la función estándar 
'memset()' para asignar un mismo valor a todos los bytes de 'agenda'. 
Por ejemplo,

memset( agenda, 0, MAX*sizeof(Tpersona) );

Por otro lado, podríamos haber hecho la inicialización verdadera al 
definir el array 'agenda' en 'main()'. Esto es,

Tpersona agenda[MAX] = {0};

- En la función 'libre()', sugiero usar un bucle 'for', en vez de un 
bucle 'do/while'. Esto es,

for( i=0; i<max && agenda[i].nombre[0]!=0; i++ );

- Como te han mencionado, puedes usar 'strcmp()' para comparar cadenas 
de caracteres.

> perfección y se puede ordenar por nombre (paso de hacer el resto
> porque es lo mismo pero con otras variables del registro).
> 

Podrías usar la función estándar 'qsort()', aunque hay que entender bien 
cómo funciona y qué requiere. Puedes consultar nuestra página como 
referencia de las funciones estándares; puedes ir a: 
http://c.conclase.net/librerias/index.php?ansilib=stdlib#inicio

> Por cierto, tenía entendido que las cadenas aceptan también espacios
> en blanco, y cuando meto la dirección con un espacio en blanco se me
> pilla el programa, alguno sabría decirme por qué y, más importante,
> como leñes lo remedio.
> 

Sí. Las cadenas sí pueden contener espacios, ya que al fin y al cabo, 
son caracteres. El problema es que 'cin >>' se detiene al leer un 
carácter blanco: ' ', '\r', '\n', '\t', '\f', y '\v'. La solución es 
usar 'getline()' para conseguir una línea entera de caracteres terminada 
por el carácter de fin-de-línea, '\n'. Por ejemplo,

char szCad[30];

cin.getline( szCad, 30 );


Espero que esto te oriente.

Steven





Más información sobre la lista de distribución Cconclase