User Tools

Site Tools


dydaktyka:cprog:common_mistakes

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
dydaktyka:cprog:common_mistakes [2015/11/08 19:13]
pkleczek [Wyświetlanie adresu zmiennej zamiast jej wartości]
— (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` (czyli: 5) jako liczbe calkowita 
- 
-printf("​%d\n",​ &​a); ​ // wypisz adres zmiennej `a` (czyli, np.: 0x0028FCE5) 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>​ 
  
dydaktyka/cprog/common_mistakes.1447006383.txt.gz · Last modified: 2020/03/25 11:46 (external edit)