Skocz do zawartości

Zczytanie macierzy ala Matlab "C"


Danon

Rekomendowane odpowiedzi

Witam

Mam do was pytanie i mam nadzieję że będziecie mi w stanie pomóc... W jaki sposób za pomocą języka C mogę zrobić zczytywanie macierzy ala Matlab czyli dokładniej rzecz ujmując:

w konsoli programu wpisujemy [ 1 2 3; 3 4 5 ; 5 6 7] i z tego otrzymujemy tablice 2 wymarową:

1 2 3

3 4 5

5 6 7

 

Mój sposób nie jest ani optymalny ani dokładny :(

GML

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

#define N 100

#define W 1000

 

int wczytaj()

{

int i=0 , j=0 , lock=0, wiersze=0;

int znaki=0 , wyraz=0 , send_wiersze=0;

int send_wyraz=0;

float a[N][N];

char ci[W];

char c;

printf("\n\n>>");

 

while(i < N)

{

c = getch();

printf("%c",c);

 

if(c==13)

{

break; // wyjście z pętli

}

 

else if(c==8 && znaki>0) //Backspace - poprawa ostatniej liczby niestety tylko ostatniej :(

{

printf(" %c",8);

znaki--;

}

 

else if(c>='0' && c<='9'|| c=='.' || c=='-') //zczytywanie tylko cyfr i "." "-"

{

ci[znaki] = c; //Znak ląduje do stringu

znaki++;

i++;

}

 

else if( c==';' )

{

if(znaki==0) // zabezpieczenie gdy mamy [3 4; 5 6_; 3 4] gdyż zczytywało spację "6_;" jako kolejny wyraz ( "_" - spacja )

{

if(wyraz!=0)

{

wyraz-=1;

}

}

 

if(lock==0) //Moja dziwna blokada ilosci elementów kolejnych wierszy

{

send_wyraz = wyraz;

}

 

if(send_wyraz != wyraz && lock==1)

{

printf("Blad w liczbie wierszy!");

system("pause");

return -1;

}

 

if(znaki!=0) // w razie gdy użytkownik wpisze "6;" ma nastąpić dodanie elementu do tablicy "a"

{

sscanf(ci, "%f", &a[wiersze][wyraz]);

//printf("a= %.2f ",a[wiersze][wyraz]);

}

 

wiersze++;

//printf("w= %d ",wiersze);

ci[znaki]=' ';

 

for(j=0; j<=wyraz; j++) // zapełnienie wiersza zerami

{

a[wiersze][j]=0;

}

 

lock=1;

wyraz=0;

i++;

znaki=0;

 

}

 

else if(c==' ') //po wciśnięciu spacji

{

if(znaki!=0) // gdy istnieją jakieś cyfry

{

ci[znaki]=' ';

sscanf(ci, "%f", &a[wiersze][wyraz]); //dodaj do tablicy "a" kolejny element

// printf("a= %.2f ",a[wiersze][wyraz]);

i++;

znaki=0;

wyraz++;

}

}

else

{

printf(" ");

}

}

 

macierz_podaj(wiersze+1,send_wyraz+1,a); // wysłanie ilości wierszy i kolumn wraz z tablicą "a"

return 0;

}

 

Naprawdę będę bardzo wdzięczny za pomoc :)

Pozdro Danon :)

Odnośnik do komentarza
Udostępnij na innych stronach

Napisałem taki kodzik, można go oczywiście zoptymalizować, ale jbc. działa.

// Main : Source
#include <Stdio.h>

int gMatrix[32][32] = { 0 }, gMatPosX = 0, gMatPosY = 0;

int strlen( char *str )
{
    int len = 0;
    while( (*str) != 0 )
    {
        len++;
        str++;
    }

    return len;
}

int findwhitesign( char *str )
{
    int pos = 0;
    while( (*str) != 0 )
    {
        if( (*str) == ' ' || (*str) == ';' )
            return pos;

        pos++;
        str++;
    }

    return pos;
}

int main()
{
    char str[128] = { 0 };
    int val, ws, act = 0;

    // Check for matrix
    scanf( "%[^\n]", str );
    str[strlen(str)] = ' ';

    // Parse string
    while( str[act] != 0 )
    {
        if( str[act] == '[' || str[act] == ']' );
        else
        if( str[act] == ';' )
        {
            gMatPosX = 0;
            gMatPosY++;
        }
        else
        {
            ws = findwhitesign( &str[act] );
            if( ws == 0 ) { act++; continue; }

            sscanf( &str[act], "%d", &gMatrix[gMatPosY][gMatPosX++] );
            act += ws;
        }
        act++;
    }

    return 0;
}

Btw. Potrzebuje kilku dopieszczeń.

 

E: Wprowadź dane w formie "[123 321 ; 456 654 ; 789 987]". Jak na razie nie zapisuje wielkości macierzy ( dość proste do wykonania ) oraz jest problem z wyczytywaniem wartości jeśli zrobimy tak "[123; 321]" ( znak ';' jest obok liczby ) to wtedy sscanf sie kaszani. Można to naprawić stosując formatowania w funkcji sscanf, ale nie pamiętam jak to się robiło by znak ';' traktował jako spację... ( google nie gryzie ).

Odnośnik do komentarza
Udostępnij na innych stronach

WIELKIE DZIEKI!! :D:D:D Nie wiem jak Ci się odwdzięczę :) już sobie go przerobiłem na własne potrzeby a z ";" poradzę sobie jutro bo wiem że to proste do wykonania :) Masz u mnie OGROMNEGO Browara :D

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...