Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: P.AGCD en 11 Julio 2011, 21:24 pm



Título: Problema Bucle C
Publicado por: P.AGCD en 11 Julio 2011, 21:24 pm
Hola compañeros, os escribo porque tengo una duda. He aprendido a programar en ADA, y ahora estoy aprendiendo con C mi duda es la siguiente:
En ADA existe un tipo de bucle que es

Loop   //inicia el bucle

Bloque de instrucciones

Exit when (condición) // sale del bucle cuando llegas a esa condición

Mi pregunta es como se hace este bucle en C.

gracias.


Título: Re: Problema Bucle C
Publicado por: Ferno en 11 Julio 2011, 21:28 pm
Ese tipo de bucle es el do/while aunque con una pequeña diferencia:

Código
  1. do //Entra al bucle
  2. {
  3.  
  4.    //Codigo dentro del bucle
  5.  
  6. } while (condicion); //Mientras se cumpla la condicion, entra al bucle


Título: Re: Problema Bucle C
Publicado por: P.AGCD en 11 Julio 2011, 22:23 pm
Gracias, pero ese bucle no me sirve.


El problema es que esta leyendo una linea de un fichero que es un registro del tipo:

struc {
char equipo1 [40];
char equipo1 [40];
int Resultado1;
int Resultado2;
}Linea;

En el fichero estan escritos de esta manera:

Equipo1 - Equipo2 : Resultado1 Resultado2

ej:

Marbella - Madrid : 9 3


Empiezo a leer caracter a caracter y lo guardo en linea.equipo1, lo que pasa es que cuando llego al - quiero que deje de guardar caracteres en linea.equipo1 y los ponga en linea.equipo2.

Si hago un do while, en este caso la condicion seria  while ('-') pero  cuando pase el guion seguira ejecutando el bucle. Yo necesito que cuando llegue al guion el bucle no vuelva a ejecutarse nunca.

espero que me hayais comprendido.


Título: Re: Problema Bucle C
Publicado por: Ferno en 11 Julio 2011, 22:31 pm
En ADA ponés esa condición para salir, en el bucle do/while entonces, debes poner lo contrario:

Código
  1. while (variable != '-');

Mientras el caracter leído sea diferente a '-', seguirá con el bucle, cuando llegue a ese caracter, no entrará más.


Título: Re: Problema Bucle C
Publicado por: rir3760 en 12 Julio 2011, 02:33 am
Si vas a desarrollar un programa en C debes ajustarte a las facilidades que provee ese lenguaje olvidándote por el momento de las características de ADA y centrándote en el algoritmo, en tu caso este es:
mientras se pueda leer una linea de texto
   procesarla


Eso en C lo puedes implementar utilizando las funciones fopen/fclose para abrir/cerrar el archivo y fgets para leer la linea de texto. Un programa de ejemplo donde el proceso de la linea es simplemente imprimirla en la salida estándar es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define LONG_MAX_LINEA  256
  5. #define NOM_ARCHIVO  "Entrada.txt"
  6.  
  7. int main(void)
  8. {
  9.   FILE *entrada;
  10.   char linea[LONG_MAX_LINEA];
  11.  
  12.   if ((entrada = fopen(NOM_ARCHIVO, "r")) == NULL){
  13.      perror(NOM_ARCHIVO);
  14.      return EXIT_FAILURE;
  15.   }
  16.  
  17.   while (fgets(linea, LONG_MAX_LINEA, entrada) != NULL)
  18.      fputs(linea, stdout);
  19.  
  20.   fclose(entrada);
  21.  
  22.   return EXIT_SUCCESS;
  23. }

En tu caso este es mas complicado, hay que conocer si el nombre de cada equipo es una sola palabra (por ejemplo "Barcelona") o bien pueden existir nombres con mas de una palabra (por ejemplo "La Coruña").

Formas de separar la linea hay muchas ya que puede basarse en diferentes funciones como strchr, strpbrk, strtok, etc.

Si la estructura del archivo de datos esta garantizada una forma separando las partes en base a una funcion propia es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define LONG_MAX_LINEA  256
  6. #define NOM_ARCHIVO  "Entrada.txt"
  7.  
  8. struct partido {
  9.   char local[LONG_MAX_LINEA];
  10.   char visitante[LONG_MAX_LINEA];
  11.   int goles_loc;
  12.   int goles_vis;
  13. };
  14.  
  15. struct partido extraer(char const linea[]);
  16.  
  17. int main(void)
  18. {
  19.   FILE *entrada;
  20.   char linea[LONG_MAX_LINEA];
  21.   struct partido p;
  22.  
  23.   if ((entrada = fopen(NOM_ARCHIVO, "r")) == NULL){
  24.      perror(NOM_ARCHIVO);
  25.      return EXIT_FAILURE;
  26.   }
  27.  
  28.   while (fgets(linea, LONG_MAX_LINEA, entrada) != NULL){
  29.      p = extraer(linea);
  30.  
  31.      printf("Local: %s\n", p.local);
  32.      printf("Visitante: %s\n", p.visitante);
  33.      printf("Resultado: %d - %d\n", p.goles_loc, p.goles_vis);
  34.   }
  35.  
  36.   fclose(entrada);
  37.  
  38.   return EXIT_SUCCESS;
  39. }
  40.  
  41. struct partido extraer(char const linea[])
  42. {
  43.   struct partido p;
  44.   char *a;
  45.   char *b;
  46.  
  47.   /* Obtenemos la posicion de " - " */
  48.   a = strstr(linea, " - ");
  49.   sprintf(p.local, "%.*s", a - linea, linea);
  50.  
  51.   /* Obtenemos la posicion de " : " */
  52.   a += 3;
  53.   b = strstr(a, " : ");
  54.   sprintf(p.visitante, "%.*s", b - a,  a);
  55.  
  56.   /* Los goles los extraemos con sscanf */
  57.   sscanf(b + 3, "%d %d", &p.goles_loc, &p.goles_vis);
  58.  
  59.   return p;
  60. }

Pero si hay mas espacio blanco en las lineas se debe modificar la aproximacion para buscar solo los caracteres separadores ('-' y ':' en tu caso).

Un saludo