Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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. }


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
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

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
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