Uklad rownan

0

Program stary jak świat, mimo to mam jakis problem a nie moge znaleźć błędu ;/

#include<stdio.h>

double wyznacznik(double [][3]);
void uklad3(double [][3], double[]);

int main()
{

printf("Podaj uklad rowan postaci: \n");
printf("a00x+a01y+a02z=b0 \n");
printf("a10x+a11y+a12z=b1 \n");
printf("a20x+a21y+a22z=b2 \n");

double a[3][3],b[3];
int i,j;

for (i=0;i<3;i++){
    scanf("%lfx%+lfy%+lfz=%lf",&a[i][0],&a[i][1],&a[i][2],&b[i]);
                 }

printf("\n Podano rownania: \n");
for (j=0;j<3;j++){
    printf("%gx%+gy%+gz=%g \n",a[j][0],a[j][1],a[j][2],b[j]);
                 }



wyznacznik (a);
uklad3(a,b);

return 0;
}

    double wyznacznik (double a[][3])
    {
    double w=0.0;

    w+=a[0][0]*a[1][1]*a[2][2];
    w+=a[1][0]*a[2][1]*a[0][2];
    w+=a[2][0]*a[0][1]*a[1][2];

 w-=a[0][2]*a[1][1]*a[2][0];
    w-=a[1][2]*a[2][1]*a[0][0];
    w-=a[2][2]*a[0][1]*a[1][0];

    printf("\n wyznacznik to %g \n",w);
    return w;
    }

  void uklad3(double a [][3], double b[])
        {
    int i,j;
    double w=wyznacznik(a);

    if(w==0.0)
    {
    printf("Układ rownan: \n");
    for  (i=0;i<3;i++)
    printf("%gx%+gy%+gz=%g \n",a[i][0],a[i][1],a[i][2],b[i]);
    printf("\n Nie ma jednoznaczego rozwiazania");
    return;
    }

    double t[3][3];
for(i=0;i<3;i++)
    for(j=0;j<3;j++)

    t[i][j]=a[i][j];

    for(i=0;i<3;i++)

    t[i][1]=b[i];

    double wx=wyznacznik(t);


        for(i=0;i<3;i++)
        for(j=0;j<3;j++)

        t[i][j]=a[i][j];

        for(i=0;i<3;i++)

        t[i][2]=b[i];

        double wy=wyznacznik(t);
for(i=0;i<3;i++)
            for(j=0;j<3;j++)

            t[i][j]=a[i][j];

            for(i=0;i<3;i++)

            t[i][0]=b[i];

            double wz=wyznacznik(t);


if(w==0.0 && wx==0.0 && wy==0.0 && wz==0.0)

{
printf("Układ rownan: \n");
    for (i=0;i<3;i++)
    printf("%gx%+gy%+gz=%g \n",a[i][0],a[i][1],a[i][2],b[i]);
    printf("\n Układ ma nieskonczenie wiele rozwiazan");
    return;
}

printf("Układ rownan: \n");
    for (i=0;i<3;i++)
    printf("%gx%+gy%+gz=%g \n",a[i][0],a[i][1],a[i][2],b[i]);

double x,y,z;
x=wx/w;
y=wy/w;
z=wz/w;

printf("Rozwiazaniem sa liczby x= %g y= %g z= %g ",x,y,z);
return ;
}

Pomozecie ?

0

współczesne IDE same formatują kod, czemu masz z tym kłopot?
czy to nie jest czytelniejsze:

#include<stdio.h>

double wyznacznik(double [][3]);
void uklad3(double [][3], double[]);

int main()
{
    printf("Podaj uklad rowan postaci: \n");
    printf("a00x+a01y+a02z=b0 \n");
    printf("a10x+a11y+a12z=b1 \n");
    printf("a20x+a21y+a22z=b2 \n");
    
    double a[3][3],b[3];
    int i,j;
    
    for (i=0;i<3;i++){
        scanf("%lfx%+lfy%+lfz=%lf",&a[i][0],&a[i][1],&a[i][2],&b[i]);
    }
    
    printf("\n Podano rownania: \n");
    for (j=0;j<3;j++){
        printf("%gx%+gy%+gz=%g \n",a[j][0],a[j][1],a[j][2],b[j]);
    }

    wyznacznik (a);
    uklad3(a,b);
    
    return 0;
}

double wyznacznik (double a[][3])
{
    double w=0.0;
    
    w+=a[0][0]*a[1][1]*a[2][2];
    w+=a[1][0]*a[2][1]*a[0][2];
    w+=a[2][0]*a[0][1]*a[1][2];
    
    w-=a[0][2]*a[1][1]*a[2][0];
    w-=a[1][2]*a[2][1]*a[0][0];
    w-=a[2][2]*a[0][1]*a[1][0];
    
    printf("\n wyznacznik to %g \n",w);
    return w;
}

void uklad3(double a [][3], double b[])
{
    int i,j;
    double w=wyznacznik(a);
    
    if(w==0.0)
    {
        printf("Układ rownan: \n");
        for  (i=0;i<3;i++)
            printf("%gx%+gy%+gz=%g \n",a[i][0],a[i][1],a[i][2],b[i]);
        printf("\n Nie ma jednoznaczego rozwiazania");
        return;
    }
    
    double t[3][3];
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            t[i][j]=a[i][j];
    
    for(i=0;i<3;i++)
        t[i][1]=b[i];
    
    double wx=wyznacznik(t);

    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            t[i][j]=a[i][j];
    
    for(i=0;i<3;i++)
        t[i][2]=b[i];
    
    double wy=wyznacznik(t);
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            t[i][j]=a[i][j];
    
    for(i=0;i<3;i++)
        t[i][0]=b[i];
    
    double wz=wyznacznik(t);
    
    if(w==0.0 && wx==0.0 && wy==0.0 && wz==0.0)
    {
        printf("Układ rownan: \n");
        for (i=0;i<3;i++)
            printf("%gx%+gy%+gz=%g \n",a[i][0],a[i][1],a[i][2],b[i]);
        printf("\n Układ ma nieskonczenie wiele rozwiazan");
        return;
    }
    
    printf("Układ rownan: \n");
    for (i=0;i<3;i++)
        printf("%gx%+gy%+gz=%g \n",a[i][0],a[i][1],a[i][2],b[i]);
    
    double x,y,z;
    x=wx/w;
    y=wy/w;
    z=wz/w;
    
    printf("Rozwiazaniem sa liczby x= %g y= %g z= %g ",x,y,z);
    return ;
}
0

Dziękuję, nadal nie mogę znaleźć błędu ;-/

0

printf("%gx+%gy+%g*z=%g\n",a[i][0],a[i][1],a[i][2],b[i]);

0

Fakt, teraz dobrze przepisuje, ale dlaczego pętla wykonuje się tylko raz:

for (i=0;i<3;i++){
scanf("%lfx%+lfy%+lfz=%lf",&a[i][0],&a[i][1],&a[i][2],&b[i]);
}

?

0

scanf("%lf x + %lf y + %lf z = %lf",&a[i][0],&a[i][1],&a[i][2],&b[i]);

0

Nadal źle ;-/ teraz jak wpisze znaki - to od razu się wysypuje, dla wszystkich + liczy, ale źle...

http://www.fotosik.pl/pokaz_obrazek/33636933bd4b8fa1.html
http://www.fotosik.pl/pokaz_obrazek/94e1bf02d2939480.html

0

Podaj uklad rowan postaci:
a00x+a01y+a02z=b0
a10x+a11y+a12z=b1
a20x+a21y+a22z=b2
2x + -3y + -4z = 2
Jak chcesz aby można było wymiennie podawać + lub - to nie da się tego zrobić w sposób prosty.
Aczkolwiek jeżeli podasz tak:
scanf("%lf x %lf y %lf z = %lf",&a[i][0],&a[i][1],&a[i][2],&b[i]);
to:
2x-3y-4z=2
wczyta się poprawnie, ale też wczyta się poprawnie to:
1x2y3z = 7
Można też dać:
scanf("%lf x [+-]%lf y [+-]%lf z = %lf",&a[i][0],&a[i][1],&a[i][2],&b[i]);
ale to nie każdy kompilator poprawnie obsłuży - mimo że wg standardu powinien.
Z wypisywaniem jest prościej, można dać:
printf("%gx%+gy%+gz=%g\n",a[i][0],a[i][1],a[i][2],b[i]);

0

Dziękuję, już poprawiłem.

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