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;
}
//---------------------------------------------------------------------------