Rozkład macierzy Metoda Doolittle'a wysypuje się

0

Witam, postanowiłem sam zabrać się za ten program, wspomogłem się trochę przykładem napisanym w fortranie, pomimo tego wysypuje mi się napisany przeze mnie program. Dawno nie pisałem nic w c bo jakieś 2 lata a i za dobry nigdy w to nie byłem, być może problem tkwi gdzieś w jakimś szczególe, albo całość jest do kitu. Proszę o pomoc dzięki:)

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>


int tab[3][3];
int tab1[3][3];
int tab2[3][3];
int i,j,k,temp=0;




main()

{
tab[1][1]=1;
tab[2][1]=4;
tab[3][1]=7;
tab[1][2]=9;
tab[2][2]=2;
tab[3][2]=2;
tab[1][3]=5;
tab[2][3]=1;
tab[3][3]=6;

for(i=0;i<3;i++)
	{
	for(j=0;j<3;j++)
		{
		tab1[i][j]=0;
		tab1[i][i]=1;
		}
	}
	
	
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
		tab2[i][j]=0;
		}
	}
	

	
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			temp=0;
			for(k=1;k<i-1;k++)
			{
				temp=temp+(tab1[i][k]*tab2[k][j]);
			}
			tab2[i][j]=tab[i][j]-temp;
		}
		for(j=0;j<3;j++){
			temp=0;
			for(k=1;k<i-1;k++)
			{
				temp=temp+(tab1[j][k]*tab2[k][i]);
			}
			tab1[j][i]=(tab[j][i]-temp)/tab2[i][i];
			
		}
		
	}
		for(i=0;i<3;i++){
			printf("%d\n", tab[i][j]);
		}
		
		getch();
}
	
2

Wychodzisz poza zakres tablicy. Tworząc tablicę 3 elementową, indexy do niej to: 0, 1, 2.
Konkretnie to tutaj:

 
    tab[1][1]=1;
    tab[2][1]=4;
    tab[3][1]=7;
    tab[1][2]=9;
    tab[2][2]=2;
    tab[3][2]=2;
    tab[1][3]=5;
    tab[2][3]=1;
    tab[3][3]=6;
0

Racja, widocznie za bardzo wziąłem sobie do serca kod z "fortrana", myślę, że przerobie i będzie śmigać.

0

Tutaj natomiast mam podobną sytuację. Nie widzę błędu, być może gdzieś pogmatwałem przy warunkach.

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>


int tab[3][3];
int tab1[3][3];
int tab2[3][3];
int i,j,k,temp=0;




main()

{
tab[0][0]=1;
tab[1][0]=4;
tab[2][0]=7;
tab[0][1]=9;
tab[1][1]=2;
tab[2][1]=2;
tab[0][2]=5;
tab[1][2]=1;
tab[2][2]=6;

for(i=0;i<3;i++)
	{
	for(j=0;j<3;j++)
		{
		tab1[i][j]=0;
		tab1[i][i]=1;
		}
	}
	
	
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
		tab2[i][j]=0;
		}
	}
	
//wyliczanie elementów
	
for(i=0;i<3;i++)
	{
	for(j=0;j<3;j++)
		{
		if(i<j)
			{
			temp=0;
			for(k=0;k<2;k++)
				{
					temp=temp+(tab1[i][k]*tab2[k][j]);
				}
				tab2[i][j]=tab[i][j]-temp;
			}
				if(i>j)	
					{
						temp=0;
						for(k=0;k<2;k++)
							{
								temp=temp+tab1[i][k]*tab2[k][j];
							}	
						tab1[i][j]=(tab[i][j]-temp)/tab2[j][j];
					}
		}
	}



//wypisywanie

		printf("Pierwwsza macierz:");
			for(i=0;i<3;i++)
				{
					printf("\n");
					for(j=0;j<3;j++)
					{
						printf("%d,", tab[i][j]);
					}
				}		
			printf("\nDruga macierz:");
			for(i=0;i<3;i++)
				{
					printf("\n");
					for(j=0;j<3;j++)
					{
			printf("%d,", tab1[i][j]);
					}
				}		
		
			printf("\nTrzecia macierz:");
			for(i=0;i<3;i++)
				{
					printf("\n");
					for(j=0;j<3;j++)
					{
			printf("%d,", tab2[i][j]);
					}
				}		
	
}
	

		
		
		

	
1

Najpierw zerujesz całą macierz tab2, a potem masz

tab1[i][j]=(tab[i][j]-temp)/tab2[j][j];

czyli dzielenie przez zero.
Tylko zgaduję bo całego algorytmu nie analizowałem. Możliwe, że się mylę bo wcześniej masz przy jakimś warunku coś tam w tab2 ustawiane. Generalnie polecam zdebugować. Tablice są tak małe, że to nie będzie problem, a rozwiązanie znajdziesz szybciej niż ktoś Ci na forum odpowie (:

0

Czy może między "ifami" nie powinien znaleźć się gdzieś "else"?

1 użytkowników online, w tym zalogowanych: 0, gości: 1