Podstawy Programowania
- Ćwiczenia 2
Zasady, Ćw1, Ćw2, Ćw3, Ćw4, Ćw5, Ćw6, Ćw7, Ćw8, Ćw9, Ćw10, Ćw11,
Ćw12, Ćw13
Prowadzący: Rafał Witkowski
Temat: Instrukcje warunkowe,
pętle. Pierwsze samodzielne rozwiązania zadań na sprawdzarce.
Zachęcam do uważnego przeczytania
wszystkiego co było na ćwiczeniach 1
Instrukcje warunkowe
Konstrukcja instrukcji warunkowej w C/C++ jest następująca:
if (wyrażenie) operacja_prawda;
else operacja_fałsz;
UWAGA! Nie ma słówka then,
które występowało w Pascalu.
Każda operacja (operacja_prawda lub
operacja_fałsz) może być
równie dobrze blokiem operacji rozpoczynającym się od znaku { a
kończącym znakiem }.
Jeśli wyrażenie jest
prawdziwe wykonana zostanie operacja
_prawda.
Jeśli wyrażenie jest fałszywe
wykonana zostanie operacja _fałsz.
Problem rozróżniania prawdy od fałszu w C sprowadza się do sprawdzania,
czy coś ma wartość 0, czy też ma inną wartość.
0 (zero) zawsze oznacza fałsz
Każda inna wartość oznacza prawdę.
Każde sprawdzenie wartości logicznej odbywa się poprzez umieszczenie
pewnego wyrażenia w nawiasach.
I tak np. fragment kodu:
i = 1;
if (i) printf("Prawda");
else printf("Fałsz");
Wypisz nam na ekranie słowo "Prawda". Gdyby jednak zrobić:
i = 0;
if (i) printf("Prawda");
else printf("Fałsz");
wówczas na ekranie pojawi się słowo "Fałsz".
W nawiasach można też umieszczać dowolne operacje arytmetyczne, a do
określenia prawdy lub fałszu wzięty zostanie wynik działań. Np:
i = 1;
if (2*i-3+1/i) printf("Prawda");
else printf("Fałsz");
Na ekranie pojawi się słowo "Fałsz".
Oczywiście w nawiasach mogą się pojawiać standardowe operacje
porównania takie jak:
równe: ==
nierówne: !=
mniejsze: <
mniejsze-równe: <=
większe: >
więsze-równe: >=
Wyrażenie umieszczone w nawiasie zwraca wówacz nam wartość 1 lub 0, w
zależności od tego, czy dane porównanie jest prawdą, czy też fałszem.
Np:
i = 1;
if (i==1) printf("Prawda");
else printf("Fałsz");
Na ekranie pojawi się słowo "Prawda".
UWAGA:
Z tego, co pojawiło się wcześniej wynika, ze można robić tak:
int x,i;
i = 1;
x = (i==1);
printf("%d",x);
Na ekranie pojawi się liczba 1, gdyż i==1 było prawdą, czyli wartość
logiczna wyrażenia wyniosła 1.
Operatory logiczne
Wartości logiczne można oczywiście ze sobą łączyć używając odpowiednich
operatorów logicznych. Najważniejsze z nich to:
Koniunkcja: &&
Alternatywa: ||
Negacja: !
Oczywiście można je dowolnie łączyć, używając odpowiedniego
ponawiasowania. Np:
i = 1;
if ((i>=0) && (i<=10) && !(i==5)) printf("Prawda"); //Prawda, jeśli i jest w przedziale od 1 do 10, ale nie jest 5
else printf("Fałsz");
Pętle
While
while (warunek) operacja;
Tak długo jak warunek jest prawdziwy, wykonywana jest operacja.
(Operacja może być
oczywiście równie dobrze blokiem operacji rozpoczynającym się od znaku
{ a
kończącym znakiem }).
do while
do operacja while (warunek);
Operacja zostanie wykonana raz, a następnie, tak długo jak warunek jest
prawdziwy, będzie powtarzana. (Operacja może być
oczywiście równie dobrze blokiem operacji rozpoczynającym się od znaku
{ a
kończącym znakiem })
For
for (wartość_początkowa; warunek_konca; modyfikacja_zmiennej_sterującej) operacja;
Wartość_początkowa - ciąg
instrukcji, które są wykonywane na początku, przy inicjalizacji pętli.
Najczęściej jest to nadanie wartości początkowych zmiennej sterującej.
Modyfikacja_zmiennej_sterującej -
ciąg instrukcji, które są wykonywane natychmiast, po zakończeniu
jednego obiegu pętli. Najczęściej jest to modyfikacja zmiennej
sterującej, np. zwiększenie jej wartości.
Warunek_konca - warunek
sprawdzany przed rozpoczęciem wykonania każdego obrotu pętli. Jeśli
warunek nie jest prawdziwy, wówczas pętla kończy swoje działanie.
(Operacja może być
oczywiście równie dobrze blokiem operacji rozpoczynającym się od znaku
{ a
kończącym znakiem })
Np:
for (int i=0; i<5; i++) operacja;
Ta pętla na początku zainicjuje zmienną i i przypisze jej wartość jeden.
Następnie operacja wykona się
5 razy. Będzie tak, gdyż 5 razy zwiększymy wartość zmiennej i o jeden i dopiero za 6 razem
warunek i<5 nie będzie prawdziwy.
Aby wykonać pewne operacje w nieskończoność można użyć takich pętli:
while (1) do
{
}
for (;;)
{
}
Operacje zakłócające przebieg pętli
Aby zmienić bieg działania pętli można użyć jedngo z dwóch poleceń
zakłócających przebieg pętli:
continue -
przerywa działanie pętli i przechodzi do jej następnej iteracji
break
- opuszcza pętle
Zadania
Podczas tych zajęć, w zasadzie mając tylko tę wiedzę i znając operacje
arytmetyczne i instrukcje przypisania, można wykonać następujące
zadania:
Zadanie 1
Zadanie 24
Zadanie 53
Zadanie 54
Szkielet programu
Odtąd wszystkie rozwiązywane przez nas zadania będą opierały się na
liczbie zestawów oraz tego, co program właściwie powinien robić.
Szkielet takiego programu powinien wyglądać następująco:
//---------------------------------------------------------------------------
#pragma hdrstop
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
int d; // deklaracja zmiennej oznaczającej liczbę zestawów danych
scanf("%d",&d); // sczytwanie liczby zestawów danych
for (int i=0; i<d; i++) // pętla sterująca programem - wykonywana tyle razy, ile jest zestawów
{
//---------------------------------------------------------------------------------------------
// Tu powinien znajdować się właściwy kod programu rozwiązujący zadanie dla pojedynczego testu
//---------------------------------------------------------------------------------------------
}
return 0;
}
//---------------------------------------------------------------------------