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 - K-YreX

#661
Lógicamente si estás guardando el valor de entrada en un <int> e introduces una letra, tendrás un resultado no esperado.
Eso se suele dar por hecho y dejarlo como una precondición para el correcto funcionamiento sin necesidad de implementar nada al respecto.
Si lo quieres controlar tendrás que comprobar que lo que se ha introducido es un número. Por ejemplo mediante un filtro, guardando la entrada en un <string> o <char[]> y si es un número, convertirlo a entero (existen funciones para ello) y continuar con el curso del programa. Suerte :-X
PD: Las etiquetas del código pls... :rolleyes:
#662
Lo primero, coloca tu código entre etiquetas de código GeSHi (puedes seleccionarlas en un desplegable que hay encima del cuadro de texto cuando escribes/modificas un mensaje). Es más difícil de ver y puede dar lugar a errores al no estar dentro de las etiquetas.

Aparte como el código es bastante largo, si puedes especificar en qué momento falla... Es decir, qué línea o bloque de instrucciones se está ejecutando justo en el momento que el programa entra en el bucle infinito :rolleyes: :-X
#663
Para ello debes poder almacenar la información. Creo que la forma más visual es mediante dos arrays, uno de tipo <char> y otro de tipo <bool> (se puede añadir la librería <stdbool.h> para poder usar variables boolenas) o sino de tipo <int> con {0,1}.
Cuando te dicen una letra, la buscas en el array de <char>, coges su posición y miras esa posición en el array de tipo <bool/int>. Si el valor es 0, aceptas la letra y lo pones a 1, si el valor es 1, el usuario tiene que elegir otra letra. Suerte :-X
#664
Coloca tu código entre etiquetas de código GeSHi (hay un desplegable encima del cuadro de texto cuando escribes/modificas un mensaje). Sin las etiquetas es difícil de interpretar el código ya que algunos corchetes [] se interpretan como etiquetas y el código parece incompleto... :rolleyes:


Lo primero decirte que en tu programa principal <main> has mezclado memoria estática y dinámica. Usa una o la otra, no las dos...
Y la función <crear_vector()> no devuelve un valor correcto, mira a ver eso, tienes que devolver el puntero a la primera posición del vector, no el valor de esa posición.

Cuando se pasa un array como parámetro lo que se pasa es un puntero que apunta a la primera dirección del array. Entonces en una función para mostrar, por ejemplo, un array, debes pasar el array (puntero al primer elemento) y su tamaño, para poder recorrerlo.

Si quieres reservar memoria en un puntero de forma dinámica, pasando el puntero como función, este debe pasarse por referencia (puedes buscar cómo pasar parámetros por referencia en C, ya que se pasa todo por valor). Y si reservas memoria con <malloc> (en C) o <new> (en C++), luego debes liberar esa memoria manualmente con <free> o <delete> respectivamente.

Suerte :-X



#665
[code]ruta_absoluta = "/home/<tu_usuario>/Escritorio/fichero_prueba.txt"
Puedes ver la ruta absoluta en la que te encuentras en la terminal con el comando <pwd>.

No sé por qué mi mensaje empieza con una etiqueta de <code> que no puedo quitar... Este párrafo debería ir lo primero, pero para que no se confunda con un <code> lo dejo aquí... :rolleyes:
Primero el tema de las rutas. El sistema de archivos de Linux "cuelga" de la raíz (root) /. Podemos referirnos a un fichero usando una ruta absoluta o una ruta relativa:
  • Ruta absoluta: se especifica desde la raíz hasta el fichero que queremos hacer referencia.
    AQUÍ DEBERÍA IR EL PRIMER TROZO DE CÓDIGO QUE SE VE
  • Ruta relativa: se especifica desde el punto en el que te encuentras.
    En este caso puedes usar cosas como el punto (.) que referencia al lugar actual en el que te encuentras o los dos puntos (..) que referencia al directorio anterior al actual.

    // si estamos en /home/<tu_usuario>
    ruta_relativa = "./fichero_prueba.txt" // mismo fichero que en el ejemplo anterior
    // el punto se puede obviar si se quita tambien la barra diagonal
    ruta_relativa = "fichero_prueba.txt"
    // si pones la barra diagonal y no pones el punto, haces referencia a la raíz, entonces tendrás un problema

    // si buscamos un fichero que esta en una carpeta que esta en Documentos y nosotros estamos en Escritorio seria:
    ruta = "../Documentos/fichero.txt"
    // dos puntos para volver para atras porque estabamos en Escritorio y luego ya entramos en Documentos


    La dirección "/home/<tu_usuario> se puede abreviar con ~ (alt gr + 4)... :silbar:

    ruta1 = "/home/<tu_usuario>/Escritorio/Carpeta1/prueba.txt"
    ruta2 = "~/Escritorio/Carpeta1/prueba.txt"


    Puedes obtener más información buscando rutas de archivos en Linux o rutas relativas y absolutas. Y también puedes estudiar todo el sistema de archivos y poder localizar algunos de los directorios fundamentales del sistema y donde se encuentran. Suerte :-X[/code]


    Citar
    1) ¿Están bién escritas las rutas en el script?
    Si estás ejecutando el programa desde tu home (~) sí. En otro caso no, si usas una ruta relativa tienes que saber desde donde lo estás ejecutando para hacer bien la referencia. Si quieres que funcione desde cualquier sitio, usa una ruta absoluta (usando ~ te ahorras un trozo). De todos modos, por comodidad cuando sabes que todo se va a mover en conjunto o que no se va a mover, se suelen usar rutas relativas por comodidad.


    Citar
    2) ¿Tengo que especificar en el terminal la ruta donde está el Fichero_Origen?
    Siempre. Otra cosa es que si tanto el fichero como el ejecutable están en el mismo lugar, basta con el nombre del fichero, pero porque esa es su ruta relativa. ACLARO: Más que "donde esté el ejecutable" es "desde donde ejecutes el programa en la terminal".


    Citar
    3) ¿He de usar alguna librería específica para trabajar con directorios?
    Más que "para trabajar con directorios" es "para trabajar con ficheros" y has de incluir la librería <fstream> que el mismo nombre lo dice <file> + <stream>.
#666
No, no es necesario el <Sleep()> ya que eso lo hemos incluido ahora para mantener el programa "dormido" durante X tiempo aunque esté siempre ejecutándose. Pero si se programa cada X tiempo, entonces el programa terminará una vez y cuando pase X, volverá a ejecutarse. Suerte :-X
#667
EDITO: No había visto el último mensaje pero como he añadido los comentarios al código, lo dejo para que se puedan ver, si no es necesario lo modifico y lo quito... :-\

El código entre etiquetas de código GeSHi (tienes un desplegable encima del cuadro de texto cuando escribes o modificas un mensaje)... :rolleyes:
Además de eso, lo suyo es tabular el código para que sea más fácil identificar cada bloque y ver rápidamente a qué nivel está.
Te dejo el código con las etiquetas, más o menos tabulado y con comentarios de las cosas que hay que cambiar/mejorar:
Código (cpp) [Seleccionar]

#include <stdio.h>
#include <string.h>

int vidas=6; // variable global, no recomendado
int correctas=0; // variable global, no recomendado
main (){ // main es una funcion, tiene que devolver algo. Devuelve un int, es decir, int main(){...}
   void lineas(int n, char a[]); // las funciones se declaran fuera del main
   char palabra[100]; // mejor usar una constante para controlar la longitud
   char letra;
   char guiones[100]; // lo mismo que dos lineas atras
   int longitud;
   void buscar_letra(char p[], int n, char l, char g[]); // funcion -> fuera del main
   printf ("Digite la palabra a adivinar: ");
   scanf ("%s", palabra); // no es muy seguro para cadenas. Mejor fgets()
   fflush(stdin); // nada recomendado usar fflush para stdin
   system("cls"); // innecesario si estas empezando
   longitud= strlen(palabra);
   lineas(longitud,guiones);

// si estas empezando, el dibujo para cuando ya funcione lo importante
  printf ("\n");
  printf("\n\t||===== ");                
  printf("\n\t||    | ");
  printf("\n\t||      ");
  printf("\n\t||      ");
  printf("\n\t||      ");
  printf("\n\t||      ");

   while (vidas>0){ // no puedes ganar nunca si solo acaba cuando te quedas sin vidas
       printf ("\nDigite la letra: ");
       scanf("%c",&letra);
       fflush(stdin); // otra vez, nada recomendado
       if (letra>= 'a'&& letra<='z'){ // ponselo facil al usuario, convierte tu la letra a minuscula o mayuscula siempre
           buscar_letra(palabra,longitud,letra,guiones);
       }
       else{
           printf ("\nNo es una letra o la letra es mayuscula (digite una letra minuscula)");
       }
   }
}

void buscar_letra(char p[100], int n, char l,char g[]){ // mejor usar nombres que ayuden a seguir el funcionamiento
   int i;
   for(i=0;i<n;i++){
       if () // esto no pinta nada
       if(p==l){
           printf ("%c", l);
           correctas++;
       }else {
           printf ("*");
       }
   }

   if(correctas==n){
       printf ("\n ADIVINASTE LA PALABRA!!!");
       printf ("\n Ganaste...");
   }
}

void lineas(int n, char a[]) { // usar mejores nombres de variables
   int i;
   for (i=0;i<n;i++){
      printf("* ", a); // este formato no es correcto
   }
}


Y como veo que el <while> no funciona muy bien te pongo aquí los pasos que tienes que seguir:

letras_solucion := contarLetras(palabra_solucion)
mientras (vidas > 0 || !acertado)
   letra := pedirCaracter()
   si (existe(caracter, palabra_solucion))
       letras_acertadas := letras_acertadas + 1
       acertado := (letras_acertadas == letras_solucion)
   sino
       vidas := vidas - 1
   fin si
fin mientras

si (acertado)
   Has ganado
sino
   Has perdido
fin si

Ahora tienes que intentar traducir esto a lenguaje C. Puedes usar las funciones que he escrito yo o usar otras si así lo prefieres, pero tienes que implementarlas tú. Suerte :-X
#668
Más o menos eso es.
Cuando haces un <#include fichero> al fin y al cabo es como si pegaras todo el contenido de <fichero> justo en la línea donde está el <include>. Entonces esto te permite implementarlo en distintos ficheros pero para la máquina a la hora de compilar es como si estuviera todo en el mismo. Es una forma de poder mantener la estructura de mantener las implementaciones en un fichero diferente a las declaraciones.
#669
Programación C/C++ / Re: EJERCICIO DE C
7 Marzo 2019, 13:02 PM
No se hacen tareas... Si quieres puedes especificar más tu duda para que te demos una idea o mejor, poner tu código para que veamos tus avances y poder ayudarte... Suerte :-X
#670
Tienes un error en ese código... Si te fijas nunca vas a salir del <while> ya que no estás comparando <continuo> con <true> sino que estás asignando <true> a la variable <continuo> (ya que sólo estás usando un =). Si el propósito es ese, un bucle infinito, entonces es innecesario eso; y si el objetivo no es ese tienes que corregir esa condición...
Además te has dejado unas comillas al final de <entrada = "Fichero_Destino.txt">.


Y hombre un poco basto sí que es... Tener el programa continuamente en ejecución, primero; te está consumiendo recursos del pc y luego que podrías cerrarlo por error y perder toda la progresión. Para establecerlo como una tarea programada tienes que buscarlo según el sistema operativo (que en tu caso imagino que es Windows). Suerte :-X

Y ahora por añadir algo más te dejo otra opción para ese tipo de condicionales con una variable <bool>:
Código (cpp) [Seleccionar]

if(ok1 == OK_traspaso && ok2 == OK_dato){
    continuo = true;
}else{
    continuo = false;
}

// FORMA EQUIVALENTE A LA DE ARRIBA
bool continuo = (ok1 == OK_traspaso && ok2 == OK_dato);