czara Opublikowano 30 Stycznia 2004 Zgłoś Opublikowano 30 Stycznia 2004 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... 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 30 Stycznia 2004 Zgłoś Opublikowano 30 Stycznia 2004 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? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
czara Opublikowano 30 Stycznia 2004 Zgłoś Opublikowano 30 Stycznia 2004 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 :( Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 30 Stycznia 2004 Zgłoś Opublikowano 30 Stycznia 2004 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
czara Opublikowano 30 Stycznia 2004 Zgłoś Opublikowano 30 Stycznia 2004 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;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Domik Opublikowano 31 Stycznia 2004 Zgłoś Opublikowano 31 Stycznia 2004 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
czara Opublikowano 1 Lutego 2004 Zgłoś Opublikowano 1 Lutego 2004 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 :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
stefex Opublikowano 1 Lutego 2004 Zgłoś Opublikowano 1 Lutego 2004 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
czara Opublikowano 1 Lutego 2004 Zgłoś Opublikowano 1 Lutego 2004 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
stefex Opublikowano 1 Lutego 2004 Zgłoś Opublikowano 1 Lutego 2004 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 3 Lutego 2004 Zgłoś Opublikowano 3 Lutego 2004 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) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...