programiranje 1 programski jezik c

Post on 06-Jan-2016

105 Views

Category:

Documents

8 Downloads

Preview:

Click to see full reader

DESCRIPTION

Programiranje 1 programski jezik c. Staša Vujičić Čas 12 V 1.2. Stringovi – osnovni pojmovi. Niska karaktera ili string je niz karaktera koji se zavr š ava karakterom '\0'. Karakter '\0' ima ASCII vrednost 0 pa se mo ž e tuma č iti kao logi č ka vrednost ”neta č no”. - PowerPoint PPT Presentation

TRANSCRIPT

Staša VujičićČas 12

V 1.2

Niska karaktera ili string je niz karaktera koji se završava karakterom '\0'.

Karakter '\0' ima ASCII vrednost 0 pa se može tumačiti kao logička vrednost ”netačno”.

2

Format za ispis niske pomoću funkcije printf je %s.

Konstante tipa niska se navode između znakova navodnika. Na primer:

char s[]="Primer stringa";

Pri tome je s niska od 15 karaktera:{'P', 'r', 'i', 'm', 'e', 'r', ' ', 's', 't', 'r', 'i', 'n', 'g', 'a', '\0'}

3

DEKLARACIJA i INICIJALIZACIJA STRINGOVA

char s1[] = {‘s’, ‘t’, ‘r’,’i’,’n’,’g’,’ ’, ‘1’ ‘\0’};

char s2[] = “string 2”;

char *s3 = “string 3”;

String može sadržati sve karaktere, ne samo slova

Svaki string se završava simbolom ‘\0’ – string terminator

ŠTAMPANjE STRINGOVA

Bez obzira kako je string deklarisan I inicijalizovan, uvek se može štampati ovako:

printf (“s1 = %s\n”, s1);

UČITAVANjE STRINGOVAchar s1[MAX];

char *s2;

scanf(“%s”, s1); OK, ako je učitan string dužine <MAX

scanf(“%s”, s2); !POGREŠNO: “Segmentation fault”

(pogledati primere) ! %s učitava niz neblanko karaktera

PRISTUP KARAKTERIMA STRINGAchar s[]=“neki string”;

indeksno: int i;karakteri stringa: s[0],s[1],…poslednji element je uvek ‘\0’adrese karaktera: &s[0], &s[1],…

pokazivački: karakteri stringa: *s, *(s+1), …Adrese karaktera: s, s+1,…

Kakva je razlika između ’s’ i ”s”?

’s’ je karakter ”s” je string ili niz od dva karaktera 's' i

'\0'.

8

Obrni string - obrće nisku karaktera.

#include <stdio.h>/* Ova funkcija racuna duzinu date niske

karaktera. Umesto nje, moguce je koristiti standardnu funkciju strlen .*/

int duzina_stringa(char s[]){

int i;for (i = 0; s[i]; i++);return i;

}

9

/* Funkcija obrce nisku karaktera */void obrni_string(char s[]){

int i, j;for (i = 0, j = duzina_stringa(s)-1; i<j; i++, j--){

int pom = s[i];s[i] = s[j];s[j] = pom;

}}

10

main(){

char s[] = "Zdravo svima";obrni_string(s);printf("%s\n", s);

}

Izlaz:amivs ovardZ

11

Uklanja beline, tabulatore ili znak za kraj reda sa kraja stringa.

int ukloni(char s[]){

int i;for (i = strlen(s)-1; i >= 0; i--)

if (s[i] != ' ' && s[i] != '\t' && s[i] != '\n')

break;s[i+1] = '\0';return i;

}12

Funkcije biblioteke <string.h> strcpy (string copy)

char *strcpy(char *s1, const char *s2);

strcpy kopira string s2 u string s1 strcpy vraća pokazivač na prvi karakter stringa

s1 strcpy podrazumeva da je string s2 dovoljno

velik za smeštanje celog stringa s1; neophodno je voditi računa o dimenziji niza s1 (pogledati demonstraciju funkcije)

!!! Stringovi se ne mogu kopirati naredbom dodele (npr s1=s2 je pogrešan način za kopiranje stringova)

(pogledati primer)

strcpy (string copy)

char *strcpy(char *s1, const char *s2);

strcpy kopira string s2 u string s1 strcpy vraća pokazivač na prvi karakter stringa

s1 strcpy podrazumeva da je string s2 dovoljno

velik za smeštanje celog stringa s1; neophodno je voditi računa o dimenziji niza s1 (pogledati demonstraciju funkcije)

!!! Stringovi se ne mogu kopirati naredbom dodele (npr s1=s2 je pogrešan način za kopiranje stringova)

(pogledati primer)

strcpy (string copy)

char *strcpy(char *s1, const char *s2);

strcpy kopira string s2 u string s1 strcpy vraća pokazivač na prvi karakter stringa

s1 strcpy podrazumeva da je string s2 dovoljno

velik za smeštanje celog stringa s1; neophodno je voditi računa o dimenziji niza s1 (pogledati demonstraciju funkcije)

!!! Stringovi se ne mogu kopirati naredbom dodele (npr s1=s2 je pogrešan način za kopiranje stringova)

(pogledati primer)

strcat (string concatanate)

char *strcat(char *s1, const char *s2);

strcat nadovezuje string s2 na string s1 strcat vraća pokazivač na prvi karakter stringa s1 strcat podrazumeva da je string s2 dovoljno velik

za smeštanje svih nadovezanih karaktera stringa s1; neophodno je voditi računa o dimenziji niza s1 (pogledati demonstraciju funkcije)

(pogledati primer)

Funkcije biblioteke <string.h>

Funkcije biblioteke <string.h>

strcmp (string compare)

int strcmp(const char *s1, const char *s2);

strcmp poredi dva stringa strcmp vraća: 0, ako je su s1 i s2 jednake <0, ako je s1 leksikografski ispred s2 (tj poredak s1,s2 jeste leksikografski ispravan) >0, ako je s1 leksikografski iza s2 (tj poredak s1,s2 nije leksikografski ispravan) !!! Stringovi se ne mogu porediti relacionim operatorima

(npr s1<s2 je pogrešan način za poređenje stringova)

(pogledati primer)

Funkcije biblioteke <string.h>

strstr (string string)

char *strstr(const char *s1, const char *s2)

strstr ispituje da li je niska s2 podstring niske s1 Ako jeste, strstr vraća adresu one pozicije u niski

s1 odakle počinje niska s2; u suprotnom, vraća NULL

(pogledati primer)

Funkcije biblioteke <string.h>

strchr (string string)

char *strchr(const char *s1, int c)

strchr ispituje da li se karakter c nalazi u niski s1 Ako se nalazi, strchr vraća adresu one pozicije u

niski s1 gde se karakter c prvi put pojavljuje; u suprotnom, vraća NULL

(pogledati primer)

#include <stdio.h>

/* Kopira string src u string dest. Pretpostavlja da u dest ima dovoljno prostora. */

void kopiraj_string(char dest[], char src[]){

int i;/* Kopira karakter po karakter, sve dok nije iskopiran

karakter '\0' */for (i = 0; src[i]!='\0'; i++)

dest[i]=src[i]; dest[i]=‘\0’;}

18

/* Nadovezuje string t na kraj stringa s.Pretpostavlja da u s ima dovoljno prostora. */void nadovezi_stringove(char s[], char t[]){

int i, j;/* Pronalazimo kraj stringa s */

for (i = 0; s[i]; i++);/* Vrsi se kopiranje, slicno f-ji kopiraj_string

*/for (j = 0; s[i] = t[j]; j++, i++);

s[i]=‘\0’;}

19

/* strcmp - Vrsi leksikografsko poredjenje dva stringa.Vraca :

0 - ukoliko su stringovi jednaki<0 - ukoliko je s leksikografski ispred t>0 - ukoliko je s leksikografski iza t

*/int uporedi_stringove(char s[], char t[]){/* Petlja tece sve dok ne naidjemo na prvi razlicit karakter

*/int i;for (i = 0; s[i]==t[i]; i++)

if (s[i] == '\0') /* Naisli smo na kraj oba stringa, a nismo nasli razliku */

return 0;/* s[i] i t[i] su prvi karakteri u kojima se niske razlikuju.Na osnovu njihovog odnosa, odredjuje se odnos stringova*/

return s[i] - t[i]; }

20

/* Vraća indeks prvog pojavljivanja karaktera c u niski s ili -1 ako se ne pojavljuje*/

int string_char(char s[], char c){

int i;for (i = 0; s[i]; i++)

if (s[i] == c)return i;

/* Nije nadjeno */return -1;

}

21

/* Pronalazi poslednju poziciju karaktera c u stringu s, odnosno -1 ukoliko s ne sadrži c */

int string_poslednji_char(char s[], char c){

/* Pronalazimo kraj stringa s */int i;for (i = 0; s[i]; i++);/* Krecemo od kraja i trazimo c unazad */for (i--; i>=0; i--)

if (s[i] == c)return i;

/* Nije nadjeno */return -1;

}

22

/* Proverava da li string str sadrzi string sub. Vraca poziciju na kojoj sub pocinje, odnosno -1 ukoliko ga nema */

int string_string(char str[], char sub[]){

int i, j;/* Proveravamo da li sub pocinje na svakoj poziciji i */for (i = 0; str[i]; i++)/* Poredimo sub sa str pocevsi od poziciji i sve dok ne naidjemo na razliku */for (j = 0; str[i+j] == sub[j]; j++)

/* Nismo naisli na razliku a ispitali smo sve karaktere niske sub */

if (sub[j+1]=='\0')return i;

/* Nije nadjeno */return -1;

}

23

main(){char s[100];char t[] = "Zdravo";char u[] = " svima";kopiraj_string(s, t);printf("%s\n", s);nadovezi_stringove(s, u);printf("%s\n", s);printf("%d\n",string_char("racunari", 'n'));printf("%d\n",string_poslednji_char("racunari", 'a'));printf("%d\n",string_string("racunari", "rac"));printf("%d\n",string_string("racunari", "ari"));printf("%d\n",string_string("racunari", "cun"));printf("%d\n",string_string("racunari", "cna"));}

24

Izlaz:ZdravoZdravo svima45052-1

25

Funkcija koja uklanja znak c kad god se pojavi u stringu s.

#include <stdio.h>void sazimanje(char s[], char c){

int i,j;for(i=j=0; s[i]!='\0';i++)if(s[i]!=c) s[j++]=s[i];s[j]='\0';

}

26

main() {

char niz[20];char c;printf("Unesi karakter\n\n");scanf("%c", &c);scanf("%s", niz);sazimanje(niz, c);printf("%s\n", niz);

}

27

Program na osnovu niske cifara broja u dekadnom zapisu izračunava vrednost broja, kao i obrnuto: na osnovu vrednosti broja formira string koji sadrži zapis broja u dekadnom sistemu.

(pogledati primer)

#include <stdio.h>#define MAX 12

28

/* Funkcija ucitava string sa ulaza u niz na ciji pocetak pokazuje pokazivac s, duzine max karaktera */

void ucitaj_string (char s[], int max){ int c; int i;

for (i = 0; (c = getchar ()) != EOF && c != ' ' && c != '\t'

&& c != '\n' && i < max - 1; i++) s[i] = c;

s[i] = '\0';

}29

/* Funkcija vraca broj koji je zapisan u dekadnom obliku u stringu na koji pokazuje s. Na pocetku stringa su dozvoljene vodece beline, nakon cega sledi opcioni znak, i na kraju same cifre broja. Eventualni karakteri nakon cifara se ignorisu. Ova funkcija je identicna funkciji atoi() iz standardne biblioteke */

int atoi_klon (char s[]){ int a = 0; /* Promenljiva u kojoj akumuliramo

vrednost */ int znak = 1; /* Znak (inicijalno +) */

/* Preskacemo beline */ while (*s == ' ' || *s == '\t') s++;

30

/* Prvi ne-blanko karakter je ili cifra, ili znak. Ako je znak u pitanju, tada po potrebi azuriramo promenljivu znak, i prelazimo na sledeci karakter. */

if (*s == '-') { znak = -1; s++; } else if (*s == '+') s++;

31

/* Racunamo vrednost broja */ while (*s >= '0' && *s <= '9') { a = 10 * a + *s - '0'; s++; }

/* Vracamo vrednost broja */ return znak * a;}

32

/* Funkcija obrni() obrce karaktere stringa */

void obrni (char cifre[]){ char *p = cifre, *q;

/* Petlja postavlja q da pokazuje na poslednji karakter u stringu. Pri tom se pod poslednjim podrazumeva karakter pre znaka '\0', koji se ne smatra delom stringa. */

33

for (q = cifre; *q != '\0'; q++); q--;

/* Obrtanje niza */ for (; p < q; p++, q--) { char t = *p; *p = *q; *q = t; }}

34

/* Funkcija na osnovu broja a kreira string sastavljen od dekadnih cifara broja a, sa eventualnim predznakom '-' */

void itoa (int a, char cifre[]){ int znak = 1; char *s = cifre;

35

/* Racunamo znak i apsolutnu vrednost */ if (a < 0) { a = -a; znak = -1; }

36

/* Izdvajamo cifre zdesna u levo i smestamo ih u string. */

do { *s = a % 10 + '0'; a /= 10; s++; } while (a);

37

/* Dopisujemo znak, ako je '-' */ if (znak == -1) *s++ = ‘-‘;

/* "Zatvaramo" string, na propisan nacin */ *s = ‘\0‘;

/* Obrcemo karaktere stringa */ obrni (cifre);}

38

int main (){ char cifre[MAX]; int a;

/* Ucitavamo string */ printf ("Uneti string oblika (+|-)dddd "); ucitaj_string (cifre, MAX);

/* Dobijamo broj iz stringa */ a = atoi_klon (cifre);

/* Prikazujemo broj */ printf ("Vrednost broja %d\n", a);

39

/* Ucitavamo broj */ printf ("Unesite broj: "); scanf ("%d", &a);

/* Kreiramo string sa ciframa */ itoa (a, cifre);

/* Prikazujemo string */ printf ("String sa ciframa broja: "); printf (“%s”, cifre);}

40

top related