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

#1501
Vale, dos cosas que veo.

En tu sentencia de control del while de la función main te interesa que itere mientras se cumplan las dos condiciones: que el numero no sea palíndromo Y que el contador no llegue a 200. Así como lo tienes, aunque pases por encima de un palíndromo no se va a parar porque el contador no ha llegado a 200.

Por otra parte en tu función de búsqueda de palíndromo te has complicado bastante mucho y verás:
qué pasa si restas un palíndromo por su reverso? qué ocurre si restas un número que no lo es por su reverso?
#1502
Soy de C, no de C++, así qur no se si hay mejorrs soluciones que la que te propongo:
Cuando generes tu tabla de 4x4 juntala mediante una union a un array de 16 elementos. Llenar el array te será mucho más fácil ya que no tienes que moverte con dos índices.
Al final imprimirás la tabla con las dos dimensiones.




Realizado el código te puedo indicar que lo más fácil es rellenar un array unidimensional con los asteriscos y espacios. A la hora de representar los datos se van tomado uno a uno los caracteres del array y mediante contadores se tiene en cuenta en que fila y columna se encuentra uno para así poder poner la nomenclatura de las filas, espacios, bordes y nuevas lineas donde toca.
#1503
Tienes razón. Pon el código para ver cómo seria.
#1504
Sí, es una solución pero aun sigues teniendo el problema: la función pop() devuelve un entero, falle o no. ¿Cómo sabe el usuario que la función pop() ha fallado y el dato que devuelve es basura?
#1505
Cierto, con lo que tendrás que controlar si hay algo para liberar antes de hacerlo. Mírate también el tema de que pasa si el usuario de tu pila hace un pop() nada mas empezar, sin haber siquiera introducido un dato en ella.
#1506
Muy buenas.

Supongo a que te refieres a algo como esto;

     1       1       1   | 3
     1       1       1   | 3
     1       1       1   | 3
------- ------- -------
     3       3       3 


Como se debe imprimir todo de corrido, al mismo tiempo que imprimes cada fila debes calcular el valor de la suma e imprimirlo al final de dicha linea. En la siguiente haces lo mismo y así.
La impresión de las columnas la puedes hacer después de haber impreso la tabla. Calculas cada columna por separado y usas el mismo patron de printf que has usado en la impresion de las filas para formatear la salida.

P.D.: Cuando presentes un codigo arreglalo para que quede bonito (margenes, espacios, saltos de línea, etc). No solo debe ser funcional sino tambien legible a primer ojo.
#1507
Muy buenas.

nisteeklod, te has olvidado de liberar la memoria del nodo con free(). Cada vez que haces pop() el area de memoria apuntada por rem queda huerfana.
#1508
Muy buenas.

Pues tu programa, algo modificado para poder borrar y editar registros quedaria mas o menos como se muestra a continuacion. Se puede y, de hecho, se debe mejorar. Como ha comentado class_OpenGL deberias hacer que trabajara con una copia en memoria para trabajar con ella y el resultado volcarlo despues en el archivo. La modificacion es sustancial.

Sin mas demora aqui va tu programa medianamente funcional. Repasalo, intenta entender porque se hace cada cosa. Esta enteramente basado en funciones de libreria estandar. No encontraras problemas en seguirlo.


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

#ifdef _WIN32
#define CLSCR "cls"
#else
#define CLSCR "clear"
#endif

typedef struct {
   char nombre[35];
   char mail[25];
   char telefono[14];
} Contacto;

const char* nombreArchivo = "agenda.bin";

void menu();
Contacto crearContacto();
void guardarContacto();
void mostrarAgenda();
void borrarContacto();
void modificarContacto();
void pausar();

int main() {
   menu();

   return 0;
}

void menu() {
   int opcion;

   do {
       system(CLSCR);
       printf("MENU PRINCIPAL\n");
       printf("==============\n\n");
       printf("1. Crear contacto\n");
       printf("2. Consultar agenda\n");
       printf("3. Borrar contacto\n");
       printf("4. Modificar contacto\n");
       printf("5. Salir\n\n");
       printf("Ingresa una opcion: ");
       scanf("%d", &opcion);
       while(getchar() != '\n');
       
       if (opcion > 0 && opcion < 6) {
           switch (opcion) {
               case 1:
                   guardarContacto();
                   break;
               case 2:
                   mostrarAgenda();
                   break;
               case 3:
                   borrarContacto();
                   break;
               case 4:
                   modificarContacto();
                   break;
               case 5:
                   printf("Fin del programa\n");
                   pausar();
                   break;
           }
       }
       else {
           printf("\nOpcion no contemplada\n");
           pausar();
       }
   } while (opcion != 5);
}

Contacto crearContacto() {
   Contacto contacto;
   
   memset(&contacto, 0, sizeof(Contacto));
   
   system(CLSCR);
   printf("NUEVO CONTACTO\n");
   printf("==============\n\n");
   
   printf("Nombre: ");
   fgets(contacto.nombre, sizeof(contacto.nombre), stdin);
   contacto.nombre[strlen(contacto.nombre) - 1] = '\0';
   printf("Correo-e: ");
   fgets(contacto.mail, sizeof(contacto.mail), stdin);
   contacto.mail[strlen(contacto.mail) - 1] = '\0';
   printf("Telefono: ");
    fgets(contacto.telefono, sizeof(contacto.telefono), stdin);
    contacto.telefono[strlen(contacto.telefono) - 1] = '\0';
   
   return contacto;
}

void guardarContacto() {
   FILE *file;
   Contacto contacto;
   long int fcur; // Actual posicion dentro del archivo
   long int fend; // Posicion de final de archivo
   char c; // Caracter adquirido
   
   file = fopen(nombreArchivo, "rb"); // Miro si el archivo existe
   if(file == NULL) { // No existe
       file = fopen(nombreArchivo, "w+b"); // Pues lo abro nuevo
       if(file == NULL) { // No se ha podido crear
           printf("No se ha podido generar un archivo para la agenda\n");
           pausar();
       }
       else { // Si se ha podido crear. Guardo el primer registro
           contacto = crearContacto();
           fwrite(&contacto, sizeof(contacto), 1, file);
           fclose(file);
       }
   }
   else { // Existe el archivo. Busco en el un registro vacio
       c = fgetc(file);
       if(c == '\0') {
           ungetc(c, file);
           fcur = ftell(file); // Encontrado en el primer registro
       }
       else {
           fseek(file, 0, SEEK_END);
           fend = ftell(file);
           fseek(file, 0, SEEK_SET);
           while((c = fgetc(file)) != '\0' && ftell(file) < fend) {
               ungetc(c, file);
               fseek(file, sizeof(Contacto), SEEK_CUR);
           }
           ungetc(c, file);
           fcur = ftell(file); // Encontrado en posteriores registros
           fclose(file);
           if(fcur == fend) { // Si no hay registros vacios
               file = fopen(nombreArchivo, "ab");
               if(file == NULL) {
                   printf("No se ha podido generar un archivo para la agenda\n");
                   pausar();
               }
               else {
                   contacto = crearContacto();
                   fwrite(&contacto, sizeof(contacto), 1, file); // Anado mi registro al final
                   fclose(file);
               }
           }
           else {
               file = fopen(nombreArchivo, "r+b");
               if(file == NULL) {
                   printf("No se ha podido generar un archivo para la agenda\n");
                   pausar();
               }
               else {
                   fseek(file, fcur, SEEK_SET);
                   contacto = crearContacto();
                   fwrite(&contacto, sizeof(contacto), 1, file); // Si habia vacio lo guardo en el
                   fclose(file);
               }
           }
       }
   }
}

void mostrarAgenda() {
   FILE* file = fopen(nombreArchivo, "rb");
   Contacto contacto;
   int i;
   
   system(CLSCR);
   printf("CONTACTOS\n");
   printf("=========\n\n");
   
   if(file == NULL) {
       printf("Error al intentar acceder al archivo\n");
   }
   else {
       printf("%s %-35s %-25s %-14s\n", "ID", "Nombre", "Correo-e", "Telefono");
       for(i = 0; i < 3+36+26+14; ++i)
           putchar('-');
       putchar('\n');
       i = 0;
       while (fread(&contacto, sizeof(Contacto), 1, file)) {
           i++;
           printf("%-2u %-35s %-25s %-14s\n", i, contacto.nombre, contacto.mail, contacto.telefono);
       }
       fclose(file);
       printf("\n");
   }
   pausar();
}

void borrarContacto() {
   FILE *file = fopen(nombreArchivo, "r+b");
   Contacto vacio;
   int buscar;
   
   memset(&vacio, 0, sizeof(Contacto));
   
   system(CLSCR);
   printf("BORRAR UN CONTACTO\n");
   printf("==================\n\n");
   
   if(file != NULL)
   {
       printf("Ingresa el ID de registro que deseas borrar: ");
       scanf("%i",&buscar);
       while(getchar() != '\n');
       --buscar;
       
       fseek(file, 0, SEEK_END);
       if(buscar * sizeof(Contacto) <= ftell(file))
       {
           fseek(file, buscar * sizeof(Contacto), SEEK_SET);
           fwrite(&vacio, sizeof(Contacto), 1, file);
       }
       else {
           printf("El indice proporcionado no corresponde a ninguna entrada\n\n");
       }
       fclose(file);
   }
   else {
       printf("No existe ninguna entrada en la agenda");
   }
   pausar();
}

void modificarContacto() {
   FILE *file = fopen(nombreArchivo, "r+b");
   Contacto contacto;
   int buscar;
   
   system(CLSCR);
   printf("MODIFICAR UN CONTACTO\n");
   printf("=====================\n\n");
   
   if(file != NULL) {
       printf("Ingresa el ID de registro que deseas modificar: ");
       scanf("%i",&buscar);
       while(getchar() != '\n');
       --buscar;
       
       fseek(file, 0, SEEK_END);
       if(buscar * sizeof(Contacto) <= ftell(file))
       {
           contacto = crearContacto();
           fseek(file, buscar * sizeof(Contacto), SEEK_SET);
           fwrite(&contacto, sizeof(Contacto), 1, file);
       }
       else {
           printf("El indice proporcionado no corresponde a ninguna entrada\n\n");
       }
       fclose(file);
   }
   else {
       printf("No existe ninguna entrada en la agenda\n\n");
   }
   pausar();
}

void pausar() {
   char c;
   
   printf("Presione ENTER para continuar...");
   while ((c = getchar()) != '\n');
}
#1509
Una idea sería que hicieras todo el trabajo en la memoria, tal vez usando listas enlazadas. Al principio del programa miras si el archivo de la agenda existe. Llenas la lista con los datos del archivo si hay. Con todas tus opciones trabajas sobre la lista en memoria, y añades una función para guardarlo todo en el disco.
También puedes añadir una funcionalidad en salir del programa para preguntar al usuario si desea guardar los cambios.
#1510
Sí, pero viendo que en todo momento trabaja directamente con el archivo he creído que esa es una premisa de su problema. Ya he visto otros enunciados por aquí, en el foro, que dicen que se debe trabajar directamente con el archivo.