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 2 4 8 16 32 64 128 256 512 1024 2048
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 Az eredmeny: 45
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 Az eredmeny: 45
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
Jelentkezz be a hozzászóláshoz.