Vai al contenuto


Foto
- - - - -

AIUTO. Creazione di un programma con C

qualcuno che sa programmare

  • Per cortesia connettiti per rispondere
Nessuna risposta a questa discussione

#1 AlessioB

AlessioB

    Iniziato

  • Members
  • StellettaStelletta
  • 49 messaggi

Inviato 13 aprile 2015 - 01:43

Salve ragazzi. Ormai sono alla frutta e devo chiedere aiuto a qualcuno.

Il problema che ho è per un esame. Devo creare un programma in C per risolvere un problema di Analisi di Rischio, per l'università; solo che non sono molto pratico di programmazione. Sono riuscito a scrivere qualcosa, ma non mi escono le cose... probabilmente perché ho scritto male il programma.

Il testo del problema è il seguente. Ho due componenti che sono caratterizzati entrambi da due costanti (una di guasto e una di riparazione). Il mio compito è quello di valutare la probabilità che il mio sistema si trovi nelle condizioni di guasto. La logica da seguire è quella di creare due vettori, uno per componente, che sia composto da valori numerici pari ad 1 e 0. Questi 1 e questi 0 escono fuori dalla generazione di numeri casuali: creo un numero casuale, tramite una formula trovo un certo valore che esce fuori grazie al numero casuale; faccio il procedimento partendo dalla costante di guasto, poi sfrutto la formula tramite la costante di riparazione, poi ancora con quella di guasto e così via fino a terminare i numeri presenti nei vettori. Devo però considerare che il numero che mi esce deve essere poi arrotondato per eccesso (se la prima cifra decimale del numero supera o è uguale a 5) o per difetto (se la prima cifra decimale del numero è inferiore a 5).

Per quanto riguarda i numeri (che mi rappresentano le ore) che escono dalle costanti di guasto, devo mettere nel vettore tanti 1 fino a che non raggiungo il numero uscito dalla formula: ciò sta ad indicare che il componente si è guastato nell'ora determinata da tale numero). A questo punto metto tanti 0 finché, tramite il numero che esce dalla costante di riparazione (anch'esso indica le ore), non arrivo al numero di ore per cui il componente si ripara. Proseguo il procedimento finché non completo il vettore; faccio lo stesso procedimento per entrambi i componenti.

Esempio: dal primo numero casuale (costante di guasto) mi esce il valore 5,34224 che approssimo a 5. Ciò significa che il mio vettore sarà costituito da 1 1 1 1 1 0 perché alla 5a ora mi si guasta il componente; dal secondo numero casuale (costante di riparazione) mi esce il valore 3,6757 che approssimo a 4. Ciò significa che il mio vettore diverrà: 1 1 1 1 1 0 0 0 0 1... Proseguo finché non ho riempito il vettore. Successivamente faccio lo stesso con l'altro componente.

 

Arrivati a questo punto devo confrontare gli elementi dei due vettori così creati: genero un terzo vettore composto da tanti 1, fino a quando almeno uno degli altri vettori presenta un 1; altrimenti metto 0 (insomma condizione AND); tuttavia devo considerare un valore 0 solo quando nel primo vettore la condizione di guasto (ovvero gli 0) sono presenti almeno un'ora prima o avvengono alla stessa ora, cioè nell'elemento precedente a quello che trova anche nel secondo vettore lo 0. Riporto un esempio

 

1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1

0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1

 

1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 1

 

Infine devo fare il conteggio degli 0 che sono presenti nel terzo vettore e dividere questo valore per il numero di elementi presenti nel vettore stesso. Per poter arricchire il tutto, devo creare un numero elevato di storie cioè fare un processo iterativo che crei questi vettori n-volte, li azzeri e li crei di nuovo. Infine il valore che serve è il rapporto tra il numero di 0 nel terzo vettore diviso (il numero di iterazioni x numero di elementi)

 

 

 

Posto qui le righe del programma che ho creato fino ad ora, ma che non va...

Grazie in anticipo


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

#define iterazioni 10000000
#define elementi 100000

// Vettori
int array_primo_vettore[iterazioni];
int array_secondo_vettore[iterazioni];
int array_terzo_vettore[iterazioni];

// Costanti
double L1 = 0.0001;
double M1 = 0.25;
double L2 = 2.3 * 0.0001;
double M2 = 2.6;

// Numero di zeri nel terzo array
int contatore = 0;


// Setta tutti gli elementi dell'array uguali a 2
void inizializzaArray(int r[]){
    int i;
    for(i = 0; i < iterazioni; i++){
        r[i] = 2;
    }
    printf("done\n");
}

// Genera una nuova x con una costante come parametro
double getX(double d){

    double random = (double)rand() / (double)RAND_MAX;
    double x;
    x = (1/d) * log(1/(1-random));
    return x;

}

// Prende un valore con la virgola e lo approssima
int getIntero(double d){
    double decimale = d - ((int) d);
    int intero;
    if(decimale < 0.5){
        intero = (int) d;
    }else{
        intero = (int) d + 1;
    }
    //printf("%d\n", intero );
    return intero;
}

// Ottiene la posizione del primo 2 nell'array
int getPrimoDue(int n[]){
    int posizione = -1;
    int i = 0;
    while(i < iterazioni){
        if(n[i] == 2){
            posizione = i;
            break;
        }
        i++;
    }
    return posizione;
}

// Aggiunge n uno all'array r a partire dalla posizione dell'ultimo 2
 void aggiungiUno(int r[], int n){

     int primoDue = getPrimoDue®;
     if(primoDue + n > iterazioni){
         n = iterazioni - primoDue;
     }
     int j;
     for(j = 0; j < n; j++){
         r[j + primoDue] = 1;
         //printf("%d\n", r[j]);
     }
 }

// Aggiunge n zeri all'array r a partire dalla posizione dell'ultimo 2
 void aggiungiZero(int r[], int n){
     int primoDue = getPrimoDue®;
     if(primoDue + n > iterazioni){
         n = iterazioni - primoDue;
     }
     int j;
     for(j = 0; j < n; j++){
         r[j + primoDue] = 0;
     }
 }


main() {

    // Inizializza entrambi gli array
    // Necessario per capire quali a quale
    // elemento siamo arrivati aggiungendo
    // zeri o uno
    inizializzaArray(array_primo_vettore);
    inizializzaArray(array_secondo_vettore);


    //
    while(getPrimoDue(array_primo_vettore) != -1){
        double x_L1 = getX(L1);
        aggiungiUno(array_primo_vettore, getIntero(x_L1));
        //printf("%d\n", getPrimoDue(array_primo_vettore));
        
        double x_M1 = getX(M1);
        aggiungiZero(array_primo_vettore, getIntero(x_M1));
        //printf("%d\n", getPrimoDue(array_primo_vettore));
    }
    

    while(getPrimoDue(array_secondo_vettore) != -1){
        double x_L2 = getX(L2);
        aggiungiUno(array_secondo_vettore, getIntero(x_L2));
        //printf("%d\n", getPrimoDue(array_secondo_vettore));

        double x_M2 = getX(M2);
        aggiungiZero(array_secondo_vettore, getIntero(x_M2));
        //printf("%d\n", getPrimoDue(array_secondo_vettore));
    }

    int j;

    for(j = 0; j < iterazioni; j++){
        if ((array_primo_vettore[j] == 0) && (array_secondo_vettore[j] == 0)){
            array_terzo_vettore[j] = 0;
            contatore++;
        }
        else if((array_primo_vettore[j] == 0) && (array_secondo_vettore[j] == 0) && (array_secondo_vettore[j - 1] == 0)){
            array_terzo_vettore[j] = 1;
        }
        else if ((array_primo_vettore[j] == 0) && (array_secondo_vettore[j] == 0) && (array_primo_vettore[j - 1] == 0)){
            array_terzo_vettore[j] = 0;
            contatore++;
        }
        else if ((array_primo_vettore[j] == 0) && (array_secondo_vettore[j] == 0) && (array_primo_vettore[j - 1] == 1) && (array_secondo_vettore[j - 1] == 1)){
            array_terzo_vettore[j] = 0;
            contatore++;
        }else{
            array_terzo_vettore[j] = 1;
        }
    }

// 0
// 111000111
// 111101111

// 1
// 111110001
// 111000111

// 0
// 111000111
// 111001111

    

    int i;
    // for(i = 0; i < iterazioni; i++){
    //     printf("%d", array_primo_vettore[i]);
    // }

    // printf("\n");

    // for(i = 0; i < iterazioni; i++){
    //     printf("%d", array_secondo_vettore[i]);
    // }

    // printf("\n");

    //for(i = 0; i < iterazioni; i++){
    double risultato = contatore/iterazioni;
    for(i = 0; i < iterazioni; i++){
        if (array_primo_vettore[i] == 0)
        {
            printf("%d", array_primo_vettore[i]);
        }
        
    }
    printf("\n");
    for(i = 0; i < iterazioni; i++){
        if (array_secondo_vettore[i] == 0)
        {
            printf("%d", array_secondo_vettore[i]);
        }
    }
    printf("\n");
    for(i = 0; i < iterazioni; i++){
        if (array_terzo_vettore[i] == 0)
        {
            printf("%d", array_terzo_vettore[i]);
        }
    }
    printf("\n");
    printf("%f\n", risultato);
    //}


    //double x_L2 = getX(L2);
    //double x_M2 = getX(M2);


    

    
}






0 utente(i) stanno leggendo questa discussione

0 utenti, 0 visitatori, 0 utenti anonimi