baldintzazkoak etiketadun mezuak erakusten. Erakutsi mezu guztiak
baldintzazkoak etiketadun mezuak erakusten. Erakutsi mezu guztiak

2024(e)ko abenduaren 1(a), igandea

Ariketa 18 | switch: Aukera anitzen arteko hautapena

ZER DAKIDAN:
if baldintzazko egitura eta if-else baldintzazko egitura menperatzen ditut.



ZER IKASIKO DUDAN:
Aldagai aukeratzailea zenbaki oso bat izanik, switch baldintzazko egitura ikasiko dut.

Ariketa 13 | Ekuazioa sistema artikulua edo Ariketa 14 | Bigarren graduko ekuazioa artikulua gogora ekarriz, programaren fluxua desbideratu daiteke if agiduari esker eta if-else aginduari esker. Baina fluxuaren aukerak hiru edo gehiago direnean switch kontrol-agindua erabil daiteke.



ESKATZEN DEN PROGRAMA

Demagun lurrazaleko lau leku ditugula, bakoitza hemisferiko banakoa. Lau lekuak hauek dira: 1 Adelaide, 2 Brasilia, 3 Calgary eta 4 Donetsk. Lau leku horiek zenbaki oso baten bitartez identifikatuko ditugu. Zenbaki identifikatzailea teklatuz irakurri eta balioaren arabera, lurrazaleko lekuari dagokion informazioa pantailaratu:



  1 identifikatzailea:
Adelaide
Latitudea: -34.927499
Longitudea: 138.600000
Hego-Ekialdeko hemisferioa

  2 identifikatzailea:
Brasilia
Latitudea: -15.793889
Longitudea: -47.882778
Hego-Mendebaldeko hemisferioa

  3 identifikatzailea:
Calgary
Latitudea: 51.047500
Longitudea: -114.062500
Ipar-Mendebaldeko hemisferioa

  4 identifikatzailea:
Donetsk
Latitudea: 48.008889
Longitudea: 37.804167
Ipar-Ekialdeko hemisferioa


Exekuzioan 1 zenbakia aukeratzean lortzen dena

Exekuzioan 4 zenbakia aukeratzean lortzen dena


LASTER ESKATUKO DEN PROGRAMA

char datu mota ikasiko dugunean, sarrerako datua zenbaki bat izan ordez karaktere bat izango da: A Adelaide, B Brasilia, C Calgary eta D Donetsk. Beraz, ataria identifikatzeko sarrerako datua A, B, C edo D letrak izango dira. Bide batez, laster eskatuko den programa horretan, system("cls") aginduaren bitartez, pantaila garbitzen ikasiko dugu ere.

Esan bezala, switch batean aukeratzailea balio diskretua izango da beti, ikusi zer gertatzen den 1 eta 2 arteko balio zatigarria aukeratzen bada:




switch baldintzazko aginduak aldagai aukeratzaile bat darabil eta aukeratzaile hori datu-mota ordinal bat izango da (zenbaki osoa adibidez edo karakterea adibidez). Sintaxiari dagokiolarik, switch kontrol-aginduan break bati esker bukatzen da agindua hurrengo aukerak ebaluatu gabe.

Ebaluazio baten nota adierazten duen zenbaki osoa irakurri ondoren dagokion hitzezko kalifikazioa pantailaratu:
Hau da Ariketa-18a_AukeraAnitzenArtekoHautapena.cbp proiektuaren iturburu-programa



Ebaluazio baten nota adierazten duen zenbaki ez-osoa irakurri eta dagokion hitzezko kalifikazioa pantailaratu:
Ariketa-18b1_AukeraAnitzenArtekoHautapena.cbp proiektuaren kodea non esparruak mugatzeko baldintza konposatua daukaten hainbat if kontrol-egiturak erabiltzen diren

Goian erakutsi den Ariketa-18b1_AukeraAnitzenArtekoHautapena.cbp proiektuaren baldintza konposatuak sahiestu ahal izateko if-else sorta bat kateatuz lor daiteke; esate baterako, Ariketa-18b2_AukeraAnitzenArtekoHautapena.cbp proiektuan egiten den bezala. Lehen if-aren bitartez behemuga zaintzen da eta azken else-aren bitartez goimuga zaintzen da, tartean dauden else if bikoteak bloke bana definitzen du. Kodea ikusi:

/* Ariketa-18b2_AukeraAnitzenArtekoHautapena: Zenbaki errealekin,
                                              kalifikazioak pantailaratu. */

// switch kontrol-agindua ezin daiteke erabili aldagai aukeratzailea
// float bat delako, horregatik if-else kateatuekin programatuko da.


#include <stdio.h>

#define NOTAMINIMOA 0.0
#define NOTAMAXIMOA 10.0

int main()
{
    float fNota;

    printf("\n");

    printf("\n Notari dagokion zenbakia eman");
    printf(" (0.0 eta 10.0 arteko datua): ");
    scanf("%f", &fNota);

    if (fNota <= 0.0)
        printf("\n Nota %.1f eta %.1f artean egongo da!", NOTAMINIMOA, NOTAMAXIMOA);
    else if (fNota < 3.0)
        printf("\n %.2f puntu | Oso txarto!", fNota);
    else if (fNota < 5.0)
        printf("\n %.2f puntu | Txarto!", fNota);
    else if (fNota < 6.0)
        printf("\n %.2f puntu | Nahiko!", fNota);
    else if (fNota < 7.0)
        printf("\n %.2f puntu | Ondo!", fNota);
    else if (fNota < 9.0)
        printf("\n %.2f puntu | Oso ondo!", fNota);
    else if (fNota <= 10.0)
        printf("\n %.2f puntu | Bikain!", fNota);
    else  // bestelako daturik ematean
        printf("\n Nota %.1f eta %.1f artekoa izango da!", NOTAMINIMOA, NOTAMAXIMOA);

    printf("\n\n");
    return 0;
}






  • Ariketa-18_MenuBat.cbp | main.c  
  • Ariketa-18a_AukeraAnitzenArtekoHautapena | main.c  
  • Ariketa-18b1_AukeraAnitzenArtekoHautapena | main.c  
  • Ariketa-18b2_AukeraAnitzenArtekoHautapena | main.c  

 

Ariketa 14 | Bigarren graduko ekuazioa

ZER DAKIDAN:
Badakit testu bat pantailan idazten. Badakit aldagaien balioak teklatuz irakurtzen eta zenbakizko datuekin eragiketa matematikoak egiten. Baina, zenbait kasutan datu batzuekin programaren agindu guzti-guztiak exekutatzea ez da komeni.



ZER IKASIKO DUDAN:
Erabakiak hartzen ikasiko dut Ariketa 13 | Ekuazio-sistema adibidean egin den bezala. Horrela, datuaren arabera programaren agindu batzuk exekutatuko dira ala ez. Adibide honetan baldintzazko if kontrol-agindua ikasiko dut.


ESKATZEN DEN PROGRAMA

Matematikan, aldagai bakarreko bigarren mailako ekuazioa edo ekuazio koadratikoa honela adierazten den aldagai bakarreko ekuazio polinomiko bat da:   a x2 + b x + c = 0

Bigarren mailako ekuazioaren soluzioari erro esaten zaio eta ondoko irudiko formula honek ematen du:
Formula horren b2-4ac zatiari diskriminatzaile esaten zaio eta Δ bitartez adierazten da (Δ, delta izeneko letra maiuskula grekoaz). Diskriminatzailearen arabera, bigarren mailako ekuazio batek, koefizienteak zenbaki errealak izanik, soluzio desberdinak izan ditzake:
  • Δ > 0, diskriminatzailea positiboa bada, bi soluzioak zenbaki erreal dira.
  • Δ = 0, diskriminatzailea 0 bada, soluzioa bakarra da eta gainera zenbaki erreala.
  • Δ < 0, diskriminatzailea negatiboa bada, ez dago erro errealik eta bi soluzioak zenbaki konplexuak dira eta bata bestearen zenbaki konplexu konjugatu dira.

ARIKETA:
Bigarren mailako ekuazio baten fA, fB eta fC koefizienteak teklatuaren bitartez irakurri eta ekuazio koadratiko horren soluzioa nolakoa den pantailaratu, hau da, erroak nolakoak diren pantailan idatzi. Ariketa honek begi bistako hedapena du, hots, erroak nolakoak diren zehazteaz gain erroak kalkulatzea.

Ekuazio-koadratikoaren erroak nolakoak diren zehazteko if kontrol-egitura erabil dezagun. Programren irteera posibleak hauek izan daitezke fA, fB eta fC koefizienteen balioen arabera:

Bigarren graduko ekuazio baten erroak nolakoak diren jakiteko programak, ondoko fluxu-diagrama jarraitzen du non Δ diskriminatzailea sarrerako datuen arabera kalkulatu den:




Ekuazio-koadratikoaren erroak nolakoak diren eta zenbat balio duten zehazteko if-else kontrol-egitura erabil dezagun. Ekuazioaren fA, fB eta fC koefizienteak teklatuz eman ondoren, bigarren graduko ekuazio horren erroak nolakoak eta zeintzuk diren ebazten duen programak fluxu-diagrama hau jarraituko du, non if-else kontrol-egitura baten barruan beste if-else kontrol-egitura bat idatzi den:








  • Ariketa-14a_BigarrenGradukoEkuazioa.cbp | main.c  
  • Ariketa-14b_BigarrenGradukoEkuazioa.cbp | main.c  


 

Ariketa 13 | Ekuazio-sistema

ZER DAKIDAN:
Badakit testu bat pantailan idazten. Badakit aldagaien balioak teklatuz irakurtzen eta zenbakizko datuekin eragiketa matematikoak egiten. Baina, edozein datuekin programaren agindu guzti-guztiak exekutatzen dira.



ZER IKASIKO DUDAN:
Erabakiak hartzen ikasiko dut. Horrela, datuaren arabera programaren agindu batzuk exekutatuko dira ala ez. Adibide honetan baldintzazko if agindua ikasiko dut eta do agindu errepikakorra landuko dut ere.


Ikasi beharreko hitzak
  Hitza  Deskribapena  edo/eta  adibidea
  Konpiladore Programa bat da. Labur esanda, programa honen bitartez iturburu-fitxategitik (guk idatzi eta irakur dezakegun testu-fitxategitik) dagokion programa exekutagarriaren fitxategi bitarra lortzen da.
  Ihes-sekuentzia Ihes-sekuentzia (edo karaktere berezi) teklatuaren bitartez ezin daitekeen eman karakterea da, adibidez \n karakterea.
  Formatu-
  zehaztatzaile
Aldagai baten edukia pantailan idaztean nola aurkeztu nahi den aukeratzeko balio du; esate baterako %d bitartez zenbaki osoa ikusiko da pantailan, baina %c bitartez karaktere bat ikusiko da.
  Aurreprozesadore Programa hau konpiladorea baino lehen jarduten da, bere lana kodea prestatzea da (#include eta #define guztiak burutu, iruzkinak kendu, e.a.).
  Sartzea Fitxategia sartzea. #include FitxategiIzen aurre-prozesadorearen jarraibideari esker FitxategiIzen fitxategiaren edukia gure programara gehitzen zaio.
  Definitzea Konstantea definitzea. #define Identifikadore BalioKonstantea bitartez konstanteak defini daitezke.
  Funtzio Kode zati bat da helburu jakin bat betetzen duena. Emaitza itzul dezake eta behar dituen datuei parametro esaten zaie.
  Parametro
  (argumentu)
Funtzio bati ematen zaion datua. Parametroren bat funtzioari pasatzean bi modutan egin daiteke: balioz ala erreferentziaz.
  Datu-mota Programa batean erabiliko ditugun magnitudeak izaera bat daukate: zenbaki osoa, zenbaki erreala, karakterea, e.a. Horiek adierazteko datu-motak erabiltzen dira.
  Iruzkin Programa azaltzen duen testua.
  Esleipen-
  operadorea
C-rako, esleipena operadore bat da, esleipen-operadorea deritzona (=), eta operadore guztien artean lehentasun txikiena du.
  Operadore
  aritmetiko
Operadore edo eragile aritmetikoen adibideak hauek dira: + batuketa-operadorea, - kenketa operadorea, * biderkatzeko operadorea, / zatitzeko operadorea, % zatiketa osoaren hondarra lortzeko operadorea, ...
  Operadore logiko Operadore edo eragile logikoak hiru dira: ! ukapen logikoa (ez/not), && konjuntzioa edo biderketa logikoa (eta/and), || disjuntzioa edo batuketa logikoa (edo/or).
  Operadore
  erlazional
Operadore erlazionalak edo erlaziozko eragileak sei dira: > handiago, >= handiago edo berdin, < txikiago, <= txikiago edo berdin, == berdin, != desberdin.





ESKATZEN DEN PROGRAMA

Cramer-en metodoa egokia da ekuazio linealen sistemak ebazteko. Hona hemen ekuazio-sistema bat eta ikusi nola lortzen den bere ebazpena koefizienteen determinanteak erabiliz:

Koefiziente guztiak zenbaki errealak izanik, koefizienteak teklatuaren bitartez irakurri eta sistemaren ebazpena pantailan idatzi.  

Sarrerako datuak kontrolatzen ez badira eta A·E - B·D = 0 baldin bada, programa konpilagarria izango da, baina errorea gertatuko da exekuzio-denboran.

Konpilatu izanak ez du esan nahi programa ondo dagoenik

Hauxe izan daiteke Ariketa-13_Ekuazio-sistema.cbp proiektua exekutatzean lortzen den irteeraren bat:

Erabiltzaileak emandako datuen arabera programak era batean ala bestean erantzuten du



/* Ariketa-13_Ekuazio-sistema: erabakiak hartzen */
// if agindua ikasiko dugu.
// do-while agindua ikasiko dugu
// Programa honetan '\a' karaktere berezia erabiliko dugu.

/*
XY planoan dauden bi zuzenek (fAx+fBy=fC eta fDx+fEy=fF) P puntuan bat egiten dute
baldin eta paraleloak ez badira. Bi zuzenen 6 koefizienteak teklatuz eman eta
P puntuaren (fPx, fPy) koordenatu kartesiarrak kalkulatu.
*/

#include <stdio.h>

int main()
{
   float fPx, fPy, fAx, fBy, fC, fDx, fEy, fF, fDeterminantea;

   printf("\n\nZenbaki errealekin lan eginez...\n\n");

   printf("\"Ax+By=C\" lehen zuzenaren \"A\" koefizientea eman: ");
   scanf("%f", &fAx);
   printf("\"Ax+By=C\" lehen zuzenaren \"B\" koefizientea eman: ");
   scanf("%f", &fBy);
   printf("\"Ax+By=C\" lehen zuzenaren \"C\" koefizientea eman: ");
   scanf("%f", &fC);
   printf("\n");
   do
   {
      printf("\"Dx+Ey=F\" bigarren zuzenaren \"D\" koefizientea eman: ");
      scanf("%f", &fDx);
      printf("\"Dx+Ey=F\" bigarren zuzenaren \"E\" koefizientea eman: ");
      scanf("%f", &fEy);
      printf("\"Dx+Ey=F\" bigarren zuzenaren \"F\" koefizientea eman: ");
      scanf("%f", &fF);

      fDeterminantea = fAx*fEy - fBy*fDx;

      if (fDeterminantea == 0.0)
         printf("\a\nErrorea! Zuzenak paraleloak dira elkarrekiko\n\n");
   } while (fDeterminantea == 0.0);

   fPx = (fC*fEy - fBy*fF) / fDeterminantea;
   fPy = (fF*fAx - fDx*fC) / fDeterminantea;

   printf("\nP puntuaren koordenatuak:  P(%.3f, %.3f)", fPx, fPy);
   printf("\n\n");

   return 0;
}


  • Ariketa-13_Ekuazio-sistema.cbp | main.c  

 

if kontrol-egitura


Biak (if kontrol-egitura eta if-else kontrol-egitura) bat dira else zatia aukerakoa delako. Kontrol-egitura hauek baldintzazko aginduak dira eta programan erabakiak hartzeko balio dute. Hona hemen bakoitzaren eskemak:


Esan bezala, kontrol-egitura honi esker programa batean gauzatu beharreko ekintzari buruzko erabakia hartzerik dago, adierazpen baten emaitzan oinarrituta (adierazpen emaitza egiazkoa izatean edo adierazpen emaitza faltsua izatean, bide bat ala beste hartuz). Hau da bere sintaxia:

if (adierazpena) agindu_1;
[else agindu_2;]
 

Non...

adierazpena:

Adierazpen numerikoa, erlazionala edo logikoa izan behar du. Adierazpena ebaluatzean lortzen den emaitza bi motatakoa izan daiteke: egiazkoa (zero ez dena) edo faltsua (zero dena).

agindu_1:

Sententzia sinplea edo konposatua adierazten du. Sententzia konposatua bada, agindu bakun bakoitza ; sinboloz bukatzen da. Kodearen zati hau exekutatuko da: adierazpena zero ez bada.

else agindu_2:

Kortxeteek hautazkotasuna adierazten dute, bloke hau ager daiteke edo ez. Sententzia sinplea edo konposatua adierazten du agindu_2k. Sententzia konposatua bada, agindu bakun bakoitza ; sinboloz bukatzen da. Kodearen zati hau exekutatuko da: adierazpena zero bada.

Esan bezala, else aukerakoa da. Baina baldin bada, baldintza egiazkoa bada, if-ari lotutako zatia exekutatuko da; faltsua bada, else-ri lotutako zatia exekutatuko da. Adibide bat ikus dezagun:

/* IF-ELSE_KartesiarPolar: erabakiak hartzen */
// atan(), sqrt() eta pow() funtzio estandar matematikoak ikasiko
// ditugu, horiek erabiltzeko "math.h" fitxategia derrigorrezkoa da.
// if agindua ikasiko dugu.

/*
XY planoan dagoen P puntu baten koordenatu kartesiarretan (fPx, fPy) teklatutik
irakurri eta P puntuari dagozkion koordenatu polarrak lortu (distantzia, angelua).
P puntuaren koordenatu polarraren angelua radianetan pantailaratu.

P puntua ezin daiteke "OY" ardatzean egon, bere tangenteak infinitoren balioa
hartuko zukeelako. Beraz, fPx abzisa ezin daiteke 0.0 izan eta hori izango da,
hain zuzen ere, programaren fluxoa erabakitzeko baldintza.
*/

#include <stdio.h>
#include <math.h>   // atan(), pow() eta sqrt() funtzio estandarrak

int main()
{
   float fPx, fPy, fDist, fAng;

   printf("\n\nZenbaki errealekin lan eginez...\n\n");

   printf("\"P\" puntuaren x koordenatua eman: ");
   scanf("%f", &fPx);
   
   if (fPx == 0.0)
      printf("\a\"P\" puntuaren abzisa ezin daiteke 0.0  izan. Programa bukatzera doa...");
   else
   {
      printf("\"P\" puntuaren y koordenatua eman: ");
      scanf("%f", &fPy);

      fDist = sqrt(pow(fPx, 2) + pow(fPy, 2));
      fAng = atan(fPy/fPx);

      printf("\nOP Distantzia = %f unitate", fDist);
      printf("\nAlfa angelua  = %f radian", fAng);
      printf("\n\nKoordenatuak:   (%.3f, %.3f) = [%.3f | %.3f]", fPx, fPy, fDist, fAng);
   }
   
   printf("\n\n");
   return 0;
}


if-else sententziak habia eginda egon daitezke bata beste baten barruan. Hau da, agindu_1 edo agindu_2 gisa, beste if-else sententzia bat idatz daiteke.

if-else sententzietan, if zatia eta else zatian parekatuta daude; eta programa batean if-else sententziak habiaratuta agertzen direnean, ez da beti erraza izaten jakitea zein else doan zein if-arekin. Halakoetan, sententzia horietako bakoitza bereizteko araua da:

else bakoitza parekatu ez den if hurbilenari dagokio.

Eskematikoki:

Eskumako kasuan bigarren if-a da else-tik hurbilen dagoena, baina
ezkerreko kasuan lehenengo if-a parekatzen da dagoen else bakarrekin


if-else sententziak bata beste baten barruan egon daitezkeela dakigu eta zenbat if-else habiaratu daitekeen ez denez mugatzen, honelako kateak ikusi ohi dira programentan:

if (adierazpen_1)
   aginduak_1;
       else if (adierazpen_2)
           aginduak_2;
               else if (adierazpen_3)
                   aginduak_3;
                        ...
                       else aginduak_n

Non...

adierazpen_1, adierazpen_2, ... adierazpen_n:

Adierazpen xeheak ala konposatuak izan daitezkeen.

aginduak_1, aginduak_2, ... aginduak_n:

Sententzia sinpleak edo konposatuak adierazten duten.

Azalpena: adierazpen_1 betetzen bada, aginduak_1 exekutazten dira, eta adierazpen_1 betetzen ez bada, hurrengo baldintzak sekuentzialki aztertzen dira eta else-if bikoteen baldintzak betetzen badira dagozkien aginduak exekutatuko dira. Adierazpen guztiak faltsuak badira, azken else-ri lotutako aginduak_n aginduak betearaziko dira. IF-ELSE-IF-ELSE-...-IF-ELSE segidari dagokion eskema eta adibide bat ikus ditzagun:

Irudia handiago ikusteko bere gainean klik egin
/* IF-ELSE-IF-ELSE-IF-ELSE_adibidea */

#include <stdio.h>

int main()
{
   int iDatua;

   printf("\n\n\t Zenbaki osoekin lan eginez...\n\n");

   printf("\t Datua eman: ");
   scanf("%d", &iDatua);

   if (iDatua <= 0)
       printf("\t Datua zero edo negatiboa izan da\n");
   else if (iDatua <= 10)
       printf("\t Datua 1 eta 10 artekoa izan da (biak barne)\n");
   else if (iDatua <= 20)
       printf("\t Datua 11 eta 20 artekoa izan da (biak barne)\n");
   else if (iDatua <= 30)
       printf("\t Datua 21 eta 30 artekoa izan da (biak barne)\n");
   else if (iDatua <= 40)
       printf("\t Datua 31 eta 40 artekoa izan da (biak barne)\n");
   else
       printf("\t Datua 41 edo handiago izan da\n");

   printf("\n\n");

   return 0;
}


if-else sententziak bata beste baten barruan egon daitezkeela dakigu. Badakigu ere programa batean if-else sententziak habiaratuta agertzen direnean, ez dela beti erraza izaten jakitea zein else doan zein if-arekin. Holako zalantzak ekiditeko bide bat da if sententzia bakar batean bi if sententzia biltzea, hori bai, bere adierazpena izan dadila baldintza konposatu egoki bat. Adibidez:

/* IF-ELSE_BaldintzaKonposatua: IF-ELSE bakarrean adierazpen konposatua */
// Erabaki datua positiboa dela eta aldiberean 100 baino txikiagoa.
// Datua mugen artean badagoenean kalkuluak egingo dira, bestela ez.

#include <stdio.h>

int main()
{
   int iDatua, iHondarra;

   printf("\n\nZenbaki osoekin lan eginez...\n\n");

   printf("Datua eman: ");
   scanf("%d", &iDatua);

   if (iDatua < 0)         // baldintza 1
       printf("Datua ezin daiteke negatiboa izan. \nEz dakigu zenbakia bakoitia ala bikoitia den.");
   else
   {
      if (iDatua >= 100)   // baldintza 2
          printf("Datua ezin daiteke 100 edo handiagoa izan. \nEz dakigu zenbakia bakoitia ala bikoitia den.");
      else
      {
          printf("Emandako %d datua mugen artean dago eta bere izaera erakutsiko dugu.\n", iDatua);
          iHondarra = iDatua % 2;
          if (iHondarra == 1)
              printf("Emandako %d da bakoitia da.", iDatua);
          else
              printf("Emandako %d da bikoitia da.", iDatua);
      }
   }

   printf("\n\nZenbaki osoekin jarraituz...\n\n");

   printf("Datua eman: ");
   scanf("%d", &iDatua);

   if (iDatua < 0 || iDatua > 99)   // baldintza konposatua
       printf("Datuaren mugak 0 eta 99 dira. Programa bukatzera doa...");
   else
   {
       printf("Emandako %d datua mugen artean dago, ikus dezagun 3-ren anizkoitza den.\n", iDatua);
       iHondarra = iDatua % 3;
       if (iHondarra == 0)
           printf("Emandako %d datua 3-ren anizkoitza da.", iDatua);
       else
           printf("Emandako %d datua ez da 3-ren anizkoitza.", iDatua);
   }

   printf("\n\n");

   return 0;
}