<div>coincido con Steven, mas claro echale agua<br></div><div><br></div><div><br></div><div>Edgardo</div><br><div class="gmail_quote">El 15 de febrero de 2010 03:14, Steven Davidson <span dir="ltr"><<a href="mailto:srd4121@njit.edu">srd4121@njit.edu</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hola Daniel,<br>
<br>
Rido wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Me he leído el artículo, gracias. Aunque me he perdido en más de una<br>
línea (vamos, o párrafo). Pero lo importante es que al final pude<br>
hacerlo :D. Mil gracias.<br>
<br>
Aquí dejo el código: <a href="http://cl1p.net/agenda/" target="_blank">http://cl1p.net/agenda/</a><br>
<br>
Si le veis algún error o mejora decídmelo. Creo que ya funciona a la<br>
</blockquote>
<br>
- Como estás usando C++, sugiero que uses constantes (variables) en lugar de las constantes simbólicas del precompilador. Esto es,<br>
<br>
const int MAX = 20;<br>
const int CDIRECCION = 40;<br>
const int CNOMBRE = 15;<br>
<br>
- El 'typedef' no es requerido; puedes eliminarlo.<br>
<br>
- 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.<br>

<br>
- Definiste una constante para representar la cantidad máxima de contactos en 'agenda', pero no la usas cuando defines este array. Escribes:<br>
<br>
Tpersona agenda[20];<br>
<br>
Deberías escribir:<br>
<br>
Tpersona agenda[MAX];<br>
<br>
- Para el caso 'N', escribes:<br>
<br>
i = libre( agenda );<br>
nuevo( agenda, i );<br>
<br>
Esto no es necesario. Simplemente escribe:<br>
<br>
nuevo( agenda, libre(agenda) );<br>
<br>
- 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.<br>
<br>
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,<br>
<br>
struct Tagenda<br>
{<br>
  Tpersona agenda[MAX];<br>
  int nCantActual;<br>
};<br>
<br>
Ahora podemos consultar la cantidad actual de la agenda de tipo, 'Tagenda'.<br>
<br>
- Haz lo mismo en 'leerag()'.<br>
<br>
- 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,<br>

<br>
memset( agenda, 0, MAX*sizeof(Tpersona) );<br>
<br>
Por otro lado, podríamos haber hecho la inicialización verdadera al definir el array 'agenda' en 'main()'. Esto es,<br>
<br>
Tpersona agenda[MAX] = {0};<br>
<br>
- En la función 'libre()', sugiero usar un bucle 'for', en vez de un bucle 'do/while'. Esto es,<br>
<br>
for( i=0; i<max && agenda[i].nombre[0]!=0; i++ );<br>
<br>
- Como te han mencionado, puedes usar 'strcmp()' para comparar cadenas de caracteres.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
perfección y se puede ordenar por nombre (paso de hacer el resto<br>
porque es lo mismo pero con otras variables del registro).<br>
<br>
</blockquote>
<br>
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: <a href="http://c.conclase.net/librerias/index.php?ansilib=stdlib#inicio" target="_blank">http://c.conclase.net/librerias/index.php?ansilib=stdlib#inicio</a><br>

<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Por cierto, tenía entendido que las cadenas aceptan también espacios<br>
en blanco, y cuando meto la dirección con un espacio en blanco se me<br>
pilla el programa, alguno sabría decirme por qué y, más importante,<br>
como leñes lo remedio.<br>
<br>
</blockquote>
<br>
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,<br>

<br>
char szCad[30];<br>
<br>
cin.getline( szCad, 30 );<br>
<br>
<br>
Espero que esto te oriente.<br><font color="#888888">
<br>
Steven</font><div><div class="h5"><br>
<br>
<br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</div></div></blockquote></div><br>