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 - MAFUS

#251
Cierto, no me había fijado con cout. Me había quedado con la forma de tratar los archivos. Así que es una mezcla.
#252
C a partir del estándar C99, que soporta buleanos.
#253
Programación C/C++ / Re: problema programa c++
1 Octubre 2018, 22:52 PM
Las taras no son la única herramienta que tiene el profesor. De hecho si el alumno copia las tareas, que están hechas para que practique la lección, no las sabrá hacer pos sí solo. A la hora de los exámenes fallará porque no habrá entendido la teoría.

De igual forma, si también hace trampas en los exámenes, se encontrará con la auténtica prueba de fuego: el mundo laboral. Allí deberá aplicar todo lo aprendido poniendo en juego su continuidad en la empresa, y por consiguiente su bienestar económico, y si falla el futuro será muy negro.
#254
Esta es mi idea. No tiene control de errores, sólo funcionalidad básica. Probado bajo Windows, en Linux necesitaría de algunos cambios:

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

char *arch_original = "original.txt";
char *arch_copia = "copia.txt";

int menu() {
   int retval;

   puts("1. Copiar a en b tal cual");
   puts("2. Copiar a en b pero invirtiendo linea a linea");
   puts("3. Copiar a en b pero invirtiendo todo el orden");
   puts("0. Salir");
   puts("");
   printf("Eleccion: ");
   scanf("%d", &retval);

   return retval;
}

void reiniciar_archivo() {
   FILE *fp = fopen(arch_original, "wt");
   fprintf(fp, "12345\nabcde");
   fclose(fp);
}

void opcion_1() {
   int c;
   FILE *original = fopen(arch_original, "rt");
   FILE *copia = fopen(arch_copia, "wt");

   c = fgetc(original);
   while(!feof(original)) {
       fputc(c, copia);
       c = fgetc(original);
   }

   fclose(original);
   fclose(copia);
}

void opcion_2() {
   char buffer[4096];
   char c;
   int tam;
   FILE *original = fopen(arch_original, "rt");
   FILE *copia = fopen(arch_copia, "wt");

   c = fgetc(original);
   while(!feof(original)) {
       ungetc(c, original);

       fscanf(original, "%4096[^\n]%n", buffer, &tam);
       for(int i=tam-1; i>=0; --i)
           fputc(buffer[i], copia);

       if((buffer[0] = fgetc(original)) == '\n')
           fputc(buffer[0], copia);
       else
           ungetc(buffer[0], original);

       c = fgetc(original);
   }

   fclose(original);
   fclose(copia);
}

void opcion_3() {
   int c;
   FILE *original = fopen(arch_original, "rt");
   FILE *copia = fopen(arch_copia, "wt");

   fseek(original, -1, SEEK_END);

   c = fgetc(original);
   while(ftell(original)>1) {
       fputc(c, copia);
       fseek(original, c=='\n'? -3 : -2, SEEK_CUR);
       c = fgetc(original);
   }
   fputc(c, copia);

   fclose(original);
   fclose(copia);
}

int main() {
   int n;

   do {
       reiniciar_archivo();
       n = menu();

       switch(n) {
       case 0:
           break;
       case 1:
           opcion_1();
           break;
       case 2:
           opcion_2();
           break;
       case 3:
           opcion_3();
           break;
       default:
           puts("La opcion elegida no es correcta.");
       }

        // Mira el resultado en el archivo copia.txt

   } while(n);
}
#255
Debes saber que los métodos recursivos gastan mas memoria que los iterativos. Cada vez que se llama la función recursiva crea un marco en el stack. Cuánta más veces se repita y cuántas más variables locales use más rápido llenará la memoria del programa.
Por esta razón una función recursiva es mas lenta ya que debe generar todo el marco, cambiar los registros del procesador para que apunten a la nueva memoria, copiar los datos de los argumentos de la función, ejecutar una instrucción de salto (que en el peor de los casos, si el predictor del procesador ha fallado, debe cargar de nuevo el IP y saltar a esa instrucción; es el doble de lento). De igual forma cuándo la función termina se debe limpiar la pila y saltar a la instrucción que hay después de la llamada.

Con métodos iterativos todo esto te lo saltar y sólo suele haber una instrucción de comparación y otra de salto.

Por tanto sólo se deben usar métodos recursivos cuando haya una clara ventaja de éstos sobre los iterativos.
#256
Tienes otro fallo aquí: while (bucle = 0) Estás asignando, no comparando.
#257
Sí, pero qué error marca?
#259
torneo.c es una copia de nadadores.c
#260
Y cómo lo compilas?