Instrukcje iteracyjne czyli pętle
Język C ma trzy instrukcje typu iteracyjnego:
1)
For(instrukcja początkowa; wyrażenie warunkowe; instrukcja kroku)
{
instrukcja1;
instrukcja2;
...................;
}
Instrukcja początkowa to najczęściej podstawienie wartości początkowej na zmienną sterującą
Wyrażenie warunkowe jeżeli przyjmie wartość „0” tzn. ”fałsz” to pętla zostanie zakończona. Ponieważ wyrażenie to jest sprawdzane przed każdym „obrotem” to pętla może nie „zaskoczyć” już przy starcie.
Instrukcja kroku jest wykonywana po każdym „obrocie”
Przykład
Obliczenie sumy szeregu Sn= n2+3*n-2 w przedziale od 1 do 100 - wydruk tylko końcowego wyniku
#include <stdio.h>
#include <math.h>
void main()
{
int i,S;
S=0;
for (i=1;i<=100;i++) S=S+i*i+3*i-2;
printf(”%d”,S);
}
Obliczenie sumy szeregu Sn= n2+3*n-2 w przedziale od 1 do 100 - wydruk każdej kolejnej sumy
#include <stdio.h>
#include <math.h>
void main()
{
int i,S;
S=0;
for (i=1;i<=100;i++)
{
S=S+i*i+3*i-2;
printf(”%d\t”,S);
}
}
Dla C nie jest błędem jeżeli nie zostanie wprowadzona jakaś pozycja do instrukcji for np. nieskończoną pętle daje:
For( ; ; )
{
.............;
.............;
}
nie podana wartość „wyrażenie warunkowe” oznacza, że zawsze jest ono spełnione
2)
while(wyr_log)
{
instrukcja1;
instrukcja2;
……………;
}
pętla będzie tak długo wykonywana jak długo wyr_log nie przyjmie wartość „0” tzn.”fałsz”
Pętla ta nie wystartuje, jeżeli od razu wyr_log będzie miało wartość 0.
3)
do
{
instrukcja1;
instrukcja2;
……………;
}
while(wyr_log)
Warunek sprawdzany jest tutaj po pierwszym przebiegu i stąd instrukcje są co najmniej raz wykonywane.
Nawiasy klamrowe są niepotrzebne jeżeli w pętli występuje tylko jedna instrukcja.
Program tablicuje wyniki w zbiorze ”wyn.dat” celem wykonania wykresu toru pocisku (problem - rzut ukośny). Dane początkowe znajdują się w zbiorze ”dane.dat”. Program kończy obliczenia przy pierwszej ujemnej wartości współrzędnej y
#include <stdio.h>
#include <math.h>
void main()
{
double alfa,v0,t,x,y;
double const g=9.81;
FILE *plik;
plik=fopen(“dane.dat”,”r”);
fscanf(plik,“%lf%lf“,&alfa,&v0);
fclose(plik);
plik=fopen(“wyn.dat“,“w“);
alfa=alfa*3.1416/180;
t=0;
do
{
x=v0*cos(alfa)*t;
y=v0*sin(alfa)*t-0.5*g*t*t;
fprintf(plik,“%4.1f %6.2f %6.2f“,t,x,y);
t=t+0.1;
}
while(y>=0)
fclose(plik);
}
#include <stdio.h> // Poszukiwanie liczb pierwszych
#include <conio.h>
#include <math.h>
void main(void)
{
long int n,i,j,k;
printf("Podaj gorna granice\n");
scanf ("%ld",&n);
for(i=3;i<=n;i=i+2)
{ k=0;
for(j=3; j<=sqrt(i); j=j+2)
{
if(fmod(i,j)==0)
{
k=1;
break;
}
}
if(k==0) printf("%ld\t",i);
}
return;
}
Instrukcja break zastosowana w pętli powoduje z niej wyskok. Przy pętlach zagnieżdżonych tylko wyjście na zewnątrz tej, w której się ta instrukcja znajduje. W powyższym przykładzie break powoduje wyskok z pętli po "j" i przejście do następnej wartości "i".
Instrukcja continue powoduje skok do końca bieżącej pętli i rozpoczęcie następnego "obrotu"
#include <stdio.h> //Poszukiwanie liczb doskonałych
#include <conio.h> // suma ich podzielników równa
#include <math.h> // jest samej liczbie
void main(void)
{
long int n,i,j,k;
printf("Podaj gorna granice\n");
scanf ("%ld",&n);
for(i=1;i<=n;i=i++)
{ k=1;
for(j=2;j<=sqrt(i);j++)
{
if(fmod(i,j)==0) k=k+j;
}
if(k==i) printf("%ld\t",i);
}
return;
}
Różne operatory
Podstawowe: + ; - ; * ; / ; % ;
Inkrementacji (+) i dekrementacji (-): ++a ; a++ ; --b ; b--
Jeżeli operator. np. inkrementacji stoi przed zmienną w wyrażeniu to najpierw ta zmienna jest "inkrementowana", a potem obliczane jest to wyrażenie. W przeciwnym przypadku jest odwrotnie!!!!!!!!
Relacji: > ; >= ; < ; <= ; == ; != ;
Spójniki logiczne
a || b
|| suma logiczna; (jedno lub drugie ma wartość prawda czyli różną od 0)
a && b
&& iloczyn logiczny; (jedno i drugie ma wartość prawda czyli różną od 0)
Bitowe
niech a=10101100 a b= 11100011 to
op. przesunięcia w lewo: a<<3 01100000
op. przesunięcia w prawo: a>>3 00010101
bitowa koniunkcja a&b 10100000
(1 tylko na miejscu gdzie jest 1 w a i w b*))
bitowa alternatywa a|b 11101111
(0 tylko na miejscu gdzie jest 0 w a i w b*))
bitowe exclusive OR a^b 01001111
(jak wyżej, dodatkowe 0 gdzie jest 1 w a i w b*))
bitowa negacja ~a 01010011
(zamiana 0 na 1 i odwrotnie)
*) jednocześnie.
Operatory przypisania:
i +=2 ⇒ i = i + 2; i -=2 ⇒ i = i - 2; i *=2 ⇒ i = i * 2;
i /=2 ⇒ i = i / 2; i >>=2⇒ i = i >> 2; i <<=2 ⇒ i = i << 2;
i &=2 ⇒ i = i & 2; i |=2 ⇒ i = i | 2; i ^=2⇒ i = i ^ 2;
Program zamienia znak wprowadzany jako mała litera i drukuje literę dużą:
#include <stdio.h>
#include <math.h>
void main(void)
{
char p;
printf("Podaj litere\n");
scanf("%c",&p);
p=p&223;
printf("%c\n",p);
}
INFORMATYKA WYKŁAD 3 Temat: Język C 3
wczytywanie danych
otwieranie pliku z danymi
tu nie stawiamy średnika
i tu też nie!
tu nie stawiamy średnika
zamknięcie pliku ”dane.dat”
otwieranie pliku do zapisu wyników
zachowana jest nazwa zmiennej plikowej „plik” i zastosowana do zupełnie innego zbioru
Sprawdzana jest podzielność kolejnych liczb nieparzystych "i" od 3 do "n" przez nieparzyste liczby "j" od 3 do
. Jeżeli reszta z dzielenia jest zerem tzn., że dana liczba "I" nie jest liczbą pierwszą, następuje skok do początku pętli i sprawdzana jest kolejna wartość "i" . W przeciwnym przypadku liczba "i" jako liczba pierwsza jest drukowana.
Przeglądane są liczby "i" z przedziału 2, "n". Każda z nich dzielona jest prze kolejne liczby "j" z przedziału 2,
. Jeżeli reszta z dzielenia jest 0 to podzielnik dodajemy do "k". Na konie sprawdzamy czy i=k, tzn. czy liczba "i" równa jest sumie swoich podzielników
Małe litery różnią się od dużych swoich odpowiedników jedynie 5 bitem - 1 małe, a 0 duże litery. Ponieważ bitowo 223 to 11011111 więc każda koniunkcja bitowa z tą liczbą zmienia jedynie 5 bit na zero - otrzymujemy dużą literę.