Skocz do zawartości
czara

Macierze - dosc dziwny sposob wczytywania i problemy

Rekomendowane odpowiedzi

Mam problem z programem pisanym na zaliczenie laboratorium z programowania .

Co prawda z programowanie nie jestem slaby ale ten program sprawia mi troche problemow :/

mam napisac klakulator macierzowy ...

tylko dosc dziwny jest sposob wprowadzenia macierzy do programu...

fragment instrukcji chyba najlepiej to zobrazuje...

 

Dołączona grafika

 

a o to co ja napisalem ale co niestety nie dziala...

#include<stdio.h>#include<math.h>#include<string.h>int main(void){unsigned int tab1[4][4];unsigned int tab2[4][4];unsigned int tab3[4][4];char lan[40];char wyj;int str,l,i,il1,il2,k,w,j,oper,lwk1,lwk2,x;printf("Podaj macierz :");scanf("%s",lan);l=strlen(lan);printf("%dn",l);str=1;k=0;w=0;il1=0;il2=0;for(i=0;i<l;i++){switch(lan[i])	{	case ']' : {if(str==1)lwk1=k; else lwk2=k;};break;	case ',' : k++; break;	case '*' : oper=3; break;	case '+' : oper=1;break;	case '-' : oper=2;break;	case '[' : {if(il1!=0) str=2; k=0;w=0;}break;	case ';' : w++; break;	case ' ' :break;	default : { if(str==1){tab1[k][w]=lan[i]-'0';il1++;}	else {tab2[k][w]=lan[i]-'0';il2++;}};break;	}}...
zapodalem tylko algorytm ktory napisalem zeby wpisywal te dane do tablicy.

Operacje na macierzach sa banalne ;)

Pomoze mi ktos poprawic ten algorytm??

Z gory dzieki za pomoc

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Obkomentuj troche ten kod, bo nie chce mi sie glowic, ktora zmienna do czego sluzy.

 

Pozatym widze, ze stdiujesz na tej samej uczelni co i ja, i to nawet na tym samym roku, bo sam niedawno ten kalkulator robilem :)

W ktorej grupie jestes?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pewno myslisz ze studiuje Informe na UZ ;)

A studiuje Elektronike i Telekomunikacje :)

I niestety mam ten sam przedmiot co ty : "Jezyki programowania" a tak naprawde to to powinno sie nazywac "ANSI C po Unixem" :/

I to jest ostatni program ktory mi brakuje do zaliczenia.

 

Dodalem komentarze :

#include<stdio.h> #include<math.h> #include<string.h> int main(void) { unsigned int tab1[4][4]; //pierwsza macierz unsigned int tab2[4][4]; //druha macierzunsigned int tab3[4][4]; //wynik dzialania na macierzachchar lan[40]; //wproawdzane daneint str,l,i,il1,il2,k,w,j,oper,lwk1,lwk2,x; //str - wskazuje do ktorej tablicy ma wpisywac liczby//k -kolumna,w - wiersz tablicy //oper - jaka operacje ma program wykonac//lwk1,lwk2 -liczba wierszy(kolumn) 1 i 2 macierzy//il1,il2 ilosc liczb wprowadzonych do kazdej z tablicprintf("Podaj macierz :");  scanf("%s",lan); l=strlen(lan); printf("%dn",l); str=1; k=0; w=0; il1=0; il2=0; for(i=0;i<l;i++) { switch(lan[i])    {    case ']' : {if(str==1)lwk1=k; else lwk2=k;};break;    case ',' : k++; break;    case '*' : oper=3; break;    case '+' : oper=1;break;    case '-' : oper=2;break;    case '[' : {if(il1!=0) str=2; k=0;w=0;}break;    case ';' : w++; break;    case ' ' :break;    default : { if(str==1){tab1[k][w]=lan[i]-'0';il1++;}    else {tab2[k][w]=lan[i]-'0';il2++;}};break;    } } . . .

a z tego co sam zauwazylem juz to algorytm jest do bani z tego wzgledu ze zapisuje tylko jednocyfrowe liczby do tablic :(

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pewno myslisz ze studiuje Informe na UZ ;)

A studiuje Elektronike i Telekomunikacje :)

I niestety mam ten sam przedmiot co ty : "Jezyki programowania" a tak naprawde to to powinno sie nazywac "ANSI C po Unixem" :/

Dlaczego niestety? ;)

 

a z tego co sam zauwazylem juz to algorytm jest do bani z tego wzgledu ze zapisuje tylko jednocyfrowe liczby do tablic :(

To jest jego jedyna wada? Nie mam teraz specjalnie czasu, zeby sie zaglebiac w to i debugowac. Ale jesli chodzi tylko o problem jednocyfrowych liczb no to musisz poprostu najpierw wszystkie cyfry zapisywac do jakiegos bufora (stringa) i dopiero potem dokonywac konwersji string->liczba.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pewno myslisz ze studiuje Informe na UZ ;)

A studiuje Elektronike i Telekomunikacje :)

I niestety mam ten sam przedmiot co ty : "Jezyki programowania" a tak naprawde to to powinno sie nazywac "ANSI C po Unixem" :/

Dlaczego niestety? ;)

 

a z tego co sam zauwazylem juz to algorytm jest do bani z tego wzgledu ze zapisuje tylko jednocyfrowe liczby do tablic :(

To jest jego jedyna wada? Nie mam teraz specjalnie czasu, zeby sie zaglebiac w to i debugowac. Ale jesli chodzi tylko o problem jednocyfrowych liczb no to musisz poprostu najpierw wszystkie cyfry zapisywac do jakiegos bufora (stringa) i dopiero potem dokonywac konwersji string->liczba.
Niestety bo akurat mam laborke z gosciem z ktorum nie dosc ze nie idzie sie dogadac to jeszcze nic nikomu nie pomoze a jedyne co powie to zebys sprawdzil "man instrukcja" :/

 

A pozatym dzis juz nie mam ochoty siedziec na c .

Jutro sprobuje to poprawic;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

mam pytanie a nie lepiej na float

includy

main()

{

int i,j,n;

float a[10][10],pom;

 

i pozniej wczytać forem

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

for(j=0;j<n;j++)

{scanf("%f" ,& pom);

a[j]=pom;

}

to tylko wczytanie macierzy jak coś to sie spytaj :) zgrubsza napisane :)) pozdrawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie doczytales pierwszego mojego postu do konca...

Wczytywanie musi byc jako jedna komenda [8,8;9,9]*.....

i z wydobyciem z takiego stringa tych liczb jest problem.

Choc juz mam prawie to zrobione.

Tylko pare rzeczy dorobic

ale to pozniej bo ucze sie czegos innego teraz.

Jak skoncze wrzuce na tweaka moze komus sie przyda kiedys :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pewno myslisz ze studiuje Informe na UZ ;)

A studiuje Elektronike i Telekomunikacje :)

I niestety mam ten sam przedmiot co ty : "Jezyki programowania" a tak naprawde to to powinno sie nazywac "ANSI C po Unixem" :/

I to jest ostatni program ktory mi brakuje do zaliczenia.

 

Dodalem komentarze :

#include<stdio.h> #include<math.h> #include<string.h> int main(void) { unsigned int tab1[4][4]; //pierwsza macierz unsigned int tab2[4][4]; //druha macierzunsigned int tab3[4][4]; //wynik dzialania na macierzachchar lan[40]; //wproawdzane daneint str,l,i,il1,il2,k,w,j,oper,lwk1,lwk2,x; //str - wskazuje do ktorej tablicy ma wpisywac liczby//k -kolumna,w - wiersz tablicy //oper - jaka operacje ma program wykonac//lwk1,lwk2 -liczba wierszy(kolumn) 1 i 2 macierzy//il1,il2 ilosc liczb wprowadzonych do kazdej z tablicprintf("Podaj macierz :");  scanf("%s",lan); l=strlen(lan); printf("%dn",l); str=1; k=0; w=0; il1=0; il2=0; for(i=0;i<l;i++) { switch(lan[i])    {    case ']' : {if(str==1)lwk1=k; else lwk2=k;};break;    case ',' : k++; break;            // komentarz odnosnie tego   case '*' : oper=3; break;    case '+' : oper=1;break;    case '-' : oper=2;break;    case '[' : {if(il1!=0) str=2; k=0;w=0;}break;    case ';' : w++; break;           //tego   case ' ' :break;    default : { if(str==1){tab1[k][w]=lan[i]-'0';il1++;} //          i tego :]   else {tab2[k][w]=lan[i]-'0';il2++;}};break;    } } . . .

a z tego co sam zauwazylem juz to algorytm jest do bani z tego wzgledu ze zapisuje tylko jednocyfrowe liczby do tablic :(

Jezeli zmiennej k uzywasz do indeksowania tablicy to powinienes ja wyzerowac za kazdym razem gdy trafiasz na nowy wiersz.

W twoim przypadku wychodzisz poza rozmiar tablicy.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nio fakt to jest maly bledzik ;)

powinno byc tak

 

case ';' : w++; k=0; break;

 

wczesniej tak bylo ale robilem zmiany i zapomnialem :/

to teraz braukuje w sumie tylko wczytywania wielocyfrowych liczb.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

zrob tak:

 

gdy natrafiasz na element stringu inny niz znaki skladni:

 

mnozysz zawartosc aktualnej komorki tablicy przez 10

dodajesz go do tablicy

musisz wyzerowac tablice na poczatku programu zebys nie dolozyl sobie smieci.

w ten sposob bedziesz odczytywal liczbe az do natrafienia na , ; badz ]

 

if(str==1)

{

tab1[k][w]*=10;

tab1[k][w]+=lan-'0';

if(lan[i+1]==']' || lan[i+1]==';' || lan[i+1]==',') il1++;

}

 

analogicznie dla drugiej tablicy

 

UPDATE:

 

w instrukcji pisze ze maja byc liczby reczywiste, czyli musisz dodac jakis znak ktory bedzie sluzyl jako separator liczby dziesietnej ( np znak '.')

Pojawia sie wtedy problem z odczytywaniem tego jak ci napisalem.

Rozwiazac to mozesz robiac tak jak wyzej ale musisz dodac zmienna ktora bedzie zliczala ilosc cyfr po przecinku. Potem po odczytaniu calej liczby (czyli nastepny znak jest znakiem skladni) dzielisz ja przez 10^liczba_cyfr_po_przecinku.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Siadlem dzisiaj i zrobilem funkcje do wpisywania liczb zmiennoprzecinkowych z lancucha.

Komentarzy jest chyba wiecej niz wlasciwego kodu ;P

#include <iostream.h>#include <ctype.h>     //jezeli chcesz wpisywac liczby rzeczywiste,     //wystarczy czesc zaznaczona komentarzem (razem     // z odpowiednimi zmiennymi) wpisac w czesci programu     //odpowiedzialnej za liczby, najlepiej jako oddzielna funkcje.void main(){char tekst[50]="";int i=0,licznik=0;float liczba=0.0;cout<<"Podaj liczbe (enter konczy wpisywanie): "; cin>>tekst;//to jako nowa funkcja :)while(tekst[i]){	if(isdigit(tekst[i])){  //isdigit() - taka przydatna funkcja- sprawdza czy wprowadzony znak jest cyfra (powinna byc dostepna//w platformie UNIXowej)  liczba = liczba*10 + (tekst[i]- '0');  licznik*=10;                               //zwieksza licznik czesci dziesietnej o 10 (jezeli  }                                          //nie bylo przecinka-jest zero, jezeli byl- bedzie	else{                                         //coraz wiekszy (uwaga na wielkosc pola int!)  if(tekst[i]== '.'){              //tutaj: jezeli jest przecinek: 	 licznik=1;                    //zacznie sie zliczanie ilosci pol po przecinku 	 }  else break;                               }	i+=1;	}if(licznik){                            //chyba jasne- ten kawalek ustawia nam odpowiednie	liczba = liczba/licznik;             //wielkosci czesci ulamkowej i calkowitej	}cout<<"liczba wprowadzona: "<<liczba;}// jeszcze cos ciekawego:// ta funkcja, nie musi miec wpisywanego zera,//aby wprowadzic czesc ulamkowa...//wystarczy napisac tak (aby wprowadzic np. 0.27)://    .27  zamiast 0.27 (liczba zostanie wpisana do pamieci poprawnie)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...