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