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

#281
Programación C/C++ / Re: Problema con EOF
30 Agosto 2014, 18:01 PM
Antes de utilizar la macro EOF debes incluir el encabezado <cstdio>.

Un saludo
#282
Utiliza la clase string (el encabezado a incluir tiene el mismo nombre) para generar la cadena, cuando llames a la función system obtienes la cadena "a la C" mediante la función miembro c_str. Mas o menos así:
Código (cpp) [Seleccionar]

string in = "mipagina.net";
string cmd = "echo ping " + in;

// ...

system(cmd.c_str());


Y si necesitas mas información sobre la biblioteca estándar de C++ consulta la referencia en linea en C Plus Plus.

Un saludo
#283
Cita de: wiD^ en 26 Agosto 2014, 20:26 PMY si quiero pasar un arreglo de registros?
No entiendo la pregunta ya que eso es lo que estas haciendo en tu programa:
int main()
{

   registro clientes[200];
   int i;

  SetearReg(&clientes, &i);
}

Por cierto no debes utilizar el operador "dirección de" (el '&') en la llamada a función y el segundo parámetro no es necesario. Y se debe utilizar la palabra reservada "struct" en la declaración del array a menos que lo estés compilando como C++.

Por ultimo lo único que debes hacer es revisar con cuidado la función "SetearReg" cortesía de Blaster y aplicar las correcciones a tu programa.

Un saludo
#284
Por supuesto que si ya que C no tiene referencias (pueden emularse mediante punteros).

Un saludo
#285
En C++ solo tienes que indicar en la declaración de la función que el parámetro en cuestión es una referencia con "&", por ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;

struct punto {
   int x;
   int y;
};

void leer_punto(punto& p);

// ...

int main()
{
   punto p;
   
   leer_punto(p);
   
   // ...
   
   return 0;
}

void leer_punto(punto& p)
{
   cin >> p.x;
   cin >> p.y;
}


Un saludo
#286
El problema se genera por la forma en que guardas los datos en el archivo:
/*Escribo el archivo*/
printf("Introduzca nombre: ");
gets(persona.nombre);
fprintf(fichero,"%s",persona.nombre);

printf("Introduzca ciudad: ");
gets(persona.ciudad);
fprintf(fichero,"%s",persona.ciudad);

printf("Introduzca edad: ");
scanf("%d",&persona.edad);
fprintf(fichero,"%d",persona.edad);

fclose(fichero);

Por ejemplo si el nombre es "X", la ciudad "Y" y la edad "5" los datos se envían sin separación alguna como la secuencia "XY5".

Para solucionarlo debes enviar cada campo seguido de un avance de linea:
/*Escribo el archivo*/
printf("Introduzca nombre: ");
gets(persona.nombre);
fprintf(fichero, "%s\n", persona.nombre);

printf("Introduzca ciudad: ");
gets(persona.ciudad);
fprintf(fichero, "%s\n", persona.ciudad);

printf("Introduzca edad: ");
scanf("%d", &persona.edad);
fprintf(fichero, "%d\n", persona.edad);

fclose (fichero);


Otros errores que debes corregir:

* Antes de utilizar la función exit debes incluir el encabezado <stdlib.h>.

* No puedes imprimir un entero (la edad) con la función puts:
fscanf(fichero,"%d",&persona.edad);
puts(persona.edad);

En lugar de puts utiliza printf.

* Después de leer el ultimo campo de tipo int (de nuevo la edad) debes descartar el resto de la linea.

* La condición del bucle de lectura garantiza un iteración de mas, en otras palabras si tienes un registro se trataran de mostrar dos. Para evitarlo debes verificar (por lo menos) el resultado de la lectura del primer campo. Combinado con el punto anterior:
while (fgets(persona.nombre, 40, fichero) != NULL){
   printf("%s", persona.nombre);
   
   fgets(persona.ciudad, 40, fichero);
   printf("%s", persona.ciudad);
   
   fscanf(fichero,"%d",&persona.edad);
   printf("%d\n", persona.edad);
   
   {
      int ch;
     
      while ((ch = fgetc(fichero)) != EOF && ch != '\n')
         ;
   }
}
fclose(fichero);


Por ultimo debes evitar el uso de magic numbers y las funciones gets y feof. Mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
#287
Cita de: kutcher en 23 Agosto 2014, 02:53 AMquisiera saber algún método para detectar un posible desbordamiento de enteros al realizar una multiplicación de dos variables de tipo unsigned para asi almacenar con seguridad el resultado en otra
a * b > MAX ==> a > MAX / b, b > MAX / a

Un saludo
#288
Solo para redondear el tema.

Convertir el valor -1 a un tipo entero sin signo es la forma usual de obtener el valor máximo del tipo en cuestión sin tener que recurrir al encabezado <limits.h>. Esto porque cuando un valor con signo se convierte a uno sin signo y el valor esta fuera del rango valido (-1 lo esta) se le suma o resta (dependiendo del caso) MAX + 1 hasta obtener uno valido (-1 + MAX + 1 == MAX).

Otro caso problemático son las conversiones aritméticas (para mas información buscar el tema "Usual arithmetic conversions"), estas definen como debe obtenerse el tipo común en el cual se realizara la operación. Por ejemplo si los operandos de un operador relacional son de tipo signed int y unsigned int entonces el primero se convierte al segundo:
int a;
unsigned b;

a = -1;
b =  0;
printf("%d < %u ? %s\n", a, b, a < b ? "Si" : "No"); /* -1 < 0 ? No */


Lo bueno es que la mayoría de los compiladores, al utilizarlos en su modo estricto, advierten sobre ese tipo de operaciones.

Un saludo
#289
Cita de: chicainge en 20 Agosto 2014, 00:26 AMtengo un problemiya al leer los datos, pongo el nombre y se acaba el programa porque pasa esto?
Porque, como ya te comento ivancea96, el campo nombre debe ser de tipo string, no char. Mismo caso con los campos laboratorio y proveedor.

Cita de: chicainge en 20 Agosto 2014, 00:26 AMy otra cosa, el getline es como se introduce una cadena en el string?
El operador ">>" se utiliza para leer y almacenar una palabra en un string, cuando se desea leer una linea de texto se utiliza getline. Esa función la debes utilizar para asegurarte de leer los campos mencionados completos.

Otro detalle importante es el uso intercalado del operador ">>" con getline, el problema ahí es que usualmente el operador ">>" ignora el espacio pero getline no lo hace. La solución es descartar el resto de la linea con, por ejemplo, la función miembro ignore.

Una forma mas sencilla pero que funciona solo en el caso base (cada linea terminada inmediatamente con el avance de linea) es:
Código (cpp) [Seleccionar]
cout << "NOMBRE: ";
getline(cin, p[0].nombre);

cout << "CODIGO: ";
cin >> p[0].codigo;

cout << "PRECIO: ";
cin >> p[0].precio;
cin.get();

cout << "DESCRIPCION: ";
getline(cin, p[0].descripcion);

cout << "LABORATORIO: ";
getline(cin, p[0].laboratorio);

cout << "PROVEEDOR: ";
getline(cin, p[0].proveedor);

cout << "FECHA DE CADUCIDAD(INTRODUCIR DIAMESAÑO): ";
cin >> p[0].fechacaducidad;


Por supuesto una vez leas los datos del registro debes hacer algo útil con ellos.

Un saludo
#290
Revisando el bucle de la funcion miembro "calcularPromedio":
Código (cpp) [Seleccionar]
int suma=0;
int valor=0;
int numeroValores=0;

for (valor; valor != 9999;numeroValores+= 1){
   cout <<"Escriba el valor: ";
   cin >> valor;
   
   if (valor==9999){
      numeroValores--;
      continue;
   }else {
      suma+=valor;
   }
}

No tiene caso utilizar "valor" como la primera expresión del bucle y en el comparas en dos ocasiones "valor" con 9999 y modificas el valor de la variable "numeroValores" en (también) dos ocasiones. Si se cambia este por un bucle while puedes reducir el numero de expresiones al minimo:
Código (cpp) [Seleccionar]
int suma = 0;
int valor;
int numeroValores = 0;

while (true){
   cout << "Escriba el valor: ";
   cin >> valor;
   
   if (valor == 9999)
      break;
   
   suma += valor;
   numeroValores++;
}


Un saludo