Interaktívna osnova pre IB001/10 a IB001/11

Týden 10

Prebrali sme:

  • reťazce, precvičenie funkcií

Príklady

  • reťazec ako pole znakov, na konci \0

char* retazec1 = "retazec1";

char* retazec2 = "retazec2";

retazec2[8] = 'x'; //prepisanie znaku \0 v retazci2

printf("%s\n", retazec1);

printf("%s\n", retazec2); //tak trochu sa zblazni, vypisuje vsetko v pamati kym nenajde \0

 

  • dynamická alokácia reťazca

char* retazec1 = (char*) malloc(20*sizeof(char));

fgets(retazec1, 20, stdin);

//urobime s retazcom co treba

free(retazec1);

  • knižnica string.h a ctype.h
  • najprogramujte funkciu na spojenie dvoch reťazcov do jedného, t.j. strcat

char* concat(char* str1, const char* str2)

{

  int i = 0;

  while (str1[i]!='\0')

    i++;

  int j=0;

  while (str2[j]!='\0')

  { str1[i] = str[j]; i++; j++; }

  str1[i] = '\0';

  return str1;

}

  • naprogramujte funkciu na porovnanie dvoch reťazcov, t.j. strcmp

int compare(const char* str1, const char* str2)

{

  int i=0;

  while((str1[i]!='\0' || str2[i]!='\0') && str1[i]==str2[i])

    i++;

  if (str1[i]> str2[i]) return 1;

  if (str1[i] < str2[i]) return 0;

  return 0;

}

  • ako zistiť dĺžku reťazca, počet písmen 'e' v reťazci

char* retazec = (char *)malloc(20*sizeof(char));

fgets(retazec, 20, stdin);

//urcite nie cez sizeof(retazec)

int dlzka = strlen(retazec);

int pocet = 0;

for (int i=0; i

{

  if (retazec[i]=='e')

  pocet++;

}

printf("slovo %s ma dlzku %d\n", retazec, dlzka);

 

  • zistite počet slov vo vete, kde môžu byť slová oddelené ľudovoľným počtom prázdnych znakov

int kolkoSlov(const char* retazec)
{

    int pocet = 0;
    int i=0;
    char znak;
    int naSlove=0;
    while (i<50 && (retazec[i])!='\0') //kym sme vnutri retazca
    {
        if (isspace(retazec[i])) //ak je to prazdny znak
        {
            naSlove = 0; //nie sme na slove
        }
        if (isalnum(retazec[i]) || ispunct(retazec[i])) //ak to nie je prazdny znak, da sa pouzit aj funkcia isgraph(retazec[i]); funkcia isprint() vracia true aj pre medzeru
        {
            if (naSlove == 0) //sme na prvom pismene slova
            {
                naSlove=1; pocet++;//zvys pocet o jedna
            }
        }
        i++; //posun sa v retazci
    }
    printf("Retazec %s obsahuje %d slov\n", retazec, pocet);
    return pocet;
}

 

  • dobrovoľná domáca úloha:
    Vytvorte funkciu char* trim(char* veta), ktorá nahradí každú postupnosť bielych
    znakov jednou medzerou. Pre vstup
    Dnes	 je \t\t krasny \t den.
    vráti
    Dnes je krasny den.

char* trim(char* retazec)
{
    char* s = (char*) malloc(50*sizeof(char));
    int ir = 0; //pozicia v retazci retazec
    int is = 0; //pozicia v retazci s
    int medzera = 0;
    while(ir<50 && retazec[ir]!='\0')
    {
        if (isalnum(retazec[ir]) || ispunct(retazec[ir])) //ak sme na slove
        {
            medzera=0; //nie je to prvy biely znak
            s[is] = retazec[ir]; //skopiruj co je v retazci do noveho retazca
            is++; //v retazci s sa posun
        }
        if (isspace(retazec[ir])) //ak je to prazdny znak
        {
            if (medzera==0) //ak je to prvy biely znak
            {
                medzera=1;
                s[is] = ' '; //nahrad ho medzerou
                is++; //posun sa v retazci s
            }
        }
        ir++; //posun sa v retazci retazec

    }
    s[++is] = '\0'; //ukoncenie retazca s NEZABUDNUT!
    return s;
}