Oppure

Loading
20/05/12 17:22
Giuan
Ragazzi ho realizzato un programma in C++ che permette di risolvere un sistema di quarto ordine con il metodo pivot...Funziona,unico problema lo si ha quando uno degli zeri si trova sotto la diagonale principale e pertanto quando mi va a risolvere,mi dà floating point error,come risolvo?

//programma che consente di eseguire un sistema di quarto ordine con il metodo di pivout
#include<stdio.h>
#include<conio.h>
#include <math.h>        //inclusione librerie
#include<dos.h>
#include<fstream.h>
#include<graphics.h>
void compl41(int &);  //richiamo funzioni importanti per il calcolo del delta
void compl42(int &);
void compl43(int &);
void compl44(int &);
void det();    //calcolo del delta
float tt,y,z,xx;
void vai();   //serve per la risouzione con gauss
void stamp(); //stampa delle soluzioni
float mat[4][5];   //dichiarazione matrice
void scoef();
void tnot();
void Scelta();

void main()
{ Scelta();
  textcolor(WHITE);
char c;
do
{textcolor(WHITE);
 clrscr();
 printf("\n\n");
 textcolor(LIGHTRED);
 cprintf("                      INSERIMENTO DATI DELLA ");
 cprintf("PRIMA EQUAZIONE:");
 textcolor(YELLOW);
 printf("\n\n\n");
 cprintf(" -- Inserire il coefficiente della x1: ");
 scanf("%f",&mat[1][1]);
 printf("\n\n");
 cprintf(" -- Inserire il coefficiente della x2: ");
 scanf("%f",&mat[1][2]);
 printf("\n\n");
 cprintf(" -- Inserire il coefficiente della x3: ");
 scanf("%f",&mat[1][3]);
 printf("\n\n");
 cprintf(" -- Inserire il coefficiente della x4: ");
 scanf("%f",&mat[1][4]);
 printf("\n\n");
 cprintf(" -- Inserire il termine noto: ");
 scanf("%f",&mat[1][5]);

 textcolor(LIGHTGREEN);
 clrscr();
 printf("\n\n");
 textcolor(LIGHTRED);
 cprintf("                      INSERIMENTO DATI DELLA ");
 cprintf("SECONDA EQUAZIONE:");
 textcolor(YELLOW);
 printf("\n\n\n");
 cprintf(" -- Inserire il coefficiente della x1: ");
 scanf("%f",&mat[2][1]);
 printf("\n\n");
 cprintf(" -- Inserire il coefficiente della x2: ");
 scanf("%f",&mat[2][2]);
 printf("\n\n");
 cprintf(" -- Inserire il coefficiente della x3: ");
 scanf("%f",&mat[2][3]);
 printf("\n\n");
 cprintf(" -- Inserire il coefficiente della x4: ");
 scanf("%f",&mat[2][4]);
 printf("\n\n");
 cprintf(" -- Inserire il termine noto: ");
 scanf("%f",&mat[2][5]);

 textcolor(LIGHTCYAN);
 clrscr();
 printf("\n\n");
 textcolor(LIGHTRED);
 cprintf("                      INSERIMENTO DATI DELLA ");
 cprintf("TERZA EQUAZIONE:");
 textcolor(YELLOW);
 printf("\n\n\n");
 cprintf(" -- Inserire il coefficiente della x1: ");
 scanf("%f",&mat[3][1]);
 printf("\n\n");
 cprintf(" -- Inserire il coefficiente della x2: ");
 scanf("%f",&mat[3][2]);
 printf("\n\n");
 cprintf(" -- Inserire il coefficiente della x3: ");
 scanf("%f",&mat[3][3]);
 printf("\n\n");
 cprintf(" -- Inserire il coefficiente della x4: ");
 scanf("%f",&mat[3][4]);
 printf("\n\n");
 cprintf(" -- Inserire il termine noto: ");
 scanf("%f",&mat[3][5]);

 textcolor(LIGHTMAGENTA);
 clrscr();
 printf("\n\n");
 textcolor(LIGHTRED);
 cprintf("                      INSERIMENTO DATI DELLA ");
 cprintf("QUARTA EQUAZIONE:");
 textcolor(YELLOW);
 printf("\n\n\n");
 cprintf(" -- Inserire il coefficiente della x1: ");
 scanf("%f",&mat[4][1]);
 printf("\n\n");
 cprintf(" -- Inserire il coefficiente della x2: ");
 scanf("%f",&mat[4][2]);
 printf("\n\n");
 cprintf(" -- Inserire il coefficiente della x3: ");
 scanf("%f",&mat[4][3]);
 printf("\n\n");
 cprintf(" -- Inserire il coefficiente della x4: ");
 scanf("%f",&mat[4][4]);
 printf("\n\n");
 cprintf(" -- Inserire il termine noto: ");
 scanf("%f",&mat[4][5]);
 textcolor(WHITE);
 cprintf("\n\n\n Vuoi ripetere l'immisione dei dati? (S/N)");
 do{ c=getch(); fflush(stdin); }while(c!='s'&&c!='S'&&c!='n'&&c!='N');
 if(c=='n'||c=='N')
 { scoef();
   tnot();
   det();
  do{ c=getch(); fflush(stdin); }while(c!='s'&&c!='S'&&c!='n'&&c!='N');
 }
}
while(c=='S'||c=='s');

}


void det()
{float determinante;
 clrscr();
 cprintf("\n\n\n DETERMINANTE");

  int ascissa=1,ordinata;
   while(ascissa<5)
    {
     ordinata=1;
      while(ordinata<5)
       {
	gotoxy(9+ascissa*6,8+ordinata*3);
	printf("%2.f",mat[ordinata][ascissa]);
	ordinata++;
       }
     ascissa++;
    }
 gotoxy(36,10);
 printf("³");
 gotoxy(36,11);
 printf("³");
 gotoxy(36,12);
 printf("³");
 gotoxy(36,13);
 printf("³");
 gotoxy(36,14);
 printf("³");
 gotoxy(36,15);
 printf("³");
 gotoxy(36,16);
 printf("³");
 gotoxy(36,17);
 printf("³");
 gotoxy(36,18);
 printf("³");
 gotoxy(36,19);
 printf("³");
 gotoxy(36,20);
 printf("³");
 gotoxy(56,10);
 printf("³");
 gotoxy(56,11);
 printf("³");
 gotoxy(56,12);
 printf("³");
 gotoxy(56,13);
 printf("³");
 gotoxy(56,14);
 printf("³");
 gotoxy(56,15);
 printf("³");
 gotoxy(56,16);
 printf("³");
 gotoxy(56,17);
 printf("³");
 gotoxy(56,18);
 printf("³");
 gotoxy(56,19);
 printf("³");
 gotoxy(56,20);
 printf("³");
 ascissa=1;
  while(ascissa<=3)
   {
    ordinata=1;
     while(ordinata<=4)
      {
       gotoxy(35+ascissa*6,8+ordinata*3);
       printf("%2.f",mat[ordinata][ascissa]);
       ordinata++;
      }
    ascissa++;
   }


int ris1,ris2,ris3,ris4;
compl41(ris1);
float a=mat[4][1]*ris1;
compl42(ris2);
 float b=mat[4][2]*ris2;
 compl43(ris3);
 float c=mat[4][3]*ris3;
 compl44(ris4);
 float d=mat[4][4]*ris4;
  determinante=a+b+c+d;
 if (determinante==0)
  { printf("\n\n    DELTA=0!  ");
    printf("\n\n ATTENZIONE...Il sistema risulta IMPOSSIBILE / INDETERMINATO");
    printf("\n\n Vuoi continuare ad inserire dati? (S/N)");
  }
 else
 { printf("\n\n\n Stampa del determinante: %f",determinante);
   printf("\n Premere un tasto per visualizzare le soluzioni...");
   getch();
   vai();
 }

}

void compl41(int & risu1)
{ int miti=(mat[1][2]*mat[2][3]*mat[3][4])+(mat[1][3]*mat[2][4]*mat[3][2])+(mat[1][4]*mat[2][2]*mat[3][3]);
 int mit1=(mat[1][3]*mat[2][2]*mat[3][4])+(mat[1][2]*mat[2][4]*mat[3][3])+(mat[1][4]*mat[2][3]*mat[3][2]);
  risu1=-miti+mit1;

}

void compl42(int & risu2)
{int miti=(mat[1][1]*mat[2][3]*mat[3][4])+(mat[1][3]*mat[2][4]*mat[3][1])+(mat[1][4]*mat[2][1]*mat[3][3]);
 int mit1=(mat[1][3]*mat[2][1]*mat[3][4])+(mat[1][1]*mat[2][4]*mat[3][3])+(mat[1][4]*mat[2][3]*mat[3][1]);
 risu2=miti-mit1;

}

void compl43(int & risu3)
{int miti=(mat[1][1]*mat[2][2]*mat[3][4])+(mat[1][2]*mat[2][4]*mat[3][1])+(mat[1][4]*mat[2][1]*mat[3][2]);
 int mit1=(mat[1][2]*mat[2][1]*mat[3][4])+(mat[1][1]*mat[2][4]*mat[3][2])+(mat[1][4]*mat[2][2]*mat[3][1]);
 risu3=-miti+mit1;


}

void compl44(int & risu4)
{
int miti=(mat[1][1]*mat[2][2]*mat[3][3])+(mat[1][2]*mat[2][3]*mat[3][1])+(mat[1][3]*mat[2][1]*mat[3][2]);
 int mit1=(mat[1][2]*mat[2][1]*mat[3][3])+(mat[1][1]*mat[2][3]*mat[3][2])+(mat[1][3]*mat[2][2]*mat[3][1]);
 risu4=miti-mit1;

}


void vai()

{if(mat[1][1]==0)
  {int vet[6];
  int gig=1;
   while(gig<=5)
   {vet[gig]=mat[1][gig];
    gig++;
   }
   int hh=1;
   while(hh<=5)
    {mat[1][hh]=mat[2][hh];
    mat[2][hh]=vet[hh];
    hh++;
    }
   }
 clrscr();
   float cu=mat[1][1];
   int a=1;
    while(a<=5)
     {
      mat[1][a]/=cu;
      a++;
     }
    int b=1;
    float qq=-mat[2][1];
    while(b<=5)
     { mat[2][b]+=mat[1][b]*qq;
       b++;
     }
     int so=2;
     float si=mat[2][2];
     while(so<=5)
      {
       mat[2][so]/=si;
       so++;
      }
     int d=1;
     float r=-mat[3][1];
     while(d<=5)
       {
	mat[3][d]+=mat[1][d]*r;
	d++;
       }
       int yaya=2;
       float rr=-mat[3][2];
       while(yaya<=5)
       {mat[3][yaya]+=mat[2][yaya]*rr;
	yaya++;
       }
       float bid=mat[3][3];
   int aaa=3;
    while(aaa<=5)
     {
      mat[3][aaa]/=bid;
      aaa++;
     }
	int eee=1;
      float r9=-mat[4][1];
      while(eee<=5)
       {
	mat[4][eee]+=mat[1][eee]*r9;
	eee++;
       }
       int yoyo=2;
       float rio=-mat[4][2];
    while(yoyo<=5)
       {mat[4][yoyo]+=mat[2][yoyo]*rio;
	yoyo++;
       }
	int noo=3;
       float rio1=-mat[4][3];
       while(noo<=5)
       {mat[4][noo]+=mat[3][noo]*rio1;
	noo++;
       }
       float bidib=mat[4][4];
   int cr=4;
    while(cr<=5)
     {
      mat[4][cr]/=bidib;
      cr++;
     }
     tt=mat[4][5];

    float tnot=mat[3][5];
    float sper=mat[3][4]*tt;
     z=tnot-sper;

    float ale=mat[2][3]*z;
    float ale1=mat[2][4]*tt;
    float tnot1=mat[2][5];
    y=tnot1-(ale+ale1);

    float giu=mat[1][2]*y;
    float giu1=mat[1][3]*z;
    float giu2=mat[1][4]*tt;
    float tnot2=mat[1][5];
    xx=tnot2-(giu+giu1+giu2);

   stamp();
   }

void stamp()
{printf("\n\n\nCOEFFICIENTI DEL SISTEMA CON IL METODO DI PIVOUT");
 int he=1,ordinata;
 while(he<=5)
   {
    ordinata=1;
     while(ordinata<5)
      {
       delay(350);
       gotoxy(25+he*5,5+ordinata*3);
       printf("%2.f",mat[ordinata][he]);
       ordinata++;
      }
    he++;
   }
     printf(" \n\nSOLUZIONI: ");
     printf("\n x1: %.2f",xx);
     printf("\n x2: %.2f",y);
     printf("\n x3: %.2f",z);
     printf("\n x4: %.2f",tt);
     printf("\n\n Vuoi continuare ad inserire dati? (S/N)");
}

void scoef()
{clrscr();

 printf("\n\n                          MATRICE DEI COEFFICIENTI");
 int i=1,j;
  while(i<5)
   {
    j=1;
     while(j<5)
      {delay(350);
       gotoxy(23+i*6,8+j*3);
       printf("%2.f",mat[j][i]);
       j++;
      }
    i++;
   }
 delay(500); printf("\n\n Premere un tasto per continuare...");
 getch();
 }

void tnot()
{ clrscr();

 printf("\n\n                             TERMINI NOTI");
 int i=1,j=1;
  while(i<5)
   {delay(350);
    gotoxy(35+i*0,8+j*3);
    printf("%2.f",mat[i][5]);
    i++;
    j++;
   }
delay(500); printf("\n\n Premere un tasto per continuare..."); getch();
}
aaa
20/05/12 17:29
nessuno
E in quale linea ti dà l'errore?

Probabilmente è una divisione per zero ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
20/05/12 17:30
Giuan
Si,l'ho capito che è una divisione per zero...E' la variabile si che è uguale a zero...Pertanto non so ora come posso proseguire con il pivout...Idee? Domani lo devo consegnare ragà per favore un aiuto
aaa
20/05/12 17:41
nessuno
Postato originariamente da Giuan:

Si,l'ho capito che è una divisione per zero...E' la variabile si che è uguale a zero...


Se l'avevi già capito, perché non l'hai detto?

Pertanto non so ora come posso proseguire con il pivout...


Si chiama pivot ... perché continui a scrivere pivout ?

Idee? Domani lo devo consegnare ragà per favore un aiuto


Non conosco a fondo il metodo ma se una variabile che utilizzi come denominatore diventa uguale a zero allora devi solo controllarla prima di dividere.

if(si==0.0) ...
else ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.