Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Pivout
Forum - C/C++ - Pivout

Avatar
Giuan (Normal User)
Newbie


Messaggi: 7
Iscritto: 04/05/2012

Segnala al moderatore
Postato alle 19:22
Domenica, 20/05/2012
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?

Codice sorgente - presumibilmente C++

  1. //programma che consente di eseguire un sistema di quarto ordine con il metodo di pivout
  2. #include<stdio.h>
  3. #include<conio.h>
  4. #include <math.h>        //inclusione librerie
  5. #include<dos.h>
  6. #include<fstream.h>
  7. #include<graphics.h>
  8. void compl41(int &);  //richiamo funzioni importanti per il calcolo del delta
  9. void compl42(int &);
  10. void compl43(int &);
  11. void compl44(int &);
  12. void det();    //calcolo del delta
  13. float tt,y,z,xx;
  14. void vai();   //serve per la risouzione con gauss
  15. void stamp(); //stampa delle soluzioni
  16. float mat[4][5];   //dichiarazione matrice
  17. void scoef();
  18. void tnot();
  19. void Scelta();
  20.  
  21. void main()
  22. { Scelta();
  23.   textcolor(WHITE);
  24. char c;
  25. do
  26. {textcolor(WHITE);
  27.  clrscr();
  28.  printf("\n\n");
  29.  textcolor(LIGHTRED);
  30.  cprintf("                      INSERIMENTO DATI DELLA ");
  31.  cprintf("PRIMA EQUAZIONE:");
  32.  textcolor(YELLOW);
  33.  printf("\n\n\n");
  34.  cprintf(" -- Inserire il coefficiente della x1: ");
  35.  scanf("%f",&mat[1][1]);
  36.  printf("\n\n");
  37.  cprintf(" -- Inserire il coefficiente della x2: ");
  38.  scanf("%f",&mat[1][2]);
  39.  printf("\n\n");
  40.  cprintf(" -- Inserire il coefficiente della x3: ");
  41.  scanf("%f",&mat[1][3]);
  42.  printf("\n\n");
  43.  cprintf(" -- Inserire il coefficiente della x4: ");
  44.  scanf("%f",&mat[1][4]);
  45.  printf("\n\n");
  46.  cprintf(" -- Inserire il termine noto: ");
  47.  scanf("%f",&mat[1][5]);
  48.  
  49.  textcolor(LIGHTGREEN);
  50.  clrscr();
  51.  printf("\n\n");
  52.  textcolor(LIGHTRED);
  53.  cprintf("                      INSERIMENTO DATI DELLA ");
  54.  cprintf("SECONDA EQUAZIONE:");
  55.  textcolor(YELLOW);
  56.  printf("\n\n\n");
  57.  cprintf(" -- Inserire il coefficiente della x1: ");
  58.  scanf("%f",&mat[2][1]);
  59.  printf("\n\n");
  60.  cprintf(" -- Inserire il coefficiente della x2: ");
  61.  scanf("%f",&mat[2][2]);
  62.  printf("\n\n");
  63.  cprintf(" -- Inserire il coefficiente della x3: ");
  64.  scanf("%f",&mat[2][3]);
  65.  printf("\n\n");
  66.  cprintf(" -- Inserire il coefficiente della x4: ");
  67.  scanf("%f",&mat[2][4]);
  68.  printf("\n\n");
  69.  cprintf(" -- Inserire il termine noto: ");
  70.  scanf("%f",&mat[2][5]);
  71.  
  72.  textcolor(LIGHTCYAN);
  73.  clrscr();
  74.  printf("\n\n");
  75.  textcolor(LIGHTRED);
  76.  cprintf("                      INSERIMENTO DATI DELLA ");
  77.  cprintf("TERZA EQUAZIONE:");
  78.  textcolor(YELLOW);
  79.  printf("\n\n\n");
  80.  cprintf(" -- Inserire il coefficiente della x1: ");
  81.  scanf("%f",&mat[3][1]);
  82.  printf("\n\n");
  83.  cprintf(" -- Inserire il coefficiente della x2: ");
  84.  scanf("%f",&mat[3][2]);
  85.  printf("\n\n");
  86.  cprintf(" -- Inserire il coefficiente della x3: ");
  87.  scanf("%f",&mat[3][3]);
  88.  printf("\n\n");
  89.  cprintf(" -- Inserire il coefficiente della x4: ");
  90.  scanf("%f",&mat[3][4]);
  91.  printf("\n\n");
  92.  cprintf(" -- Inserire il termine noto: ");
  93.  scanf("%f",&mat[3][5]);
  94.  
  95.  textcolor(LIGHTMAGENTA);
  96.  clrscr();
  97.  printf("\n\n");
  98.  textcolor(LIGHTRED);
  99.  cprintf("                      INSERIMENTO DATI DELLA ");
  100.  cprintf("QUARTA EQUAZIONE:");
  101.  textcolor(YELLOW);
  102.  printf("\n\n\n");
  103.  cprintf(" -- Inserire il coefficiente della x1: ");
  104.  scanf("%f",&mat[4][1]);
  105.  printf("\n\n");
  106.  cprintf(" -- Inserire il coefficiente della x2: ");
  107.  scanf("%f",&mat[4][2]);
  108.  printf("\n\n");
  109.  cprintf(" -- Inserire il coefficiente della x3: ");
  110.  scanf("%f",&mat[4][3]);
  111.  printf("\n\n");
  112.  cprintf(" -- Inserire il coefficiente della x4: ");
  113.  scanf("%f",&mat[4][4]);
  114.  printf("\n\n");
  115.  cprintf(" -- Inserire il termine noto: ");
  116.  scanf("%f",&mat[4][5]);
  117.  textcolor(WHITE);
  118.  cprintf("\n\n\n Vuoi ripetere l'immisione dei dati? (S/N)");
  119.  do{ c=getch(); fflush(stdin); }while(c!='s'&&c!='S'&&c!='n'&&c!='N');
  120.  if(c=='n'||c=='N')
  121.  { scoef();
  122.    tnot();
  123.    det();
  124.   do{ c=getch(); fflush(stdin); }while(c!='s'&&c!='S'&&c!='n'&&c!='N');
  125.  }
  126. }
  127. while(c=='S'||c=='s');
  128.  
  129. }
  130.  
  131.  
  132. void det()
  133. {float determinante;
  134.  clrscr();
  135.  cprintf("\n\n\n DETERMINANTE");
  136.  
  137.   int ascissa=1,ordinata;
  138.    while(ascissa<5)
  139.     {
  140.      ordinata=1;
  141.       while(ordinata<5)
  142.        {
  143.         gotoxy(9+ascissa*6,8+ordinata*3);
  144.         printf("%2.f",mat[ordinata][ascissa]);
  145.         ordinata++;
  146.        }
  147.      ascissa++;
  148.     }
  149.  gotoxy(36,10);
  150.  printf("³");
  151.  gotoxy(36,11);
  152.  printf("³");
  153.  gotoxy(36,12);
  154.  printf("³");
  155.  gotoxy(36,13);
  156.  printf("³");
  157.  gotoxy(36,14);
  158.  printf("³");
  159.  gotoxy(36,15);
  160.  printf("³");
  161.  gotoxy(36,16);
  162.  printf("³");
  163.  gotoxy(36,17);
  164.  printf("³");
  165.  gotoxy(36,18);
  166.  printf("³");
  167.  gotoxy(36,19);
  168.  printf("³");
  169.  gotoxy(36,20);
  170.  printf("³");
  171.  gotoxy(56,10);
  172.  printf("³");
  173.  gotoxy(56,11);
  174.  printf("³");
  175.  gotoxy(56,12);
  176.  printf("³");
  177.  gotoxy(56,13);
  178.  printf("³");
  179.  gotoxy(56,14);
  180.  printf("³");
  181.  gotoxy(56,15);
  182.  printf("³");
  183.  gotoxy(56,16);
  184.  printf("³");
  185.  gotoxy(56,17);
  186.  printf("³");
  187.  gotoxy(56,18);
  188.  printf("³");
  189.  gotoxy(56,19);
  190.  printf("³");
  191.  gotoxy(56,20);
  192.  printf("³");
  193.  ascissa=1;
  194.   while(ascissa<=3)
  195.    {
  196.     ordinata=1;
  197.      while(ordinata<=4)
  198.       {
  199.        gotoxy(35+ascissa*6,8+ordinata*3);
  200.        printf("%2.f",mat[ordinata][ascissa]);
  201.        ordinata++;
  202.       }
  203.     ascissa++;
  204.    }
  205.  
  206.  
  207. int ris1,ris2,ris3,ris4;
  208. compl41(ris1);
  209. float a=mat[4][1]*ris1;
  210. compl42(ris2);
  211.  float b=mat[4][2]*ris2;
  212.  compl43(ris3);
  213.  float c=mat[4][3]*ris3;
  214.  compl44(ris4);
  215.  float d=mat[4][4]*ris4;
  216.   determinante=a+b+c+d;
  217.  if (determinante==0)
  218.   { printf("\n\n    DELTA=0!  ");
  219.     printf("\n\n ATTENZIONE...Il sistema risulta IMPOSSIBILE / INDETERMINATO");
  220.     printf("\n\n Vuoi continuare ad inserire dati? (S/N)");
  221.   }
  222.  else
  223.  { printf("\n\n\n Stampa del determinante: %f",determinante);
  224.    printf("\n Premere un tasto per visualizzare le soluzioni...");
  225.    getch();
  226.    vai();
  227.  }
  228.  
  229. }
  230.  
  231. void compl41(int & risu1)
  232. { 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]);
  233.  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]);
  234.   risu1=-miti+mit1;
  235.  
  236. }
  237.  
  238. void compl42(int & risu2)
  239. {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]);
  240.  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]);
  241.  risu2=miti-mit1;
  242.  
  243. }
  244.  
  245. void compl43(int & risu3)
  246. {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]);
  247.  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]);
  248.  risu3=-miti+mit1;
  249.  
  250.  
  251. }
  252.  
  253. void compl44(int & risu4)
  254. {
  255. 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]);
  256.  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]);
  257.  risu4=miti-mit1;
  258.  
  259. }
  260.  
  261.  
  262. void vai()
  263.  
  264. {if(mat[1][1]==0)
  265.   {int vet[6];
  266.   int gig=1;
  267.    while(gig<=5)
  268.    {vet[gig]=mat[1][gig];
  269.     gig++;
  270.    }
  271.    int hh=1;
  272.    while(hh<=5)
  273.     {mat[1][hh]=mat[2][hh];
  274.     mat[2][hh]=vet[hh];
  275.     hh++;
  276.     }
  277.    }
  278.  clrscr();
  279.    float cu=mat[1][1];
  280.    int a=1;
  281.     while(a<=5)
  282.      {
  283.       mat[1][a]/=cu;
  284.       a++;
  285.      }
  286.     int b=1;
  287.     float qq=-mat[2][1];
  288.     while(b<=5)
  289.      { mat[2][b]+=mat[1][b]*qq;
  290.        b++;
  291.      }
  292.      int so=2;
  293.      float si=mat[2][2];
  294.      while(so<=5)
  295.       {
  296.        mat[2][so]/=si;
  297.        so++;
  298.       }
  299.      int d=1;
  300.      float r=-mat[3][1];
  301.      while(d<=5)
  302.        {
  303.         mat[3][d]+=mat[1][d]*r;
  304.         d++;
  305.        }
  306.        int yaya=2;
  307.        float rr=-mat[3][2];
  308.        while(yaya<=5)
  309.        {mat[3][yaya]+=mat[2][yaya]*rr;
  310.         yaya++;
  311.        }
  312.        float bid=mat[3][3];
  313.    int aaa=3;
  314.     while(aaa<=5)
  315.      {
  316.       mat[3][aaa]/=bid;
  317.       aaa++;
  318.      }
  319.         int eee=1;
  320.       float r9=-mat[4][1];
  321.       while(eee<=5)
  322.        {
  323.         mat[4][eee]+=mat[1][eee]*r9;
  324.         eee++;
  325.        }
  326.        int yoyo=2;
  327.        float rio=-mat[4][2];
  328.     while(yoyo<=5)
  329.        {mat[4][yoyo]+=mat[2][yoyo]*rio;
  330.         yoyo++;
  331.        }
  332.         int noo=3;
  333.        float rio1=-mat[4][3];
  334.        while(noo<=5)
  335.        {mat[4][noo]+=mat[3][noo]*rio1;
  336.         noo++;
  337.        }
  338.        float bidib=mat[4][4];
  339.    int cr=4;
  340.     while(cr<=5)
  341.      {
  342.       mat[4][cr]/=bidib;
  343.       cr++;
  344.      }
  345.      tt=mat[4][5];
  346.  
  347.     float tnot=mat[3][5];
  348.     float sper=mat[3][4]*tt;
  349.      z=tnot-sper;
  350.  
  351.     float ale=mat[2][3]*z;
  352.     float ale1=mat[2][4]*tt;
  353.     float tnot1=mat[2][5];
  354.     y=tnot1-(ale+ale1);
  355.  
  356.     float giu=mat[1][2]*y;
  357.     float giu1=mat[1][3]*z;
  358.     float giu2=mat[1][4]*tt;
  359.     float tnot2=mat[1][5];
  360.     xx=tnot2-(giu+giu1+giu2);
  361.  
  362.    stamp();
  363.    }
  364.  
  365. void stamp()
  366. {printf("\n\n\nCOEFFICIENTI DEL SISTEMA CON IL METODO DI PIVOUT");
  367.  int he=1,ordinata;
  368.  while(he<=5)
  369.    {
  370.     ordinata=1;
  371.      while(ordinata<5)
  372.       {
  373.        delay(350);
  374.        gotoxy(25+he*5,5+ordinata*3);
  375.        printf("%2.f",mat[ordinata][he]);
  376.        ordinata++;
  377.       }
  378.     he++;
  379.    }
  380.      printf(" \n\nSOLUZIONI: ");
  381.      printf("\n x1: %.2f",xx);
  382.      printf("\n x2: %.2f",y);
  383.      printf("\n x3: %.2f",z);
  384.      printf("\n x4: %.2f",tt);
  385.      printf("\n\n Vuoi continuare ad inserire dati? (S/N)");
  386. }
  387.  
  388. void scoef()
  389. {clrscr();
  390.  
  391.  printf("\n\n                          MATRICE DEI COEFFICIENTI");
  392.  int i=1,j;
  393.   while(i<5)
  394.    {
  395.     j=1;
  396.      while(j<5)
  397.       {delay(350);
  398.        gotoxy(23+i*6,8+j*3);
  399.        printf("%2.f",mat[j][i]);
  400.        j++;
  401.       }
  402.     i++;
  403.    }
  404.  delay(500); printf("\n\n Premere un tasto per continuare...");
  405.  getch();
  406.  }
  407.  
  408. void tnot()
  409. { clrscr();
  410.  
  411.  printf("\n\n                             TERMINI NOTI");
  412.  int i=1,j=1;
  413.   while(i<5)
  414.    {delay(350);
  415.     gotoxy(35+i*0,8+j*3);
  416.     printf("%2.f",mat[i][5]);
  417.     i++;
  418.     j++;
  419.    }
  420. delay(500); printf("\n\n Premere un tasto per continuare..."); getch();
  421. }



Rama
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5714
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:29
Domenica, 20/05/2012
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à.
PM Quote
Avatar
Giuan (Normal User)
Newbie


Messaggi: 7
Iscritto: 04/05/2012

Segnala al moderatore
Postato alle 19:30
Domenica, 20/05/2012
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


Rama
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5714
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:41
Domenica, 20/05/2012
Testo quotato

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?

Testo quotato


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



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

Testo quotato

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à.
PM Quote