User Tools

Site Tools


dydaktyka:cprog:common_mistakes

This is an old revision of the document!


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: operatory relacyjne):

int a = 5;        // przypisanie do zmiennej `a` wartosci 5
 
if (a == 7) {     // porownanie wartosci zmiennej `a` z wartoscia 7
    ...
}   

:!: Operator przypisania przypisuje temu, co stoi po lewej stronie (zazwyczaj zmiennej), wartość stojącą po prawej stronie.

int a;
2 = a;  // blad!
a = 2;  // OK

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:

scanf("%d", "%d", &a, &b);  // blad!
scanf("%d %d", &a, &b);  // OK - wczytaj dwie liczby oddzielone spacja

O tym, co dokładnie oznacza & dowiesz się na laboratorium o wskaźnikach.

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 ;-)

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

XOR na bitach zmiennych zamiast potęgowania

W języku C nie ma operatora potęgowania – symbol ^ oznacza operator bitowy XOR. Aby podnieść liczbę do danej potęgi, musisz ją wymnożyć.

int a = 4;
int b = a ^ 2;  // 4 XOR 2 == 6, nie o to chodzilo...
int c = a * a;  // OK - `a` do 3. potegi

Typ danych w wywołaniu funkcji

Typ zmiennych podajemy tylko w deklaracji funkcji – nie w wywołaniu:

void func(int a) {  // OK
    ...
}
 
int main ()
{
    int k = 3;
 
    func(int k); // blad!
    func(k);     // OK
 
    ...
}

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

// 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;
}
// Lepiej!
if (a*a + b*b == c*c) {
    return 1;
} else {
    return 0;
}

Funkcja main() bez "return"

(Minimalny) nagłówek funkcji main() wygląda następująco:

int main(void)

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):

int main(void) {
    return 0;
}
dydaktyka/cprog/common_mistakes.1447005797.txt.gz · Last modified: 2020/03/25 11:46 (external edit)