Drobne programowanie

Kaczuś zaprasza do opowieści o algorytmach, językach programowania i strukturach danych

Na stronie stosowane są pliki cookies. Więcej na podstronie.
odsłon: 490

Opis I quizu

I Quiz sprawdzający wiedzę z programowania w C i C++. Większość wiedzy znajdą Państwo w artykułach na stronie. Tutaj opis z odesłaniami.

Pytanie 1:

mamy fragment programu:
char *s = "Ala ma kota";
...
s[0] = 'E';
Proszę podać, która z odpowiedzi jest niepoprawna:

  • Program może się nie skompilować
  • Kod w zasadzie jest bez zastrzeżeń
  • Program może "wywalić się" przy operacji s[0] = 'E';
  • Deklaracja to tak naprawdę const char *s;

odpowiedź: nieprawidłową odpowiedzią jest, że kod jest poprawny. Ten przypadek był omawiany i jest w skrzyni porad.

Pytanie 2:

Który sposób sprawdzania nieparzystości może dać nieprawidłową odpowiedź
  • if((liczba & 1) == 1)
        puts("liczba nieparzysta");
  • if((liczba % 2) == 1)
        puts("liczba nieparzysta");
  • if((liczba % 2) != 0)
        puts("liczba nieparzysta");
  • if(abs(liczba % 2) == 1)
        puts("liczba nieparzysta");

odpowiedź: nieprawidłowo zadziałać może oczywiście drugi kod, dla liczb ujemnych. Ten przypadek był omawiany i jest w skrzyni porad.

Pytanie 3:

Które ze zdań dotyczących liczb zmiennoprzecinkowych jest błędne:
  • operacje na liczbach zmiennoprzecinkowych są łączne i rozdzielne
  • ilość liczb zmiennoprzecinkowych jednego typu (np float) jest ograniczona
  • wśród liczb zmiennoprzecinkowych może występować liczba -0
  • według standardu IEEE 754 liczba double ma 64 bity

odpowiedź: nieprawidłowe jest zadnie pierwsze. Problem był omawiany w artykule o liczbach zmiennoprzecinkowych.

Pytanie 4:

Czy w C możemy programować obiektowo?
  • Tylko jeśli przyjmiemy, że mówimy tak naprawdę o języku Objective-C
  • Nie, gdyż nie uda się uzyskać polimorfizmu
  • Oczywiście, że możemy, będzie tylko troszkę trudniej, niż w językach do tego przygotowanych
  • W języku C programujemy jedynie strukturalnie

odpowiedź: prawidłowa jest odpowiedź 3. Na ten temat był cały cykl artykułów.

Pytanie 5:

mamy funkcję:
int foo(unsigned int a)
{
  char s[a];
  //...
}

  • kod jest poprawny w C, a niepoprawny w C++
  • kod jest poprawny w C++, a niepoprawny w C
  • kod jest poprawny w C i C++
  • kod jest poprawny w C, a niepoprawny w C++, choć niektóre kompilatory C++ pozwalają na taką konstrukcję

odpowiedż: tu poprawne są odpowiedzi pierwsza oraz czwarta i obie zaliczają pytanie. Problem ten był omawiany w skrzyni porad.

Pytanie 6:

char tab[5] = "Tomek";

  • poprawne jest to zarówno w C jak i C++
  • poprawne w C, niepoprawne w C++
  • niepoprawne i w C i w C++
  • poprawne w C++, niepoprawne w C

odpowiedż: jest to poprawne w C, w C++ nie, gdyż w C++ literał znakowy zakończony jest zawsze zerem, tak więc tablica jest o jeden znak za mała. C pozwala na taka konstrukcję, zostawiając programiście pilnowanie prawidłowej obsługi takiej tablicy. Znajdą Państwo szczegóły w książce Bjarne'a Stroustrupa.

Pytanie 7:

void foo()
{
  int i;
  printf("%d", i);
}
wypisane zostanie:
  • 0
  • 1
  • wystąpi błąd i nic nie wypisze
  • wypisana wartość będzie przypadkowa
odpowiedź: oczywiście prawidłowa odpowiedź to odpowiedź czwarta. Mamy niezdefiniowaną wartość i, więc może to być dowolna liczba i taka zostanie wypisana.

Pytanie 8:

int i = 51;
printf ("%d, ", (i+1));
printf ("%d, ", i++));
printf ("%d", ++i);
wypisany zostanie ciąg:
  • 52, 51, 53
  • 51, 52, 53
  • 52, 52, 53
  • 52, 51, 52
odpowiedź: najpierw zostanie wypisane 51 + 1, czyli 52, następnie wypisana zostanie wartość i, czyli 51, a następnie wartość i zostanie zwiększone o 1 w kolejnym kroku najpierw i zwiększy się o 1 a później wypisze wartość, czyli 53. Tak więc prawidłową będzie odpowiedź 1.

Pytanie 9:

char tab[5];
char *ptab = tab;

scanf("%s", &ptab);
scanf("%s", ptab);
scanf("%4s", ptab);

  • poprawne są wszystkie 3 wywołania funkcji scanf
  • najlepsze wywołanie 3, potem 2, pierwsze niepoprawne
  • poprawne tylko pierwsze
  • niepoprawne są wszystkie wywołania

odpowiedź: oczywiście poprawna jest odpowiedź 2. Przypadkowo ze względu na konwersję niejawną tablicy na wskaźnik prawidłowo mogą zadziałać wszystkie 3, ale nie należy tak robić. Informacje na ten temat są w skrzyni porad.

Pytanie 10:

W zależności od języka (standard C++11 i C11) sizeof('a') będzie równe:
  • w C i w C++ sizeof(char)
  • w C sizeof(int) w C++ sizeof(char)
  • w C i w C++ sizeof(int)
  • w C sizeof(char) w C++ sizeof(int)

odpowiedź: standard mówi jasno, że w C będzie to sizeof(int), natomiast w C++ sizeof(char), na co należy zwrócić uwagę programując. Znajdą Państwo szczegóły w książce Bjarne'a Stroustrupa.

2015-08-27 21:52:43


język C C++ C quiz