2025(e)ko martxoaren 28(a), ostirala

Ariketa 55 | Palindromoak

ZER DAKIDAN:
Arrayak eta kateak ezagutzen ditut.



ZER IKASIKO DUDAN:
Arrayen ariketa bat egingo dut.

Teklatuaren bidez sartutako esaldia palindromoa den aztertu behar du programak. Horretarako, honako azpiprograma haek derrigorrez erabili behar dira:

  • Esaldiaren karaktere alfabetikoak letra larriz idazten dituen funtzioa
  • Alfabetikoak ez diren esaldiko karaktereak kentzen dituen funtzioa
  • Aurreko azpiprogramak aplikatu ondoren, esaldia palindromoa den aztertzen duen funtzio boolearra

Palindromoa: Definizioz, aurretik atzera eta atzetik aurrera irakurketa berdina duen esaldia da.

Adibidez:

  • Zein?, Ni ez                                                    [ZEINNIEZ]
  • Atara zarata!!!                                              [ATARAZARATA]
  • Iker! Ireki                                                      [IKERIREKI]
  • Ama zen ene zama                                           [AMAZENENEZAMA]
  • Nik enara neraman amaren aranekin      [NIKENARANERAMANAMARENARANEKIN]
  • Ze nekeza inori atea irekitzea eztikeria eta ironia zekenez                                                                              [ZENEKEZAINORIATEAIREKITZEAEZTIKERIAETAIRONIAZEKENEZ]

Esaldi bat fgets() bitartez irakurri ondoren (noski, azken INTRO karakterea kendu beharko da), esaldia garbitu beharko da letrak soilik utzita. Ondoren hitzak banatu beharko dira eta horretarako strtok() funtzioa erabiliko da.

/* Ariketa-55_Palindromoak: kate bat emanik palindromoa den aztertu. */

// Datua fgets() bitartez irakurri ondoren, azken INTRO karakterea kendu beharko da.
// Soilik letrak mantenduz esaldia garbitu ondoren, fnboPalindromoaDa() delako 
// funtzio boolearrak erabakiko du emandako esaldia palindromoa den ala ez.

#include <stdio.h>
#include <string.h>    // strcspn() eta strlen() funtzioetarako
#include <ctype.h>     // toupper() funtziorako
#include <stdbool.h>   // bool datu-motarako
#include <conio.h>     // getch() funtziorako

void fnsLarrizIdatzi(char *sEsaldi);
void fnsKateaGarbitu(const char *sEsaldi, char *sK);
bool fnboPalindromoaDa(const char *sEsaldi);

int main()
{
    char sKatea[256];
    char sKateGarbi[256];
    char cAukera;

    printf("Palindromoak aztertzeko programa\n");

    do
    {
        printf("\n\nSar ezazu aztertu behar den testua: ");
        fgets(sKatea, sizeof(sKatea), stdin);
        sKatea[strcspn(sKatea, "\n")] = 0;    // RETURN karakterea kendu, modu bat
        // sKatea[strlen(sKatea)-1] = '\0';   // RETURN karakterea kendu, beste modu bat

        fnsLarrizIdatzi(sKatea);
        fnsKateaGarbitu(sKatea, sKateGarbi);

        if (fnboPalindromoaDa(sKateGarbi))
        {
            printf("---> %s <--- palindromoa da\n", sKateGarbi);
        }
        else
        {
            printf("---> %s <--- ez da palindromoa\n", sKateGarbi);
        }

        printf("\nBeste testu bat aztertu nahi duzu: (B ala E): ");
        cAukera = toupper(getch());
    } while (cAukera == 'B');

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


void fnsLarrizIdatzi(char *sEsaldi)
{
    for (int i = 0; sEsaldi[i] != '\0'; i++)
    {
        switch (sEsaldi[i])
        {
            case 'ñ':
                sEsaldi[i] = 'Ñ';
                break;
            case 'á':
            case 'à':
            case 'â':
            case 'Á':
            case 'À':
            case 'Â':
                sEsaldi[i] = 'A';
                break;
            case 'é':
            case 'è':
            case 'ê':
            case 'É':
            case 'È':
            case 'Ê':
                sEsaldi[i] = 'E';
                break;
            case 'í':
            case 'ì':
            case 'î':
            case 'Í':
            case 'Ì':
            case 'Î':
                sEsaldi[i] = 'I';
                break;
            case 'ó':
            case 'ò':
            case 'ô':
            case 'Ó':
            case 'Ò':
            case 'Ô':
                sEsaldi[i] = 'O';
                break;
            case 'ú':
            case 'ù':
            case 'û':
            case 'Ú':
            case 'Ù':
            case 'Û':
                sEsaldi[i] = 'U';
                break;
            default:
                sEsaldi[i] = toupper(sEsaldi[i]);
        }
    }
}


void fnsKateaGarbitu(const char *sEsaldi, char *sKateGarbi)
{
    int k = 0;
    for (int i = 0; sEsaldi[i] != '\0'; i++)
    {
        if ((sEsaldi[i] >= 'A' && sEsaldi[i] <= 'Z') || sEsaldi[i] == 'Ñ')
        {
            sKateGarbi[k++] = sEsaldi[i];
        }
    }
    sKateGarbi[k] = '\0';
}


bool fnboPalindromoaDa(const char *sEsaldi)
{
    int iLuz = strlen(sEsaldi);
    for (int iKont = 0; iKont < iLuz / 2; iKont++)
    {
        if (sEsaldi[iKont] != sEsaldi[iLuz - iKont - 1])
        {
            return false; // ez da palindromoa
        }
    }
    return true; // palindromoa da
}






  • Ariketa-55_Palindromoak.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina