Salve ho riscontrato dei problemi che non riesco a capire e risolvere in questo esercizio sulle liste.
Mi viene riscontrato il primo errore al rigo 95. Mi dice : [Warning] assignment from incompatible pointer type. E' un problema di assegnazione ma non riesco a capire il motivo. Qualcuno può aiutarmi? L'ordinamento che ho utilizzato è in base al valore di temperatura.
Creare un programma che attraverso la dichiarazione di una struttura opportuna permetta di
gestire i dati meteorologici. Il programma deve permettere di :
Inserire una nuova rilevazione
Salvare i dati in un file
Calcolare la media dei valori immessi
Ordinare i dati secondo uno specifico criterio
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>
#define LENGHT 100
typedef struct dati{
char luogo[LENGHT];
char clima[LENGHT]; /*Nuvoloso,Pioggia,Neve,Sereno*/
double temperatura;
}meteo;
typedef struct tempo{
meteo inf;
struct meteo *next;
}tempo;
/*SCEGLIAMO DI INSERIRE I DATI SECONDO I VALORI DI TEMPERATURA REGISTRATI*/
tempo *ordina_temperature(tempo *head, char luogo[], char clima[], double temperatura);
void insert(tempo *a, tempo *b, tempo *c);
void salva_su_file(tempo *head,FILE *fp);
void media(tempo *head);
void visualizza(tempo *head);
int main(){
int scelta=1;
tempo *head=NULL; //crea la lista
char temp_luogo[LENGHT];
char temp_clima[LENGHT];
double temp_temperatura;
FILE *asd=NULL;
while(1){
printf("COSA VUOI STUDIARE DEL METEO?\n");
printf("----------------------\n");
pritnf("1)INSERIRE UN NUOVO DATO METEOROLOGICO\n2)VISUALIZZA LISTA NELLO SCHERMO\n3)SALVA I DATI IN UN FILE\n4)CALCOLA LA MEDIA DELLE TEMPERATURE\n5)ESCI");
scanf("%d",&scelta);
switch(scelta){
case 1:
while(1){
printf("-------------------------\n");
printf("INSERIRE UNA NUOVA CITTA'\n");
scanf("%s",temp_luogo);
if(temp_luogo=="0")
break;
printf("INSERIRE CLIMA\n");
scanf("%s",temp_clima);
printf("INSERIRE TEMPERATURA\n");
scanf("%lf",&temp_temperatura);
head=ordina_temperature(head,temp_luogo,temp_clima,temp_temperatura);
}
break;
case 2:
visualizza(head);
break;
case 3:
salva_su_file(head,asd);
break;
case 4:
media(head);
break;
case 5:
exit(1);
break;
default:
printf("WARNING!");
printf("LA SCELTA INSERITA NON CORRISPONDE AD UNA POSSIBILE!\n");
break;
}
}
return 0;
}
tempo *ordina_temperature(tempo *head, char luogo[], char clima[], double temperatura){
tempo *p, *temp_p, *prev_p;
p=(tempo*)malloc(sizeof(tempo)); //allocamento di memoria
assert(p!=NULL); //Blocca l'esecuzione se è NULL
strcpy(p->inf.luogo,luogo);
strcpy(p->inf.clima,clima);
p->inf.temperatura=temperatura;
p->next=NULL;
if(head==NULL) //se la lista non esiste p diventa la testa della lista
return p;
if (temperatura < head->inf.temperatura)
{p->next=head;
return p;
}
prev_p=head;
temp_p=head;
while(temp_p->next!=NULL&&temperatura>temp_p->inf.temperatura){
prev_p=temp_p; //si dà a prev_p il valore precedente di temp_p
temp_p=temp_p->next; //temp_p poi si aggiorna fino ad arrivare alla fine della lista
}
if(temp_p->next!=NULL&&temperatura>temp_p->inf.temperatura)
insert(temp_p,NULL,p); //il nuovo record si inserisce alla fine
else
insert(prev_p,temp_p,p); //il nuovo record si inserisce in una posizione intermedia
return head;
}
void insert(tempo *a, tempo* b, tempo *c){
if(a->next!=b)
{printf("ERRORE!\n");
return;
}
a->next=c;
c->next=b;
}
void visualizza(tempo *head){
while(head!=NULL){
printf("%10s %10s %10lf\n",head->inf.luogo, head->inf.clima, head->inf.temperatura);
head=head->next;
}
}
void salva_su_file(tempo *head, FILE *fp){
fp=fopen("Meteo.txt","w");
assert(fp!=NULL);
while(head!=NULL){
fprintf(fp,"\nCITTA': %10s\tCLIMA: %10s\tTEMPERATURA: %10lf\n",head->inf.luogo,head->inf.clima,head->inf.temperatura); //Scrive su FILE
head=head->next;
}
fclose(fp);
}
void media(tempo *head){
double med;
int i=0;
while(head!=NULL){
med+=head->inf.temperatura;
i++;
}
med=med/(double)i;
printf("LA MEDIA DELLE TEMPERATURE E': %10lf\n",med);
}