Skocz do zawartości

Zczytanie macierzy ala Matlab "C"


Rekomendowane odpowiedzi

Opublikowano

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 :)

Opublikowano

Problem w tym że nie mogę używać zewnętrznych bibliotek (nie zawartych w kompilatorze np Dev C++) ... To jest zadanie do szkoły...

Opublikowano

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 ).

Opublikowano

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

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ę...