PROGRAMIRANJE I A 07 Nizovi dr Draen Branin
PROGRAMIRANJE I A 07 – Nizovi dr Dražen Brđanin Goran Banjac Danijela Zoran Igor Ševo Aleksandar Keleč (bdrazen@etfbl. net) (goran. banjac@etfbl. net) (danijela. zoran@etfbl. net) (igor. sevo@etfbl. net) (aleksandar. kelec@etfbl. net) 2014.
A 07 DEKLARACIJA I REPREZENTACIJA #include <stdio. h> int main() { unsigned char i; char tekst[4]; short niz[4]; for (i = 0; i < 4; ++i) tekst[i] = 'a' + i; for (i = 0; i < 4; ++i) niz[i] = 2 * i + 2; for (i = 0; i < 4; ++i) printf("%c", tekst[i]); printf("n"); for (i = 0; i < 4; ++i) printf("%d", niz[i]); return 0; } Nizovi 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 niz[3] niz[2] niz[1] niz[0] 0 1 1 0 0 tekst[3] 0 1 1 0 0 0 1 1 tekst[2] 0 1 1 0 0 0 1 0 tekst[1] 0 1 1 0 0 1 tekst[0] abcd 2468 2
A 07 NIZOVI Napisati program koji učitava niz dužine n brojeva realnog tipa, a zatim pronalazi i ispisuje indeks najvećeg i najmanjeg elementa. #include <stdio. h> int main() { int n, i, min, max; float niz[100]; do { printf("n="); scanf("%d", &n); } while (n < 1 || n > 100); for (i = 0; i < n; ++i) { printf("%d. broj: ", i + 1); scanf("%f", &niz[i]); } max = min = 0; for (i = 1; i < n; ++i) { if (niz[i] > niz[max]) max = i; if (niz[i] < niz[min]) min = i; } printf("Indeks najmanjeg elementa je %d, a najveceg %d. ", min, max); return 0; } Nizovi 3
A 07 NIZOVI Napisati program koji učitava dva vektora dužine n, a zatim ispisuje njihov zbir, te njihovu razliku. #include <stdio. h> #define MAX 100 int main() { int n, a[MAX], b[MAX], c[MAX], d[MAX], i; do { printf("n="); scanf("%d", &n); } while (n < 1 || n > MAX); printf("Prvi vektor: n"); for (i = 0; i < n; ++i) { printf(" %d. broj: ", i+1); scanf("%d", &a[i]); } printf("Drugi vektor: n"); for (i = 0; i < n; ++i) { printf(" %d. broj: ", i+1); scanf("%d", &b[i]); } for (i = 0; i < n; ++i) { c[i] = a[i] + b[i]; d[i] = a[i] - b[i]; } printf("Zbir: "); for (i = 0; i < n; ++i) printf(" %d", c[i]); printf("n. Razlika: "); for (i = 0; i < n; ++i) printf(" %d", d[i]); return 0; } Nizovi 4
A 07 NIZOVI Napisati program koji učitava dva vektora dužine n, a zatim ispisuje njihov skalarni proizvod. #include <stdio. h> #define MAX 100 int main() { int n, a[MAX], b[MAX], i, p = 0; do { printf("n="); scanf("%d", &n); } while (n < 1 || n > MAX); printf("Prvi vektor: n"); for (i = 0; i < n; ++i) { printf(" %d. broj: ", i+1); scanf("%d", &a[i]); } printf("Drugi vektor: n"); for (i = 0; i < n; ++i) { printf(" %d. broj: ", i+1); scanf("%d", &b[i]); } for (i = 0; i < n; ++i) p += a[i] * b[i]; printf("Skalarni proizvod je %d. ", p); return 0; } Nizovi 5
A 07 NIZOVI Napisati program koji učitava niz od n cijelih brojeva, a zatim ispisuje njihovu aritmetičku sredinu i one učitane brojeve koji su veći od sredine. #include <stdio. h> #define MAX 100 int main() { int niz[MAX], i, n, s = 0; float as; do { printf("n="); scanf("%d", &n); } while (n < 1 || n > MAX); for (i = 0; i < n; i++) { printf("%d. broj: ", i + 1); scanf("%d", &niz[i]); s += niz[i]; } as = (float)s / n; printf("Sredina: %7. 3 fn. Veci su: ", as); for (i = 0; i < n; i++) if (niz[i] > as) printf(" %d", niz[i]); return 0; } Nizovi POČETAK n ISTINA n<1 LAŽ s=0 T i = 0, n-1 as = s/n niz[i] i = 0, n-1 s = s + niz[i] ISTINA T niz[i]>as LAŽ niz[i] KRAJ 6
A 07 NIZOVI Napisati program koji učitava prirodan broj n (n<100), a zatim ispisuje n!. Standardni prosti tipovi (int, long) omogućavaju maksimalno 20!=2432902008176640000 Problemi “velikih brojeva” rješavaju se tako što se broj posmatra kao niz cifara! Nizovi f[8] f[6] f[5] f[4] f[3] f[2] f[1] f[0] 1! 0 0 0 0 1 2! 0 0 0 0 2 3! 0 0 0 0 6 4! 0 0 0 2 4 5! 0 0 0 1 2 0 7
A 07 NIZOVI Napisati program koji učitava prirodan broj n (n<100), a zatim ispisuje n!. #include <stdio. h> #define MAXCIF 1000 int main() { int f[MAXCIF] = { 1 }; int i, j, n, pom, prenos; do { printf("n="); scanf("%d", &n); } while (n < 1 || n > 100); for (i = 2; i <= n; i++) for (j = 0, prenos = 0; j < MAXCIF; j++) { pom = f[j] * i + prenos; f[j] = pom % 10; prenos = pom / 10; } printf("%d != ", n); for (j = MAXCIF - 1; f[j] == 0; j--); // Preskace vodece nule for (; j >= 0; j--) printf("%d", f[j]); // Ispisuje cifre return 0; } Nizovi 8
A 07 SORTIRANJE NIZOVA Napisati program koji učitava niz od n elemenata, a zatim ispisuje te elemente u rastućem redoslijedu. Postoji velik broj algoritama za sortiranje: select-sort bubble-sort quick-sort shell-sort stack-sort. . . C 99 sintaksa dozvoljava deklaraciju tipa u početnom iskazu for petlje Nizovi #include <stdio. h> #define MAX 100 int main() { int niz[MAX], n; do { printf("n="); scanf("%d", &n); } while (n < 1 || n > MAX); for (int i = 0; i < n; ++i) { printf("%d. broj: ", i + 1); scanf("%d", &niz[i]); } for (int i = 0; i < n - 1; ++i) for (int j = i + 1; j < n; ++j) if (niz[i] > niz[j]) { int pom = niz[i]; niz[i] = niz[j]; niz[j] = pom; } printf("Sortirano: "); for (int i = 0; i < n; ++i) printf(" %d", niz[i]); return 0; } 9
A 07 SORTIRANJE NIZOVA SELECTION-SORT algoritam: uzastopni izbor (selekcija) odgovarajućeg elementa 0: 1: 1 0 Nizovi 2: 6 4 3 1 3: 8 6 4 3 4: 8 6 4 5: 3 4 8 6 6: 8 7 6 7: 8 7 0 1 3 4 6 7 8 10
A 07 VIŠEDIMENZIONI NIZOVI Napisati program koji učitava kvadratnu matricu dimenzije n, a zatim ispisuje elemente na njenoj glavnoj dijagonali. #include <stdio. h> #define MAX 100 int main() { int mat[MAX], n; do { printf("n="); scanf("%d", &n); } while (n < 1 || n > MAX); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) { printf("mat[%d]=", i, j); scanf("%d", &mat[i][j]); } printf("Elementi na glavnoj dijagonali su: "); for (int i = 0; i < n; ++i) printf(" %d", mat[i][i]); return 0; } Nizovi 11
A 07 VIŠEDIMENZIONI NIZOVI Napisati program koji učitava kvadratnu matricu dimenzije n, a zatim je transponuje i ispisuje. #include <stdio. h> #define MAX 100 int main() { int mat[MAX], n; do { printf("n="); scanf("%d", &n); } while (n < 1 || n > MAX); for (int i = 0; i < n; ++i) for (int j=0; j < n; ++j) { printf("mat[%d]=", i, j); scanf("%d", &mat[i][j]); } for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) { int pom = mat[i][j]; mat[i][j] = mat[j][i]; mat[j][i] = pom; } printf("Transponovana matrica: n"); for (int i = 0; i < n; ++i, printf("n")) for (int j = 0; j < n; ++j) printf(" %4 d", mat[i][j]); return 0; } Nizovi 12
A 07 VIŠEDIMENZIONI NIZOVI Napisati program koji učitava dvije matrice, a zatim izračunava i ispisuje njihov proizvod. #include <stdio. h> #define MAX 100 int main() { int a[MAX], b[MAX], c[MAX] = { 0 }, an, am, bn, bm; do { printf("Unesite dimenzije matrica: "); scanf("%d %d", &an, &am, &bn, &bm); } while (an<1 || bn<1 || am<1 || bm<1 || an>MAX || am>MAX || bn>MAX || bm>MAX); if (am != bn) { printf("Matrice se ne mogu pomnoziti. "); return 1; // Greska pri izvrsavanju. . . } for (int i = 0; i < an; i++) printf("Unesite prvu matricu: n"); for (int j = 0; j < bm; j++) for (int i = 0; i < an; ++i) for (int k = 0; k < am; k++) for (int j = 0; j < am; ++j) c[i][j] += a[i][k] * b[k][j]; { printf(" a[%d]=", i, j); printf("Proizvod: n"); scanf("%d", &a[i][j]); } for (int i = 0; i < an; ++i, printf("n")) printf("Unesite drugu matricu: n"); for (int j = 0; j < bm; ++j) for (int i = 0; i < bn; ++i) printf(" %4 d", c[i][j]); for (int j = 0; j < bm; ++j) return 0; { printf(" b[%d]=", i, j); } scanf("%d", &b[i][j]); } Nizovi 13
A 07 VIŠEDIMENZIONI NIZOVI Učitati dimenzije hiperkocke (prostorni element četvorodimenzionog prostora), a zatim popuniti hiperkocku vrijednostima indeksa ekvivalentne jednodimenzione reprezentacije (niza koji predstavlja “razmotanu” hiperkocku u jednodimenzionom prostoru). #include <stdio. h> #define MAX 10 int main() { int hiperkocka[MAX][MAX], a, b, c, d; do { printf("Unesite dimenzije hiperkocke: "); scanf("%d %d", &a, &b, &c, &d); } while (a < 1 || b < 1 || c < 1 || d < 1 || a > MAX || b > MAX || c > MAX || d > MAX); for (int i = 0; i < a; ++i) for (int j = 0; j < b; ++j) for (int k = 0; k < c; ++k) for (int r = 0; r < d; ++r) hiperkocka[i][j][k][r] = i * b * c * d + j * c * d + k * d + r; // hiperkocka[i][j][k][r] = i + j * a + k * a * b + r * a * b * c; return 0; } Nizovi 14
A 07 ZADACI ZA VJEŽBU 1. Napisati program koji učitava n brojeva, a zatim ispisuje sve one koji su pozitivni, kao i njihov ukupan broj. 2. Napisati program koji učitava n brojeva, a zatim ispisuje sve one elemente niza koji se ne ponavljaju. 3. Napisati program koji učitava n brojeva, a zatim ispisuje koliko se puta svaki od njih ponavlja u tom nizu. 4. Napisati program koji učitava n brojeva, a zatim ispisuje sve parne brojeve iz tog niza koji su veći od aritmetičke sredine niza. 5. Napisati program koji učitava dvije kvadratne matrice, a zatim ispisuje njihov zbir. 6. Napisati program koji učitava matricu, a zatim ispisuje sve elemente matrice veće od najvećeg elementa na glavnoj dijagonali. 7. Učitati matricu, pa ispisati sve elemente matrice poredane od najvećeg do najmanjeg. 8. Učitati matricu, pa ispisati sve elemente matrice iznad glavne dijagonale poredane od najvećeg do najmanjeg. 9. Ako bi se na prvo polje šahovske table stavilo jedno zrno, a na svako sljedeće polje dvostruko više nego na prethodno, izračunati koliko bi se zrna nalazilo na posljednjem (64 -om) polju, odnosno koliko bi ukupno zrna trebalo da bude na tabli. Nizovi 15
- Slides: 15