Stampare gli indici di 2 o più valori massimi in un array (in C)

di il
5 risposte

Stampare gli indici di 2 o più valori massimi in un array (in C)


Cattura.PNG
Cattura.PNG

Mentre mi esercitavo con questo testo mi sono chiesto una cosa: e se nel punto 6 venisse chiesto di stampare, eventualmente ci fossero, il valore di ym di più massimi come dovrei fare? qualcuno può darmi una mano?
Allego il mio codice:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
double genInput(double, double, char *strn);
void distanza(double D, double d, double ym, double *A, double *B);
double onda(double L);
double genRand(double a, double b);
int main() {
    srand(time(NULL));
    double d, D, yM;
    d = genInput(5, 40, "la distanza delle sorgenti dall'asse x");
    D = genInput(90, 140, "l' ascissa del microfono");
    yM = genInput(0, 70, "Il valore assoluto dell' ordinata del microfono");
    int i;
    double A, B, ym, dist=0, oA, oB, a[101][2];
    ym = genRand(yM, -yM);
    for (i = 0; i < 101; i++) {
        dist += ym;
        distanza(D,d,dist,&A,&B);
        oA = onda(A);
        oB = onda(B);
        a[i][0] = pow(oA + oB,2);
        a[i][1] = dist;
    }
    double max = a[0][0];
    int segnaposto;
    for (i = 0; i < 101; i++) {
        if (a[i][0] >= max) {
            max = a[i][0];
            segnaposto = i;
        }
    }
    printf("Le coordinate del microfono con maggiore intensita' sono: (%.3lf,%.3lf)\n",D,a[segnaposto][1]);
    FILE *f; 
    f = fopen("young.dat","w");
    fprintf(f, "%lf %lf %lf\n",D,a[segnaposto][1],max);
    fclose(f);
}

double genInput(double a, double b, char *strn) {
    double N;
    do {
        printf("Inserisci %s: ",strn);
        scanf("%lf",&N);
        if (N <= a || N >= b) {
            printf("ERRORE: il numero deve appartenere all'intervallo (%.3lf,%.3lf)\n",a,b);
        }
    } while (N <= a || N >= b);
    return N;
}

void distanza(double D, double d, double ym, double *A, double *B) {
    double La, Lb;
    La = sqrt(D*D + pow(d - ym,2));
    Lb = sqrt(D*D + pow(-d - ym,2));
    *A = La;
    *B = Lb;
}

double genRand(double a, double b) {
    double rnd;
    rnd = rand()/((double)RAND_MAX)*(a - (b)) + b;
    return rnd;
}

double onda(double L) {
    double delta;
    delta = genRand(0.05, -0.05);
    return sin(2*M_PI*15000*L/343)*(1+delta);
}

5 Risposte

  • Re: Stampare gli indici di 2 o più valori massimi in un array (in C)

    Lato programmazione sarebbe semplice: una volta calcolato il massimo, ti fai un array di 101 booleani e ti segni quali sono i punti il cui valore corrisponde al massimo.

    Tuttavia fisicamente la questione è più complessa. Dovresti prima farti uno studio di funzione e vedere dove sono i massimi prima di scrivere il programma, altrimenti rischi di prendere fischi per fiaschi (immagina che siano esattamente due: molto probabilmente uno te lo perderesti perché non hai a disposizione infiniti campioni). Diciamo che a livello di esame ragionevolmente il massimo sarà sempre e solo uno, altrimenti il problema diventa troppo lungo
  • Re: Stampare gli indici di 2 o più valori massimi in un array (in C)

    Non credo che il massimo sarà uno solo
    Da una prima stima a naso gli spostamenti del punto calcolato sono dello stesso ordine di grandezza della lunghezza d'onda
    Temo quindi che ci saranno più massimi locali
    Nemmeno tutti uguali
    Comunque l'analisi preventiva ci porterebbe a cosa?
    Alle righe di diffrazione e un massimo assoluto in posizione centrale rispetto alle sorgenti
    Che non è quello che cerchiamo, temo
  • Re: Stampare gli indici di 2 o più valori massimi in un array (in C)

    Per Weierstrass:
    Non ho studiato i booleani per il momento, probabilmente il problema chiede di individuarne uno solo. Per quanto riguarda il resto il programma ti sembra ok?
  • Re: Stampare gli indici di 2 o più valori massimi in un array (in C)

    Boolean non esiste (o meglio, anche se esistesse come tipo separato, non sarebbe indispensabile utilizzarla). É una variabile intera che, nel codice, non assume valori diversi da 0 (falso) o 1 (vero).
  • Re: Stampare gli indici di 2 o più valori massimi in un array (in C)

    Distanza() non restituisce come invece è espressamente richiesto
Devi accedere o registrarti per scrivere nel forum
5 risposte