You are on page 1of 17

PROGRAMIRANJE I

dr Dražen Brđanin (bdrazen@etfbl.net)


Goran Banjac (goran.banjac@etfbl.net)
Danijela Banjac (danijela.banjac@etfbl.net)
Igor Ševo (igor.sevo@etfbl.net)
Aleksandar Keleč (aleksandar.kelec@etfbl.net)

2014.
A11 STRINGOVI
#include <stdio.h> Stringovi se ispisuju od početne lokacije do
#define MAX 11 terminatora stringa. str[10] 0 0
str[9] 6 1
int main()
str[8] 6 B
{
char str[MAX]; str[7] 7 5
str[0] = 'B'; str[6] 4 C
str[1] = str[4] = str[9] = 'a'; str[5] 0 0
str[2] = 'n'; str[3] = 'j';
str[5] = '\0'; str[4] 6 1
Terminator stringa (brojna
str[6] = 'L'; str[3] 6 A
vrijednost mu je 0) označava
str[7] = 'u'; str[2] 6 E
kraj stringa, bez obzira na to
str[8] = 'k';
šta se nalazi poslije njega str[1] 6 1
str[10] = 0;
printf("%s %d %x\n", str, str[5], str[0]); str[0] 4 2
printf("%s\n", str + 6);
printf("%d", sizeof(str));
return 0; Banja 0 42
} Luka
11

Stringovi 2
A11 STRINGOVI
Napisati funkcije za određivanje dužine datog stringa, poređenje dva stringa, te
kopiranje stringa.
int duzina(char *s) int duzina(char *s)
{ {
int d; ili char *p = s;
for (d = 0; s[d]; d++); while (*p)
return d; p++;
} return p - s;
}
int uporedi(char *s1, char *s2)
{
int i;
for (i = 0; s1[i] && s1[i] == s2[i]; i++);
return s1[i] - s2[i];
}

void kopiraj(char *s1, char *s2)


{
while (*s1++ = *s2++);
}

Stringovi 3
A11 STRINGOVI
#include <stdio.h>
int duzina(char *s)
{
int d = -1;
while (s[++d]);
return d;
}
int main()
{
char str[101], c;
int i = 0;
printf("Unesite tekst:\n"); scanf("%s", str);
printf("Duzina prve rijeci ('%s') je %d.\n", str, duzina(str));
do
{
scanf("%c", &c);
str[i++] = c;
}
Unesite tekst:
while (c != '\n');
str[i - 1] = 0; Laste lete daleko!
printf("Ostatak: '%s'\n", str); Duzina prve rijeci ('Laste') je 5.
printf("Duzina ostatka: %d.", duzina(str)); Ostatak: ' lete daleko!'
return 0; Duzina ostatka: 13.
}

Stringovi 4
A11 STRINGOVI
Napisati program koji određuje da li je unesena riječ palindrom. Provjera da li je riječ
palindrom treba da se vrši u funkciji čiji je prototip:
int palindrom(char *);
#include <stdio.h>
int duzina(char *s)
{
int d = -1;
while (s[++d]);
return d;
}
int palindrom(char *s)
{
int d = duzina(s), i;
for (i = 0; i < d / 2; i++)
if (s[i] != s[d - i - 1]) return 0;
return 1;
}
int main()
{
char rijec[101];
printf("Unesite rijec: "); scanf("%s", rijec);
printf("Rijec '%s' %s palindrom.", rijec, palindrom(rijec) ? "je" : "nije");
return 0;
}
Stringovi 5
A11 STRINGOVI
Napisati funkciju koja određuje poziciju podstringa (s2) u stringu (s1), a čiji je prototip:
int pozicija(char *s1, char *s2);
U glavnom programu učitati dvije riječi, a zatim odrediti poziciju druge riječi u prvoj.
#include <stdio.h>
int pozicija(char *s1, char *s2)
{
int i, j;
for (i = 0; s1[i]; i++)
{
for (j = 0; s2[j] && s2[j] == s1[i + j]; j++);
if (!s2[j]) return i;
}
return -1;
}
int main()
{
char rijec1[101], rijec2[101]; int p;
printf("Unesite dvije rijeci: "); scanf("%s %s", rijec1, rijec2);
p = pozicija(rijec1, rijec2);
if (p < 0) printf("Rijec '%s' se ne nalazi u rijeci '%s'.", rijec2, rijec1);
else printf("Pozicija rijeci '%s' je %d.", rijec2, p);
return 0;
}

Stringovi 6
A11 STRINGOVI
Napisati funkciju koja izbacuje svako pojavljivanje podstringa (s2) iz nekog stringa
(s1), a čiji je prototip:
void izbaci(char *s1, char *s2);
U glavnom programu učitati dvije riječi, pa ispisati prvu riječ nakon izbacivanja svakog
pojavljivanja druge riječi.
#include <stdio.h>
void izbaci(char *s1, char *s2)
{
int i = 0, j, k;
while (s1[i])
{
for (j = 0; s2[j] && s2[j] == s1[i + j]; j++);
if (!s2[j])
{ int main()
for (k = i; s1[k + j]; k++) {
s1[k] = s1[k + j]; char rijec1[101], rijec2[101];
s1[k] = 0; printf("Unesite dvije rijeci: ");
} scanf("%s %s", rijec1, rijec2);
else izbaci(rijec1, rijec2);
i++; printf("Rezultat: '%s'", rijec1);
} return 0;
} }

Stringovi 7
A11 STRINGOVI
Napisati funkciju koja spaja dva stringa (konkatenacija), a čiji je prototip:
void konkatenacija(char *s1, char *s2);
Napisati glavni program koji učitava dvije riječi, a zatim ih konkatenira i ispisuje.
#include <stdio.h>
#define MAX 101

void konkatenacija(char *s1, char *s2)


{
while (*s1) s1++;
while (*s1++ = *s2++);
}

int main()
{
char rijec1[MAX * 2 - 1], rijec2[MAX];
printf("Unesite dvije rijeci: ");
scanf("%s %s", rijec1, rijec2);
konkatenacija(rijec1, rijec2);
printf("Rezultat: '%s'", rijec1);
return 0;
}

Stringovi 8
A11 STRINGOVI
Napisati funkciju koja spaja dva stringa (konkatenaciju), a čiji je prototip:
void konkatenacija(char *s1, char *s2, char *r);
Napisati glavni program koji učitava dvije riječi, a zatim ih konkatenira i ispisuje.
#include <stdio.h>
#define MAX 101

void konkatenacija(char *s1, char *s2, char *r)


{
while (*r++ = *s1++);
r--;
while (*r++ = *s2++);
}

int main()
{
char r1[MAX], r2[MAX], r[MAX * 2 - 1];
printf("Unesite dvije rijeci: ");
scanf("%s %s", r1, r2);
konkatenacija(r1, r2, r);
printf("Rezultat: '%s'", r);
return 0;
}

Stringovi 9
A11 STRINGOVI
Napisati funkciju koja spaja dva stringa (konkatenaciju), a čiji je prototip:
char* konkatenacija(char *s1, char *s2);
Napisati glavni program koji učitava dvije riječi, a zatim ih konkatenira i ispisuje.
#include <stdio.h>
#include <stdlib.h>
#define MAX 101
char* konkatenacija(char *s1, char *s2)
{
char *r, *t;
int d1 = -1, d2 = -1;
while (s1[++d1]);
while (s2[++d2]);
t = r = (char *)calloc(d1 + d2 + 1, sizeof(char));
while (*t++ = *s1++);
int main()
t--;
{
while (*t++ = *s2++);
char r1[MAX], r2[MAX], *r;
return r;
printf("Unesite dvije rijeci: ");
}
scanf("%s %s", r1, r2);
r = konkatenacija(r1, r2);
printf("Rezultat: '%s'", r);
free(r);
return 0;
}
Stringovi 10
A11 STRINGOVI
Napisati program u kojem treba:
• definisati tip OSOBA kojim se reprezentuju osobe čiji su atributi prezime (dinamički
string), ime (dinamički string) i godina rođenja.
• definisati funkciju koja sa standardnog ulaza učitava podatke o jednoj osobi, a čiji je
prototip:
void citaj(OSOBA *);
• definisati funkciju za sortiranje niza podataka o osobama po prezimenima, a čiji je
prototip:
void sortiraj(OSOBA *, int);
• definisati funkciju koja na standardni izlaz ispisuje podatake o osobi, a čiji je prototip:
void pisi(OSOBA *);
• u glavnom programu:
 učitati podatke za n osoba koristeći funkciju citaj i formirati odgovarajući dinamički
niz,
 sortirati učitani niz pomoću funkcije sortiraj,
 ispisati sortirani niz pomoću funkcije pisi.

Stringovi 11
A11 STRINGOVI
Rješenje:
#include <stdio.h> void citaj(OSOBA *o)
#include <stdlib.h> {
typedef struct osoba char prezime[101], ime[101];
{ scanf("%s %s %d",
char *prezime; prezime, ime, &o->godRodjenja);
char *ime; o->prezime = (char *)calloc(
int godRodjenja; duzina(prezime) + 1, sizeof(char));
} OSOBA; kopiraj(o->prezime, prezime);
int duzina(char *s) // pomocna o->ime = (char *)calloc(
{ duzina(ime) + 1, sizeof(char));
int d = -1; kopiraj(o->ime, ime);
while (s[++d]); }
return d;
}
void kopiraj(char *s1, char *s2) // pomocna
{ while (*s1++ = *s2++); }
int uporedi(OSOBA *a, OSOBA *b) // pomocna
{
int i;
for (i = 0; a->prezime[i] && a->prezime[i] == b->prezime[i]; i++);
return a->prezime[i] - b->prezime[i];
}

Stringovi 12
A11 STRINGOVI
void sortiraj(OSOBA *niz, int n)
{
int i, j;
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
if (uporedi(niz + i, niz + j) > 0)
{
OSOBA temp = niz[i];
niz[i] = niz[j];
niz[j] = temp;
}
}

void pisi(OSOBA *o)


{
printf("%-15s %-15s %d\n", o->prezime, o->ime, o->godRodjenja);
}

void obrisi(OSOBA *o) // pomocna


{
free(o->prezime);
free(o->ime);
}

Stringovi 13
A11 STRINGOVI
int main()
{
int i, n;
OSOBA *niz;
do
{
printf("n=");
scanf("%d", &n);
}
while (n < 1);
niz = (OSOBA *)malloc(n * sizeof(OSOBA));
printf("Unesite osobe:\n"); n=3
for (i = 0; i < n; ++i) Unesite osobe:
{ printf(" %d. osoba: ", i + 1); citaj(niz + i); }Markovic Marko 1990
1. osoba:
sortiraj(niz, n); 2. osoba: Petrovic Petar 1991
printf("=== =============== ===============
3. ====\n");
osoba: Jankovic Janko 1992
printf("RB. PREZIME IME GOD.\n");
=== =============== =============== ====
printf("=== =============== =============== ====\n");
RB. PREZIME IME GOD.
for (i = 0; i < n; ++i) === =============== =============== ====
{ printf("%2d. ", i + 1); pisi(niz + i);1.
obrisi(niz
Jankovic + i); }Janko 1992
printf("=== =============== =============== ====");
2. Markovic Marko 1990
free(niz); 3. Petrovic Petar 1991
return 0; === =============== =============== ====
}

Stringovi 14
A11 STRINGOVI (BIBLIOTEKA)
Napisati program koji učitava dvije riječi, pa ih ispisuje spojene, dužinu spojene riječi, te
određuje da li su unesene riječi jednake. Učitati treću riječ i odrediti da li se ona nalazi u
spojenoj riječi.
#include <stdio.h> Biblioteka string.h sadrži funkcije za
#include <string.h> manipulaciju stringovima, uključujući
#define MAX 101 kopiranje, određivanje dužine,
konkatenaciju, itd.
int main()
{
char r1[MAX], r2[MAX], r3[MAX], *t;
printf("Prva rijec: "); scanf("%s", r1);
printf("Druga rijec: "); scanf("%s", r2);
strcpy(r3, r1);
strcat(r3, r2);
printf("Spojena rijec: '%s'\n", r3);
printf("Duzina spojene rijeci: %d\n", strlen(r3));
printf("Rijeci %s jednake.\n", strcmp(r1, r2) ? "nisu" : "su");
printf("Treca rijec: "); scanf("%s", r2);
t = strstr(r3, r2);
printf("Rijec '%s' se %s nalazi u rijeci '%s'.", r2, t ? "" : "ne", r3);
return 0;
}

Stringovi 15
A11 STRINGOVI (BIBLIOTEKA)
void *memcpy(void *dest, const void *src, size_t n) Kopira n karaktera iz src u dest.

Kopira karakter c (neoznačen karakter) u prvih n karaktera stringa na koji


void *memset(void *str, int c, size_t n)
pokazuje argument str.

char *strcat(char *dest, const char *src) Dodaje string na koji pokazuje src na kraj stringa na koji pokazuje dest.

char *strchr(const char *str, int c) Traži prvo pojavljivanje karaktera c u stringu na koji pokazuje str.

int strcmp(const char *str1, const char *str2) Poredi string na koji pokazuje str1 sa stringom na koji pokazuje str2.

char *strcpy(char *dest, const char *src) Kopira string sa src na dest.

Računa dužinu početnog segmenta str1 koji se sastoji samo od karaktera


size_t strcspn(const char *str1, const char *str2)
koji nisu u str2.

size_t strlen(const char *str) Pronalazi dužinu stringa na str bez nul karaktera.

Pronalazi prvi karakter u stringu str1 koji je jednak bilo kom karakteru u
char *strpbrk(const char *str1, const char *str2)
str2.
Traži posljednje pojavljivanje karaktera c u stringu na koji pokazuje
char *strrchr(const char *str, int c)
argument str.
Računa dužinu početnog segmenta str1 koji se sastoji samo od karaktera
size_t strspn(const char *str1, const char *str2)
u str2.

Pronalazi prvo pojavljivanje karaktera needle, bez terminatorskog nul


char *strstr(const char *haystack, const char *needle)
karaktera, koji se pojavljuje u stringu haystack.

Stringovi 16
A11 ZADACI ZA VJEŽBU
1. Napisati program koji učitava string i karakter i potom nalazi broj pojavljivanja tog
karaktera u stringu.
2. Napisati program koji učitava string i podstring i pronalazi broj pojavljivanja podstringa
u datom stringu.
3. Učitati string i obrnuti redoslijed njegovih znakova.
4. Učitati string i odrediti koliko različitih karaktera sadrži.
5. Učitati dva stringa i pronaći njihovo najveće poklapanje (poklapanje se odnosi na
susjedne karaktere stringa).
6. Napisati funkciju koja učitava rečenicu kao string (uključujući i razmake).
7. Napisati funkciju koja string koji predstavlja rečenicu prebacuje u oblik gdje svaka riječ
počinje velikim slovom, a sva ostala slova su mala.
8. Napisati funkciju koja broji riječi u rečenici predstavljenoj stringom.
9. Učitati niz od n osoba predstavljenih imenom, prezimenom i datumom rođenja (datum
je odvojen slog), a potom taj niz sortirati po prezimenu, imenu i datumu rođenja (ako je
prezime isto, onda po imenu, a ako je ime isto onda po datumu rođenja).
Stringovi 17

You might also like