GRY-Online.pl --> Archiwum Forum

Prosze o poprawę programu w C

23.12.2005
16:22
[1]

GSi [ Pretorianin ]

Prosze o poprawę programu w C

Mam do napisania program w C obliczający macierz odwrotną. Przerobilem jakis program z C++ na c i troche zmieniłem ale źle wpisuje liczby do macierzy bo jak wpisze np. 23 to 3 przeskakuje do nastepnej kolumny.
Jak działają polecenia: "strlen" i "strtol"?

include <stdio.h>
#include <conio.h>
#include <string.h>
#include <STDLIB.H>

void wpisz_macierz(void);//wpisuje maciez z klawiatury
void zamien_wiersze(int w1,int w2);//zmienia kolejnosc wierszy w macierzy
void trojkat(void);//algorytm gausa
void wyswietl(void);//wyswietla maciez danych
void wyswietl_2(void);//wyswietla macierz wynikow
int wyswietl_wynik(void);
int format_liczby(char *x);//sprawdza czy liczba 1 to float 2 to int
//Deklaracje zmiennych
//---------------------------------------------------------------------------
float wynik=1,bufor;
int kolumny=0,wiersze=0;
float t[35][36];//macierz danych
float t_w[100][100];//macierz wyników


int main(int argc, char* argv[])

for(int t1=0;t1<35;t1++) //zerowanie tablicy
for(int t2=0;t2<36;t2++)
t[t1][t2]=0;
wpisz_macierz();
wyswietl_wynik();

getch();

return 1;



//wpisuje tablice z klawiatury
void wpisz_macierz(void)

char a[100],*b;

for(int t12=0;t12<100;t12++) //zerowanie tablicy
for(int t22=0;t22<100;t22++)
t[t12][t22]=0;

clrscr();
printf("\nWpisywanie macierzy\n");

do

do ‹//clrscr();
printf("Podaj liczbe wierszy :\n");
scanf("%c",&a);
if(format_liczby(a)==2&&strlen(a)<=15)
wiersze=strtol(a,&b,10);
else

printf("Podana liczba jest niepoprawna\n");
getch();


while(format_liczby(a)==0||strlen(a)>15);
›while(wiersze>35);
kolumny=wiersze;


for(int jx=0;jx<wiersze;jx++)
for(int j2x=0;j2x<kolumny;j2x++)

do ‹
//------------
//podglad macierzy
clrscr();
wyswietl();
//------------
printf("a%d%d = ",(jx+1),(j2x+1));
scanf("%c",&a);
if(format_liczby(a)>=1&&strlen(a)<=15)

t[jx][j2x]=strtod(a,&b);


else
printf("Podana liczba jest niepoprawna\n");

while(format_liczby(a)==0||strlen(a)>15);


clrscr();
wyswietl();//wyswietla wpisana maciez
//cout<<"wcisnij dowolny klawisz aby kontynuowac\n";
getch();


//---------------------------------------------------------------------------
//wyswietla macierz danych
void wyswietl(void)

for(int i=0;i<wiersze;i++)

for(int j_k1=0;j_k1<kolumny;j_k1++)
printf("-----------");
printf("\n");
printf("|");

for(int j=0;j<kolumny;j++)

//aby pozbyc sie zer -0.0000
if(t[j]==0) t[j]=t[j]*t[j];
/*cout<<setiosflags(ios::fixed|ios::showpoint)
<<setw(10)
<<setprecision(2)
<<t[j]<<"|"; */
printf("%5.3f",t[j]);

printf("\n");


for(int j_k=0;j_k<kolumny;j_k++)
printf("-----------");
printf("\n");

printf("\n");

//---------------------------------------------------------------------------
//wyswietla macierz wynikow
void wyswietl_2(void)

for(int i=0;i<wiersze;i++)


for(int j_k22=0;j_k22<kolumny;j_k22++)
printf("-----------");
printf("\n");

printf("|");
for(int j=kolumny;j<kolumny*2;j++)

//aby pozbyc sie zer -0.0000
if(t_w[j]==0) t_w[j]=t_w[j]*t_w[j];
/* cout<<setiosflags(ios::fixed|ios::showpoint)
<<setw(10)
<<setprecision(2)
<<t_w[j]<<"|";*/
printf("%f",t_w[j]);

printf("\n");


for(int j_k=0;j_k<kolumny;j_k++)
printf("-----------");
printf("\n");

printf("\n");

//---------------------------------------------------------------------------
int wyswietl_wynik(void)

printf("Macierz wejsciowa\n");
clrscr();
wyswietl();
trojkat();
wyswietl_2();
int zn=0;
for(int i=0;i<wiersze;i++)

for(int j=0;j<kolumny;j++)

//liczy zmienne
if(t_w[j]!=0)

//if(zn>0)cout<<" + ";
//cout<<"X"<<i+zn;
zn++;



//aby pozbyc sie -0.000
if(t_w[kolumny-1]==0) t_w[kolumny-1]=t_w[kolumny-1]*t_w[kolumny-1];

//jesli wszystkie "zmienne" maja parametry zerowe
if(zn==0)

clrscr();
wyswietl();
printf("Wyznacznik danej macierzy jest rowny 0\n");
printf("Macierz nie posiada macierzy do niej odwrotnej\n");

return 0;


//wypisuje wyrazy wolne
/*cout<<" = "<<setiosflags(ios::fixed|ios::showpoint)
<<setw(10)
<<setprecision(2)
<<t_w[kolumny-1];*/


/*cout<<endl;
if(t_w[kolumny-1]!=0&&zn==0)
cout<<endl<<"Uklad sprzeczny"<<endl;
;*/
zn=0;

//cout<<endl;
getch();
return 0;

//---------------------------------------------------------------------------
void zamien_wiersze(int w1,int w2)

float buf=0;
for(int i=0;i<kolumny*2;i++)

buf=t_w[w1];
t_w[w1]=t_w[w2];
t_w[w2]=buf;


//---------------------------------------------------------------------------
//algorytm gausa
void trojkat(void)

for(int t12=0;t12<wiersze;t12++) //wpisanie jedynek na przekontnej
t[t12][kolumny+t12]=1;


for(int t11=0;t11<35;t11++) //przekopiowanie tablicy
for(int t21=0;t21<36;t21++)
t_w[t11][t21]=t[t11][t21];



for(int i=0;i<wiersze;i++)

if(i<kolumny)

if(t_w==0)//jeśli element którym mamy zerować jest równy zero

int i_p=0;
do

if(t_w[i+i_p]!=0) zamien_wiersze(i,i+i_p);
i_p++;

while (t_w==0&& i+i_p<wiersze);//do puki mamy zerowe elementy

if(t_w!=0)
‹ //k!
float buf=t_w;
//to mażna ??????
for(int i_1k=0;i_1k<kolumny*2;i_1k++) //dzielimy wiersz tak aby otrzymac 1
t_w[i_1k]=t_w[i_1k]/buf;

for(int j=i+1;j<wiersze;j++)

buf=(t_w[j]/t_w)*(-1);//liczba przez którą mnożymy odejmowany wiersz
for(int k=i;k<kolumny*2;k++)

t_w[j][k]=t_w[j][k]+t_w[k]*buf;


›//k!


//teraz od dołu
int w=0;
if(kolumny*2<wiersze)w=kolumny*2;
else w=wiersze;
for(int i_y=w-1;i_y>=0;i_y--)

for(int j=i_y-1;j>=0;j--)//tu też po wierszach

if(t_w[i_y][i_y]!=0)

float buf=(t_w[j][i_y]/t_w[i_y][i_y])*(-1);//liczba przez którą mnożymy odejmowany wiersz
for(int k=i_y;k<kolumny*2;k++)

t_w[j][k]=t_w[j][k]+t_w[i_y][k]*buf;







//---------------------------------------------------------------------------
//sprawdza poprawnosc liczby zapizanej w postaci napisu
int format_liczby(char *x)

int liczba_kropek=0;
int liczba_minusow=0;
for(unsigned int i=0;i<strlen(x);i++)

if((x>='0'&&x<='9')||x=='.'||x=='-')

if(x=='.') liczba_kropek++;
if(x=='-') liczba_minusow++;
if(liczba_kropek>1||(liczba_kropek==1&&i==0)) return 0;
if(liczba_minusow>1) return 0;

else return 0;


if(liczba_kropek==1)
return 1;//zwraca jeden jesli podana liczba to float
else return 2;//zwraca 2 gdy podana liczba to int
›;

23.12.2005
19:18
[2]

aka [ Chor��y ]

scanf("%c",&a); musisz zamienić na scanf("%s",&a);

strlen podaje długość napisu;
strtol konwertuje napis do long;

© 2000-2024 GRY-OnLine S.A.