difatti io l'esercizio ho cercato di svolgerlo ma arrivo a questo punto:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char luogo[30];
float valore;
}rilevazioni;
int main()
{
rilevazioni*dato=NULL;
int i=0,n=0, END=0;
printf("quante rilevazioni vuoi inserire?");
scanf("%d", &n);
dato=(rilevazioni*)malloc(n*sizeof(rilevazioni));
for(i=0;i<n;i++)
{
do
{
printf("inserisci luogo:");
scanf("%s", dato[i].luogo);
printf("inserisci valore:");
scanf("%f", &dato[i].valore);
}while(dato[i].luogo!=END);
}
return 0;
}
- Usa i tag CODE
- Il testo non dice che devi chiedere la dimensione, ma che devi fermarti quando l'utente inserisce "end"
- I tuoi due cicli annidati non hanno un significato: ripeti n volte un inserimento che dovrebbe fermarsi quando l'indirizzo della stringa dato[i].luogo è diverso da 0
- 2 sono i metodi: allocare un vettore sovradimensionato di strutture o riallocare il vettore quando ti serve più spazio che, nel caso più semplice, significa riallocarlo ad ogni inserimento per contenere un elemento in più (Nota che questo meccanismo è inefficiente)
Questa è la struttura base, vedi di capire come funziona e completa con quello che mancaP.s. il testo ti dice esplicitamente di usare un vettore, a me parrebbe più efficiente e più adatta alla situazione una lista con inserimento ordinato.codice:#include <stdio.h>#include <stdlib.h> #include <string.h> typedef struct { char luogo[30]; float valore; }rilevazioni; int main() { rilevazioni *dati=NULL; int size = 0; char luogo[30]; while(1) { printf("Inserisci luogo: "); scanf("%s", luogo); if(strcmp(luogo, "end")==0) break; dati = (rilevazioni *)realloc(dati, sizeof(rilevazioni)*(size+1)); strcpy(dati[size].luogo, luogo); printf("Inserisci tasso d'inquinamento: "); scanf("%f", &dati[size].valore); size += 1; } int i; printf("\n\n"); for(i = 0; i < size; i++) printf("Luogo: %s\t\tTasso d'Inquinamento: %f\n", dati[i].luogo, dati[i].valore); free(dati); return 0; }
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
Come ti è già stato detto, qui non si fornisce la "pappa pronta" (che non serve a niente), ma si cerca di indirizzare nella direzione giusta, correggendo il lavoro svolto e eventualmente dando indicazioni utili.
Nel caso specifico, per il bubble sort trovi milioni di descrizioni in pseudocodice su Internet, quindi il primo passo è cercare di capire la descrizione dell'algoritmo e tradurla in C; prova a fare questo, posta il codice ottenuto e se incontri problemi cercheremo di correggerli insieme.
Per stampare a video i valori superiori a 33, basta un for che cicla su tutto l'array e un if all'interno per vedere se l'elemento corrente è superiore a 33...
Amaro C++, il gusto pieno dell'undefined behavior.
questo è quello che ho provato :
codice:#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char luogo[30]; float valore; }rilevazioni; int main() { rilevazioni *dati=NULL; int size = 0; int i, j, temp, n ; char luogo[30]; while(1) { printf("Inserisci luogo: "); scanf("%s", luogo); if(strcmp(luogo, "end")==0) break; dati = (rilevazioni *)realloc(dati, sizeof(rilevazioni)*(size+1)); strcpy(dati[size].luogo, luogo); printf("Inserisci tasso d'inquinamento: "); scanf("%f", &dati[size].valore); size += 1; } for(size=1;size<n;size++) { for(i=0; i<n; i++) { if(dati[i]>dati[i+1]) { temp=dati[i]; dati[i]=dati[i+1]; dati[i+1]=temp; } } } printf ( "\n\nArray dopo sistemazione:\n") ; for ( i = 0 ; i <n ; i++ ) printf ( "%d\t", dati[i] ) ; getch(); } }
Ultima modifica di MItaly; 10-12-2013 a 02:39 Motivo: tag CODE
Non hai inizializzato n.
size non lo devi toccare in quanto contiene la dimensione attuale del tuo array.
L'algoritmo di ordinamento non è propriamente giusto.
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares