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

#1241
Programación C/C++ / Re: Poner contraseña
26 Julio 2012, 02:13 AM
Los problemas del programa original son dos: el primero es el tamaño del array para almacenar la linea introducida por el usuario y el segundo que no eliminas (si es el caso) el resto de la linea.

El primero se elimina simplemente ajustando el tamaño del segundo array para que pueda contener la contraseña mas un carácter adicional y el segundo revisando la linea introducida por el usuario (cortesía de la función "strchr"): si no se encuentra el carácter '\n' significa que hay que descartar caracteres (el resto de la linea).

En cuanto a tu segunda pregunta "fgets" solo lee la linea, si deseas una comparación debes utilizar la función "strcmp".

El programa con las correcciones es:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
   char contra[] = "xD";
   char linea[sizeof contra + 1];
   char *p;
   
   while (1){
      printf("Introduce la contrasena: ");
      fflush(stdout);
      if (fgets(linea, (int) sizeof linea, stdin) == NULL)
         return EXIT_FAILURE;
     
      if ((p = strchr(linea, '\n')) != NULL)
         *p = '\0';
     
      if (strcmp(contra, linea) == 0){
         puts("Contrasena correcta");
         break;
      }else if (p == NULL){
         int ch;
         
         while ((ch = getchar()) != EOF && ch != '\n')
            ;
      }
   }
   
   return EXIT_SUCCESS;
}


Un saludo
#1242
Indicas que el lenguaje es C++ sin embargo el código fuente es C, ¿Cual de los dos estas estudiando?

Como C el problema es que no debes pasar la dirección del array, este se convierte a puntero de forma automática. Tampoco es necesario incluir los encabezados <string.h>, <dos.h>, <conio.h> <stdlib.h> y <ctype.h>, la función principal se debe definir como "int main(void) ...", entre otros detalles.

El programa corregido (es C):
#include <stdio.h>

void Retorno(char palabra[]);

int main(void)
{
   char cadena[20];
   
   Retorno(cadena);
   printf("%s\n",cadena);
   
   return 0;
}

void Retorno(char palabra[])
{
   palabra[0] = 'h';
   palabra[1] = 'o';
   palabra[2] = 'l';
   palabra[3] = 'a';
   palabra[4] = '\0';
}


Un saludo
#1243
Solo para redondear el aporte de bemone.

Si no tienes una referencia de calidad sobre la biblioteca estándar de C++ puedes utilizar una en linea. Solo por mencionar una (por cierto muy buena): descripción y ejemplo (en ingles) de la funcion "getline" cortesia del sitio C plus plus se encuentra en esta pagina.

Un saludo
#1244
El problema con la lectura incorrecta de los registros se debe a dos errores:

* El primero sucede al tratar de leer un registro ya que siempre lo almacenas en "lectura", esa es la primera posición del array. Debes indicar la posición del elemento con "&lectura[ i ]" o "lectura + i"

* El segundo es lógico ya que el correcto funcionamiento de "feof" es devolver verdadero (diferente de cero) solo después que una función de lectura como "fread" falle.

Ese fragmento (y solo ese) corregido:
for (i = 0; fread(lectura, sizeof *lectura, 1, pf) == 1; i++)
   printf(
      "Nombre:%s\nnota1:%u\nnota2:%u",
      lectura.nombre,
      lectura.nota1,
      lectura.nota2
   );
cant_alumnos = i;


Debo aclarar que no verifique a fondo el programa, tal vez (eso parece) tenga mas errores.

Un saludo
#1245
El problema se debe al IDE (entorno de desarrollo integrado) que estas utilizando. La gran mayoría de estos como Lcc-win32, Pelles C, CodeBlocks, Visual Studio, etc. generan esa pausa de forma automática, lo correcto ya que siendo estrictos no forma parte del programa.

Unos pocos IDEs (en este momento solo recuerdo a Dev-C++) no la generan. Para evitar llenar de pausas los programas (que para empezar no son necesarias) me parece mejor cambiar a otro.

Un saludo
#1246
Programación C/C++ / Re: Reiniciar bucles C++
21 Julio 2012, 03:19 AM
Cita de: Fyrox en 21 Julio 2012, 02:57 AMSin embargo,  he leído que no es recomendable nunca cambiar el valor de la i, además de que el código que has hecho parece bastante mejor. De todas formas, me podrías explicar porqué no está bien reiniciar el bucle?
Primero porque si te equivocas puedes terminar con un bucle infinito.

Segundo porque es un mala practica. Para explicarlo mejor dado un bucle como este:
Código (cpp) [Seleccionar]
int i;

for (i = 0; i != N; i++){
   // Algun proceso ...
}

Sin revisarlo a detalle podemos concluir que el numero de iteraciones es N (salvo una salida anormal) y aun cuando el bucle termine de forma abrupta basta con revisar el valor del contador.

Pero si "tasajeamos" el contador dentro del bucle eso ya no lo podemos dar por sentado. Imagina que debes leer N lineas de un archivo, con el contador "tasajeado" debes utilizar una variable extra para llevar la cuenta (algo que, para empezar, no es necesario de hacerlo de la forma correcta).

Para una descripción mas técnica (y correcta) puedes buscar en la red paginas relacionadas con "Loop Invariants".

Un saludo
#1247
Programación C/C++ / Re: Reiniciar bucles C++
21 Julio 2012, 02:47 AM
Solo tienes que cambiar la lógica del programa para que repita la división entre el factor primo cuantas veces sea posible. Por ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

int main()
{
int n, i, prime[] = {2, 3, 5, 7, 11};

cout << "Numero? ";
cin >> n;

i = 0;
while (n != 1){
while (n % prime[i] == 0){
n /= prime[i];
cout << " " << prime [i];
}

i++;
}
cout << endl;

return 0;
}


En C++ puedes utilizar la clase "vector" y la función "sort" para realizar esa operación de una forma casi automática. Varios ejemplos los puedes revisar en C plus plus.

Un saludo
#1248
Si quieres practicar con el uso de punteros a estructuras los mejores tutoriales (en mi opinión) son los (por desgracia en ingles) de la Stanford CS Education Library.

Un saludo
#1249
Cita de: Nefkofan en 20 Julio 2012, 13:40 PMRealmente no creo que sea necesario, eso es lo bueno de POO que no se necesita conocer todo el código para saber como funciona
No. El problema esta en otra parte y lo mencionas mas adelante.


Cita de: Nefkofan en 20 Julio 2012, 13:40 PMcreo que mi confusión era que el profesor me planteo que para definir un vector de dimensión 10 debía especificar vector[9] creo que esto es un error, aunque 9 si es la décima posición del vector la declaración del vector debe ser vector[10] ya que debe reservar la ultima posición a Final_de_linea O.o...
Solo la ultima parte esta errada: "debe reservar la ultima posición a Final_de_linea", eso solo aplica a las cadenas "a la C" con cualquier otro tipo de array no tienes que reservar un elemento extra.

Cuando declaras un array:
Código (cpp) [Seleccionar]
int a[10];
Indicas el numero de elementos "N" y accedes a estos mediante los indices 0 .. N-1, en este caso son 0 .. 9. Solo dile a tu profesor que revise cualquier libro sobre C++.

Un saludo
#1250
Para que alguien pueda ayudarte en los foros se necesita mas información empezando por el lenguaje, compilador y SO que estas utilizando. También revisa los temas fijos.

Un saludo