Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Nasze polecane książki, kursy, strony internetowe itp. pomocne przy przyswajaniu umiejętności pisania programów w C.
Awatar użytkownika
StaryAnoda_NEW
Newb
Newb
Posty: 66
Rejestracja: środa 04 kwie 2018, 16:48

Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: StaryAnoda_NEW » niedziela 04 lis 2018, 19:02

Hej

Jakie mieliście pytanie kiedy staraliście się na stanowisko młodszego programisty C, czy tam młodszego programisty systemów wbudowanych?
Oraz jakie byście zadali pytania, kiedy mielibyście za zadanie przeprowadzić taką rozmowę?

Pozdrawiam
StaryAnoda_NEW
done is better than perfect

Awatar użytkownika
dambo
Expert
Expert
Posty: 601
Rejestracja: czwartek 17 mar 2016, 17:12

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: dambo » niedziela 04 lis 2018, 22:04

Ja bym celował trochę obok - wystarczy dbać o swojego githuba itp i można uniknąć takich pytań o szczegóły, tylko rozmawiać na "wyższym poziomie abstrakcji".
Zapraszam na mojego pseudobloga z projektami itp: http://projektydmb.blogspot.com/

Awatar użytkownika
inż.wielki
User
User
Posty: 254
Rejestracja: niedziela 20 gru 2015, 23:11

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: inż.wielki » poniedziałek 05 lis 2018, 07:55

Jak wyżej. Jak idziesz na rozmowę weź swoje projekty. Najlepiej laptopa + jeden albo 2 projekty fizyczne. Wtedy nie powinno być żadnych problemów. Mnie pytali ostatnio o to co się stanie kiedy w mikrokontrolerze zajedziesz sobie pamięć ram. Jak działają przerwania itd

Awatar użytkownika
ZbeeGin
User
User
Posty: 277
Rejestracja: sobota 08 lip 2017, 17:16
Lokalizacja: GOP
Kontaktowanie:

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: ZbeeGin » poniedziałek 05 lis 2018, 11:38

inż.wielki pisze:Mnie pytali ostatnio o to co się stanie kiedy w mikrokontrolerze zajedziesz sobie pamięć ram.

Pytanie bez sensu - pewnie podchwytliwe. SRAM - mało który µC ma przecież FRAM lub DRAM jako pamięć operacyjną - to tylko przerzutniki więc nie ma tam nic co by ulegało szybkiemu zużyciu.

@ StaryAnoda_NEW, proponuję nie wykuwać "na blachę" odpowiedzi na znane pytania rekruterów. Powinieneś być w stanie reagować i udzielać odpowiedzi odpowiedniej do toku rozmowy.

Awatar użytkownika
piotrek
Newb
Newb
Posty: 81
Rejestracja: niedziela 05 lis 2017, 02:46

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: piotrek » poniedziałek 05 lis 2018, 21:48

Do pytań z zakresu embedded najlepiej przygotować się z problematycznych kwestii takich jak ograniczona pamięć, przerwania, niezawodność programu. W szczególności:
- przepełnienie stosu (rekurencja, częste przerwania, zagnieżdżanie funkcji)
- slowo kluczowe volatile i różne jego postaci (const, *const, argumenty funkcji)
- makra, prekompilacja czego się da
- crashe programu i jego przyczyny (nieumiejęte operowanie wskaźnikami, mazanie po pamięci)
- rzutowanie struktur i typów na siebie wzajemnie (pola bitowe, struktury, tablice, unie, inty 16,32 bitowe, typy wskaznikowe na zwykłe)
- obsługa przerwań w maszynie stanów
- niezależność od architektury, przenaszalność kodu
- kopiowanie argumentów funkcji na stos, zmiene lokalne
- zmienne statyczne, stałe, inicjalizacja zmiennych, tablic, struktur
- zagadnienia wokół mikrokontrolerów: AD/DA, PWM

A jeśli chodzi o własne projekty na repo GITa - trzeba być pewnym co się pokazuje, bo to może być strzał w stopę :D
Podejście seniorów na rekrutacji do "młodzieży" może być bardzo surowe ponieważ obecnie, w dobie bezmyślnych "arduinowców" i powszechnych praktyk programowania ctrl+c, ctrl+v trudno zaufać kompetencji rekrutów.

Awatar użytkownika
anshar
Posty: 7
Rejestracja: sobota 09 lip 2016, 20:30

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: anshar » poniedziałek 05 lis 2018, 22:38

Ja na przykład, miałem za zadanie napisać krótką funkcję, która ma zliczać ilość bitów w zmiennej na przykład int (czyli ile znajduje się "jedynek" w jakiejś zmiennej, na przykład zmienna o wartości 7 to binarnie 0b00000111 czyli 3, 27 to 0b00011011 czyli 4).
Zadanie niby nie trudne, ale czy na pewno?
Zacząłem od użycia operatora przesunięcia bitowego i sprawa prosta.
Tylko, że to miało być napisane bez użycia operatorów przesunięć bitowych, mnożenia i dzielenia. :)
Na pytanie jakich operatorów mogę użyć otrzymałem odpowiedź, że do dyspozycji są tylko +, -, & oraz |.
Proste? Do dyspozycji miałem tylko mazak i białą tablicę.

Dając Ci jakieś zadanie do wykonania często chcą zobaczyć jak sobie poradzisz, jak wygląda Twoje logiczne myślenie.

Zadawałem pytania, głośno myślałem, próbowałem na różne sposoby i się udało.
Najgorsze jest gdy ktoś powie coś w stylu nie wiem, nie dam rady, to czarna magia. :)
Może to Ci pomoże. Powodzenia!

Zacząłem tak:

Kod: Zaznacz cały

#include  <stdio.h>

#define value 27

int bitCount(int val);

int main(void)
{
    printf("Ilość bitów '1' w zmiennej %d wynosi %d\n", value, bitCount(value));
    return 0;
}

int bitCount(int val) {
   
    int result = 0;
   
    while(val) {
        if(val & 1) result++;
        val >>= 1;   
    }
    return result;
}


A jak teraz pozbyć się '>>' ? ;)

Awatar użytkownika
ZbeeGin
User
User
Posty: 277
Rejestracja: sobota 08 lip 2017, 17:16
Lokalizacja: GOP
Kontaktowanie:

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: ZbeeGin » poniedziałek 05 lis 2018, 23:05

Odwrócić sytuację i użyć dodawania val+val.

Awatar użytkownika
piotrek
Newb
Newb
Posty: 81
Rejestracja: niedziela 05 lis 2017, 02:46

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: piotrek » wtorek 06 lis 2018, 13:17

Wystarczy nakladac maskę kolejnych potęg liczby 2 i sprawdzać czy val jest większa od 0. Potęgi można stablicować albo obliczać, zaczynając od n=1: n << 1 = 2 * n = n + n

Awatar użytkownika
j23
User
User
Posty: 380
Rejestracja: czwartek 08 paź 2015, 18:40

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: j23 » wtorek 06 lis 2018, 16:32

anshar pisze:(...)A jak teraz pozbyć się '>>' ? ;)

W sumie ciekawe zadanie na rekurencję, a dalej wstęp do pytań o stos i jego przepełnienie i jak se z tym poradzić...

W każdym razie ja bym zrobił to tak:

Kod: Zaznacz cały

#include  <stdio.h>
#define value 27
int bitCount(int val);
int main(void)
{
    printf("Ilość bitów '1' w zmiennej %d wynosi %d\n", value, bitCount(value));
    return 0;
}

int result=0;
int bitCount(int val) {
   if (val==0) return result;
   if (val==1) return result++;
   if (val>=2)
      {
      val=val-2;
      return result++;
      }   
   bitCount(val);
}
"(...)He is divisive. He is manipulative. He is a user(...)" - Gary Kildall about Bill Gates

Awatar użytkownika
anshar
Posty: 7
Rejestracja: sobota 09 lip 2016, 20:30

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: anshar » wtorek 06 lis 2018, 20:30

Fajny pomysł z rekurencją. ;)
Super! A da się bez rekurencji?

Tak na szybko wkleiłem tutaj: https://rextester.com/l/c_online_compiler_gcc
Niestety nie działa. :roll:

Awatar użytkownika
xor
User
User
Posty: 139
Rejestracja: poniedziałek 05 wrz 2016, 21:44

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: xor » wtorek 06 lis 2018, 21:16

W tej funkcji nigdy nie dojdzie do rekurencji.

No to ja podam kolejny przykład, ale nie mój bo hakier ze mnie marny, ale z książki pt. "Hacker's Delight" (gdzie nb. algorytmów na to jest chyba ze 20):

Kod: Zaznacz cały

#include  <stdio.h>
#define value 27

int bitCount(int val);


int main(void)
{
    printf("Ilość bitów '1' w zmiennej %d wynosi %d\n", value, bitCount(value));
    return 0;
}


int bitCount(int x) {
   int n;
   n = 0;

   while (x != 0) {
      n = n+ 1;
      x = x & (x - 1);
   }
   return n;
}

Awatar użytkownika
piotrek
Newb
Newb
Posty: 81
Rejestracja: niedziela 05 lis 2017, 02:46

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: piotrek » wtorek 06 lis 2018, 23:32

A tutaj przykład jak przetestować na wszystkich wartościach typu danych (typ countedInteger, tutaj jest 16 bitowy uint). Testowanie odbywa się poprzez porównanie wyników dwóch funkcji - pewnej z operatorem >> i testowanej z ograniczonymi operatorami + &

Kod: Zaznacz cały

#include <stdio.h>
#include <assert.h>
#include <stdint.h>
#define MAX(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | (0xFULL << ((sizeof(t) * 8ULL) - 4ULL)))
typedef uint16_t countedInteger;
const int BIT_SIZE = sizeof(countedInteger) * 8;
int countBit(countedInteger v);
int countBitLimitedOperators(countedInteger v);
int countFunctTest();
int main() {
   countFunctTest();
   return 0;
}
int countFunctTest() {
   uint64_t i;
   uint64_t max = (uint64_t)MAX(countedInteger);
   for(i = 0; i < max; ++i) {
      assert(countBit(i) == countBitLimitedOperators(i));
   }
}
int countBit(countedInteger v) {
   int count = 0;
   while(v > 0) {
      count += v & 1;
      v >>= 1;
   }
   return count;
}
int countBitLimitedOperators(countedInteger v) {
   int count = 0;
   int bitSize = BIT_SIZE;
   int pow2 = 1;
   while(bitSize-- > 0) {
      count += (v & pow2) > 0 ? 1 : 0;
      pow2 = pow2 + pow2;
   }
   return count;
}

Awatar użytkownika
anshar
Posty: 7
Rejestracja: sobota 09 lip 2016, 20:30

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: anshar » środa 07 lis 2018, 00:30

No i pięknie panowie!
Na rozmowie o pracę doszedłem do takiej postaci:

Kod: Zaznacz cały

int bitCount(int value) { 
    int result=0;
    while(value) {
            value &= value--;
            result++;
    }
    return result;
}


Muszę zerknąć do tej książki pt. "Hacker's Delight" (gdzie nb. algorytmów na to jest chyba ze 20):i! ;)

Awatar użytkownika
piotrek
Newb
Newb
Posty: 81
Rejestracja: niedziela 05 lis 2017, 02:46

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: piotrek » środa 07 lis 2018, 09:54

Kilka przykładów starej dobrej szkoły można znaleźć tutaj: https://graphics.stanford.edu/~seander/bithacks.html

Awatar użytkownika
xor
User
User
Posty: 139
Rejestracja: poniedziałek 05 wrz 2016, 21:44

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: xor » środa 07 lis 2018, 12:22

Kod: Zaznacz cały

...
            value &= value--;
...


Mam poważne wątpliwości co do tego wyrażenia. IMO punkt sekwencyjny jest za średnikiem, a więc wynik wyrażenia jest zależny od kompilatora.

Awatar użytkownika
ZbeeGin
User
User
Posty: 277
Rejestracja: sobota 08 lip 2017, 17:16
Lokalizacja: GOP
Kontaktowanie:

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: ZbeeGin » środa 07 lis 2018, 12:40

Zaczyna się robić mocny off-topic...

Awatar użytkownika
mokrowski
User
User
Posty: 167
Rejestracja: czwartek 08 paź 2015, 20:50
Lokalizacja: Tam gdzie Centymetro

Re: Język C - zbiór zadań, pytań na rozmowę kwalifikacyjną

Postautor: mokrowski » środa 07 lis 2018, 20:53

Ja zaczynam od bardzo prostego pytania lub polecenia.

Proszę określi czy i jak podany program się kompiluje, jakie ma błędy i w jaki sposób należy go poprawić.

Kod: Zaznacz cały

main() {
    char * msg = "Hello C!\n";
    printf(msg);
}


Po tym jak ktoś odpowiada, ile znajdzie błędów, czy odróżnia ostrzeżenia od błędu, określa czy coś jest w standardzie a co nie jest... będę od razu wiedział z kim mam do czynienia :)

Na drugi ogień idzie pytanie:
Czy to jest poprawne i jak będzie działało a jeśli nie jest poprawne to jak poprawić by działało?

Kod: Zaznacz cały

#include <stdio.h>

int main(void) {
    char * msg = "babol";
    msg[0] = 'r';
    msg[1] = 'o';
    puts(msg);
    return 0;
}


Po tych dwóch pytaniach 50-70% odpada i nie tracę czasu.
,,Myślenie nie jest łatwe, ale można się do niego przyzwyczaić" - Alan Alexander Milne: Kubuś Puchatek


Wróć do „Skąd czerpać wiedzę na temat języka C?”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość