1 / 40

Programiranje 1 programski jezik c

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 ''. Karakter '' ima ASCII vrednost 0 pa se mo ž e tuma č iti kao logi č ka vrednost ”neta č no”.

zariel
Télécharger la présentation

Programiranje 1 programski jezik c

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programiranje 1 programski jezik c Staša Vujičić Čas 12 V 1.2

  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”.

  3. Stringovi – osnovni pojmovi • Format za ispis niske pomoću funkcije printf je %s. • Konstante tipa niska se navode izmeđuznakova 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'}

  4. 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

  5. ŠTAMPANjE STRINGOVA • Bez obzira kako je string deklarisan I inicijalizovan, uvek se može štampati ovako: printf (“s1 = %s\n”, s1);

  6. UČITAVANjE STRINGOVA char 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

  7. PRISTUP KARAKTERIMA STRINGA char 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,…

  8. 8 Kakva je razlika između ’s’ i ”s”? ’s’ je karakter ”s” je string ili niz od dva karaktera 's' i '\0'.

  9. Primer 5 • 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; }

  10. /* 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; } }

  11. main() { char s[] = "Zdravo svima"; obrni_string(s); printf("%s\n", s); } Izlaz: amivs ovardZ

  12. Primer 6 • 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; }

  13. 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 • strcpypodrazumeva 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 • strcpypodrazumeva 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 • strcpypodrazumeva 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)

  14. Funkcije biblioteke <string.h> • strcat (string concatanate) char *strcat(char *s1, const char*s2); • strcatnadovezuje string s2 na string s1 • strcat vraća pokazivač na prvi karakter stringa s1 • strcatpodrazumeva 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)

  15. 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)

  16. 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)

  17. 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)

  18. Primer 7 #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 iskopirankarakter '\0' */ for (i = 0; src[i]!='\0'; i++) dest[i]=src[i]; dest[i]=‘\0’; }

  19. /* 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’; }

  20. /* 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]; }

  21. /* 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; }

  22. /* 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; }

  23. /* 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 smosve karaktere niske sub */ if (sub[j+1]=='\0') return i; /* Nije nadjeno */ return -1; }

  24. 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")); }

  25. Izlaz: Zdravo Zdravo svima 4 5 0 5 2 -1

  26. Primer 8 • 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'; }

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

  28. Primer 9 28 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 brojau dekadnom sistemu. (pogledati primer) #include <stdio.h> #define MAX 12

  29. 29 /* 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'; }

  30. 30 /* 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 */ intatoi_klon (char s[]) { int a = 0;/*Promenljiva u kojoj akumuliramo vrednost */ int znak = 1; /* Znak (inicijalno +) */ /* Preskacemo beline */ while (*s == ' ' || *s == '\t') s++;

  31. 31 /* Prvi ne-blanko karakter je ili cifra, ili znak. Ako je znak u pitanju, tada po potrebi azuriramopromenljivu znak, i prelazimo na sledeci karakter. */ if (*s == '-') { znak = -1; s++; } else if (*s == '+') s++;

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

  33. 33 /* Funkcija obrni() obrce karaktere stringa */ voidobrni (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. */

  34. 34 for (q = cifre; *q != '\0'; q++); q--; /* Obrtanje niza */ for (; p < q; p++, q--) { char t = *p; *p = *q; *q = t; } }

  35. 35 /* 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;

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

  37. 37 /* Izdvajamo cifre zdesna u levo i smestamo ih u string. */ do { *s = a % 10 + '0'; a /= 10; s++; } while (a);

  38. 38 /* Dopisujemo znak, ako je '-' */ if (znak == -1) *s++ = ‘-‘; /* "Zatvaramo" string, na propisan nacin */ *s = ‘\0‘; /* Obrcemo karaktere stringa */ obrni (cifre); }

  39. 39 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);

  40. 40 /* 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); }

More Related