[C]: problema punteros y archivos

Iniciado por andie13, 26 Noviembre 2016, 23:01 PM

0 Miembros y 1 Visitante están viendo este tema.

andie13

Hola, me piden que indique el nombre de un archivo (será el nombre del mes) que contiene un formato así:
Mes
Ciudad
12 15 rojo (temperatura min, max y nivel de alerta).
El caso es que el programa debe determinar cuantos dias tiene el mes para saber si es correcto o no y trabajar haciendo la media, moda y tal a partir de ese dato, reservando memoria dinamica para tal. El caso es que no consigo hacerlo funcionar. Sé que tiene algun error suelto, pero no sé identificarlos, y me estoy estresando. Además, he oído que se debe de hacer teniendo en cuenta el argv y argc pero no sé implementarlos en el programa.
Muchas gracias por leer esto, se agradece.


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

/*FUNCION PARA CONTABILIZAR OS DIAS DO MES*/
int seleccionar(char *mes)  {
   int i=0,c;
   
   char meses[12][10] = {"xaneiro","febreiro","marzo","abril","maio","xunho","xullo","agosto","setembro","outubro","novembro","decembro"};
   int diasmes[12]= {31,28,31,30,31,30,31,31,30,31,30,31};
   
   for (i=0; i<12; i++) {
       c=strcmp(mes,diasmes[i]);
       if (c==0) {
           break;
       }
       else if (i==11 && c!=0) {
           printf("O mes e incorrecto, recorde que debe usar minusculas.\n");
           sleep(5);
           exit(0);
       }
   }
   return diasmes[i];
}

/*FUNCION CALCULO DA MEDIA*/
float media(int vector[]){
   float resultado;
   int media=0;
   int i;
   for(i=0;i<32;i++){
       media=vector[i]+media;
   }
   resultado=media/i;
   return(resultado);
}

/*FUNCION CALCULO DA MODA*/
char moda(int amar,int naran,int rojo){
   int res;
   
   if(amar>naran&&amar>rojo){
       res=1;
   }
   else if(naran>amar&&naran>rojo){
       res=2;
   }
   else if(rojo>amar&&rojo>naran){
       res=3;
   }
   else if(amar==naran&&amar!=rojo){
       res=4;
   }
   else if(amar==rojo&&amar!=naran){
       res=5;
   }
   else if(naran==rojo&&naran!=amar){
       res=6;
   }
   else if(amar==naran&&amar==rojo&&naran==rojo){
       res=7;
   }
   return(res);
}

int main(int argc, char** argv[]) {
   int i=0;
   int x;
   int amarillo,amarillo1=0,naranja,naranja1=0,rojo,rojo1=0;
   float minimo,maximo;
   int mod;    
   
   char mes[10];
   char cidade[10];
   float *minimadias;
   float *maximadias;
   char *riscodias;
   
   minimadias=(float*)malloc(sizeof(float));
   maximadias=(float*)malloc(sizeof(float));
   riscodias=(char*)malloc(sizeof(char));
   
   FILE *fp;
   char nombreOrg[50];
   printf("Indique o nome do arquivo que desea abrir (): ");
   scanf("%s",nombreOrg);
   if((fp=fopen(nombreOrg, "r"))==NULL){
       printf("O archivo non pode ser aberto.\n");
       exit(1);
   }
   x=nombreOrg(seleccionar);
   printf("%d",x);
   {
       fscanf(fp,"%s",&mes);
       fscanf(fp,"%s",&cidade);
       
       while(feof(fp)==0){
       //printf("%d\n",argc);
       fscanf(fp,"%d",(minimadias+i));
       fscanf(fp,"%d",(maximadias+i));
       fscanf(fp,"%s",(riscodias+i));
       }
   }
   {
           amarillo=strcmp(riscodias,"amarillo");
           naranja=strcmp(riscodias,"naranja");
           rojo=strcmp(riscodias,"rojo");
           if(amarillo==0){
               amarillo1++;
           }
           else if(naranja==0){
               naranja1++;
           }
           else if (rojo==0){
               rojo1++;
           }
           i++;
       }

   FILE *fp1;
   fp1=fopen("salida4.txt","w");  /*Abrimos o ficheiro salida9.txt*/
       if(fp1==NULL){
       printf("O archivo non pode ser aberto.\n");
       exit(1);
   }
   {  
       minimo=media(minimadias);
       maximo=media(maximadias);
       fprintf(fp1,"O mes e %s.\n",mes);
       fprintf(fp1,"A cidade e %s.\n",cidade);
       fprintf(fp1,"A media das temperaturas minimas e %.2f.\n",minimo);
       fprintf(fp1,"A media das temperaturas maximas e %.2f.\n",maximo);
       mod=moda(amarillo1,naranja1,rojo1);
       
       if(mod==1){
           fprintf(fp1,"%s","O nivel de risco mais repetido foi amarillo.");
       }
       else if(mod==2){
           fprintf(fp1,"%s","O nivel de risco mais repetido foi naranja.");
       }
       else if(mod==3){
           fprintf(fp1,"%s","O nivel de risco mais repetido foi rojo.");
       }
       else if(mod=4){
           fprintf(fp1,"%s","O nivel de risco mais repetido foi amarillo/naranja.");
       }
       else if(mod==5){
           fprintf(fp1,"%s","O nivel de risco mais repetido foi amarillo/rojo.");
       }
       else if(mod==6){
           fprintf(fp1,"%s","O nivel de risco mais repetido foi naranja/rojo.");
       }
       else if(mod==7){
           fprintf(fp1,"%s","O nivel de risco mais repetido e indeterminado.");
       }
   }
   
   fclose(fp);
   fclose(fp1);
   free(maximodias);
   free(minimadias);
   free(riscodias);
}

engel lex

primero, te recomiendo no poner "urgente" eso no va a hacer que más gente te ayude (por el contrario mucho ni lo abrirían pensando que estás pidiendo que te hagan la tarea)

segundo, tu codigo es largo para que lo lean (recuerda que entre más largo y complicado menos atención tendrá tu tema, ya que por lo general la gente echa un vistazo, no va a compilar ni seguir tu programa paso a paso), indica las lineas de las cosas que tienes  y las funciones donde debería funcionar y no lo hace...

muestra que entradas diste y que resultados recibiste...


te recomiendo en primera instancia aprender a usar el debugger de tu ide... eso te resolverá mil problemas...

y tampoco entendí mucho lo que querías, sobre argv y argc, en google conseguirás bastante info de como usarlo (basicamente argc, contiene la cantidad de elementos pasados por consola, donde siempre será por lo menos 1 y argv es una array de arrays char que contendrá cada cosa (el espacio es el elemento separador) el primer elemento será siempre la llamada al mismo programa)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

andie13

es que no compila directamente, entonces no puedo usar el debugger.
Muchas gracias por los consejos. Intentaré revisar todo hasta que me funcione para detectar los errores.

engel lex

Cita de: andie13 en 26 Noviembre 2016, 23:32 PM
es que no compila directamente, entonces no puedo usar el debugger.
Muchas gracias por los consejos. Intentaré revisar todo hasta que me funcione para detectar los errores.

si no compila entonces más aún!!! donde están los errores de compilación? -.-
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.