Kod: |
int main(void) { long unsigned n, tn, d, j=0, k=0; printf ("Unesi n i d: "); scanf("%lu%lu", &n, &d); for (n; n-d>0; n-=d) { tn=n; while (tn>0) /*red samo sa zvjezdicama*/ {printf ("*"); tn--; } printf("\n"); tn=n; for (j=0; j<tn-2; j++) /*redovi s tockicama*/ { printf ("*"); for (k=0; k<tn-2; k++) {printf (".");} printf ("*"); printf ("\n"); } tn=n; /*while petlja ista kao gornja*/ while (tn>0) {printf ("*"); tn--; } } return 0; } |
Kod: |
int main(void) { int n, i, ak, ak1, ak2, ak3, prvi, drugi, treci, fib=0, alfa, alfa_konst=0; printf ("Unesi n kao duljinu niza (<20): "); scanf ("%d", &n); printf ("Unesi brojeve: "); scanf ("%d%d%d", &prvi, &drugi, &treci); ak3=prvi; ak2=drugi; ak1=treci; for (i=0; i<n-2; i++) /*broj unosa je n-1 jer su prvi, drugi i treci 3 clana + (n-3 ostalih + a0)*/ { fib=0; scanf ("%d", &ak); if (i==0) {for (alfa=0; alfa<ak; alfa++) { if (ak1==((ak2)+(alfa*(ak3)))) {fib=1; alfa_konst=alfa; /*zadaj alfa_konst samo ako postoji prvi put; ako ne postoji za prva tri clana, ne postoji ni za ostale*/ break;} } } for (alfa=0; alfa<ak; alfa++) { if (ak==((ak1)+(alfa*(ak2)))) {fib=1; break;} } if (alfa_konst!=alfa) {fib=0;} /*alfa uvijek mora ostati ista, i to kao pocetni alfa_konst*/ if (fib==0) {break;} ak1=ak; ak2=ak1; } if (fib==0) {printf ("Niz nije fibonaccijevski.\n");} else {printf ("Ucitani niz brojeva je fibonaccijevski s alfa = %d", alfa_konst);} return 0; } |
Kod: |
int main(void) { int a, b, c, t, ia, ib; printf ("Unesi a i b: "); scanf ("%d%d", &a, &b); if (b>a) {t=a; a=b; b=t;} if (b<0) b=-b; if (a<0) a=-a; ia=a; ib=b; while (a%b!=0) { c=a%b; a=b; b=c; } printf ("GCD(%d,%d) = %d", ia, ib, c); return 0; |
Kod: |
int bzub10(int x) { int brojac=0; while (x>0) {x/=10; brojac++;} return brojac; } int bzub6(int x) { int brojac=0; while (x>0) {x/=6; brojac++;} return brojac; } int bub6 (int x) { int broj=0, nbroj=0, znam, i; int t=x; if (x<0) t=-x; while (t>0) { broj=broj*10+t%6; t/=6; } if (bzub6(x)!=bzub10(broj)) { while (bzub6(x)!=bzub10(broj)) broj*=10; } return broj; } int imazn(x) { int vr=1, nx; nx=bub6(x); for (nx; nx; nx/=10) { if (nx%10!=1 && nx%10!=2 && nx%10!=3) vr=0; } return vr; } int main(void) { int a, b, i, brojac=0; scanf ("%d%d", &a, &b); if (b>a) {int temp; temp=a; a=b; b=temp;} for (i=a-1; i>b; i--) { if (imazn(i)) {printf ("%d ", i); brojac=1;} } if (brojac==0) printf ("Nema takvih brojeva."); return 0; } |
krilo (napisa): | ||
|
krilo (napisa): |
Ta funkcija ne radi ništa, rekla bih, za čovjeka smisleno |
Citat: |
ali služi svrsi zadatka. |
Citat: |
Zvuči glupo, ali konstruira obrnuti zapis broja u bazi 6 |
Citat: |
Treba mi da kasnije za funkciju koja će provjeriti ima li u tom zapisu drugih znamenaka osim 1, 2, 3. |
Citat: |
Otherwise, ne znam što podrazumijevaš pod high-level objašnjenje. |
Citat: |
Bila sam napisala kompletnu funkciju koja ispisuje broj u bazi 6 |
Citat: |
bavim se programiranjem tek 3 mjeseca, pa nisam 100% sigurna da će se ono što kodiram realizirati u program koji će uvijek raditi |
Citat: |
Ne zamjeram "agresivnost", razumljivo je. |
Citat: |
Nemam dovoljno iskustva da procijenim da funkcija ne valja |
Citat: |
ako vidim da služi svrsi, ne nalazim problem. |
Kod: |
#include <stdio.h>
/* Funkcija koja vraca 1 ako n u bazi 6 ima samo znamenke izmedju 1 i 3. U suprotnom vraca 0. Funkcija pretpostavlja da je n > 0. */ int znamenke_u_bazi_6_samo_izmedju_1_i_3(int n) { int znamenka; /* U petlji provjeravamo sve znamenke od n. */ while (n > 0) { znamenka = n % 6; /* Ako znameka nije izmedju 1 i 3 mozemo odmah vratiti 0. */ if (znamenka < 1 || znamenka > 3) return 0; /* Ako je ova znamenka bila ok, onda idemo provjeriti sljedecu. */ n = n / 6; } /* Ako smo izvrtili cijelu petlju bez da smo vratili 0, to znaci da su sve znamenke izmedju 1 i 3. */ return 1; } int main() { int a, b, n; int pronasao = 0; /* ovo cemo postaviti na 1 ako nadjemo neki broj s trazenim svojstvom */ scanf("%d%d", &a, &b); /* Prvo osiguramo da bude a <= b. */ if (a > b) { int t = a; a = b; b = t; } /* Sada ispisemo trazene brojeve. */ for (n = a + 1; n < b; n = n + 1) { if (znamenke_u_bazi_6_samo_izmedju_1_i_3(n)) { printf("%d ", n); pronasao = 1; } } /* Ako nismo pronasli nijedan broj, ispisujemo odgovarajucu poruku. */ if (!pronasao) { printf("Nema takvih brojeva."); } return 0; } |
hendrix (napisa): |
Lijepo je da se, za promjenu, i ovdje nešto rješava. |
Citat: |
Samo bih uputio krilo na ovaj topic |
mdoko (napisa): |
U svakom slučaju, ako nešto zvuči glupo, onda to uglavnom znači da nisi skroz iskristalizirala algoritam kojim se problem treba riješiti, nego pribjegavaš nekakvim ad-hoc rješenjima. |
Citat: |
Meni se čini da ti na neki način poistovjećuješ broj s njegovim zapisom u bazi 10. Nemoj to raditi. |
Citat: |
Točno ovo što si napisala. Svaka čast na koncizno sročenom objašnjenju. |
Citat: |
Zašto si uopće išla pisati tu funkciju? |
Citat: |
Ja se bavim programiranjem 20 godina , pa još uvijek nisam 100% siguran da će ono što kodiram rezultirati točnim rješenjem problema na kojem radim. |
Citat: |
Zar ti nije čudno da tvoj algoritam radi za baze 2, 3, 4, 5, 6, 7, 8, 9 i 10, ali kad naletimo na bazu 11, odjednom imamo problem? |
Citat: |
Lijepo je da se, za promjenu, i ovdje nešto rješava. |
krilo (napisa): |
Moram ti priznati da je "algoritmiranje" jedna od najtežih stvari na prvoj godini za ljude koji to nikad u životu nisu vidjeli... |
Citat: |
(osobno, iz opće sam gimnazije) |
Citat: |
jednostavno naučiti razmišljati kao komp i pojednostavljivati programe na način na koji ti to radiš je meni prilično fascinantno |
Citat: | ||
Zato što gospodična, otkad je otkrila funkcije, voli sve preko njih raditi jer su nekako... elegantne. (Sviđa mi se ideja da se u glavnoj funkciji sve može skratiti samo na pozivanje funkcija bez puno žongliranja petljama i sličnim.) |
Citat: |
Ustvari, još jedno pitanjce: Kolko god moj kod bio bedast, zakaj ne radi? |
Kod: |
int potbr2(int i)
{ int vr=1, t=i; while (t>0) {if (t%2==0 || t==1) t/=2; else {vr=0; break;}} if (i==0) vr=0; return vr; } int main(void) { int n; printf ("Unesi broj clanova niza: "); scanf ("%d", &n); int a[n]; int i, j, brojac=0; printf ("Niz?: "); for (i=0; i<n; i++) scanf ("%d", &a[i]); for (i=1; i<n; i++) { if (potbr2(i)) {for (j=i; j<n; j++) a[j]=a[j+1]; brojac++; i++;} } n-=brojac; for (i=0; i<n; i++) printf ("%d ", a[i]); return 0; } |
krilo (napisa): | ||
|
Citat: |
Palo mi je napamet početi brisati od zadnjeg člana |
Citat: |
ali onda ne znam što na njegovo mjesto staviti |
Citat: |
Imam funkciju za prepoznavanje je li indeks potencija broja dva |
Spoiler : |
Citat: | ||
|
Citat: |
Moglo bi ti odnijeti bodove na kolokviju. |
Citat: |
Pomakni sve članove koji se nalaze desno od onoga koji brišeš za jedno mjesto ulijevo. |
Citat: |
Zašto ti treba varijabla t? |
krilo (napisa): | ||
|
Citat: | ||
|
Citat: | ||
|
Kod: |
int potbr2(int i)
{ int vr=1; if (i==0) vr=0; while (i>0) {if (i%2==0 || i==1) i/=2; else {vr=0; break;}} return vr; } |
Kod: |
int potbr2(int i)
{ if (i==0) return 0; while (i>0) {if (i%2==0 || i==1) i/=2; else return 0;} return 1; } |
Citat: |
za ovaj tvoj kod nisam baš ganz sicher... Za duljinu niza unesem 10 i brojeve od 0-9, a on izbaci 0, 3, 3, 3, 5, 5 iako bi trebao maknuti samo 1, 2, 4 i 8. |
Kod: |
[mdoko@bajdo]/tmp$ cat proba.c
#include <stdio.h> int main() { int niz[1719]; int n, d, i; int broj_obrisanih; printf("Duljina niza: "); scanf("%d", &n); for(i = 0; i < n; ++i) { printf("niz[%d] = ", i); scanf("%d", &niz[i]); } /* Trazimo najvecu potenciju od 2 koja je indeks u nasem nizu. */ d = 1; /* ovo je 2^0 */ while(d < n) { /* indeksi u nizu idu od 0 do n-1 */ d = d * 2; } d = d / 2; /* Gornjom petljom smo izletili iz niza, pa se moramo vratiti jedan korak unatrag */ /* Brisanje "nezeljenih" clanova niza i brojanje koliko smo ih obrisali.*/ broj_obrisanih = 0; while(d > 0) { /* Pocevsi od indeksa d+1, pomicemo sve clanove niza za jedno mjesto ulijevo. */ for(i = d + 1; i < n; ++i) { niz[i-1] = niz[i]; } broj_obrisanih = broj_obrisanih + 1; /* Sad kad smo se rijesili elelmenta na poziciji d, mozemo krenuti brisati sljedeci element. */ d = d / 2; } /* Na kraju ispisemo novonastali niz. Duljina novig niza je (n - broj_obrisanih). */ for(i = 0; i < n - broj_obrisanih; ++i) { printf("%d ", niz[i]); } return 0; } [mdoko@bajdo]/tmp$ gcc -o proba -O1 -std=c89 -pedantic-errors -Wall -Wextra -Wno-unused-result proba.c [mdoko@bajdo]/tmp$ ./proba Duljina niza: 10 niz[0] = 0 niz[1] = 1 niz[2] = 2 niz[3] = 3 niz[4] = 4 niz[5] = 5 niz[6] = 6 niz[7] = 7 niz[8] = 8 niz[9] = 9 0 3 5 6 7 9 |
krilo (napisa): |
Copy-pasteala sam ovaj drugi kod, ali mi compiler izbaci na liniji int niz[1719] obavijest error: stray \240 i odbija kompajliranje... Kaj bi to točno trebalo značit? (Čisto informativno.) |
Kod: |
void prebroji (char a[], int n, int *krizic, int *kruzic, int *igre)
{ *krizic=0; *kruzic=0; *igre=-1; int i; for (i=0; i<n; i++) { if (a[i]=='o') (*kruzic)++; if (a[i]=='!') (*igre)++; if (a[i]=='x') (*krizic)++; } } void igra(char a[], int n) { int i, j, s, r; for (i=0; i<n;) { for (j=i+1; j; j++) {if (a[j]=='!') break;} int krizic=0, kruzic=0, igre=0, k; for (k=i+1; k<j; k++) { if (a[k]=='o') (kruzic)++; if (a[k]=='x') (krizic)++; } if(krizic>kruzic) {for(s=i+1; s<j; s++) a[s]='x';} if(kruzic>krizic) {for(s=i+1; s<j; s++) a[s]='o';} i=j; } for (i=0; i<n; i++) printf ("%c", a[i]); } int main(void) { char a[20]; int i, n, krizic, kruzic, igre; printf ("Duljina niza? "); scanf ("%d", &n); printf ("Niz? "); for (i=0; i<n; i++) scanf (" %c", &a[i]); prebroji(a,n,&krizic,&kruzic,&igre); printf ("Krizica: %d\nKruzica: %d\nIgara: %d\n", krizic, kruzic, igre); igra(a,n); return 0; } |
krilo (napisa): |
Probala sam valjda petsto puta s međuispisima, ali jednostavno ne mogu naći razlog zašto se petlja s j, kad je i najveći mogući, vrti u nedogled. |
Mala_022 (napisa): | ||
Samo ukratko (dok ne dođe mdoko ) - kad je i najveći mogući (i=n-1), onda je j=i+1=n, a ne znamo šta je a[n] (i onda još u petlji povećavaš j bez provjeravanja dokle uopće može ići). |
krilo (napisa): |
Generalno, algoritam je ovakav: jot je indeks prvog sljedećeg uskličnika, pa se prema omjeru križića i kružića situacija mijenja u "ogradi". Poslije mijenjanja, i postaje jot i isti se postupak dalje nastavlja.
Poanta je u tome da i nije jednak n-1 (barem ne u testnom primjeru). Tu bi zadnji mogući i trebao biti na 8. mjestu (na trećem uskličniku), pa bi j (sljedeći nađeni uskličnik) trebao biti na 12 mjestu. Na kraju for-petlje imamo i=j, a kako je j=12 trebala bi se for-petlja uredno prekinuti. (Tako da se ne bi desio slučaj j=n.) Ispravite me ako griješim, al stvarno ne znam di griješim |
krilo (napisa): | ||
|
output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.