Programowanie
Godzio: Trivial
Mam do Ciebie małą (albo w sumie dużą) prośbę

Jak będziesz miał chwilę czasu to napisz
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
20 kwi 21:57
Trivial: Rozumiem, że czyste C. Jaki poziom skomplikowania?
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
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.
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.
20 kwi 23:03
Dziadek Mróz:
No nie śmiga jeszcze
20 kwi 23:05
asdf:

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

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

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
21 kwi 00:04
Trivial: W końcu działa. Gratulacje.
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
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

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.
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 gui
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...
23 kwi 02:41
asdf: ale to był sarkazm z mojej strony

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

Chciałem jedynie zmobilizować!
23 kwi 02:48
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
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).
http://ideone.com/pyciQP
23 kwi 19:43
asdf:
23 kwi 21:21
asdf: wspak(1:length(slowo)) = slowo(length(slowo):−1:1);
disp(wspak);

! taki tam błąd
23 kwi 21:33
23 kwi 21:38
asdf:
23 kwi 22:39
Trivial: Jakoś słabo z tym zapałem,
Godzio.
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
29 kwi 10:50