matematykaszkolna.pl
Programowanie Godzio: Trivial Mam do Ciebie małą (albo w sumie dużą) prośbę Jak będziesz miał chwilę czasu to napisz emotka
20 kwi 20:32
Trivial: Nie zauważyłem wcześniej. Już się boję. O co chodzi?
20 kwi 21:35
Godzio: Nie wiem czy pamiętasz, kiedyś, na 1 semestrze poprosiłem Cię o radę w sprawie jakiegoś podręcznika do nauki programowania w C no i podałeś "Szkoła Programowania. Język C" Stephen Prat. No i teraz zacząłem go przerabiać bo stwierdziłem, że jednak jest mi potrzebne to programowanie I tu dochodzimy do setna sprawy, chciałbym, żebyś mi dawał jakieś zadania programistyczne, oczywiście bez kosmosów, bo te z ćwiczeń z tego podręcznika to idą gładko, więc jakbyś miał chęci i czas czasem mi dać jakieś zadanko byłoby super emotka
20 kwi 21:57
Trivial: Rozumiem, że czyste C. Jaki poziom skomplikowania? emotka
20 kwi 22:02
Godzio: Tak, czysty C. Na razie przerobiłem 200 stron i głównie było o tych typach zmiennych po prostu już zasypiałem, doszedłem do funkcji while() dzisiaj jeszcze przerobie for a jutro if Generalnie funkcje już jakieś umiem pisać, a później je połączyć w całość Wiem wiem, bida, ale to moje początki.
20 kwi 22:04
adam: Programiści pomóżcie tu znaleźć błąd: #include <iostream> #include <iomanip> #include <cmath> using namespace std; int main(){ float km,cal; float cm; float m; cin >> km; m=floor(3.6*km) cm=round((3.6*km − m)*100) cal=656,168*km cout << "Wpisz predkosc w km/h:"; cout << endl << fixed << setprecision(2) << km << " km/h to " << m << " m i " << cm << " cm na sekund lub " << fixed << setprecision(3) << cal << " cali/minute."; return 0; } błąd jest w cm=round((3.6*km − m)*100)
20 kwi 22:06
Godzio: Średników nie zapomniałeś?
20 kwi 22:08
Trivial: Godzio, możesz zacząć od czegoś prostego: Napisz funkcję która odwróci przekazany łańcuch znaków. Przykład wywołania: char out[1024]; reverse("Ala ma kota", out); // w out mamy "atok am alA".
20 kwi 22:11
Saizou : " I tu dochodzimy do setna sprawy" setna (cześć) sprawy
20 kwi 22:15
Godzio: No sedna sedna
20 kwi 22:28
Dziadek Mróz: [code] //tabliczka smażenia 9x9 ... int tab[9][9]; // macierz 9x9 for(int i = 1; i < 10; i++) // 1, 2, 3, 4, 5, 6, 7, 8, 9 // for(i = 1; i <= 9; i++) { for(int j = 1; j < 10; j++) // 1, 2, 3, 4, 5, 6, 7, 8, 9 { tab[i][j] = i*j; // w tablicy o danych indeksach i oraz j umieszczam iloczyn i*j // tab[1][1] = 1*1 // tab[1][2] = 1*2 // tab[1][3] = 1*3 // ... } } for(int i = 1; i < 10; i++) // 1, 2, 3, 4, 5, 6, 7, 8, 9 { for(int j = 1; j < 10; j++) // 1, 2, 3, 4, 5, 6, 7, 8, 9 { printf("%d * %d = %d", i, j, tab[i][j]); // wypisz zawartość tabliczki smażenia // output: // 1 * 1 = 1 // 1 * 2 = 2 // 1 * 3 = 3 // ... } } // fork() − tworzenie procesów w linuxie (za if(fork() == 0) system kopiuje program od warunku do końca pliku i wykonuje do zakończenia warunku ... printf("P1: %d\n", getpid()); // wypisz PID procesu (1) if(fork() == 0) { printf("R: %d\tP: %d\n", getppid(), getpid()); // wypisz PID rodzica (1) i PID procesu } printf("P2: %d\n", getpid()); // output: // P1: 12478 // R: 12478 P: 12489 // P2: 12478 // warunek if ... int war = 1; if(war) // if(prawda){ instrukcje } { printf("warunek ok"); war = 0; } if(war) // if(fałsz) { instrukcje się nie wykonają } { printf("warunek nie ok"); } else // inaczej { instrukcje } { printf("nie warunek nie ok"); } // output: // warunek ok // nie warunek nie ok [/code]
20 kwi 22:43
Dziadek Mróz: Aha w forku inne wyjście: // output: // P1: 12478 // R: 12478 P: 12489 // P2: 12489 // P2: 12478
20 kwi 22:44
Godzio: Trivial możesz jeszcze podać tą stronkę co się program wysyłało. Mam pewną koncepcję
20 kwi 22:46
20 kwi 22:50
Dziadek Mróz: // kiedyś miałem podobne zadanie i w nim był while odczytujący z deskryptora pliku fd po znaku do bufora buf, mniej więcej chodziło o to, że gdy read trafi na koniec pliku to jest 0 int i = 1; while(read(fd, buf, 1) != 0) { printf("Odczytano %d znaków\n", i); i++; } printf("Odczytano z pliku %d znaków", i);
20 kwi 22:51
asdf: Cześć wszystkim. Godzio, a Ty czasem nie ogarniałeś już matlaba?
20 kwi 22:51
Godzio: Na razie faza testów. Mam kilka oczywistych błędów w programie a) jeżeli będą te same literki np. Alkamale (byle co − wymyślone) to druga i przed ostatnia są takie same więc program się zatrzyma b) chyba jeszcze nie wiem jak całe łańcuchy wpisywać, żeby się zapisywały (ze spacją) c) no i nie działa, ale jestem ciekaw czy jeżeli coś tu zmienić to czy poza tym wyjątkiem z a) by działało. http://ideone.com/0YojBI
20 kwi 22:52
Trivial: Godzio, same błędy masz. Trzeba tam wybrać język C, a nie Javę.
20 kwi 22:53
asdf: printf("%c",&out[j]);
20 kwi 22:54
Godzio: Hejo asdf, mocne słowa, że ogarniałem Napisałem jakiś mini projekt, do którego użyłem całego internetu.Nie za bardzo się uczyłem jak ciekawiej programować bo uważałem, że to mi się nigdy nie przyda, a teraz stwierdzam, że jednak warto umieć bo na samych analizach statystycznych człowiek nie pociągnie
20 kwi 22:55
20 kwi 22:55
Godzio: A nie, bo scanf tam wcześniej był, a później nie usunąłem tego &
20 kwi 22:56
Godzio: http://ideone.com/yW0a5A ostateczna
20 kwi 22:56
Trivial: Godzio, to jeszcze dopisz jakieś wejście może, żeby ten program coś robił. (stdin).
20 kwi 22:56
Trivial: I tam można edytować. Nie musisz wysyłać cały czas od nowa. emotka
20 kwi 22:57
Godzio: Dobra, ten sam błąd, ale coś działa, zaraz dopracuje
20 kwi 22:57
Trivial: Jak już skończysz, to się wypowiem − widzę, że czeka Cię duuużo pracy.
20 kwi 22:59
Godzio: Wiem, bardzo dużo, ale tym razem jestem zdeterminowany. Jeszcze pomyślę.
20 kwi 23:00
20 kwi 23:02
Trivial: asdf, printf też jest dość niebezpieczny. emotka
20 kwi 23:03
Dziadek Mróz: No nie śmiga jeszcze
20 kwi 23:05
asdf: emotka bo, np.: char s = '\0'; printf("%s", s); co do scanf (tekst z stackoverflow): C FAQ : Why does everyone say not to use scanf? link: http://c-faq.com/stdio/scanfprobs.html mimo wszystko ja bym i tak polecał uczyc sie na poczatku na scanf i printf Uczą wedlug mnie trzymania sie pewnych regul emotka
20 kwi 23:10
asdf: Wszystko z C ma i tak przelozenie na C++, wiec jak ktos zalapie printfa, nie bedzie miec problemu z cout, scanf −> cin, calloc, malloc −> new itd..
20 kwi 23:12
Dziadek Mróz: Kartka i długopis: Wejście: Grzegorz Wyjście: zrogezrG potrzebne są dwie tablice, in[1024] i out[1024] z in = "Grzegorz" wysyłamy ostatni znak na 0 pozycję out itd... void reverse(char in[1024]) { int i; int j = strlen(in) − 1; // bo to jest licznik dla out, wynikiem strlen jest n znaków a tablica jest od 0 do n−1 znaków char out[1024]; for(i = 0; i < strlen(in); i++) { out[i] = in[j]; j−−; } for(i = 0; i < strlen(out); i++) { printf("%c", out[i]); } } sprawdzenie (Grzegorz): j = 7; out[0] = in[7] z out[1] = in[6] r out[2] = in[5] o out[3] = in[4] g out[4] = in[3] e out[5] = in[2] z out[6] = in[1] r out[7] = in[0] G zrogezrG
20 kwi 23:16
Godzio: Rozumiem, że trzeba było użyć czegoś więcej niż pętli while() ? Może z tymi zadaniami poczekamy do jutra/pojutrza jak w pełni poczytam i porobię przykłady z for i if będzie to miało większy sens, chyba, że da się to zadanie samym whilem zrobić.
20 kwi 23:19
bezendu: Dziadek Mróz to bardzo rumpka przypomina emotka
20 kwi 23:19
asdf: for(i=(strlen(in)−1);i >= 0;i−−) printf("%c", in[i]); while: i = strlen(in)−1; while(!(i < 0)) printf("%c", in[i−−]); while(i != −1)) (...)
20 kwi 23:21
Dziadek Mróz: i na while'u void reverse(char in[1024]) { int i = 0; int j = strlen(in); char out[1024]; while(j != 0) { out[i] = in[j−1]; // bo tablica od 0 do n−1 znaków printf("%c", out[i]); i++; j−−; } } sprawdzenie (Grzegorz): i = 0 j = 8 != 0 out[0] = in[7] z j = 7 != 0 out[1] = in[6] r j = 6 != 0 out[2] = in[5] o j = 5 != 0 out[3] = in[4] g j = 4 != 0 out[4] = in[3] e j = 3 != 0 out[5] = in[2] z j = 2 != 0 out[6] = in[1] r j = 1 != 0 out[7] = in[0] G j = 0 == 0 // koniec
20 kwi 23:23
Dziadek Mróz: Można również wypisywać od kupra strony, czyli // for for(i = strlen(in) − 1; i > 0; i−−) { printf("%c", in[i]); } // while i = strlen(in); while(i != 0) { printf("%c", in[i−1]); i−−; }
20 kwi 23:26
Trivial: Godzio, nie trzeba nic poza pętlą while. Nakieruję Cię mainem. http://ideone.com/H75yo3 asdf, czy poniższy kod jest bezpieczny? http://ideone.com/bQKa2m
20 kwi 23:26
Dziadek Mróz: aha w for'ze musi być i >= 0 a w while'u i != −1 lub i >= 0
20 kwi 23:27
asdf: Godzio, for i while sie niczym nie roznia, tylko składnią. Wszystko co zapiszesz forem, zapiszesz na petli while i odwrotnie. Co bedziesz chcial uzyc − Twoja sprawa
20 kwi 23:27
asdf: Trivial, no nie, co gdy strlen(stdin) > 2047 ? To co dales Godziowi − nie wydaje Ci sie za trudne jak na początek?
20 kwi 23:31
asdf: chdozi o rozwiazanie z 23:26
20 kwi 23:32
Trivial: asdf, nie ma problemu dla dłuższych ciągów − czytamy tylko pierwsze 2048 − 1 znaków. emotka
20 kwi 23:33
Trivial: To co dałem Godziowi jest dość proste. Ten memcpy zignorować − jest tylko po to, żeby nie było błędu dla pustej funkcji reverse. Docelowo proszę wywalić. emotka
20 kwi 23:34
Godzio: Dobra podpatrzyłem rozwiązanie Dziadka Mroza, niestety nie podołałem Mógłbyś dać jeszcze jakieś zadanko (ale to już bardziej na jutro), posiedzę sobie nad nim przez nockę Może zrobię emotka
20 kwi 23:37
asdf: aha..Ty podrzuciles "szablon" na funkcje tylko... w jaki sposob w takim razie printf jest niebezpieczny? chodzi tu o brak konca stringa przy ktorym printf sie zgubi?
20 kwi 23:38
Trivial: Godzio, najpierw masz uzupełnić mój szablon. Zakaz modyfikowania funkcji main. I ma działać! emotka Jak już zrobisz, to dam Ci napisanie prostego testu czy ta funkcja działa.
20 kwi 23:38
Godzio: Ok!
20 kwi 23:39
Trivial: asdf, string zawsze wczyta się poprawnie jeśli o to chodzi. Będzie miał maks 2048 znaków (w tym znak końca łańcucha '\0'). Problem jest w samym printfie. emotka
20 kwi 23:40
20 kwi 23:45
Trivial: Przecież to się nawet nie kompiluje. I brakuje klamry.
20 kwi 23:46
Godzio: Ale to w tym Twoim gdzieś jest błąd
20 kwi 23:46
Godzio: A dobra, to przez klamrę ...
20 kwi 23:47
asdf: w takim razie w czym jest problem dla printfa tutaj? O ile jest!
20 kwi 23:47
Trivial: asdf, spróbuj dać input Hello world! <evil>%n</evil> Rozwalisz program.
20 kwi 23:48
Godzio: Jeszcze muszę się zastanowić
20 kwi 23:48
Trivial: Godzio, ma się uruchamiać i wypisywać odwrotność "Ala ma kota." emotka
20 kwi 23:49
Godzio: Już nieco poprawione, ale jeszcze jakieś krzaki się robią.
20 kwi 23:50
Godzio: A nie! Działa! Tylko na końcu jakieś dwa symbole nie wiem skąd
20 kwi 23:51
Godzio: Przez tego Twojego puts(out)
20 kwi 23:52
Trivial: Nie przez mojego puts. emotka Pewnie zapominasz o znaku końca łańcucha. Na początku funkcji dodaj: out[strlen(string)] = '\0';
20 kwi 23:53
Godzio: Dobra, jestem spamerem, ale trudno o tej porze i tak wszyscy śpią, poprawiłem działa jak w zegarku
20 kwi 23:54
Trivial: Kod do oceny.
20 kwi 23:55
asdf: a mnie uczyli, ze przekazujac lancuch w ten sposob: char a[20] = "hehe"; jest to rownowazne z: a[0] = 'h'; a[1]='e'; a[2]='h' a[3]='e' a[4] ='\0';
20 kwi 23:55
20 kwi 23:57
Trivial: Godzio, nie działa − nic nie wypisało na stdout. Brakuje znaku końca łańcucha.
20 kwi 23:57
asdf: wycofuje ten post z 23:55, zle zitnerpretowalem
20 kwi 23:59
Godzio: Jak nie działa u mnie normalnie kompiluje i wyświetla .atok am alA
21 kwi 00:00
Trivial: Na ideone nie działa. Na dole masz napisane: "Standard output is empty" zamiast ".atok am alA". To, że działa u Ciebie to może być zbieg okoliczności (np. piszesz po akurat wyzerowanej tablicy out). Trzeba dodać to, o czym mówiłem 23:53.
21 kwi 00:02
Godzio: http://ideone.com/CkOKBQ Teraz zapamiętam, że przed wysłaniem ma tam działać emotka
21 kwi 00:04
Trivial: W końcu działa. Gratulacje. emotka
21 kwi 00:05
Trivial: Chcesz jeszcze jedno?
21 kwi 00:08
Godzio: A jeszcze mam pytanie, jak wprowadzić do programu całe zdanie, wpisując je, a nie żeby program miał już je podane? Bo funkcja scanf("%s",string); weźmie tylko pierwszy wyraz tego zdania
21 kwi 00:09
asdf: Jak chcesz Godzio to masz takie, skorzystaj z tablicy ASCII, dopisz do programu nastepujaca funkcjonalnosc: zamiana wszystkich liter z malych na duże. jezeli to sie uda to kolejną: gdy w ciagu wystapia inne liter niz a−z, A−Z to nalezy przerwac. spacje oczywiscie normalnie przepisuj . Jak poznales typy to pewnie wiesz, ze char to liczba, a więc: http://pl.wikipedia.org/wiki/ASCII i jazda!
21 kwi 00:11
asdf: sprobuj moze: %*s, nie pamietam juz...
21 kwi 00:11
Trivial: Bezpieczny sposób to skorzystanie z funkcji fgets. http://ideone.com/NM80x3
21 kwi 00:12
Godzio: Postaram się na dzisiejszy wieczór to zrobić, bo teraz nie mam pomysłu, a myślę, że if − em jakoś łatwiej to zrobić. Jedynie co wiem to to, żeby przesunąć litery o 32, z warunkiem że przesuwamy tylko te, które są > 96 i < 123
21 kwi 00:41
Dziadek Mróz: Jeszcze jak byłem w sile wiedzy to napisałem pętlę czytającą słowa i zapisującą je do tablicy słów
21 kwi 00:43
Godzio: W sumie łatwe bo zrobiłem, ale działa mi tylko u mnie, a na ideonie znów nie chce
21 kwi 00:50
asdf: no łatwe miales operacje na bitach? tzn & i | ? jezeli tak to: a = a | 0x20: np. a = 65 = 0100 0001 a = a | 0x20: 0100 0001 0010 0000 = 0110 0000 = 97 a teraz pytanie: jak z 97 przejsc na 65?
21 kwi 00:55
asdf: jak nie miales tego to mozesz nie wiedziec.
21 kwi 00:56
asdf: jak miałeś tablice dwuwymiarowe to masz takie zadanie: wejscie: "ala ma kota"; wyjscie: out[0] = "ala"; out[1] ="ma"; out[3] ="kota"; proponuje: najpierw zlicz ile jest spacji w podanym stringu wejsciowym, stworz tablice dwu wymiarowa: out[n][1024] dwa fory int spacja = 32;
21 kwi 01:06
asdf: mozesz to zrobic tez bardziej sprytnie: zliczac ile jest spacji i policzyc jaka dlugosc ma najdluzszy wyraz, wtedy oszczedzisz na pamięci.
21 kwi 01:07
Godzio: Obiecuje, że rano do tego przysiądę, ale teraz padam, próbowałem jeszcze zrobić, żeby zatrzymywał program, ale coś warunków dopasować nie mogę Dzięki za pomoc emotka Dobranoc!
21 kwi 01:13
asdf: wtedy: out[n][dlugosc najdluzszego wyrazu]; Polecam tez dobrze na samym początku poznac style w jaki sposob zapisuje się zmienne i nabrac dobrych nawykow, podstawowe to: Pascal case The first letter in the identifier and the first letter of each subsequent concatenated word are capitalized. You can use Pascal case for identifiers of three or more characters. For example: BackColor Camel case The first letter of an identifier is lowercase and the first letter of each subsequent concatenated word is capitalized. For example: backColor Źródło: http://msdn.microsoft.com/en-us/library/x2dbyw72(v=vs.71).aspx blacha sprawa, ale jednak bardzo ważna. Próbuj też trzymać się spójności w programie, ja to robilem tak: przed pisaniem programu w pierwszych linijkach kodu (w komentarzach) pisalem sobie: zmienne − pascal case, jezyk: angielski, np. int counterTheSpacesInString; funkcje − pascal case, jezyk: polski, np. wczytajZmienne(); argumenty w funkcjach, np. void funkcjaPierwsza(const char MojeImie[]); − Camel case itd... wazne jest tez, zebys trzymal sie spojnosci nie tylko w stylu, ale w nazywaniu, np. funkcji: jak juz piszesz kilka funkcji i masz: wczytajPlik(), dodajPlik(), zapiszDoPliku(), to juz nie pisz funkcji: edytowaniePliku(), tylko zgodnie ze spojnością: edytujPlik();
21 kwi 01:26
Dziadek Mróz: Napisz sobie program kalambury. Program czyta z pliku postaci: [file] wyraz1 wyraz2 wyraz3 ... [/file] wyrazy do tablicy, losuje wyraz za pomocą funkcji random() wyraz z tablicy, wyświetla jego długość w postaci (Grzegorz): [output] ________ [/output] później pyta czy podajesz literę czy hasło i jeżeli litera znajduje się w wyrazie pokazuje (z): [output] __z____z [/output] Po odgadnięciu wyrazu pyta czy grasz dalej.
21 kwi 12:08
Trivial: Widzę, że już determinacja przeszła. emotka
23 kwi 00:27
asdf: Oj tam Trivial, dziwisz sie? Są ciekawsze rzeczy w programowaniu, np. wielowątkowosc, a my tu gadu−gadu o jakims odwracaniu lancucha, kalamburach, zamianach liter z malych na duże...do tego: konsola, co to za guiemotka
23 kwi 01:19
Trivial: Wielowątkowość to jeden wielki deadlock i race condition, a programowanie z ich użyciem to zazwyczaj koszmar, chyba że interakcji między wątkami jest bardzo mało albo używa się przekazywania komunikatów (message passing). Są dużo bezpieczniejsze sposoby na wykorzystanie wielu rdzeni − np. przetwarzanie równoległe albo transakcje. Co do tworzenia funkcjonalnego GUI, to pożera to masę czasu i jest często dość żmudne... emotka
23 kwi 02:41
asdf: ale to był sarkazm z mojej stronyemotka Chodziło mi jedynie o to, że puki co te programiki nie złe i jak na sam początek są w porządku − tylko brak chęci emotka Chciałem jedynie zmobilizować! emotka
23 kwi 02:48
Trivial: To na pożegnanie odwrócę łańcuch w Haskellu. http://ideone.com/0Ql4c1 Dobranoc. emotka
23 kwi 02:53
asdf: mimo tego bez wielowatkowosci trudno jest cokolwiek zrobic. Akurat siedze w C# nad klasą Task, wielki kombajn, ale jak to w ksiazce fajnie pisze "kazdy przez to musial przejsc i zrozumiec bo programy sekwencyjne przeszly do lamusa"
23 kwi 02:53
asdf: Dobranoc.
23 kwi 02:53
23 kwi 03:19
Godzio: Trivial nie przeszła Musiałem referat napisać i właśnie go kończę. Jutro się za nie zabiorę obiecuje!
23 kwi 05:46
Trivial: asdf, z gotowców to ja też umiem korzystać! http://ideone.com/ATHeMJ emotka
23 kwi 10:16
asdf: jakich gotowców? W takim razie całe programowanie w C# to gotowce...(obiektowość). Mógłbym przecież Tobie też to powiedzieć. W matlabie już się troche bawiłem i zapisywanie w formie wektora: ( : ) + funkcja foldl jest już mi znane
23 kwi 16:43
asdf: slowo ='kajak'; wspak(length(slowo):−1:1) = slowo(length(slowo):−1:1); to tez jest gotowiec?
23 kwi 16:50
Trivial: No wykorzystałeś gotową procedurę do odwracania tablicy. (:) nie ma za wiele wspólnego z matlabowym wektorem, ale tak − to też trochę gotowiec. W takim razie implementuję "niegotowiec" − bez wywoływania żadnych funkcji bibliotecznych (nie licząc (:), ale bez tego się nie da). emotka http://ideone.com/pyciQP
23 kwi 19:43
asdf: emotka
23 kwi 21:21
asdf: wspak(1:length(slowo)) = slowo(length(slowo):−1:1); disp(wspak); ! taki tam błąd
23 kwi 21:33
Trivial: A nie lepiej po prostu: wspak = slowo(length(slowo):−1:1); ? http://ideone.com/nX4rE8
23 kwi 21:38
asdf: emotka
23 kwi 22:39
Trivial: Jakoś słabo z tym zapałem, Godzio. emotka
26 kwi 17:25
asdf: a potencjał ma
28 kwi 18:05
Godzio: Trivial za wcześnie Cię o to poprosiłem Jutro mam dwa kolokwia i na nich się skupiłem, na majówkę wyjeżdżam do głuszy, więc będę miał czas posiedzieć nad programowaniem, bo tam ani internetu ani zasięgu nic. Gdybyś mógł mi napisać parę zadań na ten czas, w niedziele zdam raport. (te zadania już obejmujące wszystkie te funkcje while, for, if i te takie podstawowe. Sory, że tak wyszło, ale nie miałem kompletnie czasu na nic innego niż na naukę.
28 kwi 18:45
Trivial: Godzio, możesz sobie porobić zadanka ze spoja. Są różne poziomy trudności, także każdy znajdzie coś dla siebie.
29 kwi 00:48
Dziadek Mróz: Na tej stronie są zadania mojego wykładowcy z czasów studiów: http://www.cs.put.poznan.pl/jkniat/MatDydakt.html Do góry są kijowe wykłady z C, a zadania są we "Wprowadzenie do Programowania, Z0 − Z7"
29 kwi 10:50