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

#631
Programación C/C++ / Re: problema scanf
1 Noviembre 2013, 02:15 AM
El problema en las dos llamadas a scanf es utilizar '%' (el operador binario modulo) cuando debería ser '&' (el operador unario "dirección de"). Cambia esas dos sentencias a:
scanf("%d", &readVal);

/* ... */

scanf("%d", &readVal);


Un saludo
#632
No es necesario utilizar la función miembro eof ya que se puede verificar directamente el estado del stream (y por ende si la lectura fue exitosa) con:
Código (cpp) [Seleccionar]
while (getline(Archivo, Cadena)){

   // ...
   
}


Y para leer cada secuencia primero se descartan los caracteres antes del primer dígito, a continuación se leen pares de caracteres donde el primero es '0' o '1' y el segundo ',' o ']' con este ultimo indicando el final de la secuencia.

Ya para terminar coincido con lo dicho por eferion: tiene toda la apariencia de ser un trabajo de clase.

Un saludo
#633
Programación C/C++ / Re: agenda y archivos
30 Octubre 2013, 16:00 PM
Cita de: m@o_614 en 29 Octubre 2013, 21:22 PMsi NULL retorna un puntero tipo void, que no se supone que void puede apuntar a cualquier tipo de dato?
Cierto pero ese tema no tiene relación alguna con el tuyo. Lo que tu intentas es comparar el valor de retorno de la función strcmp que es de tipo int con una dirección de memoria y eso no es valido en C, de ahí el mensaje de advertencia del compilador. La solución ya la mencione en mi mensaje anterior.

En cuanto a pedir la fecha debes obtener los tres valores en la misma llamada a sscanf, de esta forma (el nombre del array debe ser "persona"):
puts("Dame fecha de nacimiento:");
fgets(cadena, MAX, stdin);
sscanf(
   cadena, "%d %d %d",
   &datos[i].fechaNacimiento.dia,
   &datos[i].fechaNacimiento.mes,
   &datos[i].fechaNacimiento.año
);


Pero antes de hacerlo debes cambiar el nombre del campo "año" por algún otro ya que el carácter 'ñ' no es valido (solo se permiten caracteres del alfabeto ingles, los dígitos '0' .. '9', el carácter '_' y no puede empezar con un dígito).

Un saludo
#634
Programación C/C++ / Re: agenda y archivos
29 Octubre 2013, 02:55 AM
Cita de: m@o_614 en 29 Octubre 2013, 02:22 AMpor que en esta linea me aparece un warning de comparison between integer and pointer without a cast y que aun asi me compile:

la linea es esta:
if((strcmp(nombreBuscar,persona[j].nombre))== NULL)
Porque estas comparando el valor de retorno de strcmp (de tipo signed int) con la macro NULL (usualmente "(void *) 0"). Debes cambiar la comparación a:
if (strcmp(nombreBuscar, persona[j].nombre) == 0)

Un saludo
#635
Programación C/C++ / Re: agenda y archivos
29 Octubre 2013, 02:06 AM
Cita de: m@o_614 en 28 Octubre 2013, 23:10 PMhay una parte que dice: leerá los datos de un fichero llamado "agenda.dat" (si existe). Al terminar, guardará todos los datos en ese fichero. y es lo que no entiendo bien que quiere decir, como voy a leer datos de un fichero si me esta diciendo que guarde todos los datos en el fichero al final
Son tres pasos:
1) Abres el archivo en modo lectura y lees todos los registros almacenándolos en el array.
2) Todas las operaciones (listado parcial y total, agregar) se realizan en el array.
3) Justo antes de terminar el programa abres el archivo en modo escritura y sobrescribes su contenido con los registros en el array.

Cita de: m@o_614 en 28 Octubre 2013, 23:10 PMy en la parte que dice añadir un dato nuevo, se refiere a agregar una Persona a la agenda con su nombre,direccion,tel... o a inventar un nuevo dato como edad o algo asi?
Desde el menú la opción agregar debe permitir al usuario agregar un registro.

Un saludo
#636
* Para empezar deberías evitar el uso de fflush(stdin), gets y la biblioteca conio de Borland, las razones se explican en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

* La declaración del alias "listado" esta mal, debería ser:
typedef struct listado /* <== */ {
   char nombre[50];
   char cantidad[50];
   int codigo;
   struct listado *siguiente; /* <== */
} listado;


* En la función "aumentar" en esta sentencia:
ultimo == producto;
Utilizas el operador de comparación "==" cuando debería ser el de asignación "=".

* En la función "eliminar" en la sentencia:
printf("El producto que est%c buscando no se encuentra disponible en estos momentos, 160");
Tienes mal colocada la comilla doble de cierre.

* Falta incluir el encabezado para tener acceso a las funciones de conio como getch, de nuevo lo mejor es evitar su uso.

* Agrega los prototipos de todas las funciones al principio del programa, antes de cualquier definición.

Una vez realices todos esos cambios el programa debe compilar sin generar mensajes de advertencia.

Un saludo
#637
Programación C/C++ / Re: Errores en valgrind
28 Octubre 2013, 02:26 AM
Cita de: elektro88 en 27 Octubre 2013, 11:53 AMSe trata de un programa que trabajal rcon vectores (structs) y hace distintos tipos de operaciones entre ellos. El programa lee los vectores y operaciones de el stdin.

El programa en si funciona pero al pasar el valgrint me salta con los siguientes errores.
Si lo compilo como C99 utilizando gcc en Cygwin (un entorno similar a Linux) el programa termina reventando.

Un consejo: utiliza el español en los comentarios ya que es el lenguaje oficial de los foros y nos ayudaría (y mas todavía a los usuarios que no vivimos en España) a entender tu programa.

----

* Deficiencias en el programa como sentencias innecesarias hay muchas, por ejemplo las funciones "add" y "sub" terminan con:
   vector *x = create_vector (v1->size, auxdata);
   auxdata = NULL;
   free (auxdata);
   return x;
}

Cuando se llama a free y su argumento es NULL el efecto de la llamada es ... ninguno. Y si agregamos que la variable "x" solo se declara para utilizarla como valor de retorno (de la función en turno) ese bloque se puede acortar a solo:
   return create_vector (v1->size, auxdata);
}


* Por alguna extraña razón tratas de rebobinar la entrada estándar, ello tal vez funcione o tal vez no pero el punto importante es que no es necesario. Este bloque en la función main:
while (!feof (stdin) ) {
   if (fgetc (stdin) == EOF) {
      break;
   }
   linea = fgets (copia_linea, MAX_LONG, stdin);
   lineas++;
   
}
rewind (stdin);
for (int i = 0; i < num_vectors + 1; i++) {
   linea = fgets (copia_linea, MAX_LONG, stdin);
   linea = NULL;
}

Lo debes eliminar.

* El bucle que le sigue lo debes controlar verificando el valor retornado por fgets (NULL en caso de error o fin de archivo). Esto:
for (int i = 0; i < lineas; i++) {
   linea = fgets (copia_linea, MAX_LONG, stdin);
   printf ("\n%s", linea);
   sscanf (linea, "%c", &pl);
   // ...

Hay que cambiarlo a:
for (int i = 0; (linea = fgets (copia_linea, MAX_LONG, stdin)) != NULL; i++){
   printf ("\n%s", linea);
   sscanf (linea, "%c", &pl);
   // ...


* En las funciones "dot", "norm", "normalize", "incr" y "decr" tienes bucles que utilizan los indices 0 .. size, eso no es correcto ya que los indices validos son 0 .. size - 1. En pocas palabras debes cambiar el uso del operador "<=" por "<". Por ejemplo en la función "dot" este bucle:
int i = 0;

// ...

while (i <= v_min->size) {
   suma += (v1->data[i] * v2->data[i]);
   i++;
}

Se debe cambiar a:
int i = 0;

// ...

while (i < v_min->size) { // Debe ser "<"
   suma += (v1->data[i] * v2->data[i]);
   i++;
}

Mismo caso con las otras cuatro funciones.

----

Si se compila con todos esos cambios y se utiliza la entrada que publicaste en tu primer mensaje el programa tal vez funcione correctamente, si eso sucede se explica porque el numero de elementos en los vectores es muy pequeño (el mayor tiene tres).

O tal vez siga reventando ya que la función "resize" esta mal diseñada ya que no reajusta el bloque de memoria, simplemente copia la direccion del bloque y con ello se abre la puerta para que el programa reviente al tratar de modificar direcciones fuera de el.

Esa función se debe cambiar a:
vector *resize(vector *x, vector *y)
{
   if (x->size < y->size){
      vector *aux;
     
      aux = x;
      x = y;
      y = aux;
   }
   
   y->data = realloc(y->data, x->size * sizeof *y->data);
   for (int i = y->size; i < x->size; i++)
      y->data[i] = 0;
   
   return create_vector(y->size, y->data);
}


Sin embargo es, en el mejor de los casos, un parche bien feo. Es mejor desarrollar la funciones desde cero considerando vectores de tamaños diferentes: serian las funciones las que cambian el tamaño de un vector de forma temporal o permanente dependiendo de la operación a realizar.

Un saludo
#638
Programación C/C++ / Re: cifrado cesar en c
27 Octubre 2013, 02:24 AM
Para que el programa genere la salida esperada se necesitan tres cambios.

1) Eliminar el resto de la linea justo después de pedir el desplazamiento y antes de pedir el texto a cifrar. Esto lo puedes realizar con un bucle:
{
   int ch;
   
   while ((ch = getchar()) != EOF && ch != '\n')
      ;
}


2) Debes cifrar solo los caracteres en mayúsculas. En tu bucle cifras el carácter sin importar cual es y solo entonces verificas si es valido. El bucle se debe cambiar a (se puede acortar mas utilizando las funciones getchar e isupper):
printf("Introduce el texto a cifrar:");
fflush(stdout);

while (1){
   scanf("%c", &caracter);
   
   if (caracter >= 'A' && caracter <= 'Z')
      cadena[j++] = cifrar (desplazamiento, caracter);
   else
      break;
}


3) Por ultimo imprimes de forma indiscriminada cien caracteres cuando debes imprimir solo los caracteres introducidos por el usuario (hasta el primer carácter invalido), hay que cambiar ese bucle a:

for (i = 0; i < j; i++)
   printf("%c", cadena[i]);


Con las modificaciones el programa funciona correctamente.

Un saludo
#639
Programación C/C++ / Re: cifrado cesar en c
26 Octubre 2013, 17:42 PM
Cita de: kikian94 en 26 Octubre 2013, 17:22 PMse puede realizar sin arrays?
Si (por un momento pensé que se trataba de cifrar/descifrar varias lineas, mea culpa).

Pero, en mi opinión, es mas fácil declarar un array, leer una linea con fgets y después procesarla:
char linea[100];
int i;

/* ... */

puts("Texto a procesar:");
fgets(linea, 100, stdin);

/* ... */

/* Procesamos cada uno de los caracteres */
for (i = 0; linea[i] != '\0' && linea[i] != '\n'; i++){
   /* Procesamos el caracter linea[i] */
}


Un saludo
#640
Programación C/C++ / Re: cifrado cesar en c
26 Octubre 2013, 15:14 PM
Problemas con el programa hay varios.

El primero es el uso de fflush(stdin) en el bucle que mencionas, aquí hay dos escenarios:
A) La función no tiene efecto, si eso sucede el primer carácter a procesar sera el avance de linea de (valga la redundancia) la linea anterior (introducción de la clave de cifrado), ese carácter se procesa y causa la salida del bucle.
B) La función tiene efecto, ello resulta en que la linea completa (salvo el primer carácter) que se debe cifrar se pierde.

Lo que debes hacer es eliminar esa llamada a función y en su lugar verificar que el resto de la linea (por lo menos el '\n') al introducir la clave de cifrado se descarte. Opciones y mas información en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Otro se encuentra en la validación dentro del bucle:

if ((caracter <= 'A') || (caracter>='Z')){
   printf("Error en los caracteres introducidos");
   fflush(stdout);
}

Con ello se indica que tanto 'A' como 'Z' no son caracteres validos, ahí debes utilizar los operadores '>' y '<'.  También debes eliminar los paréntesis y la llamada a fflush ya que no son necesarios.

El ultimo problema a corregir en el programa es uno de diseño: para poder imprimir el texto cifrado o descifrado en medio del texto "*** El texto cifrado es ..." debes almacenar la linea en un array.

Un saludo