menu
shopping_cart
0
KOSÁR

20. lecke

Ciklusos feladatok

lightbulb_outlineÉrdekes feladatok a FOR ciklus felhasználásával

Kettő hatványai

Írju ki 2048-ig kettő hatványait. 2,4,8,16,32,64,128...

Kettő hatványait úgy kapjuk meg, hogy vesszük először a 2-őt azt szorozzuk 2-vel, ami már 4. Ezt szorozzuk 2-vel, ami már 8. És így tovább... Ehhez elég 1 darab változó, és egy FOR ciklus:

#include<stdio.h>

int main(){

    int i;
    for(i=2; i<=2048; i=i*2){
        printf("%d ", i);
    }

return 0;
}

kettohatvany.c c

Adjuk össze a számokat n-ig

Kérjünk be a felhasználótól egy számot, és adjuk össze eddig a pozitív egész számokat. Például ha ő megadja a 9-et, akkor a végeredmény:

1+2+3+4+5+6+7+8+9 = 45

A kezdő megoldás:

  • Felfedezzük, hogy ha a felhasználó megad egy ”n” számot, akkor 1-től n-ig végig kell pásztáznunk ezeket a számokat. Erre való a FOR ciklus. A működéséhez létre kell hozni egy ciklusváltozót.

  • A számokat össze kell adni, így kell egy összeg nevű változó is amibe gyűjtjük az összeget. Mivel a gyűjtés úgy történik, hogy a soron következő számot mindig hozzáadjuk az összeg változó tartalmához, ezért nem árt, ha az összeg változóban kezdetben nem memóriaszemét van, hanem üres - ezért a program elején ki kell nullázni.

#include<stdio.h>

int main(){

    int osszeg=0, i, n;

    scanf("%d",&n);

    for(i=1; i<=n; i++)
    {
        osszeg = osszeg + i;
    }

    printf("Az eredmeny: %d", osszeg);

return 0;
}

osszegez_v1.c c 9

Feltűnhet az a tény, hogy a FOR ciklus léptető részén i=i+1 helyett i++ áll. Ez a két írásmód ugyanazt jelenti: egy változó értékét növeli 1-el. A programozók nem szeretnek gépelni olyan sokat, ezért vezették be a ++ operátort egy változó növeléséhez. Hasonlóan létezik az i=i-1 helyett az i-- is! A jegyzet további részében minden esetben az i++ vagy i-- növelési és csökkentési módszert fogom használni!

A haladó megoldás:

Matek óráról lehet, hogy rémlik ez a képlet:

első n pozitív egész összege = n(n+1)/2

A program:

#include<stdio.h>

int main(){

    int n;

    scanf("%d",&n);

    printf("Az eredmeny: %d", n*(n+1)/2 );

return 0;
}

osszegez_v2.c c 9

A két algoritmusnak más a hatékonysága. Míg az elsőnél temérdek műveletet végez a proecsszor (az összeg képzése, a ciklusváltozó léptetése, a memóriahozzáférések kezelése) – addig az utóbbi megoldás egyszerű. Szorzunk, osztunk és már elő is állt a művelet. A hatékonyság mérőszáma tehát a CPU által végzendő műveletek száma, és a futási idő.

Csillagok, csillagok

A feladat: Kérjünk be a felhasználótól egy ”N” számot és rajzoljunk a képernyőre egy ekkora, NxN méretű csillagokból álló négyzetet.

Hogyan kezdjünk hozzá? Gondoljuk át mit tudunk. Válaszoljunk ezekre a kérdésekre:

  • Egy sorban hány csillag van?
  • Hány darab sor van?
  • Összesen hány csillag van?

Igen! Annyi!

Több szabályosságot is észrevehetünk:

  • Egy sorban N darab csillag van.
  • N darab sor van.

Ezt a programozás során ki lehet használni. Bontsuk lépésekre a feladatot és haladjunk sorban, mindig azt leprogramozva amit már tudunk.

Először kérjük be a felhasználótól az N számot, ami az oldalhosszúság lesz.

int n;
scanf("%d", &n);

Írjunk ki a képernyőre 1 darab sort. (N darab csillagot egy FOR ciklussal)

int i;
for(i=1; i<=n; i++){
    printf("* ");
}

Hány sor van? Hát N darab, tehát ismételjük ezt a lépést megint N-szer. Arra vigyázzunk, hogy ha a most megírt kódsor köré építünk még egy FOR ciklust, akkor annak már egy másik ciklusváltozó kell, mert nem jó ha a kettő keveredik.

Keresd meg az alább látható programban, hogy melyik a külső és melyik a belső FOR ciklus!

#include<stdio.h>

int main(){

    int n;
    scanf("%d", &n);

    int i, j;
    for(j=1; j<=n; j++){

        for(i=1; i<=n; i++){
            printf("* ");
        }

    }

return 0;
}

csillagnegyzet_v1.c c 5

Az eddigi program a megfelelő darabszámú csillagot nyomtatja ki, viszont egyáltalán nem négyzet alakú az elrendezés. Ahhoz, hogy négyzetes legyen, Enter-eket kellene beszúrni bizonyos helyekre. Nevezetesen, akkor, amikor egy sor kinyomtatásának végére értünk. Ez épp a belső ciklus után történik meg.

#include<stdio.h>

int main(){

    int n;
    scanf("%d", &n);

    int i, j;
    for(j=1; j<=n; j++){

        for(i=1; i<=n; i++){
            printf("* ");
        }

        printf("\n");
    }

return 0;
}

csillagnegyzet_v2.c c 5

Így már készen is van a program. Van két egymásba ágyazott FOR ciklus:

  • a külső ciklus felel a sorokért (és a sortörtését)
  • a belső ciklus a sorokon belüli csillagokért