Metodo di eliminazione di gauss-errore sulle matrici

di
Anonimizzato6712
il
1 risposte

Metodo di eliminazione di gauss-errore sulle matrici

Ho dei problemi con questo codice con le matrici...Non posso usare i puntatori qualcuno mi sa dare una mano(come compilatore uso gcc o g++).

grazie in anticipo allego il codice.
//questo programma risolve con il metodo di gauss sistemi di equazioni di primo grado.

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
void leggidim(int& n)
{
  printf("inserire la dimensione della marice: n=");scanf("%d",&n);
  return;
}
void leggimatrice(int n,double a[][n])
{
  int d=1;
  while (d==1)
  {
  printf("\n\ninserire i coefficenti della matrice riga per riga");
  for (int i=0; i<n; i++) 
    for (int j=0;j<n;j++)
    {
      printf("\n A%d,%d=",i+1,j+1);scanf("%lf",&a[i][j]);
    }
  for (int i=0;i<n;i++) {
    printf("\n |");
    for (int j=0;j<n;j++){ 
      printf("%d" ,a[i][j]);
      printf(" |");
  }
  }
    printf("\n\nE' questa la matrice che volevi inserire?Se si premi 0 altrimenti premi 1 e risrivi i coefficenti");scanf("%d",&d);
  }
  return;
}
void leggivett(int n,double b[])
{
  int d=0;
  while (d==0) {
    for (int i=0;i<=n;i++) {
       printf("inserisci i termini noti riga per riga");scanf("%lf",&b[i]);
       float palfa;
       }
       printf("Sono questi i termini noti?");
       for (int j=0;j<n;j++)
       printf("|%f|\n!",b[j]);
       printf("\nse si premi 1 altrimenti premi 0");scanf("%d",&d);
  }
  return;
}
void riduci (int n,double a[][n],double b[])
{
  double m[n-1][n];
  for (int k=0;k<n;k++)
    for (int i=1;i<=n;i++)
    {
      double f[n];
      if (fabs(a[i][k])>fabs(a[k][k])) 
	if(fabs(a[i][k])!=fabs(a[k][k])) 
	  for(int l=o;l<n;l++)                                       //a questo punto il programma stabilisce qual'e' la riga 
      {                                                              //con il pivot maggiore ossia quello piu' grande in valore assoluto
	f[l]=a[i][k];
	a[k][k]=a[i][k];
	a[i][k]=f[l];
      }
    }
    for (int i=k+1;i<n;i++)
    {
      m[i][k]=a[i][k]/a[k][k];           //creazione di un coefficente per l'eliminazione.  
      for(int j=k+1;j<n;j++)
	a[i][j]=a[i][j]-m[i][k]*a[k][j]; //riduzione dei coeff
    b[i]=b[i]-m[i][k]*b[k];              //riduzione dei termini noti
    }
	return;
}
void calcola(int n, double a[][n], double b[], double x[])
{
  x[n]=b[n]/a[n][n];
  
  for (int i=n-1; i>0; i--)
  {
    x[i]=0
    for (int j=n;j>0;j--)
    {
      x[i]+=(x[j]*a[i][j])/b[i];
    }
  }
  return;
}
void stampa(double x[])
{
  for (int i=0;i<n;i++)
    printf("%lf",x[i]);
  return;
}
main()
{
  int n;
  leggidim(n);
  double a[n][n],b[n];
  leggimatrice(n,a);
  leggivett(n,b);
  riduci(n,a,b);
  double x[n];
  calcola(n,a,b,x);
  stampa(x);
  return 0;
}

1 Risposte

  • Re: Metodo di eliminazione di gauss-errore sulle matrici

    Ciao, come prima cosa ti segnalo che è inutile postare tutto questo codice, senza un commento o descrivendo che tipo di problema hai. Anche la persona più generosa del forum non riuscirebbe ad aiutarti

    Non sapendo che tipo di problema hai, posso cmq darti un primo possibile errore che ho riscontrato nel main del tuo codice:
    
    int n;
    leggidim(n);
    double a[n][n],b[n];
    
    Questa sintassi è illegale in c. Infatti te stai cercando di allocare una matrice statica (a) e un vettore statico (b) con il parametro dinamico n, che il compilatore non ha modo di sapere in fase di compilazione. Per creare una matrice nxn e un vettore di lunghezza n devi allocare dinamicamente la memoria, utilizzando la funzione malloc, disponibile nella libreria <stdlib.h> (che è già stata includa).
    Un'altra cosa da segnalare è il passaggio del parametro n per valore nella funzione leggidim. Per fare in modo che leggidim modifichi la tua variabile n, gliela devi passare per indirizzo, e quindi devi modificare anche la funzione che deve prendere come paramentro un puntatore ad n.
    Ultima cosa, in c si dichiarano sempre prima le variabili, e poi il codice. Non è come in java, o c++ dove puoi fare quello che vuoi.
    Quindi il codice lo devi cambiare con questo:
    
    int i, n;
    double ** a, *b;
    
    leggidim(&n);
    a = (int **) malloc(sizeof(int *) * n);
    for (i = 0; i < n; i++)
       a[i] = (int *) malloc(sizeof(int) * n);
    
    v = (int *) malloc(sizeof(int) * n);
    
    Saluti.
Devi accedere o registrarti per scrivere nel forum
1 risposte