infa.pdf

(1079 KB) Pobierz
1. Dany będzie fragment kodu w C++. Będzie należało go przeanalizować i odpowiedzieć na
pytania
dotyczące np. wartości pewnych zmiennych w określonych punktach programu, zawartości
wyświetlanych komunikat—w, kolejności wykonania instrukcji programu, itp.
Np.: Jaka jest wartość zmiennej x w linii 7? Czy instrukcja w linii 10 zostanie wykonana przy
podanych
warunkach wejściowych? Itp.
2. Przedstaw składnię i sposób działania wyrażeń warunkowych w języku C. Podaj przykłady
zastosowania.
Podpowiedź: if, switch, operator warunkowy
if (warunek) {
instrukcje;
}
if (warunek1) {
instrukcje1;
}
else if (warunek2) {
instrukcje2;
}
else {
instrukcje3;
}
jeżeli warunek1 jest spełniony, to wykonywane są instrukcje1,
jeżeli
nie, to są pomijane
jeżeli natomiast warunek2 jest spełniony, to wykonywane są
instrukcje2
jeżeli nie jest spełniony warunek 1 ani 2, wykonywane są
instrukcje3
Przykład: jeżeli zmienna x jest mniejsza od 7, to program wyświetla komunikat, że liczba jest
mniejsza od 7
if (x<7) {
cout<<”Liczba jest mniejsza od 7”<<endl;
}
switch (zmienna) {
case x: { instrukcje1; } break;
sprecyzowanymi
case y: { instrukcje2; } break;
wykonana
.
.
.
default: { instrukcje; } break;
}
w zależności od wartości zmiennej program decyduje
które z zestawu instrukcji wykonać. Poza
wartościami istnieje opcja default, która zostanie
dla każdej innej wartości zmiennej.
Opcjonalna funkcja break powoduje, że po wykonaniu
danego bloku instrukcji nie są wykonywane kolejne z
określonego wyrażenia switch bez sprawdzenia
warunków
Przykład: w zależności czy zmienna ma wartość 1,2,3 czy inną cyfrę program wyświetla
komunikaty: „1”, „2”, „3”, „inna cyfra”
switch (zmienna) {
case 1: { cout<<”1”<<endl; } break;
case 2: {cout<<”2”<<endl; } break;
case 3: {cout<<”3”<<endl; } break;
default” { cout<<”Inna cyfra”<<endl; } break;
}
Operator warunkowy „?”
wyrazenie_logiczne ? operacja_t : operacja_f;
• operacja_t – operacja, która wykonywana jest, gdy wyrażenie logiczne jest spełnione
• operacja_f – operacja, która wykonywana jest, gdy wyrażenie logiczne nie jest spełnione
Przykład: x<y ? x++:x--;
Jeżeli x<y to wtedy zmienna x jest zwiększana o 1; w innym
wypadku zmniejszana o 1.
Przy budowie warunków logicznych korzysta się z operatorów logicznych i relacji (porównań):
==, <, >, <=, >=, != operacje porównania
&&, ||, ! operacje logiczne
3. Przedstaw składnię i sposób działania pętli w języku C. Podaj przykłady zastosowania.
Podpowiedź: for, while, do-while
Pętla for - Używana, gdy z góry znamy liczbę wywołań instrukcji wewnątrz pętli
for (licznik=początek; warunek; zmiana licznika po przejściu) {
instrukcje;
}
•Licznik – licznik wykonań pętli (zalecany typ całkowity), zmienna, należy ją wcześniej
zadeklarować
• Początek – początkowa wartość licznika
• Warunek – warunek
trwania pętli
Przykład:
for (i=0; i<100; i++) {
cout<<i<<endl;
_getch();
}
Program będzie za każdym przejściem pętli wyświetlał aktualną wartość zmiennej i, która przyrasta
o 1 przy każdym przejściu, aż osiągnie wartość 100 i oczekiwał na naciśnięcie dowolnego klawisza.
Pętla while
Instrukcje wewnątrz pętli wykonywane są tak długo, jak długo spełniony jest warunek trwania pętli
– Ewentualny (nie musi go być) licznik pętli musimy zmieniać sami
– Używana, gdy:
• nie znamy z góry liczby wywołań
• znamy z góry liczbę wywołań (może zastąpić pętlę for)
• koniec pętli nie jest uzależniony od wartość licznika
(np. gdy czekamy na naciśnięcie klawisza)
– Składnia
while
(warunek trwania) {
instrukcje;
}
int suma;
suma=0;
while (a!=0) {
cin>>a;
suma=suma+a;
cout<<suma;
program pobiera wartość a, dopóki jest różna od zera, sumuje
wpisywane wartości i wyświetla je. Po wpisaniu zera pętla
kończy
przejście i jest przerywana.
}
Pętla do – while
Analogiczna do pętli while, lecz warunek trwania pętli sprawdzany jest
na końcu każdego przebiegu, a nie na początku - następstwo: pętla wykona się zawsze co najmniej
jeden raz
do
{
instrukcje;
}
while
(warunek trwania)
Przykład:
do {
cin>>a;
suma=suma+a;
cout<<suma;
} while (a!=0)
działanie jak wyżej
4. Na czym polega rzutowanie typów zmiennych? Kiedy i po co się je stosuje? Podaj składnię
operacji
rzutowania w języku C i w C++.
Rzutowanie w C:
c=(float)a/(float)b;
Podanie przed zmienną nazwy innego typu wymusza wykonanie obliczeń z użyciem
odpowiedniego typu zmiennej
• Rzutowanie nie zmienia typu zmiennej na stałe, a tylko dla danej operacji
• Inny możliwy zapis to c=float(a)/float(b);
• Powyższe sposoby to tzw. „rzutowanie w stylu C”, w C++ jest niezalecane
Rzutowanie w C++ (statyczne):
zmienna=static_cast <typ> (wyrażenie);
Rzutowanie oznacza, że kompilator na moment wyłącza kontrolę zgodności typów
• Rzutowanie to potencjalne miejsce błędów
• Rzutowania typów powinno się unikać
• Zwłaszcza rzutowania z typów o wyższej precyzji na typy o niższej precyzji np. z float na
int
• Powinno się stosować od razu odpowiednie typy zmiennych lub wprost stosować
odpowiednie operacje (np. zaokrąglenie)
Rzutowanie jest stosowane w celu przekonwertowania wartości zmiennej danego typu na inny typ,
w celu np. zgodności z funkcją lub do obliczeń (zmienne muszą być tego samego typu).
5. Na czym polega przeciążanie funkcji w języku C?
Jest to zadeklarowanie kolejnej funkcji o tej samej nazwie, ale z innymi parametrami wejściowymi
(o innych typach i w innej liczbie). Kompilator sam rozpozna (po typie zmiennych lub liczbie
parametrów), którą funkcję wybrać.
int
funkcjaC(int x){
operacje;
return
x;
}
float
funkcjaC(float x,
int
p){
operacje;
return
x;
}
Stosuje się to, jeśli tą samą funkcję trzeba wywoływać z różnymi rodzajami parametrów.
6. Czym różnią się od siebie zmienne statyczne, automatyczne i dynamiczne? Jaki jest zasięg
ich działania w
programie? Podaj przykłady
Zmienne statyczne
– Są tworzone raz, przy wywołaniu programu
• zmienne globalne
• statyczne zmienne lokalne
Przykład:
int zmienna1;
int main {
}
Zmienne automatyczne
– Są automatycznie tworzone i usuwane w czasie wykonywania programu
• zmienne lokalne funkcji
– Są umieszczane w obszarze stosu (stack)
Przykład:
void funkcja {
int zmienna;
}
Cecha wspólna
– Mają w momencie kompilacji znany typ (rozmiar) i nazwę (nadaną przez programistę)
Ograniczenie
– Z góry (w momencie pisania kodu) trzeba wiedzieć np. jak duże tablice będą potrzebne
– Obszar przeznaczony dla zmiennych statycznych i automatycznych jest ograniczony
• Nie można zadeklarować dowolnie dużej tablicy
(np. pod Windows XP maksymalny rozmiar wszystkich utworzonych zmiennych automatycznych
to 2GB)
Zmienne dynamiczne
– Mogą być tworzone i usuwanie w dowolnym momencie działania programu
– Są umieszczane w obszarze sterty (heap)
– Maksymalny rezerwowany obszar zależy od systemu i dostępności pamięci
• Np. w Windows XP można zadeklarować tablice do 2GB każdą
– Dają możliwość kontroli nad przydziałem pamięci
• Np. reakcję, gdy nie uda się utworzyć odpowiednio dużej tablicy
• Można zmieniać ich rozmiar w czasie działania programu
– Dostęp do zmiennych dynamicznych możliwy jest wyłącznie z użyciem wskaźników
• Nie mają nazw – powstają w czasie działania programu
Przykład:
unsigned long
*wsk_ul;
wsk_ul=new
unsigned long;
//operacje
delete wsk_ul;
7. Czym są i do czego służą zmienne wskaźnikowe? Kiedy ich używany? Jakie mają zalety?
Jakie niosą
niebezpieczeństwa? Podaj przykład deklaracji i inicjalizacji takiej zmiennej.
Język C/C++ daje możliwość bezpośredniego operowania także na adresach komórek pamięci, w
tym celu wykorzystuje się zmienne wskaźnikowe (pointers).
Deklaracje zmiennej wskaźnikowej:
typ
*nazwa;
– Przykład:
int
*ws_int; Zmienna wskaźnikowa o nazwie „ws_int”, która będzie mogła zawierać adres komórki
pamięci przechowującej liczbę typu int
float
*ws_f1, *ws_f2; Dwie zmienne wskaźnikowe, które będą mogły zawierać adresy komórek
pamięci przechowujące liczby typu float
Nadanie wartości zmiennej wskaźnikowej
– operator pobrania adresu „&” (operator adresu)
• zwraca fizyczny adres komórki pamięci przechowującej zmienną
typ
*wskaznik, zmienna;
wskaznik=&zmienna;
Zgłoś jeśli naruszono regulamin