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

#1231
No, no es correcto ya que no colocas todos los bytes del array a cero.

Una forma mejor es utilizando el nombre del array y su numero de elementos:
fichaPersona Alumnos[20];
memset(Alumnos, 0, sizeof *Alumnos * 20);


También deberías eliminar la literal 20 (en su lugar utiliza una macro).

Un saludo
#1232
Cita de: Fyrox en 31 Julio 2012, 02:52 AMrir3760, ¿me podrías explicar como funciona exactamente la siguiente linea?
Código (cpp) [Seleccionar]
cin.ignore(numeric_limits<int>::max(), '\n');
No entiendo exactamente su funcionamiento.
Cuando se llama a la función miembro "ignore":
Código (cpp) [Seleccionar]
cin.ignore(N, 'ch');
Se descartan caracteres del stream "cin" hasta que se cumpla una de dos condiciones:
A) Se encuentra el carácter 'ch'.
B) Se descartan N caracteres.

Otra forma es mediante un bucle:
Código (cpp) [Seleccionar]
{
   char ch;
   
   while (cin.get(ch) && ch != '\n')
      ;
}


La idea de ambas es descartar el resto de la linea (sin importar el numero de caracteres que la componen).

Un saludo
#1233
Programación C/C++ / Re: Ayuda
31 Julio 2012, 03:07 AM
Un detalle.

Cuando se llama a scanf/fscanf, por ejemplo:
char usr[32], pwd[32];
int intentos=0, ingresa=0;

do {
system("cls");
printf("Usuario: "); fscanf(stdin,"%32s",&usr);
printf("\nClave: "); fscanf(stdin,"%32s",&pwd);

Al utilizar el especificador de formato "%Ns" se le indica a la función que almacene, a partir de la dirección indicada, un máximo de N caracteres y a continuación un '\0' para indicar el fin de la cadena.

Por ello las llamadas a "fscanf" (mejor "scanf") deberían ser:
printf("Usuario: "); fscanf(stdin,"%31s",&usr);
printf("\nClave: "); fscanf(stdin,"%31s",&pwd);


Un saludo
#1234
Como ya indico BlackZeroX (Astaroth) para leer una linea de texto de la entrada estándar debes utilizar su función miembro getline.

Antes de hacerlo debes descartar el resto de la ultima linea (por lo menos queda el avance de linea o '\n') para que no sea procesada por "getline". Eso lo puedes hacer de varias formas por ejemplo un bucle o utilizando la función miembro "ignore".

El programa con ambas correcciones es:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <fstream>
using std::ofstream;

#include <limits>
using std::numeric_limits;

int main()
{
   char name[30];
   char text[255];
   
   cout << "Introduzca nombre del fichero (con extension): ";
   cin >> name;
   cin.ignore(numeric_limits<int>::max(), '\n');
   
   cout << "Introduzca contenido del fichero: ";
   cin.getline(text, sizeof text);
   
   ofstream myfile;
   myfile.open(name);
   myfile << text << endl;
   myfile.close();
   
   return 0;
}


Un saludo
#1235
Cita de: k3r00t en 29 Julio 2012, 01:18 AMNo me refiero a si el archivo pudo ser abierto con exito o no, sino que si existe o no,
Utilizando solo la biblioteca estándar de C o C++ no es posible realizar la operación que mencionas, debes utilizar el API de tu sistema operativo.


Cita de: Queta en 29 Julio 2012, 01:43 AM
Puedes usar fopen perfectamente.
No es correcto utilizar "fopen" porque:

A) Si esta tiene éxito el archivo existe, OK.
B) Si no tiene éxito no se puede asumir lo contrario (el archivo no existe) ya que la función puede fallar por otras razones (falla del dispositivo, falta de privilegios, etc.).

Un saludo
#1236
Salvo programas sencillos no se recomienda el uso de "atoi" ya que esta retorna cero si:
A) La cadena no es valida (por ejemplo "JJJJJ")
B) El numero en la cadena es ... cero.

Para una validación a prueba de errores se debe utilizar la función "strtol" (prototipo en <stdlib.h>).

Un saludo
#1237
Cita de: abreu20011 en 28 Julio 2012, 21:58 PM¿Es posible que funcione por compilar desde Windows aunque no incluya las librerías? Es que no se muy bien por que pasa eso :)

Del mismo modo, puedo usar system() sin incluir stdlib.h
Es posible pero no se recomienda.

Antes de llamar a una función se debe indicar su prototipo para que así el compilador pueda verificar que las llamadas y definición (si aplica) coincidan. La forma usual es incluyendo el encabezado que corresponda. Por ejemplo:
#include <stdlib.h> /* Prototipo de "system" */

/* ... */

system("pause");


Si no se indica el prototipo el compilador asume lo siguiente:
1) El tipo de retorno de la función es "int".
2) El numero y tipo de cada argumento esta dado por la llamada.

Si ello no es correcto se presentan problemas. Por ejemplo:
#include <stdio.h>

int main(void)
{
   double num;
   
   num = atof("3.141592"); /* Falta el prototipo de "atof" */
   printf("%f\n", num);
   
   return 0;
}

Ahí el tipo de retorno de "atof" se asume como "int" cuando en realidad es de tipo "double".

Para evitar casos como ese lo mejor es incluir los prototipos (vía encabezados) y nos olvidamos del problema.

Un saludo
#1238
Programación C/C++ / Re: funciones duda
27 Julio 2012, 17:23 PM
Cita de: ALONSOQ en 27 Julio 2012, 14:05 PMPerdona por la pregunta que seguro que es una tontería, pero por que dices que la función no devuelve ningun valor. ¿ No devuelve tres entreros aleatorios?
No. Lo que hace esa función es almacenar los tres números a partir de la dirección indicada.

Para que una función retorne un valor se debe indicar como su tipo de retorno y se debe utilizar la sentencia:
return N;
Donde "N" sera el valor retornado por la función y, por supuesto, coincida con (o pueda ser convertido a) el tipo apropiado.

Por ejemplo una función que recibe tres números y resulta en la suma de estos es:
int suma(int a, int b, int c)
{
   return a + b + c;
}


Un saludo
#1239
El problema es el siguiente, al pedir el numero tecleas:
123{ENTER}

Los caracteres "123" se toman para obtener el numero 123 pero el avance de linea '\n' se queda en el bufer de la entrada estándar. Cuando al final del programa llamas a la función "getchar" esta lee ese carácter, retorna de inmediato y el efecto es no tener la mentada pausa.

Por ello debes descartar el resto de la linea, en C++ hay varias opciones políticamente correctas, la mas sencilla es utilizando un bucle:
Código (cpp) [Seleccionar]
// Descartamos el resto de la linea
char ch;
while (cin.get(ch) && ch != '\n')
   ;
// Pausa mediante la lectura de un caracter
cin.get(ch);


Un saludo
#1240
Programación C/C++ / Re: funciones duda
26 Julio 2012, 23:01 PM
El error principal se encuentra en la funcion "main", ahi llamas a la funcion pasandole un entero:
matriz_aleatoria(matriz[contador]);

Lo correcto es usar solo el nombre del array:
matriz_aleatoria(matriz);

Y ya que la funcion no retorna un valor debes indicar este como void:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void matriz_aleatoria(int m[]);

int main(void)
{
   int matriz[3];
   
   srand((unsigned) time(NULL));
   matriz_aleatoria(matriz);
   
   return 0;
}

void matriz_aleatoria(int m[])
{
   int  i;
   
   for (i = 0; i < 3; i++){
      m[i] = rand() % 16;
      printf("%d\n", m[i]);
   }
}


Un saludo