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

#801
En C y C++ se puede utilizar la función strtol para obtener el numero representado por una cadena. En C++ seria mas o menos así:
Código (cpp) [Seleccionar]

cout << "Numero: ";
string palabra;
cin >> palabra;
cout << palabra << " ==> " << strtol(palabra.c_str(), 0, 2) << endl;

El tercer argumento de la función es la base (2 a 36) de la representación en cadena. Mas información sobre la mentada función en sitios como "C Plus Plus".

Un saludo
#802
Programación C/C++ / Re: [C]funciones
25 Mayo 2013, 14:44 PM
Un comentario:

En C++ cuando se declara una función en la forma:
Código (cpp) [Seleccionar]
int fn();
Ello indica que el tipo de retorno de la función es int y no recibe argumentos.

Pero en C la misma declaración:
int fn();
Indica una función que recibe un numero no determinado de argumentos, para indicar que no recibe argumentos se debe indicar explícitamente utilizando la palabra reservada void:
int fn(void);

Un saludo
#803
Si me permiten un comentario (aquí voy de criticon):
Cita de: leosansan en 23 Mayo 2013, 12:10 PM
* Consecuencia de la consecuencia, además de generar los aleatorios has de "idear" un sistema que te permita no repetir en cada número nuevo que generas el que coincida con los generados anteriormente. [...]

Código (cpp) [Seleccionar]
int i, j;

// ...

vector<int> n;
random_shuffle ( n.begin(), n.end() );
for (i = 0; i < 1000; ++i)
   n.push_back(i+1);
for(i = 0; i < 10; i++)
   for (j = 0; j < 10; j++)
      m[i][j] = n[(10 * i) + (j + 1)];
}

Primero se deben agregar con push_back y solo entonces revolver con random_shuffle. Mas o menos así:
Código (cpp) [Seleccionar]
int i, j;

// ...

vector<int> n;
for (i = 0; i < 1000; ++i)
   n.push_back(i + 1);
random_shuffle(n.begin(), n.end());

for (i = 0; i < 10; i++)
   for (j = 0; j < 10; j++)
      m[i][j] = n[i * 10 + j];
}


Un saludo
#804
Cita de: NathanD en 22 Mayo 2013, 18:09 PMresulta que tengo que coger la información de un fichero .dat con la información de una matriz dinámica.
Lo primero que debes indicar es como esta almacenada la información en el archivo de datos ya que ello decide que funciones utilizar para la lectura (fread o fscanf). Supongo es un archivo de texto con el formato:
3 4
0.0  1.0  2.0  3.0
10.0 11.0 12.0 13.0
20.0 21.0 22.0 23.0

Los dos primeros valores son el numero de filas y columnas seguidos de cada uno de los valores, texto plano sin chiste. Si es de otra forma debes dar un ejemplo sobre como los guardas.

En cuanto al programa lo primero que debes hacer es evitar el uso de gets y fflush(stdin), las razones se indican en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Tampoco puedes concluir, si la llamada a fopen falla, que el archivo no existe ya que la mentada función puede fallar por otras razones (falta de privilegios, falla catastrófica, etc.).

Con esto:
matriz = (tMatriz*) malloc( 20 * sizeof(tMatriz) );
Reservas memoria para veinte matrices, ¿Estas seguro de leer ese numero del archivo? Y en C las conversiones explicitas al tipo apropiado de funciones como malloc, calloc y para el caso cualquier función que retorne un "void *" no son necesarias y no se recomiendan (por ejemplo si no incluyes el encabezado <stdlib.h> esa conversión puede terminar reventando al programa).

Y una matriz (punteros incluidos) no puedes simplemente leerla así del archivo:
/* Leer un maximo de 20 estructuras *punteros incluidos* */
cantidad = fread(matriz, sizeof(tMatriz), 20, fichero);

/* El numero de filas y columnas de la primera matriz es */
printf("%d\t%d", matriz->c, matriz->f);   //Basura


De nuevo la forma correcta para leer el numero de filas, columnas y cada valor depende del formato del archivo de datos. Danos un ejemplo.

Un saludo
#805
Cita de: Belial & Grimoire en 22 Mayo 2013, 18:16 PM
CitarBien, 2,8 * 1048575 = 2936010 bytes. Ok, entonces 3 minutos a 128 kbps son unos 2936010 bytes lo que nos salen unos 978670 bytes por minuto.
lo que no entiendo es de donde salio la cantidad 978670?, alguien sabe como o de donde se obtiene esa cantidad?
Se calcula, división entre tres.

Un saludo
#806
Si cada nombre es único se puede modificar el bucle para que este pare cuando se encuentre una coincidencia. Con ello se puede utilizar al contador del bucle como bandera de estado, mas o menos así:
Código (cpp) [Seleccionar]
else if (z == 1){
   cout << " Introduce el nombre de la persona que desea buscar: ";
   cin >> buscaNombre; cout << endl << endl;
   
   for (i = 0; i < N && strcmp(Fulanito[i].Nombre, buscaNombre) != 0; i++)
      ;
   if (i != N){
      cout <<"    Telefono de "<< Fulanito[i].Nombre <<": " << Fulanito[i].Telefono;
      cout << endl << endl << endl;
   }else
      cout << "No existe en la base esa persona"<< endl<< endl<< endl;
}

Pero, de nuevo, solo aplica si no hay nombres repetidos.

Y para imprimir un carácter varias veces se puede utilizar un objeto de la clase string:
Código (cpp) [Seleccionar]
cout << string(num_reps, ch) << endl;
Donde ch es el carácter a imprimir y num_reps el numero de repeticiones.

Un saludo
#807
Cita de: leosansan en 14 Mayo 2013, 15:41 PM
El problema radica, con permiso de rir, en que no inicializar las  variables *media=0 y *varianza=0 antes de los correspondientes for.
Tienes razón, no era un problema sino dos (el uso del VLA y las dos variables sin inicializar).

¿O son tres? Lo menciono porque:

1) Debido a que la definición de la función main omite el tipo de retorno no se puede compilar como C99 (no seria valido).

2) La declaración del array "data" requiere compilar como C99.

...

Un saludo
#808
Si puedes hacer la multiplicación con lápiz y papel:
    1 2 3 4 5
        x 1 2
  -----------
    2 4 6 9 0
+ 1 2 3 4 5
  -----------
  1 4 8 1 4 0


Puedes hacerla sin problemas en C y C++. Solo tienes que utilizar arrays para almacenar cada uno de los dígitos, donde exista un vació colocas un cero:
  0 2 4 6 9 0
+ 1 2 3 4 5 0
  -----------
  1 4 8 1 4 0


A continuación basta con realizar la suma teniendo en cuenta el acarreo.

Un saludo
#809
Programación C/C++ / Re: Archivos
14 Mayo 2013, 02:40 AM
Cita de: amchacon en 13 Mayo 2013, 23:01 PMEn cuanto a guardar los datos, te valdría una función como esta:

void Guardar(Alumnos* Datos,int MAX)
{
   FILE* Fichero = fopen("Salida.txt","wb");
   int i = 0;

  for (i = 0; i < MAX; i++)
  {
      write(Datos[i].nombre,strlen(Datos[i].nombre),sizeof(nombre),Fichero);
      write(Datos[i].estado,1,sizeof(int),Fichero);
      write(Datos[i].edad,1,sizeof(int),Fichero);
      fprintf(Fichero,"\n \n"); // Saltos de linea
  }

  fclose(Fichero);
}


Siendo "Datos" el vector de datos y MAX los elementos que hay.
Tengo la impresión de que la función que pensabas utilizar para escribir los datos es "fwrite" ("write" seria solo un error ortográfico). ¿Estoy en lo correcto?

Si ese es el caso es mas fácil simplemente imprimir todo el contenido del array con una sola llamada (a fwrite):
void Guardar(Alumnos *Datos, int MAX)
{
   FILE *salida;
   
   if ((salida = fopen("Salida.txt", "wb")) == NULL)
      perror("Salida.txt");
   else {
      fwrite(Datos, sizeof *Datos, MAX, salida);
      fclose(salida);
   }
}


O si se quiere almacenar la información como texto se puede utilizar un bucle e imprimir cada uno de los registros mediante fprintf (un campo por linea).

Un saludo
#810
El problema se debe a la declaración de la variable "data":
int N;

/* ... */

float med,var,data[N];

Un array declarado en esa forma se conoce como array de longitud variable o VLA, los dolores de cabeza surgen por el soporte variado de estos en los distintos estándares de C:

A) En C90 los VLAs no son validos.
B) En C99 los VLAs son validos.
C) En C11 los VLAs son validos pero su soporte es opcional.

Para que el programa funcione correctamente debes verificar que tu compilador soporte el estándar C99 (y por supuesto que se compile en ese modo).

Por ello es mejor, en mi opinión, reservar memoria de forma dinámica. Mas o menos así:
int N;

/* ... */

/* 1) Declaracion del puntero */
float med,var,*data;

/* 2) Reserva de memoria */
data = malloc(N * sizeof *data);

/* ... */

/* Cuando ya no sea necesaria la memoria se libera */
free(data);


Por ultimo tienes que cambiar la definicion de la funcion main.

Un saludo