2025(e)ko apirilaren 21(a), astelehena

Azken ariketa | main() funtzioaren parametroak







Gure programak exekutatzeko komandoen terminala erabil daiteke. Komando terminal bat baino gehiago izan dezakegu instalaturik gure konputagailuan, adibidez: cmd eta PowerShell. Bietariko edozein irekitzeko joan sistemaren bilatzailera eta bertan idatzi terminalaren izena.

cmd komando terminalean ezagutu behar ditugun komandoak hiru dira: cd, dir eta programa bat exekutatu

cmd komandoen terminalak onartzen dituen komandoen artean garrantzitsuenak hauek dira (komando gehiago hemen):

  • dir: directory, uneko karpetaren edukia ikusteko
  • cd: change directory, karpetaz aldatzeko. Adibidez:
    • cd KarpetaBat
      Uneko karpetan barruan KarpetaBat delakorik baldin badago
    • cd ..
      Uneko karpetaren gurasora joateko
  • FitxategiaExekutatu
    Uneko karpetan barruan FitxategiaExekutatu.exe fitxategirik badago exekutatuko da
  • FitxategiaExekutatu Param1 Param2 Param3
    Uneko karpetan barruan FitxategiaExekutatu.exe fitxategirik badago exekutatuko da Param1, Param2 eta Param3 parametroen balioekin

PowerShell komando terminalean ezagutu behar ditugun komandoak hiru dira: cddir eta programa bat exekutatu

PowerShell komandoen terminalak onartzen dituen komandoen artean garrantzitsuenak hauek dira, ikusten denez cmd komandoen terminalaren berdinak dira, baina fitxategiak exekutatu ahal izateko .\ sinboloak jarri behar dira aurretik:

  • dir: directory, uneko karpetaren edukia ikusteko
  • cd: change directory, karpetaz aldatzeko. Adibidez:
    • cd KarpetaBat
      Uneko karpetan barruan KarpetaBat delakorik baldin badago
    • cd ..
      Uneko karpetaren gurasora joateko
  • FitxategiaExekutatu
    Uneko karpetan barruan .\FitxategiaExekutatu.exe fitxategirik badago exekutatuko da
  • FitxategiaExekutatu Param1 Param2 Param3
    Uneko karpetan barruan .\FitxategiaExekutatu.exe fitxategirik badago exekutatuko da Param1, Param2 eta Param3 parametroen balioekin


main() funtzioak onartzen dituen argumentuak ikasteko lehen hurbilpena, ezagutzen dugun programa hau gogoratzea: Lehen koadranteko P puntuaren bi koordenatuak emanik, Kartesiar-Polar bihurketa egiten duen programa. Algoritmoa hauxe da:

  1. XY planoaren lehen koadrantean dagoen P puntu baten koordenatu kartesiarretan (fPx, fPy) teklatutik // irakurri eta...
  2. P puntuari dagozkion koordenatu polarrak lortu (distantzia, angelua)
  3. P puntuaren koordenatu polarraren angelua gradu-minutu-segundotan pantailaratu eta
  4. P puntuaren koordenatu polarraren distantzia pantailaratu

Hauxe da AzkenAriketa_KartesiarPolar-gogoratu programaren kodea, non datuak teklatuz irakurtzen direlako main() funtzioari ez zaion parametrorik pasarazten:

/* AzkenAriketa_KartesiarPolar-gogoratu: main() funtzioak onartzen dituen argumentuak.
                                         Lehen hurbilpena, datuak teklatuz irakurriz. */

// Lehen koadranteko P puntuaren bi koordenatuak emanik, gogoratu KartesiarPolar bihurketa
// egiten zuen programa. Algoritmoa hauxe da:

// 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 gradu-minutu-segundotan pantailaratu
// eta P puntuaren koordenatu polarraren distantzia pantailaratu.

#include <stdio.h>
#include <conio.h>  // getche() funtziorako
#include <math.h>   // sqrt() funtziorako   
#define PI 3.141592653

void DatuakHartu(float *fPx, float *fPy);
void RadianGraduMinutuSegundo(float fRadianak, int *iGraduak, int *iMinutuak, float *fSegundoak);

int main()
{
    float fPx, fPy;
    float fDist, fRadianak;
    int iGraduak;          // emaitzaren zati bat
    int iMinutuak;         // emaitzaren zati bat
    float fSegundoak;      // emaitzaren zati bat

    printf("\n==============================================================================\n");

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

    DatuakHartu(&fPx, &fPy);

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

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

    RadianGraduMinutuSegundo(fRadianak, &iGraduak, &iMinutuak, &fSegundoak);

    printf("\nOP Distantzia = %f unitate", fDist);
    printf("\nAlfa angelua  = %d\xA7 %d' %.3f\"", iGraduak, iMinutuak, fSegundoak);
    printf("\nKoordenatuak:   (%.3f, %.3f) = [%.3f | %d\xA7 %d' %.3f\"]", fPx, fPy, fDist, iGraduak, iMinutuak, fSegundoak);

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


void DatuakHartu(float *fPx, float *fPy)
{
    do
    {

        printf("\"P\" puntuaren x koordenatua eman: ");
        scanf("%f", fPx);
        if (*fPx == 0.0)
            printf("\a\"P\" puntuaren abzisa ezin daiteke 0.0 izan eta 1. koadranteoa izango da\n");
    } while (*fPx <= 0.0);

    do
    {
        printf("\"P\" puntuaren y koordenatua eman: ");
        scanf("%f", fPy);
        if (*fPy == 0.0)
            printf("\a\"P\" puntuaren ordenatua ezin daiteke 0.0 izan eta 1. koadranteoa izango da\n");
    } while (*fPy <= 0.0);
}


void RadianGraduMinutuSegundo(float fRadianak, int *iGraduak, int *iMinutuak, float *fSegundoak)
{
    float fDatuaGradutan;  // datua graduetan
    float fHondarra;       // zenbaki errealaren alde dezimala
    float fMinutuak;       // minutuak adierazteko zenbaki erreala

    fDatuaGradutan = fRadianak*360/(2*PI);
    // printf("\n  fDatuaGradutan = %9.6f", fDatuaGradutan);
    *iGraduak = (int)fDatuaGradutan;
    // printf("\n        iGraduak = %2d", *iGraduak);
    fHondarra = fDatuaGradutan - *iGraduak;
    // printf("\n       fHondarra = %9.6f", fHondarra);

    fMinutuak = 60*fHondarra;
    // printf("\n       fMinutuak = %9.6f", fMinutuak);
    *iMinutuak = (int)fMinutuak;
    // printf("\n       iMinutuak = %2d", *iMinutuak);
    fHondarra = fMinutuak - *iMinutuak;
    // printf("\n       fHondarra = %9.6f", fHondarra);

    *fSegundoak = 60*fHondarra;
    // printf("\n      fSegundoak = %9.6f", *fSegundoak);
    // printf("\n\n %f radian = %02d:%02d:%f gradu-minutu-segundo", fRadianak, *iGraduak, *iMinutuak, *fSegundoak);
}


main() funtzioak onartzen dituen argumentuak ikasteko bigarren hurbilpen honetan datuak ez ditugu teklatuz irakurriko, horren ordez exekuzio-denboran main() funtzioari pasatuko zaizkio lehen koadranteko P puntuaren bi koordenatuak. Hori egiteko bi modu daude.

Komando terminala ireki eta da AzkenAriketa_main-funtzioaren-parametroak programa exekutagarriaren karpetan kokatu. AzkenAriketa_main-funtzioaren-parametroak programaren karpetak egonik komando hau exekutatu cmd terminalean:

  AzkenAriketa_main-funtzioaren-parametroak 7.03 8.45 

Edo beste komando hau PowerSheell terminalean:

.\AzkenAriketa_main-funtzioaren-parametroak 6.91 8.02 

Non lehen parametroa (7.03 edo 6.91) datua den P puntuari dagokion x koordenatu kartesiarra den, eta bigarren parametroa (8.45 edo 8.02) datua den P puntuari dagokion y koordenatu kartesiarra den. Datu horiekin programak, lehen bezala, koordenatu polarraren distantzia eta angelua kalkulatuz pantailaratuko ditu (angelurako gradu-minutu-segundo unitateak erabiliz).

Adibidez, irudi honetan erakusten da AzkenAriketa_main-funtzioaren-parametroak programaren exekuzioa cmd terminalean, programa dagoen C:\Eskolak\2024-25\LaborategikoEskolak\AzkenAriketa_main-funtzioaren-parametroak\bin\Debug karpetatik exekutatuta 1.1 eta 0.5 argumentuekin:

Proiektuaren karpetan kokatu eta AzkenAriketa_main-funtzioaren-parametroa.exe programa exekutatu

Eta irudi honetan exekuzio bera erakusten da cmd terminalean, baina C: unitateko C:\ erroa karpetatik exekutatuta 1.1 eta 0.5 argumentu berdinekin:

C: unitateko erroan kokatu eta AzkenAriketa_main-funtzioaren-parametroa.exe programa exekutatu

Hauxe da AzkenAriketa_main-funtzioaren-parametroak programaren kodea, non programa exekutatzean programari datuak ematen zaizkion main() funtzioaren parametroen bitartez:

/* AzkenAriketa_main-funtzioaren-parametroak: main() funtzioak onartzen dituen argumentuak.
                                              Bigarren hurbilpena, datuak parametro bezala. */

// Lehen koadranteko P puntuaren bi koordenatuak emanik, gogoratu KartesiarPolar bihurketa
// egiten zuen programa. Algoritmoa hauxe da:

// XY planoan dagoen P puntu baten koordenatu kartesiarretan (fPx, fPy) teklatutik
// ez dira irakurtzen eta horren ordez komandoen terminalean emango dira programa
// exekutatzean.
// P puntuari dagozkion koordenatu polarrak kalkulatu (distantzia, angelua).
// P puntuaren koordenatu polarraren angelua gradu-minutu-segundotan pantailaratu
// eta P puntuaren koordenatu polarraren distantzia pantailaratu.

#include <stdio.h>
#include <stdlib.hh>  // atof() funtziorako
#include <math.h>   // sqrt() funtziorako   
#include <conio.h>   // getch() funtzioarako
#define PI 3.141592653

void RadianGraduMinutuSegundo(float fRadianak, int *iGraduak, int *iMinutuak, float *fSegundoak);

int main(int iHiruArgumentu, char *HiruKate[])
{
    int iKont;
    float fPx, fPy;
    float fDist, fRadianak;
    int iGraduak;          // emaitzaren zati bat
    int iMinutuak;         // emaitzaren zati bat
    float fSegundoak;      // emaitzaren zati bat

    printf("\n") ;
    printf("\nHiru kate: Programa exekutagarriaren izen osoa eta bi parametro\n") ;
    for (iKont = 0; iKont < iHiruArgumentu; iKont++)
        printf("\n \t %d. argumentua hau da: |%s|", iKont, HiruKate[iKont]) ;
    printf("\x07\n\nEDOZEIN tekla sakatu aurrera egiteko... ") ;
    getch() ;


    if (iHiruArgumentu != 3)
    {
        printf("\n\nErrorea! main() funtzioak 2 argumentu behar ditu");
        printf("\nP puntu baten Px eta Py koordenatu kartesiarrak.");
        printf("\n\nPrograma bukatzera doa!\n\n");
    }
    else
    {
        printf("\n\n==============================================================================\n");
        printf("Zenbaki errealekin lan eginez...\n");

        fPx = atof(HiruKate[1]);
        if (fPx == 0.0)
            printf("Errorea! (|%s| => %.3f) P puntuaren x abzisa ez da egokia\n", HiruKate[1], fPx);
        fPy = atof(HiruKate[2]);
        if (fPy == 0.0)
            printf("Errorea! (|%s| => %.3f) P puntuaren y ordenatua ez da egokia", HiruKate[2], fPy);

        if (fPx != 0.0 && fPy != 0.0)
        {
            fDist = sqrt(pow(fPx, 2) + pow(fPy, 2));
            fRadianak = atan(fPy/fPx);

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

            RadianGraduMinutuSegundo(fRadianak, &iGraduak, &iMinutuak, &fSegundoak);

            printf("\nOP Distantzia = %f unitate", fDist);
            printf("\nAlfa angelua  = %d\xA7 %d' %.3f\"", iGraduak, iMinutuak, fSegundoak);
            printf("\nKoordenatuak:   (%.3f, %.3f) = [%.3f | %d\xA7 %d' %.3f\"]", fPx, fPy, fDist, iGraduak, iMinutuak, fSegundoak);
        }
        printf("\n==============================================================================\n\n");
    }

    return 0;
}


void RadianGraduMinutuSegundo(float fRadianak, int *iGraduak, int *iMinutuak, float *fSegundoak)
{
    float fDatuaGradutan;  // datua graduetan
    float fHondarra;       // zenbaki errealaren alde dezimala
    float fMinutuak;       // minutuak adierazteko zenbaki erreala

    fDatuaGradutan = fRadianak*360/(2*PI);
    *iGraduak = (int)fDatuaGradutan;
    fHondarra = fDatuaGradutan - *iGraduak;
    fMinutuak = 60*fHondarra;
    *iMinutuak = (int)fMinutuak;
    fHondarra = fMinutuak - *iMinutuak;

    *fSegundoak = 60*fHondarra;
}



Esan dugu bi modutan pasatu ahal zaizkiola parametroak main() funtzioari exekuzio-denboran, bat komandoen terminalean programa exekutatuz eta bestea Code::Blocks ingurune barnean parametroak adieraziz. Horretarako, menuaren bide hau jarraitu:

Project > Set programs' arguments... > Program arguments:
Project > Set programs' arguments... > Program arguments:

main() funtzioaren goiburua hau izanik int main(int iHiruArgumentu, char *HiruKate[]) ikusten da bigarren argumentua kateen array bat dela eta lehen argumentua zenbaki oso bat dela (arrayaren luzera efektiboa adierazten duen zenbaki osoa). Irudi honek ilustratzen du egoera hori:

Aurrekoarekin jarraituz, AzkenAriketa_main-funtzioaren-parametroak programan ikus daitekeen bezala argumentuak kateak dira. Lehendabiziko katea programaren izena da eta array baten 0 posizioa hartuko du, hurrengo argumentuak (karaktere-kate bat ere) array baten 1 posizioa hartuko du, hurrengo argumentuak (karaktere-kate bat ere) array baten 2 posizioa hartuko du eta horrela argumentu guztiekin.

/* AzkenAriketa_main-funtzioaren-parametroak: main() funtzioaren argumentuak. */

int main(int iHiruArgumentu, char *HiruKate[])

// Programaren exekuzio bakoitzean:

// iHiruArgumentu aldagaiak zenbat argumentu sartu diren gordeko du, gure kasuan 3 zenbakia
//                komeni zaigu: programaren izena, Px koordenatua eta Py koordenatu

// char *HiruKate[] erakusleen arraya da eta kateen erakusleak gordetzen ditu, gure kasuan
//                  3 kateren erakusleak: programaren izena, Px koordenatuaren katea eta 
//                  Py koordenatuaren katea

main() funtzioaren hiru argumentuak kateak dira

Goiko irudian horretan erakusten diren argumentuak hauek dira:

  • 0 argumentua: C:\Eskolak\2024-25\LaborategikoEskolak\AzkenAriketa_main-funtzioaren-parametroak\bin\Debug\main-funtzioaren-parametroak.exe
  • 1 argumentua: "1.1"
  • 2 argumentua: "0.5"

0 argumentua ez da behar izaten programan, baina beste biak bai eta, adibide honetan, 1 eta 2 argumentuak zenbakiak adierazten dituzten kateak dira. Hori dela eta, atof() funtzioari esker lor daiteke katetik zenbakira bihurketa.





  • AzkenAriketa_KartesiarPolar-gogoratu.cbp | main.c  
  • AzkenAriketa_main-funtzioaren-parametroak.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina