Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C] funzione somma elementi sopra diagonale matrice

    scrivere una funzione che faccia la somma dei numeri sopra la diagonale di una matrice.
    io ho scritto
    codice:
    double sumdiag(double **a,int m);{
    int i,j;
    double sum =0.0;
    for(i=0;i<n;++i){
    for (j=0; j<n;++j)
    sum += a[i-1][j];
    return sum;
    }
    ma è errata.dove sbaglio?

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Il ; alla prima riga. Ma che errori riporta?
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Scusa, se devi sommare solo i numeri sulla diagonale (di fatto calcolare la traccia della matrice) perché hai due for?
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Originariamente inviato da MItaly
    Scusa, se devi sommare solo i numeri sulla diagonale (di fatto calcolare la traccia della matrice) perché hai due for?
    ma a me servono quelli sopra la diagonale,non sulla diagonale.
    a parte il; ci sono altri errori?
    mi interessava capire soprattutto se l'algoritmo è giusto.
    se gli elementi sulla diagonale hanno lo stesso indice i,k, quelli sopra avranno i-1,k, o no?

  5. #5
    Originariamente inviato da pablito92
    ma a me servono quelli sopra la diagonale,non sulla diagonale.
    Ah, pardon, letto male... Ma intendi sommare questi:
    codice:
    +-         -+
    | . x x x x |
    | . . x x x |
    | . . . x x |
    | . . . . x |
    | . . . . . |
    +-         -+
    o questi:
    codice:
    +-         -+
    | . x . . . |
    | . . x . . |
    | . . . x . |
    | . . . . x |
    | . . . . . |
    +-         -+
    ?
    In ogni caso il tuo codice è sbagliato, dato che stai sì sommando gli elementi una riga sopra rispetto agli indici del tuo ciclo, ma il ciclo scorre su tutti gli elementi, per cui di fatto stai sommando comunque tutti gli elementi tranne quelli dell'ultima riga, più alcuni valori non validi (vai ad accedere alla "riga -1", il che probabilmente risulta in un crash - se sei fortunato).
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Originariamente inviato da MItaly
    Ah, pardon, letto male... Ma intendi sommare questi:
    codice:
    +-         -+
    | . x x x x |
    | . . x x x |
    | . . . x x |
    | . . . . x |
    | . . . . . |
    +-         -+
    o questi:
    codice:
    +-         -+
    | . x . . . |
    | . . x . . |
    | . . . x . |
    | . . . . x |
    | . . . . . |
    +-         -+
    ?
    In ogni caso il tuo codice è sbagliato, dato che stai sì sommando gli elementi una riga sopra rispetto agli indici del tuo ciclo, ma il ciclo scorre su tutti gli elementi, per cui di fatto stai sommando comunque tutti gli elementi tranne quelli dell'ultima riga, più alcuni valori non validi (vai ad accedere alla "riga -1", il che probabilmente risulta in un crash - se sei fortunato).
    a me servono questi
    +- -+
    | . x x x x |
    | . . x x x |
    | . . . x x |
    | . . . . x |
    | . . . . . |
    +- -+.

    sapresti dirmi quindi come modificarla?

  7. #7
    Il doppio ciclo allora va bene; nella somma rimetti sum += a[i][j]; (in modo da evitare contorsioni mentali sugli indici); a questo punto, ragiona sui limiti sugli indici dei for: quando sei sulla prima riga devi sommare gli elementi dal secondo all'ultimo, quando sei sulla seconda riga devi sommare dal terzo all'ultimo...
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Originariamente inviato da MItaly
    Il doppio ciclo allora va bene; nella somma rimetti sum += a[i][j]; (in modo da evitare contorsioni mentali sugli indici); a questo punto, ragiona sui limiti sugli indici dei for: quando sei sulla prima riga devi sommare gli elementi dal secondo all'ultimo, quando sei sulla seconda riga devi sommare dal terzo all'ultimo...
    così come ti pare:
    codice:
    double sumdiag(double **a,int n){
     int i,j; 
    double sum =0.0; 
    for(j=0;j<n;++j){ 
    for (i=0; i<n;++i){
     if(a!=[i][i]) 
    sum += a[i][j+1]; 
    return sum; 
    } 
    }

  9. #9
    Ma no, non ha senso né a livello di sintassi, né a livello di logica... Ragiona sui limiti dei for, come ti ho scritto nel messaggio precedente... come scriveresti il risultato che vuoi ottenere in termini di sommatorie? O anche, che relazione deve sussistere tra i e j perché l'elemento che identificano sia sopra la diagonale?
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    I for falli andare da 0 a m/2-1 e da 0 a n/2-1 (con m= numero di righe, n= numero di colonne).

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.