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

#1
Hola, quiero obtener la media de una serie de números almacenados en un vector. He definido un vector de 100 elementos, pero no lo quiero llenar todo. Uso el bucle while  para introducir la cantidad de números que yo quiera. En el momento que me pregunta otro? le doy que no y me sale esto: La media es -36046567217453303226519490776462834093195326687546261483049571502083785345215250433915316893387385717851675440677491564514894938068961058035063788649341798672398777324866008790631210573116460943674979154620314287199762365252556423138115833356791091699933773824.000000

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

#define TAM 100

int main(){
        double v[TAM];
        int i=0;
        char op='s';
        double media = 0.0;

        while((op == 's' || op == 'S') && i < TAM){
            printf("Introduce un número: ");
            scanf("%lf", &v[i]);
            i++;
            printf("Otro? (s/n)");
            scanf("%1s", &op);
        }
       
   
        for(i=0; i<TAM; i++){
           media += v[i];
        }
        media = media/TAM;
        printf("La media es %lf\n", media); 
}
#2
Hola, el siguiente programa escribe cadenas en un fichero binario, luego las lee del fichero y finalmente las muestra por pantalla:

#include <stdio.h> //escribe una cadena en un fichero y después lo lee y escribe en pantalla
#include <string.h>

struct registro{
   char nombre[50];
};


int   main ()
   {
      FILE *fich;
      char nom_fich[50];
      char op;
       
      struct registro datos;

      printf("Introduzca nombre del fichero: ");
      scanf("%49s",nom_fich);
      /* Escritura del float en el fichero */
      if ((fich = fopen (nom_fich, "wb")) == NULL)
         {
         printf ("Error de creación del fichero\n");
         
         }
       else{
          do{
           printf("Introduce una cadena: ");
           scanf("%49s",datos.nombre);
           fwrite (&datos, sizeof (datos), 1, fich);
           printf("¿Otro? (s/n)");
           scanf("%1s",&op);
          }while((op == 's') || (op == 'S'));
       }
       fclose (fich);

       /* Lectura del float del fichero */
      if ((fich = fopen (nom_fich, "rb")) == NULL)
         {
         printf ("Error de existencia del fichero\n");
         
         }
      else{
          fread (&datos, sizeof(datos), 1, fich);
          while(!feof)
             fread (&datos, sizeof(datos), 1, fich);
      }
      fclose (fich);
     
      printf ("%s\n", datos.nombre);
   }


Cuando lo compilo sólo me imprime la primera cadena, ¿por qué? Por favor, contestadme pronto esta tarde tengo examen de recuperación. Gracias.
#3
Programación C/C++ / Re: buscar deuda mayor
10 Junio 2010, 13:33 PM
He hecho la siguiente modificación :

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

#define LEE_CHAR(c)\
c=getchar();\
while((c=='\n') || (c==' ') || (c=='\t'))\
c=getchar();

#define LEE_CAD(c,n) { int i=0; \
                     c[i]=getchar();\
     while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
     while ((c[i]!='\n') && (i < (n-1))){ \
        i++;\
c[i]=getchar(); }\
     c[i]='\0'; }

#define TAM_NOMBRE 100


struct cliente{
char nombre[TAM_NOMBRE];
        double deuda;
};
int main(){
  void alta();
  void mostrar_todo();
  void deuda_mayor();
  char op;
  FILE * pf;

  if((pf = fopen("datos.dat", "wb")) == NULL) {/*"rb+"*/
           /* Si no existe, ejecuta el módulo que lo cree */
   alta();

      if((pf = fopen("clientes.dat", "rb")) == NULL) {
perror("Fichero no accesible");
                exit(1);
      }
  }
 
  do{
printf("MENÚ\n----\n");

printf("1). Dar de alta un cliente.\n");
                printf("2). Mostrar todo.\n");
                printf("3). Deuda mayor.\n");
                printf("4). salir y eliminar.\n");
                printf("0). Salir\n\nOpción(0-4): ");

                do{
LEE_CHAR(op);
}while( (op < '0') || (op >'4') );

switch(op){
                    case '1': alta(pf); break;
                    case '2': mostrar_todo(pf); break;
                    case '3': deuda_mayor(pf); break;
                    case '4':{ fclose(pf); pf=NULL; remove("clientes.dat"); op= '0';
break;}
}
  }while(op != '0');

exit(0);
}//main()
//////////////////////////////////////////////////////////           
void alta(FILE *pf){
      struct cliente cli;
      int fin;

  if((pf = fopen("clientes.dat", "ab")) == NULL) {
printf("Error al crear el fitxer\n");
}
else {
fin = 1; /* Termina con fin == 0 */


while ( fin ) {
printf ("Nombre del cliente: ");
LEE_CAD(cli.nombre,TAM_NOMBRE);
                        printf ("Deuda: ");
                        scanf("%lf",&cli.deuda);
fwrite(&cli,1,sizeof cli,pf);
printf("Otro (0--> NO, 1--> SI)? ");
scanf("%d",&fin);
}
if (fclose(pf))
printf("Error al guardar el fichero\n");
}
}
/////////////////////////////////////////////
void mostrar_todo(FILE *pf){
       struct cliente cli;

       if((pf = fopen("clientes.dat", "rb")) == NULL) {
printf("Error al abrir el fichero clientes.dat\n");
       }
       else{

fread(&cli, 1, sizeof cli, pf);
        while (!feof(pf)){
printf("%s  %.2lf\n", cli.nombre, cli.deuda);
fread(&cli,1, sizeof cli,pf);
        }
        fclose(pf);
  }
}
//////////////////////////////////
void deuda_mayor(FILE * pf){
        struct cliente max,cli;

        if((pf = fopen("clientes.dat", "rb")) == NULL) {
printf("Error al abrir el fichero clientes.dat\n");
        }
        else{
             fread(&max,1,sizeof cli,pf);/*supongo que el primero es el mayor*/
             while(!feof(pf)){
                if(cli.deuda > max.deuda)/*si es mayor que el actual lo cambia*/
                   max=cli;
                fread(&cli,1,sizeof cli,pf);
             }
        }
        fclose(pf);
        printf("%s %.2lf\n",cli.nombre,cli.deuda);
}


Cuando lo compilo introduzco los datos de 2 clientes: Si la deuda del primero es mayor que la del segundo me muestra la del segundo que es la más pequeña, sin embargo si la deuda del segundo es mayor que la del primero me muestra ésta última. ¿Dónde está el fallo? Ayudadme, por favor, el martes tengo recuperación. Gracias.
#4
Programación C/C++ / Re: buscar deuda mayor
10 Junio 2010, 12:00 PM
Hola, en la función deuda_mayor lo primero que hago es definir la estructura:
     struct cliente cli;
luego como me interesa buscar la deuda más alta declaro una variable llamada deuda_mayor de tipo int que será la posición en la que se encuentra. Hasta aquí bien ¿no?. La duda que tengo es esta: La variable deuda que tengo definida en el struct cliente, ¿la tengo que comparar con la variable deuda_mayor que se encuentra en la función deuda_mayor?, ¿la variable deuda tengo que volver a definirla en este módulo o no hace falta?
#5
Programación C/C++ / ejercicio de examen
8 Junio 2010, 20:55 PM
Hoy he tenido el examen y el enunciado es este, a ver si hay alguien que pueda resolverlo.
Según nos ha dicho el profesor no es necesario definir el struct.
Me ha salido de pena el examen.

Escribe un programa en C, que estará formado por un módulo principal y por un módulo que será llamado desde el anterior. El programa principal deberá leer de teclado el nombre de 12 ficheros con los datos de las ventas de cada mes del año y cada una de estas ventas está formada por un registro (struct venta) que incorporamos mediante el fichero ventas.h. El programa principal debe crear un fichero donde guardará el valor mayor de cada uno de los 12 ficheros. El proceso consistirá en:

     1.    Crear el fichero para los valores mayores de las ventas (max_ventas.dat).
     2.    Leer los 12 nombres de ficheros.
     3.    Por cada fichero con ventas, lo abrirá y le pasará el puntero a fichero al otro módulo que se encargará de buscar el registro con valor de venta mayor (el campo a usar es total_venta), devolviendo este registro al programa principal.
     4.    Grabar en el fichero el registro que nos ha devuelto el módulo que busca el mayor.
     5.    Cerrar el fichero max_ventas.dat y terminar el programa.
#6
Programación C/C++ / Re: buscar deuda mayor
8 Junio 2010, 20:39 PM
Acabo de modificarlo, corriguiendo los errores que me has dicho, pero cuando le doy a la opción 2 que busca la deuda más alta y la muestra por pantalla no hace nada.
#7
Programación C/C++ / Re: buscar deuda mayor
8 Junio 2010, 17:13 PM
He modificado lo de double deuda_mayor = 0.0 y he puesto int deuda_mayor=0, pero me da estos errores:
En la función 'deuda_mayor':
deuda_mayor.c:113: error: el valor indicado por el subíndice no es ni matriz ni puntero
deuda_mayor.c:113: error: el valor indicado por el subíndice no es ni matriz ni puntero
deuda_mayor.c:117: error: el valor indicado por el subíndice no es ni matriz ni puntero
deuda_mayor.c:117: error: el valor indicado por el subíndice no es ni matriz ni puntero
#8
Programación C/C++ / Re: buscar deuda mayor
8 Junio 2010, 15:56 PM
He vuelto a modificarlo, he quitado NUM_CLIENTES y no entiendo por qué deuda_mayor tiene que ser int si me tiene que sacar la deuda más alta que es de tipo double.
#9
He aplicado este ejercicio a un programa que da de alta clientes, pero cuando pido mostrar el fichero no sale la coma para separar los registro.

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

#define LEE_CHAR(c)\
c=getchar();\
while((c=='\n') || (c==' ') || (c=='\t'))\
c=getchar();

#define LEE_CAD(c,n) { int i=0; \
                     c[i]=getchar();\
     while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
     while ((c[i]!='\n') && (i < (n-1))){ \
        i++;\
c[i]=getchar(); }\
     c[i]='\0'; }

#define TAM_NOMBRE 100
#define TAM_DIR 100

struct cliente{
char nombre[TAM_NOMBRE];
char direccion[TAM_DIR];
        double deuda;
};
int main(){
void crear_fich();
        int cambiar_salto_por_coma();
        void mostrar_fich();
        char op;
FILE *pf; //Puntero a fichero

        /* Abre el fichero para trabajar con él en Lectura / Escritura */
        if((pf = fopen("datos.dat", "wb+")) == NULL) {
           /* Si no existe, ejecuta el módulo que lo cree */
   crear_fich();
   /* Una vez creado lo habre en lectura/escritura */
           if((pf = fopen("datos.dat", "rb+")) == NULL) {
perror("Fichero no accesible");
                exit(1);
   }
        }

do{
printf("\nMENÚ\n----\n");
printf("1). Crear fichero.\n");
                printf("2). Cambiar salto de linea por coma.\n");
                printf("3). Mostrar fichero.\n");
printf("0). Salir\n\nOpción(0-3): ");
do{
LEE_CHAR(op);
}while( (op <'0') || (op >'3') );

switch(op){
case '1':
crear_fich(pf);
    /* Una vez creado lo abre en lectura/escritura */
    if((pf = fopen("datos.dat", "rb+")) == NULL) {
perror("Fichero no accesible");
                exit(2);
    }
break;
                                case '2': cambiar_salto_por_coma(pf);
                                        break;
                                case '3': mostrar_fich(pf);
                                        break;
} //switch
        }while(op!='0');
if(fclose(pf) == EOF)
           printf("Error al cerrar el fichero.\n");
        exit(0);
}//main()
////////////////////////////////////////////////////////////////////////
void crear_fich(FILE* pf) {
         struct cliente cli;
         char otro;

if((pf = fopen("datos.dat", "wb")) == NULL) {
perror("Al crear el fichero de datos");
                exit(4);
         }
         
         /* Lectura de los ciclistas */
         do {

cli.deuda = 0.0;
                printf("Nombre: "); LEE_CAD(cli.nombre, TAM_NOMBRE);
                printf("Dirección: "); LEE_CAD(cli.direccion, TAM_DIR);
                printf("Deuda: "); scanf("%lf", &cli.deuda);
                /*Escribe el cliente en el fichero */
                fwrite(&cli, sizeof(struct cliente), 1, pf);
printf("¿Otro? (s/n) ");
                LEE_CHAR(otro);
}while((otro=='s') || (otro=='S'));
if(fclose(pf) == EOF){
printf("Error al cerrar el fichero, compruebe si hay información.\n");
                exit(5);
        }
} /* crear_fich()*/
///////////////////////////////
int cambiar_salto_por_coma(FILE *pf){
 
  char letra;

  // Abro el fichero
  if((pf=fopen("datos.dat","rb+"))==NULL){
      printf("Error al abrir el fichero.\n");
      return 1;
  }
  else{
     while ( !feof(pf) ){ // Mientras no sea final de fichero
     if(letra=='\n'){
        letra=',';
     }
     printf("%c",letra);   
     letra = getc(pf);
    }
  // Cerrar fichero
  fclose(pf);
  getchar();
  return 0;
  }
}
//////////////////////////////////
void mostrar_fich(FILE *pf){
       char letra;
       struct cliente cli;
       rewind(pf);
       fread(&cli,sizeof(struct cliente),1,pf);
       while(!feof(pf)){
          printf("%s %s %.2lf\t\n\n",cli.nombre,cli.direccion,cli.deuda);
          fread(&cli,sizeof(struct cliente),1,pf);
      }
}
#10
Programación C/C++ / Re: buscar deuda mayor
8 Junio 2010, 12:55 PM
Os he hecho caso y he modificado el ejercicio a ver si me lo podéis mirar, por favor, sigue dándome fallos.
Hoy tengo examen. Gracias.