Confronto con il modulo in un array

di il
7 risposte

Confronto con il modulo in un array

Salve a tutti, sto cercando di scrivere un programma che mi permetta di fare un prodotto tra una matrice (array bidimensionale N*N) con un vettore di N componenti; Sono riuscito a scrivere il prodotto righe per colonne tra la matrice "A" e il vettore "b"; essenzialmente voglio trovare un vettore c=A[j]*b[j] che devo iterare finchè la differenza massima tra le componenti del vettore c e di quelle b[j] risultino essere inferiori ad una certa soglia, ad esempio di 0.01. L'idea che mi è venuta in mente è quella di usare un ciclo do / while, ma non so come scrivere l'istruzione del modulo. Vi riporto in basso il listato che ho scritto:
#include <stdio.h>
#include <math.h>
#define N 4

main (){

  double A[N][N];
  double b[N];
  double c[N]={0.,0.,0.,0.};
  int n,i,j;
  
  printf("Inserire la dimensione della matrice (N<4):");
  scanf("%d", &n);
  printf("\n Inserisci ora gli elementi della matrice e del vettore\n");
  
  for(i=0;i<n;i++){
    
    for(j=0;j<n;j++){
      
      printf("A[%d, %d] = ", i,j);
      scanf("%lf", &A[i][j]);
      
    }
    
    printf("b[%d] = ", i);
    scanf("%lf", &b[i]);
    
  }


  /* Svolgo il prodotto righe per colonne */


  for(i=0;i<N;i++){

    do {
      
      for(j=0;j<N;j++){
	
	c[i] += A[i][j]*b[j];
	
      }
         
   c[i]==b[i];
  /*per continuare l'iterazione, la posizione fatta sulla riga di sopra è corretta??*/    
    
} while ((b[j]-c[i])<0.01);   /* vorrei che il modulo della differenza tra le componenti del vettore iniziale e di quello possa essere al massimo < 0.01, ma non so proprio come scrivere il modulo!! */
    
    printf("c[%d]=%lf\n",i,c[i]);
    
    
  }
  
  printf("\n");
  
}
Qualcuno sa darmi una mano?

7 Risposte

  • Re: Confronto con il modulo in un array

    Leggi il regolamento e applica i tag code nel tuo codice cosi riusciamo a comprendere cosa ha scritto.
  • Re: Confronto con il modulo in un array

    Scusa, non avevo visto il tasto Code..
  • Re: Confronto con il modulo in un array

    Main e basta non esiste, modificalo in int main.
    Guarda sta riga
    
    double c[N]={0.,0.,0.,0.};
    
    Se N cambia devi riscriverla, quindi trova un modo generico.
    Infine guarda sta funzione fmod
  • Re: Confronto con il modulo in un array

    La riga
    double c[N]={0.,0.,0.,0.};
    effettivamente non rende generico il programma, ma al momento stavo facendo delle prove con una matrice 4x4, per inizializzarla con tutti 0 basta fare un ciclo for che riempia il vettore di zeri.

    Per quanto riguarda il main, anche senza l'int esterno non mi da problemi (in alcuni listati che ho letto sui libri di università viene spesso omesso l int, probabilmente perchè non compare un return(0) alla fine del programma, e l'int probabilemte in quel caso è d'obbligo, ma può essere che quello che sto dicendo sia poco corretto in quanto non sono un esperto di programmazione, però questa e l idea che mi sono fatto, visto che il programma, per una matrice 4x4 ed omettendo il do e lo while, gira).

    La funzione modulo è diversa da quella che sto cercando. Io vorrei l'operatore modulo matematico, ovvero quell'operatore che restituisce un numero positivo dalla somma o sottrazione di due numeri es.
    |2-3|=1=|3-2|

    La funzione modulo " % " restituisce il resto di un quoziente, e non è quello di cui ho bisogno..
  • Re: Confronto con il modulo in un array

    Allora è la funzione abs
    I libri di scuola sono tutti da buttare in quanto int main è OBBLIGATORIO per un compilatore decente, diciamo post 1998.
  • Re: Confronto con il modulo in un array

    Grazie, era "abs" quello che cercavo! Mi sono espresso male, non era il modulo ma bensì il valore assoluto quello che cercavo!..
    Ora però se provo a far girare il programma di prima, mi gira all'infinito. Penso che il il do/while non sia corretto. Vorrei che il ciclo for continuasse l'iterazione finchè la differenza massima tra le componenti del nuovo vettore c rispetto alle vecchie componenti b (il vettore b lo inizializzo da tastiera) risultino essere al massimo di 0.01, e finchè c è anche solo una differenza tra le componenti maggiore di 0.01 il ciclo continui.
    Per questo motivo ho pensato di inserire il "do" all'interno del primo ciclo (quello della i) in modo da poter effettuare il confronto con ogni componente del vettore c rispetto a quella del vettore b[j];
    il ciclo deve arrestarsi solo quando il valore assoluto della differenza tra le componenti dei due vettori è inferiore a 0.01, per cui metterei un
    while(abs(c[i]-b[j])>=0.01)
    . Il problema è che non so dove mettere la condizione che, nel caso in cui non sia soddisfatta la condizione del valore assoluto, il vecchio vettore b[j] deve essere sostituito con quello appena calcolato c, ovvero porre b==c (in modo che piano piano le componenti cambino e la loro differenza tende sempre più a diminuire); Se metto la condizione dopo il while, il programma non la legge (correggetemi se mi sbaglio!) mentre se metto tale condizione prima del while il ciclo dovrebbe arrestarsi (la differenza tra le componenti è nulla perchè c=b) e così non farebbe quello che vorrei.. come posso fare^
    
      for(i=0;i<N;i++){
        
      do {
          for(j=0;j<N;j++){
    	c[i] += A[i][j]*b[j];
          }            
    } while (abs(c[i]-b[j])>=0.01){
    
    c[i]==b[i]; /* dove va messa questa condizione??*/
    
    }
    }
    
  • Re: Confronto con il modulo in un array

    Non riesco a comprendere la comparazione nel while. Il b[j] non è valido una volta uscito dal for perche a quel punto j == N. Quindi scrivi magari in pseudocodice quello che stai cercando di fare.
Devi accedere o registrarti per scrivere nel forum
7 risposte