c wykład 3, Informatyka


Instrukcje iteracyjne czyli pętle

Język C ma trzy instrukcje typu iteracyjnego:

1)

For(instrukcja początkowa; wyrażenie warunkowe; instrukcja kroku)

{

0x08 graphic
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)

0x08 graphic
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.

0x08 graphic

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

0x08 graphic
#include <stdio.h>

#include <math.h>

void main()

{

0x08 graphic
double alfa,v0,t,x,y;

double const g=9.81;

FILE *plik;

plik=fopen(“dane.dat”,”r”);

0x08 graphic
fscanf(plik,“%lf%lf“,&alfa,&v0);

fclose(plik);

0x08 graphic
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>

0x08 graphic
#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

0x08 graphic
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żą:

0x08 graphic

#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 0x01 graphic
. 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, 0x01 graphic
. 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ę.



Wyszukiwarka