Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di unoedx
    Registrato dal
    Jul 2002
    Messaggi
    22

    [C++]Segmentation fault

    non riesco a capire perche questo codice mi va in segmentation fault

    for(int i=0; i<n;i++)
    {
    int flag=0, j=0;
    do
    {
    j++;
    if(x[i]==x[j])
    flag=1;
    }
    while (flag==1 || j==i-1);
    if(flag==0)
    fr[i]=fr[i]+1;
    else
    fr[j]=fr[j]+1;
    }

    il debugger (uso gdb) mi da l'errore alla linea
    if(x[i]==x[j])
    uso gcc 2.95.3


    unoedx

  2. #2
    Non puoi postare il programma completo?

  3. #3
    Utente di HTML.it L'avatar di unoedx
    Registrato dal
    Jul 2002
    Messaggi
    22
    #include <iostream> /* definisce le funzioni cout e cin */
    #include <cstdlib> /* definisce la funzione abs */
    #include <cmath> /* definisce la funzione sqrt */

    using namespace std;


    double x[99]; /* x(i):dati */
    double moda[99]; /* moda */
    int fr[99]; /* fr(i): frequenze */
    double vm; /* valor medio */
    int fmax; /* frequenza massima */
    double sc; /* valore assoluto di ogni scarto */
    double ssc; /* somma degli scarti assoluti */
    double sq; /* somma dei quadrati degli scarti assoluti */
    double ssma; /* scarto semplice medio assoluto */
    double sd; /* deviazione standard */
    int n; /* numero dei dati immessi */
    double somma; /* somma dei dati */
    int sf; /* somma delle frequenze */
    double mediana; /* mediana */

    void ordinamento(void);
    //funzione di ordinamento

    void ssmasd(void);
    //scarto medio (ssma) e deviazione standard (sd)

    void freq(void);
    //calcolo della frequenza

    void frmax(void);
    //calcolo della frequenza massima

    void Mediana(void);
    //calcolo della mediana

    void Moda(void);
    //calcolo della moda

    int main()
    {
    cout << "Elaborazione di unit -bā statistiche" << endl; -A
    cout << "Instroduci le singole unit -bā" << endl << "(anche pių volte se si ripresentano)" << endl; -A
    cout << "Verranno calcolati:" << endl;
    cout << "valor medio" << endl << "mediana" << endl << "moda" << endl << "campo di variabilit -bā" << endl << "scarto semplice medio" << endl << "deviazione standard" << endl << endl; -A
    cout << "Quante unit -bā immetti?\t"; -A
    cin >> n;
    somma = 0;
    for(int i=0; i<n; i++)
    {
    cout << "x[" << i << "]\t=\t";
    cin >> x[i];
    somma += x[i];
    }
    vm = somma/n;
    ordinamento();
    ssmasd();
    freq();
    frmax();
    Mediana();
    Moda();

    for(int i=0; i<=100 ;i++)
    cout << endl;

    cout << "\tdato\tfrequenza" << endl;
    for(int i=0; i<=n ; i++)
    {
    if(fr[i]>0)
    cout << char(9) << x[i] << char(9) << fr[i] << endl;
    }
    cout << endl << endl << endl;
    cout << "Valore Medio\t=\t" << vm << endl;
    cout << "Mediana\t=\t" << mediana << endl;
    if(sf<n)
    {
    cout << "Moda\t=\t" << char(9) ;
    for(int i=0; i<=n; i++)
    cout << i << "\t=\t" << moda[i] << endl;
    }
    else
    cout << "Tutti i dati hanno la stessa frequenza (non esiste moda)" << endl;
    cout << "Campo di variabilit -bā\t=\t" << x[n]-x[0] << endl; -A
    cout << "Scarto semplice medio assoluto\t=\t" << ssma << endl;
    cout << "Deviazione standard\t=\t" << sd << endl;

    }


    void ordinamento(void)
    {
    double e;
    for (int i=0; i<n-1 ;i++)
    {
    if(x[i]>x[i+1])
    {
    e=x[i];
    x[i]=x[i+1];
    x[i+1]=e;
    }
    }
    }

    void ssmasd(void)
    {
    ssc=0;
    sq=0;
    for(int i=0; i<=n; i++)
    {
    sc=abs(x[i]-vm);
    ssc+=sc;
    sq += sqrt(sc);
    }
    ssma=ssc/n;
    sd=sqrt(sq/n);
    }

    void freq(void)
    {
    fr[0]=1;
    for(int i=0;i<n;i++)
    fr[i]=0;

    for(int i=0; i<n;i++)
    {
    int flag=0, j=0;
    do
    {
    j++;
    if(x[i]==x[j])
    flag=1;
    }
    while (flag==1 || j==i-1);
    if(flag==0)
    fr[i]=fr[i]+1;
    else
    fr[j]=fr[j]+1;
    }
    }


    void frmax(void)
    {
    fmax=0;
    for(int i=0; i<=n ; i++)
    if(fr[i]>fmax) fmax=fr[i];
    }

    void Mediana(void)
    {
    int i=n%2;
    int j=0;
    if(i==0)
    {
    j=n/2;
    mediana=(x[j]+x[+1])/2;
    }

    else
    {
    j=(n-1)/2+1;
    mediana=x[j];
    }
    }

    void Moda(void)
    {
    sf=0;
    int j=0;
    for(int i=0; i<=n ; i++)
    {
    if(fr[i]==fmax)
    {
    j++;
    moda[j]=x[i];
    sf+=fr[i];
    }
    }
    }

  4. #4

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    20
    uhhmmmm...
    - perchč mai c++? questo č un programma c, che del c++ utilizza soltanto la std::cout, tranquillamente sotituibile con printf... Per programmare in c++ č essenziale che il programmatore segua scrupolosamente il paradigma a oggetti, altrimenti nascono dei mostri... cambia estensione da cpp a c cambia gli include e sostituisci i cout, cosicchč all'ing. Stroustroup non vengano crisi esistenziali
    - variabili globali a strafottere, la main invoca una serie di funzioni void (void)... non č proprio quello che si dice un esempio lampante di programmazione strutturata
    - se la tua "ordinamento" funzionasse avremmo un algoritmo di ordinamento su un vettore in tempo lineare (e tu avresti vinto il nobel per la matematica), ma purtroppo č matematicamente impossibile "ordinare" in tempo lineare. Il bubble sort l'algoritmo che hai tentato di usare) č al contrario uno dei peggiori algoritmi di ordinamento mai concepiti, ed ha in effetti una complessitā quadratica, quindi con un solo ciclo for sarā dura implementarlo... ne esistono molte varianti migliorate che per ordinare un array di 99 elementi vanno benissimo. Certo per ordinarne 99000 sarebbe meglio usare un algoritmo decente
    - per la freq ci credo che non riesci a capire perchč va in segmentation fault... segui il mio suggerimento e struttura meglio il programma (utilizzando, ebbene sė, i puntatori), non avrai pių nessun problema criptico di questo genere. Altrimenti riscrivi freq daccapo cercando di implementarla un po' meglio
    - non si fa mai un confronto diretto tra double, in quanto sono numeri in virgola mobile a precisione finita che la macchina approssima a modo suo... con x e y double, non si scrive x == y, ma si sceglie un valore z molto piccolo e si scrive ( ( x - y ) < z ) E' un problema notevole per cui sono stati sviluppati raffinati workaround e sofisticati algoritmi

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 © 2024 vBulletin Solutions, Inc. All rights reserved.