PDA

Visualizza la versione completa : programmazione c


lukafulmine
09-12-2013, 16:39
Si realizzi un programma in c che chiede all'utente una sequenza di dati relativi a rilevazioni da sensori
e li memorizza in un'opportuna struttura dati. All'utente viene chiesta una stringa, indicante un luogo,
e un valore reale di concentrazione di inquinanti, una luogo e un valore reale, e cosi' via, finche' il luogo non
e' il valore "end". Man mano che vengono letti, i dati sono inseriti in un array di strutture (nome, dato),
che va quindi ordinato per valori crescenti del dato, ad esempio con l'algoritmo bubble sort.
Alla fine si devono stampare tutti i luoghi e i valori per cui il dato e' maggiore di 33.

Scara95
09-12-2013, 16:59
E quindi?

lukafulmine
09-12-2013, 17:04
E quindi?
quindi mi servirebbe la trasposizione in c di questo problema....

Scara95
09-12-2013, 17:13
quindi mi servirebbe la trasposizione in c di questo problema....
Hai sbagliato forum o per lo meno sezione del forum, leggi il regolamento: qui non si svolgono esercizi altrui.

lukafulmine
09-12-2013, 17:16
Hai sbagliato forum o per lo meno sezione del forum, leggi il regolamento: qui non si svolgono esercizi altrui.
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;
}

Scara95
09-12-2013, 17:37
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 manca
#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;
}


P.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.

lukafulmine
10-12-2013, 01:16
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 manca
#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;
}


P.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.


come posso implementare la funzione bubble sort e stampare a video i valori superiori a 33??? codice pls

MItaly
10-12-2013, 01:29
codice pls
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 (http://en.wikipedia.org/wiki/Bubble_sort) 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...

lukafulmine
10-12-2013, 01:35
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 (http://en.wikipedia.org/wiki/Bubble_sort) 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...

questo quello che ho provato :


#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();
}
}

Scara95
10-12-2013, 07:33
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.

Loading