This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
dydaktyka:cprog:common_mistakes [2015/11/08 19:10] pkleczek [Operacje na bitach zamiast operatorów logicznych] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Częste błędy ====== | ||
- | |||
- | ...czyli na co zwracać szczególną uwagę podczas pisania programu. | ||
- | |||
- | ===== Brak zrozumienia polecenia? ===== | ||
- | |||
- | Przykładowo, jeśli polecenie brzmi: | ||
- | > Napisz funkcję, która zwróci wartość (...) | ||
- | to funkcja powinna zwrócić wartość poprzez instrukcję ''return'' -- a nie wypisywać ją na ekran za pomocą funkcji ''printf()''. | ||
- | ===== Przypisanie czy porównanie? ===== | ||
- | |||
- | W języku C operator ''='' oznacza przypisanie, natomiast operator ''=='' -- porównanie dwóch wartości (zobacz: [[dydaktyka:cprog:2015:conditionals#operatory_relacyjne|operatory relacyjne]]): | ||
- | |||
- | <code c> | ||
- | int a = 5; // przypisanie do zmiennej `a` wartosci 5 | ||
- | |||
- | if (a == 7) { // porownanie wartosci zmiennej `a` z wartoscia 7 | ||
- | ... | ||
- | } | ||
- | </code> | ||
- | |||
- | :!: Operator przypisania przypisuje temu, co stoi po lewej stronie (zazwyczaj zmiennej), wartość stojącą po prawej stronie. | ||
- | <code c> | ||
- | int a; | ||
- | 2 = a; // blad! | ||
- | a = 2; // OK | ||
- | </code> | ||
- | |||
- | ===== Wczytywanie wielu liczb ===== | ||
- | |||
- | Funkcja ''scanf()'' jako pierwszy argument przyjmuje łańcuch znaków z odpowiednimi specyfikatorami konwersji; kolejne argumenty to adresy zmiennych, do których mają zostać wstawione dane (stąd ten symbol ''&'' przed nazwą zmiennych). \\ | ||
- | Obrazowo: | ||
- | <code c> | ||
- | scanf("%d", "%d", &a, &b); // blad! | ||
- | scanf("%d %d", &a, &b); // OK - wczytaj dwie liczby oddzielone spacja | ||
- | </code> | ||
- | |||
- | [size=10]O tym, co dokładnie oznacza ''&'' dowiesz się na laboratorium o wskaźnikach.[/size] | ||
- | |||
- | ===== Wyświetlanie adresu zmiennej zamiast jej wartości ===== | ||
- | |||
- | No dobrze, mówiąc krótko -- ''&'' to w języku C operator służący do uzyskiwania adresu zmiennej. Na laboratoriach zazwyczaj chcesz wypisać wartość zmiennej, a nie wartość jej adresu ;-) | ||
- | |||
- | <code c> | ||
- | int a = 5; | ||
- | |||
- | printf("%d\n", a); // wypisz wartosc zmiennej `a` jako liczbe calkowita | ||
- | |||
- | printf("%d\n", &a); // wypisz adres zmiennej `a` jako liczbe calkowita | ||
- | // (chyba nie o to chodzilo...) | ||
- | </code> | ||
- | |||
- | ===== XOR na bitach zmiennych zamiast potęgowania ===== | ||
- | |||
- | W języku C nie ma operatora potęgowania -- symbol ''^'' oznacza [[https://pl.wikipedia.org/wiki/Operator_bitowy|operator bitowy]] XOR. Aby podnieść liczbę do danej potęgi, musisz ją wymnożyć. \\ | ||
- | |||
- | <code c> | ||
- | int a = 4; | ||
- | int b = a ^ 2; // 4 XOR 2 == 6, nie o to chodzilo... | ||
- | int c = a * a; // OK - `a` do 3. potegi | ||
- | </code> | ||
- | |||
- | ===== Operacje na bitach zamiast operatorów logicznych ===== | ||
- | |||
- | W języku C ''||'' oraz ''&&'' to [[dydaktyka:cprog:2015:conditionals#operatory_logiczne|operatory logiczne]], natomiast ''|'' oraz ''&'' to [[https://pl.wikipedia.org/wiki/Operator_bitowy|operatory bitowe]]. | ||
- | |||
- | Podczas tego przedmiotu prawdopodobnie nie poznasz operatorów bitowych, stąd sądzę, że możesz w ciemno stosować "podwójne" symbole. | ||
- | ===== Typ danych w wywołaniu funkcji ===== | ||
- | |||
- | Typ zmiennych podajemy tylko w deklaracji funkcji -- nie w wywołaniu: | ||
- | |||
- | <code c> | ||
- | void func(int a) { // OK | ||
- | ... | ||
- | } | ||
- | |||
- | int main () | ||
- | { | ||
- | int k = 3; | ||
- | | ||
- | func(int k); // blad! | ||
- | func(k); // OK | ||
- | |||
- | ... | ||
- | } | ||
- | </code> | ||
- | |||
- | |||
- | ===== if-else - co to?! ===== | ||
- | |||
- | Zamiast powtarzać ten sam warunek logiczny, tylko w formie zaprzeczenia, możesz skorzystać z konstrukcji ''if-else'' (//jeżeli -- w przeciwnym razie//). | ||
- | |||
- | <code c> | ||
- | // Dziala, ale trzeba duzo pisac i malo to czytelne... | ||
- | if (a*a + b*b == c*c) { | ||
- | return 1; | ||
- | } | ||
- | if (a*a + b*b != c*c) { | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | <code c> | ||
- | // Lepiej! | ||
- | if (a*a + b*b == c*c) { | ||
- | return 1; | ||
- | } else { | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ===== Funkcja main() bez "return" ===== | ||
- | |||
- | (Minimalny) nagłówek funkcji ''main()'' wygląda następująco: | ||
- | <code c> | ||
- | int main(void) | ||
- | </code> | ||
- | Ten ''int'' oznacza, że funkcja ''main()'' zwraca wartość całkowitą (do systemu operacyjnego), a zatem powinna się ona kończyć instrukcją ''return'' (w naszym przypadku ''return 0;'', bo ''0'' oznacza poprawne zakończenie programu): | ||
- | <code c> | ||
- | int main(void) { | ||
- | return 0; | ||
- | } | ||
- | </code> | ||