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 - rir3760

#921
Supongo se refiere (¿Tu profesor?) a que si almacenas en un archivo un bloque de memoria con fwrite debes leerlo con fread. El caso usual es cuando se almacena en el archivo un array de estructuras con campos de tipo int, double, etc.

Pero si ese es el caso ya no estamos tratando con un archivo cuyo contenido son lineas de texto.

Un saludo
#922
Cita de: NathanD en 19 Marzo 2013, 10:52 AMEntonces, si lo hago con fread, tendría que mirar yo mismo manualmente los '\n'
Correcto

Cita de: NathanD en 19 Marzo 2013, 10:52 AMes que se supone que para habitante del censo del fichero .dat hay una línea
Entonces lo mejor es utilizar fgets para leer por linea (y por ende por registro). Si necesitas separar la linea en componentes (nombre, dirección, etc.) puedes utilizar funciones como strtok.

Un saludo
#923
Cita de: NathanD en 19 Marzo 2013, 00:25 AMmi problema es que no entiendo ciertas cosas sobre los ficheros, más concretamente la diferencia entre ficheros binarios y de texto
La diferencia principal entre un stream binario y uno en modo texto es: en este ultimo el carácter o caracteres utilizados para indicar el avance de linea (por ejemplo '\r' + '\n' en MS Windows) se convierten de forma transparente a '\n' en las operaciones de lectura. Y cuando escribes en el archivo todo '\n' se convierte apropiadamente (siguiendo el ejemplo cada '\n' se sustituye por el par '\r' + '\n').

Eso no sucede con un stream en modo binario.

Cita de: NathanD en 19 Marzo 2013, 00:25 AMNo se me ocurrió otra forma que hacerlo con fgets, para tener en cuenta los saltos de línea, asumiendo que cada habitante está en una línea (¿cómo puedo hacerlo con fread?).
No es posible ya que fgets lee por linea (si no sobrepasa el máximo indicado) mientras que fread lee por bloque, puedes utilizar esta ultima para leer N caracteres pero no sabrás cuantas lineas se leyeron (debes escanear el bloque para contar manualmente los '\n').

Un saludo
#924
Programación C/C++ / Re: Problema con moda
19 Marzo 2013, 05:07 AM
Lo primero que debes hacer es cambiar los nombres de los encabezados, evitar el uso de la biblioteca conio de Borland y cambiar la definición de la función main. El porque se explica en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

En este momento tu programa no calcula correctamente la moda ya esta se toma como la ultima repetición de dos o mas números. Para explicarlo mejor esta es una salida de tu programa con ese problema:
***Metodo Burbuja, Media,mediana,moda***
10 7 1 1 1 5 5 9 8 7
1 1 1 5 5 7 7 8 9 10
? Media: 5.4
? Mediana: 5 7
? Moda: 7

Como puedes ver toma la moda como 7 cuando debería ser 1.

Para calcularla correctamente debes utilizar dos bucles: el primero para conocer el numero que se repite mas veces y el segundo para imprimir todos los números que cumplan con ese requisito (así imprimes la moda cuando esta son dos o mas números).

Un saludo
#925
Por partes:

* La función scanf con casi todos los especificadores como "%d", "%s", etc. lo primero que hace es descartar el espacio blanco, tomando tu programa como ejemplo no hay problema al introducir (cuando se pide la deuda):
    12.34{ENTER}

Pero con los especificadores "%[]" y "%c" ese descarte no sucede, la función retorna el primer carácter que encuentre en el bufer de la entrada estándar.

* Regresando al ejemplo, al pedir la deuda si se introdujo:
    12.34{ENTER}
La función scanf con "%f" descarta los espacios, con los caracteres "12.34" genera el numero y lo almacena en deuda[ i ], el avance de linea o '\n' se queda en el bufer de la entrada estándar y, cuando se llama a scanf con "%c", es almacenado en la variable resp.

* Para evitarlo se utiliza " %c", el espacio en la cadena de formato indica "leer y descartar una secuencia de cero o mas caracteres de espacio blanco". En otras palabras la función primero descarta los caracteres de ese tipo (en tu caso el avance de linea) y solo entonces lee un carácter y lo almacena en la variable resp.

* Por ultimo con scanf los caracteres ' ', '\t', '\n' no se toman literalmente (salvo dentro de "%[]"), en su lugar generan el comportamiento ya mencionado. Para explicarlo mejor puedes utilizar " %c", "\t%c", "\n%c" y el efecto sera el mismo.

Un saludo
#926
Cita de: 85 en 18 Marzo 2013, 03:30 AM
haber haber haber, veamos

...
No te entendi. ¿Por favor puedes explicar a que te refieres con eso?

Un saludo
#927
Son extensiones de Microsoft, una es Generic-Text Mappings in TCHAR.H.

Un saludo
#928
Cita de: Handelson en 17 Marzo 2013, 20:47 PM
Y tenías razón en el segundo hay que unirlos dos puntos con "cout"

#include <iostream>

int main() {
     
     std::cout << "Hola capullo";
     system("pause");
     return 0;
     
}
Solo aclarar un punto: el espacio blanco (espacio, tabulador, avance de linea, etc.) no puede generar el error que mencionas ya que C++ es un lenguaje de formato libre (el espacio solo importa para separar los componentes, en cualquier otro se ignora).

Por ejemplo esto es valido:
Código (cpp) [Seleccionar]
#include <iostream>
int
main
(
)
{
std
::
cout
<<
"Hola capullo"
;
return
0
;
}

Pero, por supuesto, no se recomienda.

Los únicos casos donde si importan los espacios son las directivas del preprocesador, cadenas literales y algunas declaraciones.

Por cierto si piensas utilizar Dev-C++ hay algunas versiones de este que han sido actualizadas, una de estas es Orwell Dev-C++ y en su log de actualizaciones se indica que se añadió la pausa automática en su versión 5.2.0.0.

No lo he probado y no lo recomiendo pero si te interesa ...

Un saludo
#929
Ademas de la corrección que ya te indico pacoperico otras dos son:

1) Al pedir confirmación si se debe continuar o no:
scanf("%f",&deuda[i]);
printf("\n\nHay otro cliente...S/N? ");
scanf("%c",&resp);

La variable "resp" terminara almacenando el avance de linea generado al introducir el monto de la deuda, para que funcione correctamente debes utilizar " %c":
scanf("%f",&deuda[i]);
printf("\n\nHay otro cliente...S/N? ");
scanf(" %c",&resp);


2) Asumes se introducirá el máximo numero de registros:
//Listar los codigos de los clientes buenos
printf("\n\nClientes Buenos con deuda menor a 10000 bs");
printf("\n\nCodigo del cliente");
for(j=0;j<MAX;j++)
{
   /* ... */
}
getch();

//Mostrar el codigo de los clientes malos
for(k=0;k<MAX;k++)
{
      /* ... */
}

Lo que generara resultados incorrecto si el numero de registros es menor, debes cambiar las comparaciones que controlan los bucles a:
//Listar los codigos de los clientes buenos
printf("\n\nClientes Buenos con deuda menor a 10000 bs");
printf("\n\nCodigo del cliente");
for(j=0;j<i;j++)
{
   /* ... */
}
getch();

//Mostrar el codigo de los clientes malos
for(k=0;k<i;k++)
{
      /* ... */
}

Para así procesar solo los registros introducidos.

Un saludo
#930
Cita de: NathanD en 17 Marzo 2013, 15:25 PMComo se trata de reescribir el programa usando punteros, me he limitado a cambiar el parámetro:
void HOTELES_inicializarHoteles(HOTELES *hotel)
El problema: todo parámetro declarado como un array en realidad se procesa como un puntero. Puedes hacer ese cambio pero solo es cosmético.

El error en esta sentencia:
*(hotel + i).numero_clientes = 0;
Se genera porque el operador "." tiene mayor prioridad que "*" y la expresion se evalúa así:
*((hotel + i).numero_clientes) = 0;
Para conseguir el efecto deseado se deben utilizar paréntesis (mejor, por sencillo, utilizar "[]").

Y como ya te comentaron es mas fácil ayudarte si publicas el código fuente del programa así como los mensajes de error que se generan.

Un saludo