[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