C ProgramozasJava Programozas

Egy ismeretlen Feladat megoldása

Szeretném nektek megmutatni, hogyan érdemes nekiállni egy ismeretlen feladatnak. A legfontosabb, hogy nem szabad megijedni a feladat elolvasása után, mert általában ezeknek a leírásoknak nagyobb a füstje mint a lángja, azaz könnyebb őket megoldani mint gondolnánk. Általában egy vizsga vagy egy állásinterjú során nincs idő hosszabb programok készítésére, ezért ha már több mint 10-15 sort írtál és még messze a vége, akkor érdemes lehet elgondolkoznod, hogy nincs-e egy rövidebb megoldás.

 

 

A Feladat

Keresse meg a legkisebb közös többszörösét a 81 és 12-nek.

 

Ezt a feladatot az oktatásom során is fel szoktam adni, mikor már vettünk minden olyan részt, amivel meg lehet oldani. A kezdeti sokk után azonban csak kevés embernek sikerül egy jó megoldást készítenie. Nézzük meg tehát most lépésről-lépésre hogyan érdemes nekiállni ennek a feladatnak.

 

 

  1. Az első lépés, mi a feladat?

 

A feladat, hogy megtaláljuk két szám legkisebb közös többszörösét (LKKT), jelen esetben a 81-nek és a 12-nek. Mivel azonban mi egy jó programot akarunk csinálni, ezért egy olyan megoldást készítünk, ami minden számra működni fog!

 

 

  1. Mi az a legkisebb közös többszörös?

 

Általában a legtöbb vizsga vagy állásinterjú kérdésnek van egy központi része, amit ha nem tudunk, akkor szinte kizárt, hogy megoldjuk a feladatot. Ennek a valószínűségét sok gyakorlással tudjuk csökkenteni. Ha azonban valamit mégsem tudunk, akkor annak könnyen utána tudunk nézni (legalábbis otthon), de legrosszabb esetben ne féljünk egy kis segítséget kérni a velünk szembeülőtől. Ebből a szituációból hiszed vagy sem, de akár még jól is ki tudsz jönni. Ha a felvételiztető látja, hogy hogyan reagálsz egy ismeretlen helyzetre az nagyon pozitív is tud lenni, mivel a munkád elején valószínűleg több dolog lesz ismeretlen, mint amennyit már tudsz.

 

Hogyan tudunk utánanézni valaminek magunktól?

Használjuk a Google-t, keressünk rá arra a konkrét kifejezésre, amit keresünk, esetleg írjuk is be mellé a programozási nyelvet, amit használni szeretnénk és nézzük meg az első 3 találatot. Íme az eredmény: Google Találatok

 

Két szám legkisebb közös többszöröse az a legkisebb egész szám, amelyet mindegyik szám maradék nélkül oszt.

 

Például 2 és 3 esetében a legkisebb közös többszörös a 6, mert azt a 2 és a 3 is osztja. Azért nem a 12 a legkisebb közös többszörös, mert a 6 kisebb mint a 12.

 

 

  1. Programtervezés

 

Mielőtt vadul elkezdjük írni a forráskódot, előtte próbáljunk meg felállítani egy tervet, készítsünk egy tervrajzot a programunkhoz.

Ha általánosan gondolkozunk, akkor mi lehet tetszőleges két számnak az Elméleti legkisebb közös többszöröse? => Az 1, de csak akkor ha az 1-nek és az 1-nek keressük a legkisebb közös többszörösét.

Mi lehet a lehető Legnagyobb legkisebb közös többszöröse két számnak? => Ez a két szám szorzata, mert annak eredményét biztosan mind a két szám osztja maradék nélkül.

 

Rendben, van tehát egy programunk, ami bemenetként vár két egész számot, A-t és B-t, kimenetként pedig kiad egy 1 és A*B között egy számot, nevezzük C-nek. A definícióból tudjuk, hogy C-t osztva A-val a maradék 0 és C-t osztva B-vel a maradék szintén 0. Meghatároztuk tehát a programunk bemenetét, a programunk kilépési pontját és egy algoritmust, ami képes megtalálni az elvárt kimenetet.

 

 

  1. Programváz felépítése

 

Most, hogy megvan a tervrajzunk a megoldáshoz, kezdjük el felépíteni az alapokat. Először csináljunk egy dedikált függvényt a feladathoz, de csak a vázát írjuk le:

„… van tehát egy programunk, ami bemenetként vár két egész számot, A-t és B-t, kimenetként pedig kiad egy 1 és A*B között egy számot, nevezzük C-nek.”

 

int getLKKT(int numberA, int numberB)
{
      /** Local variables, Always Initialize */
      int numberC = 0;

 

            /** Program Code */

 

            /** Return */
            return numberC;
      }

 

Ez tehát a programunk alapja, melyre mindenképp szükségünk lesz. Egyelőre még nem csinál semmit, de már jól vezeti a kezünket. Mindig érdemes egy ilyen, úgynevezett „csontvázat” (angolul „skeleton”-t) első lépésként leimplementálni, mert így teljesen egyértelmű lesz a függvényünk be és kimenete és utána már fókuszáltan tudunk foglalkozni a konkrét algoritmus implementációjával.

 

 

  1. A megoldó algoritmus

 

Most implementáljuk le az algoritmust, ami megoldja a feladatot:

„… kimenetként pedig kiad egy 1 és A*B között egy számot, nevezzük C-nek. A definícióból tudjuk, hogy C-t osztva A-val a maradék 0 és C-t osztva B-vel a maradék szintén 0.”

 

Hogyan tudjuk hatékonyan leellenőrizni az összes számot egy megadott értéktartományon belül?

=> FOR Ciklussal

A maradék nélküli osztást pedig feltételként ellenőrizzük

=> IF Feltételvizsgálat

                programozási segítség, maradékos osztás: 10 % 3 = 1, 10 % 2 = 0, 17 % 5 = 2

 

int getLKKT(int numberA, int numberB)
{

            /** Local variables, Always Initialize */
            int numberC = 0;
            int tmpNumber = 0;

     

            /** Program Code */
            for(tmpNumber = 1; tmpNumber <= (numberA*numberB); tmpNumber++)
            {
                  if(((tmpNumber % numberA) == 0) && ((tmpNumber % numberB) == 0))
                  {
                        /** LKKT has found Save and Exit */
                        numberC = tmpNumber;
                        break;
                  }
            }

 

            /** Return */
            return numberC;

      }

 

 

  1. A használat

 

Megvan tehát a függvényünk, ami képes meghatározni bármely két egész számra a legkisebb közös többszöröst. Nincs más hátra, próbáljuk ki, hogy valóban működik-e. Ezt a lépést természetesen sohasem szabad kihagyni!

 

int main()
{

            int A = 12;
            int B = 81;

           

            int C = getLKKT(A, B);

            printf("LKKT of 12 and 81 = %d", C);  // 324

}

 

Ez volt tehát ennek az elsőre talán bonyolultnak tűnő feladatnak a megoldása. Kérlek mielőtt megláttok egy idegen feladatot és esetleg megijedtek, előtte mindig lépjetek egy lépést hátra és gondoljátok végig. Mindig próbáljatok meg felállítani egy tervet, mert ez később rengeteget fog segíteni nektek. Ha ezt a módszert követitek, akkor sokkal jobb minőségű kódot fogtok tudni írni, ráadásul sokkal gyorsabban.

Később pedig rá fogtok majd ébredni, hogy a programozásban az igazi nehézséget nem maga a programozási nyelv jelenti, hanem a jó megoldás összeállítása. Hiszen hogyan tudnánk írni egy jó programot vagy építeni egy szép házat tervrajz nélkül? Persze ne értsetek félre, tudom, hogy az elején ez nagyon nehéz és először a programozási nyelv képességeivel kell tisztábban lennünk, különben honnan is tudhatnánk, hogy milyen eszközeink állnak rendelkezésre egy feladat megoldásához.

 

 

Remélem tetszett ennek a kis feladatnak a megoldása és a módszer, ahogyan eljutottunk odáig. Ha van további kérdésed, akkor nézz még szét itt a Blogon vagy írj nyugodtan. A program C nyelvű implementációját ITT találod, a Java nyelvben való megoldását pedig ITT.

Bajor Tamás - Programozz Te Is!

Hello, Bajor Tamás vagyok, a Programozz Te Is oldal alapítója és oktatója. Kösz, hogy itt vagy és éppen az én cikkem olvasására fordítod a drága idődet! Azért dolgozom minden nap, hogy neked segítsek a programozás világában minél profibban elmélyülni. A cikkek egyetlen írójaként rengeteg munkát és energiát fektetek mind az oldalba, mind pedig az oktatásba!

 

Arra kérlek, ha tetszett cikk amit olvastál vagy szívesen veszed az ingyenes anyagokat akkor dobj egy Like-ot a Facebook-on, ezzel is támogatva a munkámat. Ez egy apró kattintás neked, de hatalmas segítség nekem!