1 / 39

Programiranje 1 programski jezik c

Programiranje 1 programski jezik c. Staša Vujičić Čas 12 V 1.1. 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”.

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

  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” • ! %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. Primer 7 • Izvršiti implementaciju funkcija strcpy, strcat, strcmp, strchr, strstr bibliotekestring.h. #include <stdio.h> /* strcpy - 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]; }

  14. /* strcat -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++); }

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

  16. /* strchr - Pronalazi prvu poziciju karaktera c u stringu s, odnosno -1 ukoliko s ne sadrzi c */ 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; }

  17. /* Pronalazi poslednju poziciju karaktera c u stringu s, odnosno -1 ukoliko s ne sadrzi 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; }

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

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

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

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

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

  23. Primer 4 23 Funkcija za učitavanje reči sa ulaza u nisku karaktera. #include <stdio.h> #include <ctype.h> /* Potrebno je zbog funkcije isspace. Funkcija isspace ispituje da li je karakter praznina (blanko, tabulator ili prelazak u novi red).Ona je definisana u okviru ctype.h */

  24. 24 /* Funkcija ucitava rec sa standardnog ulaza i smesta je u niz karaktera s. Ovo uspeva zbog toga sto se po vrednosti prenosi adresa pocetka niza,a ne ceo niz */ void ucitaj_rec(char s[]) { int c, i = 0; while (!isspace(c=getchar())) s[i++] = c; s[i] = '\0'; }

  25. 25 main() { /* Obavezno je alocirati memoriju za niz karaktera */ char s[100]; ucitaj_rec(s); /* Format za ispis stringa se zadaje kao %s */ printf("%s\n", s); }

  26. Primer 9 26 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. #include <stdio.h> #define MAX 12

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

  28. 28 /* Funkcija ispisuje karaktere stringa */ voidispisi_string (char s[]) { int i; for (i = 0; s[i] != '\0'; i++) putchar (s[i]); putchar ('\n'); }

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

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

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

  32. 32 /* 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. */

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

  34. 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. 35 /* Racunamo znak i apsolutnu vrednost */ if (a < 0) { a = -a; znak = -1; }

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

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

  38. 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. 39 /* Ucitavamo broj */ printf ("Unesite broj: "); scanf ("%d", &a); /* Kreiramo string sa ciframa */ itoa (a, cifre); /* Prikazujemo string */ printf ("String sa ciframa broja: "); ispisi_string (cifre); }

More Related