Danon Opublikowano 2 Maja 2010 Udostępnij Opublikowano 2 Maja 2010 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 Więcej opcji udostępniania...
matusz997 Opublikowano 2 Maja 2010 Udostępnij Opublikowano 2 Maja 2010 Do tego użyj STL Containers Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danon Opublikowano 2 Maja 2010 Autor Udostępnij Opublikowano 2 Maja 2010 Problem w tym że nie mogę używać zewnętrznych bibliotek (nie zawartych w kompilatorze np Dev C++) ... To jest zadanie do szkoły... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 2 Maja 2010 Udostępnij Opublikowano 2 Maja 2010 Ma być to w 'C'?? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danon Opublikowano 2 Maja 2010 Autor Udostępnij Opublikowano 2 Maja 2010 Tak to ma być w "C". Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 2 Maja 2010 Udostępnij Opublikowano 2 Maja 2010 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 Więcej opcji udostępniania...
Danon Opublikowano 2 Maja 2010 Autor Udostępnij Opublikowano 2 Maja 2010 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę