Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Ilmalcom
    Registrato dal
    Oct 2002
    Messaggi
    1,345

    [C] Mi aiutate a verificare se è corretto?

    Ciao a tutti, mi è stato dato il seguente problema da risolvere: Dato un array v di numeri reali e un numero reale x, scrivere
    una funzione che determina se esistono due elementi distinti in v la
    cui somma e` x. Nel programma principale stampare eventulmente tali
    elementi.

    Il prototipo della funzione e`:
    int sommaX(double v[], int dim, int x, int *y, int *z)

    [La soluzione migliore non usa due cicli annidati.]

    Ovviamente risolverlo diventa molto facile tramite i due cicli annidati, ma mi interessava proprio trovare la soluzione migliore Io ho pensato a questa e vorrei sapere il vostro parere a riguardo. Nota: sort è una funzione già scritta e funzionante che non fa altro che ordinare in modo decrescente l'array

    codice:
    int sommaX (double v[], int dim, double x, double *y, double *z) {
            int inf = 0, sup = dim - 1;
            sort (v,dim);
            while (inf <= sup) {
                    if (v[inf] + v[sup] == x) {
                            *y = v[inf];
                            *z = v[sup];
                            return 1;
                    }
                    else {
                            if (v[inf] + v[sup] < x)
                                    sup--;
                            else
                                    inf++;
                    }
            }
            return 0;
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Io ho provato con questo programma (togliendo l'ordinamento decrescente che ho imposto all'array), ma non funziona tanto bene:
    codice:
       double vett[] = {10.1, 7.0, 5.2, 4.7, 2.0, 1.5};
       double primo, secondo;
       if ( sommaX(vett, 6, 12.2, &primo, &secondo) ) {
          printf("Primo: %f\t Secondo: %f", primo, secondo);
       } else {
          printf("NO\n");
       }
       return 0;
    Se metto di cercarmi due numeri che sommati diano 10.1 li trova (primo e penultimo), ma con 12.2 non li trova (secondo e terzo).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Ilmalcom
    Registrato dal
    Oct 2002
    Messaggi
    1,345
    Deve essere solo un problema di approssimazioni, in quanto se utilizzo come vettore double vett[6] = {10.1, 7.0, 5, 4.7, 2.0, 1.5}; e specifico di volere gli elementi che danno come somma 12 stampa correttamente 7 e 5, mentre se metto 7.0 e 5.2 non funziona più idee su come risolvere?

  4. #4
    Deve essere solo un problema di approssimazioni
    Infatti, l'operatore == usato su double non ha senso.
    M'hanno fatto 'na capa tanta co' 'sta storia... ^__^
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  5. #5
    Utente di HTML.it L'avatar di Ilmalcom
    Registrato dal
    Oct 2002
    Messaggi
    1,345
    Originariamente inviato da dekdek
    Infatti, l'operatore == usato su double non ha senso.
    M'hanno fatto 'na capa tanta co' 'sta storia... ^__^
    Sì, ho presente il discorso e pensavo anche io a questa motivazione, infatti con gli interi funziona perfettamente, ma nel codice non c'è alcun frammento scritto con l'ipotesi che i numeri siano interi... Se ci sono altre idee ben vengano

  6. #6
    Utente di HTML.it L'avatar di Ilmalcom
    Registrato dal
    Oct 2002
    Messaggi
    1,345
    In effetti questo frammento di codice stampa a video 0...

    codice:
    int main (void) {
            double a = 12.3;
            double b = 3.4;
            printf ("%d\n", (a + b == 15.7));
            return 0;
    }

  7. #7
    Dovresti calcolarti l'epsilon macchina (non ricordo se serve quello assoluto o relativo) e confrontarlo con un valore significativo dell'uguaglianza.
    Qualcosa del tipo (siano 'a' e 'b' i due reali da confrontare):

    if ( abs((a/b)-1) < eps_macc)
    Pero' me lo sono inventato al momento, potrebbe non funzionare!!!

    P.S. L'epsilon macchina e' il piu' piccolo numero floating point x tale che:

    (x + 1) > 1

    Dovrebbe essere pari a 2^(-m), dove m sono i bit dedicati alla mantissa.
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

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.