Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    37

    aiuto per il calcolo del mediano

    Ciao a tutti,dovrei implementare una funzione che dopo aver fatto l'inserimento in lista,calcola la media e il mediano della lista,cioè quell'elemento che ha una differenza tra il numero di maggioranti e minoranti <=1. I maggioranti sono tutti gli elementi con valore >=rispetto all'elemento in esame,mentre i minoranti sono quelli che hanno un valore <= dell'elemento.

    La mia idea era quella di prendere il primo elemento della lista in esame,contare tutti i suoi maggioranti,tutti i suoi minoranti e se la differenza è <=1 l'ho trovato,altrimenti rifaccio la stessa cosa con il secondo elemento della lista e cosi via fino alla fine.

    L'inserimento della lista,la stampa e il calcolo della media sono ok,però quando calcola il mediano il programma si punta. Dove sbaglio???

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

    typedef struct list{ //definizione lista
    int info;
    struct list *nextptr;
    }list;
    /*******************dichiarazione delle funzioni*****************************/
    void inserisci(list **listptr,int value);//inserisce in testa
    void print_list(list*listptr);//stampa lista
    void elaboralista(list*lp,float*,int*);//ritorna media e mediano
    /****************************main****************** *******************/
    int main(int argc, char *argv[])
    {
    int value;
    int scelta;
    int mediano=0;
    float media=0;
    list *listptr=NULL;

    do {
    printf("\n cosa vuoi fare: \n 1)inserire in testa\n 2)stampa lista");
    printf("\n 3)calcola media e mediamo\n 0) per terminare");
    scanf("%d",&scelta);
    switch (scelta)
    {
    case 1rintf("\n digita il valore da mettere in testa-->");
    scanf("%d",&value);
    inserisci(&listptr,value);
    break;


    case 2rint_list(listptr);
    break;


    case 3:elaboralista(listptr,&media,&mediano);
    printf("\n media= %f -- mediano=%d ",media,mediano);
    break;

    }
    }
    while (scelta!=0);
    system("PAUSE");
    return 0;
    }
    /***********************inserimento in testa*******************************/
    void inserisci(list **listptrptr,int value)
    {
    list*tmpptr;
    tmpptr=(list*)malloc(sizeof(list));
    tmpptr->info=value;
    tmpptr->nextptr=(*listptrptr);
    (*listptrptr)=tmpptr;
    return ;
    }
    /****************************stampa**************** *******************/
    void print_list(list *listptr)
    { printf("\n lista:");
    do
    {
    printf("--> %d ",listptr->info);
    listptr=listptr->nextptr;
    }
    while(listptr->nextptr!=NULL);
    printf("-->%d",listptr->info);
    return;
    }

    /*************calcola media e mediano**********************************/
    void elaboralista(list*lp,float*media,int*mediano)
    {
    list*tmp=NULL;
    list *tmp2=NULL;
    float somma=0;
    int count=0; //conta elementi
    int upper,lower;//conta i maggioranti e minoranti
    tmp=lp;//salvo testa lista
    while(lp!=NULL)
    {
    count++;
    somma+=lp->info;
    lp=lp->nextptr;

    }

    (*media)=(somma/count);
    printf("\nmedia=%f",somma/count);
    lp=tmp;//ricopio testa
    tmp2=lp;//salvo testa

    while(lp!=NULL)
    {
    tmp=lp;
    upper=0;
    lower=0;

    while(tmp!=NULL)
    {
    if(tmp->info>=lp->info) //l'elemento in esame cioè tmp->info
    upper++; // è maggiorante di lp->info
    if(tmp->info>=lp->info) //l'elemento in esame cioè tmp->info
    lower++; // è minorante di lp->info
    tmp=tmp->nextptr;//scorro tutta la lista
    }
    if(abs(upper-lower)<=1)//se la diff tra il numero di maggioranti e quello
    //dei minoranti è <=1 lp->info è un mediano
    (*mediano)=lp->info;
    else
    lp=lp->nextptr;//prendo in esame il candidato successivo
    }
    lp=tmp2;
    return;
    }
    /************************************************** ****************************/

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Non ti conviene, per efficienza, semplicemente ordinare la lista e prendere l'elemento di indice lunghezza/2
    ?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    37
    Sicuramente è la soluzione piu semplice,però io devo risolvere questa cosa senza ordinare la lista!!(..esercizio d' esame....)

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Altra cosa, perché due controlli uguali del genere?
    codice:
    if(tmp->info>=lp->info) //l'elemento in esame cioè tmp->info 
    upper++; // è maggiorante di lp->info
    if(tmp->info>=lp->info) //l'elemento in esame cioè tmp->info 
    lower++; // è minorante di lp->info
    io non caisco niente di c/c++ (programmo solo in java e php), ma il secondo if non dovrebbe essere
    codice:
    if(tmp->info <= lp->info)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    37
    Si hai ragione ho sbagliato il copia incolla!!Ciao e grazie!

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    37
    Nessuno riesce ad aiutarmi???

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.