Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   como guardar una palabra de un archivo .txt (https://www.clubdelphi.com/foros/showthread.php?t=87174)

jcdca 24-11-2014 17:28:05

como guardar una palabra de un archivo .txt
 
necesito sacar una palabra de un archivo .txt con el siguiente formato:
QUESO;5
PLANCHA;4
TORTUGA;9
ZAPATO;6
HORMIGA;1
UNIVERSIDAD;3
TECLADO;8
INFORMATICA;7
INGENIERIA;2
LETRERO;10


el numero es el orden en como debo sacarla, y guardala en una variable. COMO LO HARIA? ESTO SERIA PARA EL LENGUAJE C

Casimiro Notevi 24-11-2014 17:30:58

¿Y qué parte no sabes?, ¿qué codigo tienes?, ¿dónde tienes el problema?

jcdca 24-11-2014 17:38:37

yo leo el archivo, pero lo leo por caracteres, pero cuando trato de poner cada caracter en una sola variable no puedo, no se hacerlo en c.

Código PHP:

void tomarpalabra(){
     
system ("color b");
     
system("cls");
     
int cantidad;
     
char caracter,palabra;     
     
printf("\n\t\t\t  ¿Con cuantas palabras desea jugar? ");  
     
scanf("%d",&cantidad);
     
FILE *archivo;
     
archivofopen("prueba.txt","r"); 
     if (
archivo== NULL){
            
printf("lel archivo no se encuentra");}
            else{                
                while (
feof(archivo)==0){
                   if (
caracter!=";"){
                     
caracter=fgetc(archivo);
                     
palabra+=caracter;}
                  else{
                       break;}
                    } }  
     
printf("\n %s",palabra);                 
     
getch();    
    } 

todavia falta validar algunas cosas, como los numero y eso, pero cuando logre guardar una palabra en la variable ya hare esa parte, me interesa es guardar una palabra al menos, ya despues me encargo del orden.... el programa corre, pero al momento de imprimir la palabra printf("\n %s",palabra) me da un error y se sale. no se porque las librerias que tengo son:
Código PHP:

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


Casimiro Notevi 24-11-2014 17:51:23

Cita:

Empezado por jcdca (Mensaje 485430)
me da un error y se sale.

¿Y qué error es?

Por cierto, bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

jcdca 24-11-2014 18:15:25

1 Archivos Adjunto(s)
esa es la imagen, me sale una ventana emergente.

Casimiro Notevi 24-11-2014 18:27:17

Depúralo paso a paso para encontrar la línea que te da el problema.

aguml 24-11-2014 18:58:06

Tienes varios fallos:

Código PHP:

palabra+=caracter

Eso no está bien porque usas para guardar la cadena una variable char y no un array. No lo he probado pero pon por ejemplo:

Código PHP:

char palabra[50]; 

Ademas tampoco se puede concatenar asi un array de caracteres ya que lo que haces es incrementar el valor de palabra[0]. Usa strcat para concatenar cada caracter o usa un indice que irias incrementando para ir copiando cada caracter uno tras otro. Por ejemplo:

Código PHP:

char palabra[50];
int indice 0;

while(!
feof(fichero)){
    
caracter fgetc();
    
palabra[indice] = caracter;
    
indice++;
    if(
caracter == ';')
        break;
}
palabra[indice] = '\0'

Ojo, no está probado pero la idea es esa.

aguml 24-11-2014 19:29:36

Esto está probado y hace lo que quieres aunque yo en este caso usaria mejor fscanf y me quitaba de lios de leer caracter a caracter pero bueno:

Código PHP:

#include <stdio.h>
#include <stdlib.h>

int main(int argccharargv[])
{
   
int cantidadxindice;
   
char caracter;
   
char palabra[50];
   
FILE *archivo;

   
printf("\n\t\t Indique el numero de palabras a usar: ");
   
scanf("%d",&cantidad);

   
archivofopen("prueba.txt","r");

   if (
archivo== NULL){
      
printf("\nEl archivo no se encuentra.\n");}
   else{
      for(
0cantidadx++)
      {
         
indice=0;
         while (!
feof(archivo)){

            do{
               
caracter fgetc(archivo);
            }while(
caracter == '\n');

            if (
caracter != ';'){
               
palabra[indice] = caracter;
               
indice++;
            }else{
               
palabra[indice] = '\0';
               
printf("\n %s",palabra);
               break;
            }
         }
      }
   }
   
printf("\n\n");
   
system("PAUSE");;

   return 
0;
}
//--------------------------------------------------------------------------- 


ecfisa 24-11-2014 23:16:07

Hola jcdca.
Cita:

Empezado por jcdca (Mensaje 485426)
necesito sacar una palabra de un archivo .txt con el siguiente formato:
QUESO;5
PLANCHA;4
TORTUGA;9
ZAPATO;6
HORMIGA;1
UNIVERSIDAD;3
TECLADO;8
INFORMATICA;7
INGENIERIA;2
LETRERO;10

el numero es el orden en como debo sacarla, y guardala en una variable. COMO LO HARIA? ESTO SERIA PARA EL LENGUAJE C

No me quedó muy claro lo que solicitas...
Pero te pongo un ejemplo que lee el archivo, separa las palabras de los números tomando en cuenta el delimitador ";" y va almacenando las palabras en un arreglo cuyo índice está dado por el número leido:
Código PHP:

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

#define MAX_WORDS 1024

int main()
{
  
FILE *fp;
  
char vstr[MAX_WORDS][30] = {0};
  
char cad[40], aux[30], num[10], *ch;
  
int  iix;

  if ((
fp fopen("Archivo.TXT""rt")) == NULL) {
    
perror("Error");
    
fclose(fp);
    return 
1;
  }

  while ( !
feof(fp) ) {
    
fgets(cad40fp);    
    
ch strchr(cad';');
    
strncpy(auxcadch-cad);
    
aux[ch-cad]= '\0';
    
strncpy(numcad+(ch-cad+1), 10);
    
num[10]= '\0';
    
strcpy(vstr[atoi(num)], aux);
  }
  
fclose(fp);

  for(
0MAX_WORDSi++)
    if (
strlen(vstr[i]) > 0printf("%d %s\n"ivstr[i]);

  
getchar();
  return 
0;


Saludos :)

jcdca 25-11-2014 02:42:01

listo gracias, son unos genios jeje... es que nunca había usado el lenguaje c y hay cosas que se me complican todavía... ya me corre bien ;) gracias a todos.. era eso de concatenar así: palabra+=caracter; lo puse como me dijeron con un indice y corre, pero ahora tengo otra duda, estoy tratando de que imprima solo una palabra, por ejemplo:
QUESO;5
PLANCHA;4
TORTUGA;9
ZAPATO;6
HORMIGA;1
UNIVERSIDAD;3
TECLADO;8
INFORMATICA;7
INGENIERIA;2
LETRERO;10

de esa lista que les di antes también, yo leo carácter por carácter, guardando la palabra, hasta llegar al punto y coma, cuando llego al punto y coma leo el numero y con un if lo comparo con el numero 1, para ver si es la primera palabra que en este caso seria hormiga, si no es la primera, borro la palabra y sigo buscando hasta conseguirla. asi tengo el código:

else
{ caracter = fgetc(archivo); //esto me lee el numero que esta al lado del punto y coma
int aux = (int) (caracter - 48); //esto me convierte ese numero en entero
if (aux==x) //esto me compara ese numero con x, que en este caso es 1
{palabra[i] = '\0';
printf("\n %s",palabra); getch(); break;
}else {}


el código así si funciona, pero me imprime todas las palabras hasta llegar a la primera, QUESOPLANCHATORTUGAZAPATOHORMIGA y se detiene cuando llega a la primera... la cosa es que necesito vaciar la variable para que no me las guarde todas, si no solo la ultima palabra... esa parte de vaciar tendría que ponerla en el ultimo else si no me equivoco... intente poniendo en el else esto: *palabra = '\0';, y nada, si pongo eso no me imprime nada de nada, no me da error pero tampoco me imprime.... también intente con palabra[0]=0; y lo mismo no imprime nada. probé también poniendo palabra[i] = '\0'; en el else y no hace nada, me sigue imprimiendo todas las palabras hasta la llegar a la primera.. y con la funcion memset() me da un error no se si es que me falta alguna librería o algo.

el getch(); es solo para que se detenga y ver si imprimia algo. y el break es para romper el ciclo, que imagino que ya lo saben, pero bueno jeje

ecfisa 25-11-2014 03:17:46

Hola jcdca.

Por favor, cuando incluyas código en tus mensajes usa las etiquetas como indica la siguiente imágen:


Saludos y gracias por tu colaboración :)

aguml 25-11-2014 11:34:07

Creo que te complicas mucho la vida, yo usaria archivos con registros de tamaño fijo.
En este ejemplo puedes ver como crear un archivo secuencial y lo relleno y luego busco en el tanto por nombre como por numero de registro. Es mucho mas sencillo de manejar.

Código PHP:

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

#define TAM_MAX_PALABRA 50
int main(int argccharargv[])
{
   
struct{
      
char palabra[TAM_MAX_PALABRA];
      
int index;
   }
registro;

   
char nombre[TAM_MAX_PALABRA];
   
int cantidadxindiceencontradanreadsalir=0;
   
char caracter;
   
FILE *archivo;

   
//ZONA DONDE CREO EL ARCHIVO SECUENCIAL Y LO RELLENO CON LOS REGISTROS
   
printf("\nIndique el numero de palabras a usar: ");
   
scanf("%d",&cantidad);

   
archivo fopen("prueba.txt","w"); //Abro el fichero para escritura

   
if(archivo != NULL){ //Si el archivo se ha abierto correctamente...
      
for(0cantidadx++){
         
printf("\n\nIntroduce el nombre del registro %d: "x);
         
fflush(stdin); //Limpiamos el buffer de entrada
         
fgets(registro.palabra,TAM_MAX_PALABRA,stdin); //es mas recomendable ya que permite guardar cadenas con espacios
         
printf("\nIntroduce el numero del registro %d: "x);
         
scanf("%d",&registro.index);

         
fwrite(&registro,sizeof(registro),1,archivo); //Guardo el registro
      
}
      
fclose(archivo); //Cierro el archivo
   
}

   
//ZONA DONDE BUSCO EL REGISTRO DESEADO
   
archivofopen("prueba.txt","r");

   if (
archivo== NULL){
      
printf("\nEl archivo no se encuentra.\n");
   }else{
      do{
         
//Mostramos el menú y esperamos hasta que se elija una opcion correcta
         
system("CLS"); //Limpiamos la pantalla
         
printf("\n\nELIGE EL TIPO DE BUSQUEDA\n");
         
printf("-------------------------\n\n");
         
printf("\t1.Por indice\n");
         
printf("\t2.Por nombre\n");
         
printf("\t3.Salir\n\n");
         
printf("\tOpcion: ");
         
scanf("%d",&x);

         switch(
x)
         {
            case 
1:
               
printf("\nElige el indice a buscar: ");
               
scanf("%d",&indice);
               break;

            case 
2:
               
printf("\nElige el nombre a buscar: ");
               
fflush(stdin); //Limpiamos el buffer de entrada
               
fgets(nombre,TAM_MAX_PALABRA,stdin); //es mas recomendable ya que permite guardar cadenas con espacios
               
break;

            case 
3:
               
salir 1;
               break;

            default:
               
printf("\n\tValor introducido incorrecto.");
               
printf("\n\tPulse Intro para continuar.");
               
fflush(stdin); //Limpiamos el buffer de entrada
               
getchar(); //Esperamos a que se pulse intro
         
}
      }while(
|| 3); //Si elegimos una opcion correcta saldremos del bucle

      
if(salir == 0){
         
encontrada 0;

         while (!
feof(archivo)){
            
nread fread(&registro,sizeof(registro),1,archivo);

            if(
nread == 0//Si no lee mas registros es porque llegamos al final
               
break;

            switch(
x)
            {
               case 
1:
                  if(
indice == registro.index){
                     
printf("\nPalabra encontrada: %s"registro.palabra);
                     
encontrada 1;
                  }
                  break;

               case 
2:
                  if(
strcmp(nombreregistro.palabra) == 0){
                     
printf("\nPalabra encontrada. Registro: %d"registro.index);
                     
encontrada 1;
                  }
                  break;
            }
         }

         if(
encontrada == 0)
            
printf("\nPalabra no encontrada.");

         
fclose(archivo); //Cerramos el archivo
         
printf("\n\n");
         
system("PAUSE");
      }
   }
   return 
0;
}
//--------------------------------------------------------------------------- 


jcdca 25-11-2014 20:44:10

ya pude hacerlo, pero ahora tengo otro problemita :) recorro el archivo y saco las palabras en orden, y llamo a la funcion insertarenlista para meter todas las palabras en orden en una lista, al parecer si la llena o eso creo yo, pero al momento de imprimirla me muestra simbolos extraños, no se si es que la lleno mal, o que la imprimo mal o lo que sea, alguien sabe que tengo mal?

Código PHP:

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

struct nodo
{
  
char palabra[30];
  
struct nodo*sig;
};

typedef struct nodo listaPalabra;

listaPalabra crearLista(listaPalabra *inicio)
{
   
inicio=NULL;
   return 
inicio;
}

listaPalabra *insertarEnLista(char palabra[30],listaPalabra *inicio)
{
       
listaPalabra *nuevoNodo;
       
listaPalabra *aux;
       
       
nuevoNodo=(listaPalabra*)malloc(sizeof(listaPalabra));
       
nuevoNodo->palabra[30]=palabra[30];
       
nuevoNodo->sig=NULL;
       
              
       
       if (
inicio == NULL)
       {
             
inicio=nuevoNodo;                  
       }
       else
       {
           
aux=inicio;
           
           while (
aux->sig !=NULL)
           {
                 
aux=aux->sig;                 
           }           
           
aux->sig=nuevoNodo;           
       }  
       return 
inicio;    
}

void imprimir (listaPalabra *lista)
{
     
listaPalabra *auxiliar;
     
auxiliar=lista;
     
     while (
auxiliar!=NULL)
     {
           
printf("%s \n",auxiliar->palabra);
           
auxiliar=auxiliar->sig;
     }
}


void Jugar(){
     
system ("color b");
     
system("cls");
     
int cantidad,i,j,aux,x,indice;
     
char caracter,palabra[30];   
     
printf("\n\t\t\t  ¿Con cuantas palabras desea jugar? ");  
     
scanf("%d",&cantidad);
     
x=1i=1j=0;
     
listaPalabra*lista;
     
lista=crearLista(lista);
     while (
i<=cantidad)
     {
       
FILE *archivo;
       
archivofopen("prueba.txt","r"); 
       if (
archivo== NULL)
       {
            
printf("El archivo no se encuentra");}
            else
            {                          
                while (
feof(archivo)==0)
                {
                       do
                       { 
                         
caracter=fgetc(archivo);
                       }while(
caracter=='\n');
                     
                   if (
caracter!=';')
                   {                      
                      
palabra[j]=caracter;
                      
j++;
                   }
                  else
                  {
                     
caracter=fgetc(archivo);
                     
aux= (int)(caracter-48);                     
                     if (
aux==i)
                     {                                                         
                        
lista=insertarEnLista(palabra,lista); 
                        
imprimir(lista);      
                      }                                          
                      
indice=0;
                      while (
indice<20)
                      {
                         
palabra[indice]=0;
                         
indice++;
                      }
                      
j=0;
                       
                  } 
            }  
                
close(archivo);
            } 
       
       
i++;
     }
                                    
     
getch();    
     }



void menu()
{
char resp;

  do
  { 
system ("color b"); 
       
system("cls");
    
printf("\n\n\t\t\t* * * * * MENU DE OPCIONES * * * * *");
    
printf("\n\t\t---------------------------------------------------");
    
printf("\n\t\t\t  Juego de el ahorcado ");
    
printf("\n\t\t---------------------------------------------------\n\n\n\n");
    
printf("\t\t\t\t (1) Jugar \n");
    
printf("\t\t\t\t (0) salir\n");

    do
     
resp=getch();

    while (
resp<'0' || resp>'1');
    switch(
resp)
     { case 
'1'Jugar();
         break;
      case 
'0'
         break;
     }
  }
  while(
resp!='0');
}


   
int main()
{
 
menu();

 return(
0);



aguml 25-11-2014 21:53:54

lo he mirado por encima en el movil y la verdad es que no tiene mucho que ver con lo que mostrabas antes pero a simple vista, en la funcion que añade nuevos registros veo "nuevoNodo->palabra[30]=palabra[30]; " y eso está mal. Lo que haces es copiar el caracter 30 y solo ese. Puedes optar por usar strcpy, strncpy, o un bucle que copie todo el array pero no se puede copiar una cadena con un simple igual ya que lo que haces en realidad es asignar la direccion y no su contenido y al cambiar el contenido del array cambia en ambos.

jcdca 25-11-2014 22:59:06

Para que sepan esto es lo que tengo que hacer:

Consiste en un juego donde el usuario deberá adivinar un conjunto de palabras las cuales serán cargadas desde un archivo con formato txt (su formato será indicado más adelante en el presente documento).
El juego consiste en que una vez cargue una lista de palabras a adivinar por el usuario, este deberá ir ingresando letras por el teclado, en caso de que la letra introducida pertenezca a la palabra deberá mostrarse por pantalla, en caso contrario, deberá restarle una vida.
Durante la partida el usuario podrá equivocarse cinco (5) veces máximo, luego de cometer este número de equivocaciones, la partida se dará por terminada y se le deberá notificar dicha situación, dándole la oportunidad de iniciar una nueva.
Al iniciar una partida se le deberá preguntar al usuario cuantas palabras desea que tenga la partida, siendo el mínimo 3 y el máximo 10, se leerán las todas las palabras que contenga el archivo y se mostrará dicho número introducido por el usuario siguiendo el orden que se muestra en la sección de estructura del archivo.
Las letras introducidas indican las teclas que van presionando los usuarios (deben omitirse los caracteres especiales tales como ñ, á, #, etc. Así como números 123456789, el número cero (0) si debe de leerse al ser introducido por teclado ya que será interpretado como la instrucción para finalizar la partida por parte del jugador.
Al finalizar la partida, debe de preguntársele al usuario nuevamente el número de palabras a ser mostradas, leerse la totalidad del archivo, ordenarlas según el formato y desplegar la cantidad de palabras indicadas por el usuario.
Para la lista de palabras a ser mostradas durante la partida deberá utilizarse obligatoriamente una lista u otro conjunto de manejo dinámico, bajo ningún concepto se permite utilizar arreglos para tal fin, el equipo que utilice este elemento para mostrar las palabras a ser utilizadas en la partida será reprobado lamentablemente con una nota de 01 en dicha entrega.
Las letras restantes, indican el resto de letras del abecedario que el usuario puede introducir todavía para la palabra que se muestra en pantalla.
Cada vez que se pase a una nueva palabra, la lista de letras introducidas y restantes deben reiniciarse, en el caso de las introducidas ponerse en blanco, en caso de las restantes, mostrar todo el abecedario (Omitir la letra ñ).
La siguiente línea de la interfaz deberá mostrar la palabra por la que va el jugador de las 10 cargadas.
Las vidas restantes, 5 en total, deberán mostrarse en pantalla con algún símbolo, corazón por ejemplo, cada vez que el usuario se equivoque, es decir introduzca una letra que no pertenezca a la palabra en pantalla se le restará una vida de las 5 disponibles.
Es importante resaltar que las vidas del usuario son para toda la partida, no por palabra, razón por la cual las mismas no deben reiniciarse al pasar a la siguiente palabra como si ocurre con las listas de letras introducidas y letras restantes.
Por último, como de indico anteriormente, debe mostrarse la opción para salir de la partida, es decir la tecla 0, si el usuario introduce dicho carácter, la partida deberá terminar y volver a leerse el archivo de 10 palabras ordenadas según se indique en la estructura del mismo.
En caso de que el usuario logre pasar las 10 palabras de la partida, el juego deberá notificarle que ha concluido con éxito la misma, felicitándolo y volviendo a iniciarse una nueva partida una vez el usuario haya culminado la misma.

Ya llene la lista con las palabras del archivo, ahora quiero sacar una por una para comparar las letras de la palabra con las introducidas por el usuario

aguml 26-11-2014 09:05:51

a ver, cuando trabajas con listas, al crearla, guardas en un puntero la direccion al primer miembro de la lista y luego simplemente usas una nueva estructura de ese tipo a la que le asignas la direccion de ese puntero y tendras al primer miembro, para leer el siguiente le asignas al puntero la direccion que contiene next en tu caso y asi hasta que next sea null. Si pones todo el proyecto te podremos ayudar mas eficientemente ya que si no nos tocaria adivinar cosas. Un detalle, si usas malloc no te olvides de usar free para liberar la memoria de todos sus miembros.

aguml 26-11-2014 10:43:39

Aqui se explica bien claro y sencillo el funcionamiento de las listas enlazadas simples que es lo que estás usando: http://es.kioskea.net/faq/2842-la-lista-enlazada-simple

PD: No te vamos a hacer el trabajo pero si pones tu codigo y nos dices en que fallas pues te podriamos ayudar jejeje.

jcdca 26-11-2014 17:31:20

Cita:

Empezado por aguml (Mensaje 485573)

PD: No te vamos a hacer el trabajo pero si pones tu codigo y nos dices en que fallas pues te podriamos ayudar jejeje.

jajaja claro que no me van a hacer el trabajo, la idea es hacerlo yo y aprender jeje, yo puse lo que me mandaron para que supieran mas o menos que es lo que trato de hacer y sea mas fácil al ayudarme, porque vi que hay algunas preguntas que hice que no entendían, entonces por eso mande el enunciado, estoy tratando de hacer un juego de el ahorcado pero con las instrucciones que me dieron.... la duda anterior ya la resolví gracias... déjenme adelantar y acomodar un poco mas el código y se los paso junto con las dudas que se me presentaron ;)

jcdca 27-11-2014 06:37:58

bueno aquí esta el código

Código PHP:

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

void desarrollo(int cantidadint i);

struct nodo 

  
char palabra[30]; 
  
struct nodo*sig
}; 

typedef struct nodo listaPalabra

char variable[30];

listaPalabra crearLista(listaPalabra *inicio

   
inicio=NULL
   return 
inicio


listaPalabra *insertarEnLista(char palabra[30],listaPalabra *inicio

       
listaPalabra *nuevoNodo
       
listaPalabra *aux
        
       
nuevoNodo=(listaPalabra*)malloc(sizeof(listaPalabra)); 
       
strcpy(nuevoNodo->palabra,palabra);
       
nuevoNodo->sig=NULL;     
        
       if (
inicio == NULL
       { 
             
inicio=nuevoNodo;                   
       } 
       else 
       { 
           
aux=inicio
            
           while (
aux->sig !=NULL
           { 
                 
aux=aux->sig;                  
           }            
           
aux->sig=nuevoNodo;            
       }   
       return 
inicio;     


void imprimir (listaPalabra *lista

     
listaPalabra *auxiliar
     
auxiliar=lista;       
     while (
auxiliar!=NULL
     { 
           
printf("%s \n",auxiliar->palabra); 
           
auxiliar=auxiliar->sig
     } 


listaPalabra *buscarPalabra (listaPalabra *lista)
{
     if (
lista != NULL)
     {                   
            
listaPalabra *auxiliar;                   
            
auxiliar lista;                   
            
strcpy(variable,lista->palabra);                   
            
lista lista->sig;
     }       
     return 
lista;     
}

void Jugar()
 { 
     
system ("color b"); 
     
system("cls"); 
     
int cantidad,i,j,aux,x,indice,z
     
char caracter,palabra[30];    
     
printf("\n\n\t\tCon cuantas palabras desea jugar? (3 a 10)\n");   
     
scanf("%d",&cantidad); 
     do
     {
        if((
cantidad<3) || (cantidad>10))
        {
           
system("cls"); 
           
printf("\n\n\n\t\tCon cuantas palabras desea jugar? (3 a 10)");  
           
printf("\n\n\t   Debe introducir un numero comprendido entre 3 y 10 \n"); 
           
scanf("%d",&cantidad);    
        }
     }while((
cantidad<3) || (cantidad>10));
     
x=1i=1j=0
     
listaPalabra*lista
     
lista=crearLista(lista); 
     while (
i<=cantidad
     { 
       
FILE *archivo
       
archivofopen("prueba.txt","r");  
       if (
archivo== NULL
       { 
            
printf("El archivo no se encuentra");
       } 
            else 
            {                           
                while (
feof(archivo)==0
                { 
                     do 
                     {  
                      
caracter=fgetc(archivo); 
                     }while(
caracter=='\n'); 
                      
                    if (
caracter!=';'
                    {                       
                       
palabra[j]=caracter
                       
j++; 
                    } 
                   else 
                   { 
                      
caracter=fgetc(archivo); 
                      
aux= (int)(caracter-48);                      
                      if (
aux==i
                      {                                                          
                         
lista=insertarEnLista(palabra,lista); 
                      }                                           
                      
indice=0
                      while (
indice<20
                      { 
                          
palabra[indice]=0
                          
indice++; 
                      } 
                      
j=0;                        
                   }  
                }   
                
close(archivo); 
            }          
       
i++; 
     }      
    for(
1<=cantidadz++)
    {
         
lista=buscarPalabra(lista);
         
desarrollo(cantidad,z);         
    }
     
getch();     
 } 

void desarrollo(int cantidadint i)
{
    
int vidas=6,cont=0,indice=0,contador=0,adivino;
    
char letra,palabra[30],introducidas[52],restantes[52],aux[52]="A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z";
    
printf("%s\n",variable);
    while (
indice < (strlen(variable))*2)
    {
        
palabra[indice]='_';
        
palabra[indice+1]=' '
        
indice+=2;
    }
    
indice=0;
    while (
indice<52
    { 
         
introducidas[indice]=0
         
indice++; 
    } 
    
indice=0;
    
strcpy(restantes,aux);
      while((
vidas 0) && (cont strlen(variable)))
    {       
        
system("cls");
        
printf("%s",variable);
        
printf("\n\n\n      %s \n\n",palabra);        
        
printf("\n\n     Letras introducidas= %s",introducidas);
        
printf("\n\n     Letras restantes= %s",restantes); 
        
printf("\n\n     palabra %i de %i ",i,cantidad);
        
printf("\n\n\n     Vidas(%i)= ",vidas);
        
contador=0;        
        while (
contador<vidas)
        {
            
printf(" * "); 
            
contador++;
        }        
        
printf("\n\n\n     Salir de la partida tecla(0)");
        
printf("\n\n\n\n\t                          Ingrese letra\n");
        
scanf("%c",&letra);
        
adivino=0;
        
contador=0;
        while (
contador strlen(variable))
        {         
           if(
letra==variable[contador])
           {
                  
palabra[contador*2]=letra
               
adivino=1;
               break;        
           }           
           
contador++;
        }
        if (
adivino==0)
        {
            
vidas--;
        }
        
introducidas[indice]=letra;
        
introducidas[indice+1]="-";
        
indice+=2;
        
cont++;
    }    
}

void menu() 
{
char resp
  do 
  { 
system ("color b");  
       
system("cls"); 
    
printf("\n\n\t\t\t* * * * * MENU DE OPCIONES * * * * *"); 
    
printf("\n\t\t---------------------------------------------------"); 
    
printf("\n\t\t\t  Juego de el ahorcado "); 
    
printf("\n\t\t---------------------------------------------------\n\n\n\n"); 
    
printf("\t\t\t\t (1) Jugar \n"); 
    
printf("\t\t\t\t (0) salir\n"); 
    do 
      
resp=getch(); 
      while (
resp<'0' || resp>'1'); 
      switch(
resp
      { 
          case 
'1'Jugar(); 
                    break; 
          case 
'0':  
                    break; 
      } 
  } 
  while(
resp!='0'); 

    
int main() 

    
menu(); 
    return(
0); 


eso es lo que tengo por ahora, todavía le faltan algunas cosas y acomodar algunos detalles, ahora les dijo mis dudas e inconvenientes, en la función desarrollo, tengo declarado la variable vidas, y le puse un valor de 6, cuando realmente son 5 vidas, porque hice eso? porque depure el código y fui paso a paso a ver porque fallaba y resulta que la primera vez que pasa por estas instrucciones:

Código PHP:

   printf("\n\n\n\n\t                          Ingrese letra\n");
        
scanf("%c",&letra);
        
adivino=0;
        
contador=0

no se detiene a esperar a que el usuario introduzca una letra, si no que sigue de largo y lógicamente me quita una vida,y ademas me llena de basura la variable introducidas, porque letra no tiene ningún valor, la segunda vez que pasa si se detiene, pensé que solo era al principio y ya, pero lo hace cada vez que introduzco una letra... entonces adivine o no la letra me quita una vida, porque pasa dos veces antes de detenerse a leer la letra y no entiendo porque, y estoy completamente seguro que sigue de largo la primera vez porque como dije lo depure y vi paso por paso y vi como siguió de largo, como si la primera vez no existiera el scanf, entonces esa es mi primera duda.. alguien sabe porque pasa eso?... realmente esto es solo por curiosidad, porque igual eso lo pondré en un ciclo que me valide que el usuario introduzca letras y no números o otros caracteres, pero igual me surge la curiosidad jeje, porque me parece raro que haga eso.... y la segunda duda es que cuando introduzco una letra en mayúscula si me la detecta en la palabra, pero si la pongo en minúscula no, es decir si la palabra es HORMIGA e introduzco H me la escribe, si introduzco h no me la escribe, porque las palabras del documento.txt están en mayúsculas, hay alguna función que me pueda pasar la letra que introduce el usuario a mayúscula? así introduzca la letra en minúscula o mayúscula de todas forma me la detectaría.... y tercera y ultima duda jeje, quiero pasar un valor por referencia en este caso es el valor de la variable vidas, porque? porque si la declaro dentro de esa función cada vez que sea una nueva palabra me la va a volver a poner en 6, y en el enunciado que les mande dice que no puedo hacer eso, que las vidas no se reinician, que son para toda la partida, yo crei que era asi:

Código PHP:

 void desarrollo(int *vidas){códigos}  //declaración de la función

int main(){int vidas=6;   desarrollo(&vidas)} // llamado de la función 

pasandole a la función la dirección, y que esta tomara el valor que esta dentro de esta dirección, pero me da error, no es así como se hace?
podría declarar la variable fuera de todas las funciones y me serviría, pero no quiero eso, quiero pasarla por referencia, porque ya lo he intentado varias veces y no me sale...

bueno esas son mis tres dudas por ahora, porque ignora el scanf la primera vez, como paso minusculas a mayusculas y como paso por referencia..
y desde ya, gracias por la ayuda ;)

aguml 27-11-2014 08:24:48

lo del scanf seguramente es porque el flujo de entrada contiene datos, limpialo antes del scanf con un fflush(stdin). Para pasar de minusculas a mayusculas simplemente asegurate que sea una letra en minusculas con un condicional y si lo es le restas 32. Para lo de las vidas si pasasla direccion luego para acceder a su contenido haz *vidas. Pon el asterisco delante. Lee informacion sobre el uso de punteros. No entiendo como te mandan algo tan complejo sin tener claro el uso de punteros, filas, flujo... Dentro de un rato veo tu codigo a ver si veo algo raro.


La franja horaria es GMT +2. Ahora son las 22:10:04.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi