Download as pdf or txt
Download as pdf or txt
You are on page 1of 19

Utasítások

Programozás I.

Hatwágner F. Miklós

Széchenyi István Egyetem, Gy®r

2013. október 9.
Utasítások típusai, blokkok
Utasítások típusai:

összetett

címkézett

kifejezés

szelekciós

iterációs

ugró

Összetett utasítás (blokk)

utasítások { } jelek között (nem írunk utána ;-t! (üres


utasítás))

szintaktikailag egy utasításnak számít

hatókör, láthatóság szabályozása

blokkban el®ször deklarációs (pl. függvény blokkjában lév®


lokális változók), azután végrehajtható utasítások következnek

blokkok egymásba ágyazhatóak → azonosítók elfedése

Hatwágner F. Miklós Utasítások


Címkézett és kifejezés utasítás
Címkézett utasítás

végrehajtható utasítás megjelölésére → a végrehajtás kés®bb


innen folytatható (ld. még goto, switch utasítás is!)

hatáskörük: tartalmazó függvény

külön névterületet használnak

nem befolyásolják a végrehajtási sorrendet, vagy az utasítás


hatását

Kifejezés utasítás

olyan kifejezés, amit ; követ

ált. hozzárendelést, függvényhívást tartalmaznak

Címkézett és kifejezés utasítások

#include<stdio.h>
int main(void) {
cimke1: printf("Kifejezés utasítás, amit meg is címkéztek\n");
return 0;
}
Hatwágner F. Miklós Utasítások
Szelekciós utasítások  if

if(kifejezés) utasítás1

if(kifejezés) utasítás1 else utasítás2

kifejezés

típusa: aritmetikai vagy mutató


értéke: logikai (mellékhatások!)
0 → utasítás2
nem 0 → utasítás1
utasítás1 és utasítás2 lehet összetett is

tetsz®leges mélységben egymásba ágyazhatók, de az else a


blokkján belüli, a forrásszövegben ®t közvetlenül megel®z®,
else nélküli if utasításhoz tartozik!

Hatwágner F. Miklós Utasítások


Szelekciós utasítások  if

Szemantikailag hibás kivitelezés

if(t=='n')
if(k=='b') printf("Nappali tagozat, BSc képzés\n");
else
printf("Levelez® tagozat\n");

Helyes kivitelezés

if(t=='n') {
if(k=='b') printf("Nappali tagozat, BSc képzés\n");
} else
printf("Levelez® tagozat\n");

Többirányú elágazás; két if-fel is megoldható?

if(t=='n') {
if(k=='b') printf("Nappali tagozat, BSc képzés\n");
else printf("Nappali tagozat, MSc képzés\n");
} else {
if(k=='b') printf("Levelez® tagozat, BSc képzés\n");
else printf("Levelez® tagozat, MSc képzés\n");
}

Hatwágner F. Miklós Utasítások


Bináris keresés

monoton növekv® sorrendben adott elemekkel m¶ködik

log(n ) lépésben terminál, ahol n az elemek száma

ha többször is el®fordul a keresett érték, bármelyik indexével


visszatérhet

az algoritmus részletei

Visszaadja x indexét azn elem¶ t tömbben, vagy ha nincs benne, akkor annak

az indexnek a −1-szerese−1-et, ahol lennie kellene → bsearch()


int binker(int x, int t[], int n) {
int also=0, felso=n-1, kozep;
while(also<=felso) {
kozep = (also+felso)/2;
if(x<t[kozep]) felso = kozep-1;
else if(x>t[kozep]) also = kozep+1;
else return kozep;
}
return -also-1;
}
Hatwágner F. Miklós Utasítások
Szelekciós utasítások  switch

switch(kifejezés) utasítás

kifejezés egész típusú

utasítás tartalmazhat

több case konstans-kifejezés: utasítás-t,


nulla vagy egy default: utasítás-t

végrehajtás leáll:

switch blokkjának végén


az els® break utasításnál

konstans-kifejezés egész típusú

egész el®léptetés kifejezés és konstans-kifejezés értékein, majd


összehasonlítás

több case címke is címkézheti ugyanazt az utasítást, de


minden címkének egyedinek kell lennie

switch utasítások egymásba ágyazhatóak

Hatwágner F. Miklós Utasítások


Angol sorszámnevek

if és switch utasítások használata

#include<stdio.h>
void ordinal(unsigned num) {
if(!num) putchar('0');
else {
printf("%d", num);
if(num>10 && num<21) printf("th");
else switch(num%10) {
case 1: printf("st"); break;
case 2: printf("nd"); break;
case 3: printf("rd"); break;
default: printf("th");
}
}
}

Hatwágner F. Miklós Utasítások


Karakterek számlálása

pelda16.c, a pelda9.c átalakítása

/* PELDA16.C -- Számjegyek, üres és egyéb karakterek leszámlálása */


#include <stdio.h>
void main(void) {
int c, i, nwhite, nother, ndigit[10];
printf("Számjegyek, üres- és egyeb karakterek leszámlálása\n"
"a bemeneten EOF-ig vagy Ctrl+Z-ig.\n\n");
nwhite = nother = 0;
for(i=0; i<10; ++i) ndigit[i]=0;
while((c=getchar()) != EOF) switch(c) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
ndigit[c-'0']++; break;
case ' ': case '\n': case '\t':
++nwhite; break;
default:
++nother; break;
}
printf("Számjegyek\n\n");
for(i=0; i<10; ++i) printf("%d = %d\n", i, ndigit[i]);
printf("\n\nÜres karakterek = %d\nEgyéb karakterek= %d\n",
nwhite, nother); }

Hatwágner F. Miklós Utasítások


Iterációs utasítások  while

while(kifejezés) utasítás

kifejezés: mint if-nél

igaz érték esetén végrehajtja az utasítás-t, majd ismét


kiértékeli a kifejezés-t

kilépés a ciklusból:

kifejezés értéke hamissá válik


ugró utasítással (ld. kés®bb) hagyjuk el a ciklust

utasítás lehet összetett

Hatwágner F. Miklós Utasítások


Iterációs utasítások  for

for(<init-kifejezés>; <kifejezés>; <léptet®-kifejezés>)


utasítás

mindegyik kifejezés-ben használható a vessz® operátor!

akár mindegyik kifejezés elhagyható, de a pontosvessz®k nem!

M¶ködés:

1 init-kifejezés kiértékelése; ált. értékadás a ciklusváltozónak

2 a kifejezés értékét®l függ®en dönt utasítás, azaz a ciklusmag


végrehajtásáról. Ha elhagyják, értékét 1-nek veszi!

3 ha kifejezés értéke igaz volt, végrehajtja az utasítás-t, majd

4 végrehajtja a léptet®-kifejezés-t, és ugrik a 2. pontra

Hatwágner F. Miklós Utasítások


Buborék rendezés

Az n elem¶ t tömb elemeinek növekv® sorrendbe rendezése


(algoritmus)

void buborek(int t[],int n) {


int i, j;
for(i=n-1; i>=1; i--)
for(j=0; j<i; j++)
if(t[j]>t[j+1]) {
int csere = t[j];
t[j] = t[j+1];
t[j+1] = csere;
}
}

Hatwágner F. Miklós Utasítások


Karakterlánc egésszé alakítása

s karakterlánc átalakítása egésszé

int atoi(char s[]) {


int i, n=0, sign=1;
for(i=0; s[i]==' ' || s[i]=='\n' || s[i]=='\t'; i++);
if(s[i]=='+' || s[i]=='-') sign=(s[i++]=='+')?1:-1;
for(; s[i]>='0' && s[i]<='9'; ++i) n=10*n+s[i]-'0';
return sign*n;
}

Hatwágner F. Miklós Utasítások


Egész számok rendezése

pelda17.c, részlet

/* PELDA17.C -- Egész számok rendezése */


#include <stdio.h>
#define MAX 100
int getline(char s[], int l);
int atoi(char s[]);
void buborek(int t[], int n);
int main(void) {
int i, n=0; /* Rendezend® elemek száma */
char sor[20]; /* Billenty¶zet input */
int v[MAX]; /* A számokat tároló tömb */
while(n<1 || n>MAX) {
printf("\nHány egész számot rendezzünk(1-%d)? ", MAX);
getline(sor, 4); n=atoi(sor); }
printf("\n\nKérem a rendezend® számokat(-32768 - +32767)!\n");
for(i=0; i<n; i++) {
printf("%3d: ", i+1); while(!getline(sor, 7));
v[i] = atoi(sor); }
printf("\n\nA rendezett számok:\n\n");
buborek(v, n);
for(i=0; i<n; i++) printf("%8d", v[i]);
return 0; } ...

Hatwágner F. Miklós Utasítások


Iterációs utasítások  do - while

do utasítás while(kifejezés);

1 végrehajtja az utasítás-t

2 kiértékeli a kifejezés-t, melynek igaz értéke esetén ugrik az 1.


pontra

n egész átalakítása az s karakterláncba → sprintf()

#include <stdio.h>
#include <string.h>
#include <limits.h>
void itoa(int n, char s[]) {
int i=0, j=0, sign;
if((sign=n) < 0) {
if(n==INT_MIN) {++n; ++j;}
n=-n; }
do s[i++]=n%10+'0'; while((n/=10)>0);
s[0]+=j;
if(sign<0) s[i++]='-';
s[i]='\0';
strrv(s); }

Hatwágner F. Miklós Utasítások


Ugró utasítások  break

break; egyszint¶ kiléptetés iterációs vagy switch utasításból

pelda18.c
/* PELDA18.C -- Sorvégi fehér karakterek eltávolítása */
#include <stdio.h>
#define MAXLINE 128
int getline(char s[],int lim);
int main(void) {
int n; /* A sor hossza */
char line[MAXLINE+1]; /* A sor */
printf("Sorvégi fehér karakterek levágása.\n"
"Vége: EOF vagy üres sor!\n\n");
while(printf("Kérem a sort!\n"), (n=getline(line,MAXLINE))) {
while(--n>=0)
if(line[n]!=' ' && line[n]!='\t') break;
line[n+1] = '\0';
printf("|%s|\n\n", line);}
return 0; }

Hatwágner F. Miklós Utasítások


Ugró utasítások  continue, goto

continue; azonnal befejezi a ciklusmag végrehajtását

goto címke; Blokk belsejébe lépve az inicializáció elmarad!

ugrás utasítás címkére

#include<stdio.h>
int main(void) {
int i;
for(i=0; i<10; i++) {
if(i%2) goto cimke;
{ int k='A';
cimke: k++;
putchar(k); }
}
return 0; }

Hatwágner F. Miklós Utasítások


Ugró utasítások  continue, goto

continue; azonnal befejezi a ciklusmag végrehajtását

goto címke; Blokk belsejébe lépve az inicializáció elmarad!

ugrás utasítás címkére

#include<stdio.h>
int main(void) {
int i;
for(i=0; i<10; i++) {
if(i%2) goto cimke;
{ int k='A';
cimke: k++;
putchar(k); }
}
return 0; }

kimenet

BCBCBCBCBC

Hatwágner F. Miklós Utasítások


Ugró utasítások  return

return <kifejezés>;

A nem void visszatérési érték¶ függvényekben legalább


egyszer szerepelnie kell

Megszakítja a fv. végrehajtását, visszatér a hívóhoz

kifejezés értékének hozzárendelési konverzióval a függvény v. t.

típusára alakíthatónak kell lennie

Az értékkel visszatér® fv. jobbérték!

Jobbérték, balérték

#include<stdio.h>
int main(void) {
int i;
i=getchar(); i++; /* OK */
/* i++=getchar(); HIBA! A növelés/csökkentés
eredménye nem balérték! */
/* i=++getchar(); HIBA! A fv.-t hívó kifejezés
nem balérték! */
putchar(i); return 0; }

Hatwágner F. Miklós Utasítások

You might also like