koliko se sjećam, smilevski je rekao da funkcija može vratiti samo jednu vrijednost. baš je na prošlom labosu netko pitao jel može vratiti više vrijednosti, on je rekao nikako, samo jednu. eh sad, jel pri tome mislio da u našim zadatcima smije/mora vraćat samo jednu, ili je to tako kod c-a. nek objasni netko iskusniji :)
Može li mi netko objasniti kako se radi funkcija koja u main vraća više vrijednosti različitih varijabli? Funkcija treba ići iz maina (može i ispred, ali mi je ovo važnije).
Funkciji proslijediš pointer na memorijsku lokaciju na koju mora spremiti vrijednost koju vraća. To radiš za svaku vrijednost.
#include <stdio.h>void inc_count(int *count_ptr){(*count_ptr)++;}int main(){int count = 0;while (count < 10) inc_count(&count);return (0);}
Da funkciji inc_count prosljeđuješ int count, ovo bi bila beskonačna petlja, ali ti u ovom slučaju prosljeđuješ pokazivač na varijablu count. Na taj način funkcija može mijenjati vrijednost varijable na koju pokazivač pokazuje.
koliko se sjećam, smilevski je rekao da funkcija može vratiti samo jednu vrijednost. baš je na prošlom labosu netko pitao jel može vratiti više vrijednosti, on je rekao nikako, samo jednu. eh sad, jel pri tome mislio da u našim zadatcima smije/mora vraćat samo jednu, ili je to tako kod c-a. nek objasni netko iskusniji :)
A nama Mia nije ništa rekla. Koja je to *#$%!*#.
Može li mi netko objasniti kako se radi funkcija koja u main vraća više vrijednosti različitih varijabli? Funkcija treba ići iz maina (može i ispred, ali mi je ovo važnije).
Funkciji proslijediš pointer na memorijsku lokaciju na koju mora spremiti vrijednost koju vraća. To radiš za svaku vrijednost.
#include <stdio.h>void inc_count(int *count_ptr){(*count_ptr)++;}int main(){int count = 0;while (count < 10) inc_count(&count);return (0);}
Da funkciji inc_count prosljeđuješ int count, ovo bi bila beskonačna petlja, ali ti u ovom slučaju prosljeđuješ pokazivač na varijablu count. Na taj način funkcija može mijenjati vrijednost varijable na koju pokazivač pokazuje.
Lijepo je to. Još kada bi razumio to bilo bi super.
Prouči malo: http://publications.gbdirect.co.uk/c_book/chapter5/pointers.html
Ukratko, pokazivač (pointer) je varijabla koja sadrži adresu varijable. Kada ti pozoveš funkciju, C za svaki proslijeđeni argument napravi novu varijablu istog tipa i u nju kopira vrijednost orginalne varijable u trenutku pozivanja funkcije. Unutar funkcije se koristi ta nova varijabla, tako da bilo koja promjena vrijednosti te varijable postoji samo unutar funkcije.
Međutim, kad proslijediš pointer ti funkciji kažeš "varijabla je na toj i toj memorijskoj lokaciji" i onda preko pointera funkcija pristupa toj memorijskoj lokaciji.
Jedna mala analogija:
Ja sam gluh, a ti nijem. Ja tebe nešto mogu pitati, ali ne mogu dobiti odgovor. Međutim, ako ja tebi uz pitanje pošaljem i informaciju kako mi možeš odgovoriti (napiši mi SMS na taj i taj broj), ja ipak mogu dobiti povratnu informaciju. Broj na koji ćeš mi poslati SMS je pointer.
Može li mi netko objasniti kako se radi funkcija koja u main vraća više vrijednosti različitih varijabli? Funkcija treba ići iz maina (može i ispred, ali mi je ovo važnije).
Vratiti više različitih ili istih varijabli znači npr. jedan int jedan float i jedan double se ne radi kao kada funkcija vrača samo jednu vrijednost
preko return-a.
Znači nešto kao "int float double mojafunkcija(int,float,double)" pa return i,f,d ne funkcionira.
Ali postoji nekoliko načina kako izvesti nešto tako.
1. Možeš koristiti strukturu ili klasu
Doslovno vračanje više varijabli preko returna je nemoguće.
Ako želiš da funkcija vrati više vrijednosti u funkciju iz koje se poziva to postižeš preko pokazivača, dakle takva funkcija ne vraća
vrijednost u pozivajuću funkciju, nego se pokazivačima povežu varijable funkcije iz koje se pozivanje vrši i pozivajuće funkcije, pošto su
varijable povezane pokazivačima, promjena u funkciji koju si pozvao rezultira promjenom varijable u pozivajućoj funkciji
#include<stdio.h>
void StaviNovuVrijednost(int *a, int *b) // argumenti funkcije su pokazivači na varijable a i b u main funkciji
{
*a = 8; // pokazivačima je napravljena veza između varijabli a i b u ovoj funkciji
*b = 10; // i varijabli a i b u glavnoj funkciji tako da varijable a i b u glavnoj
} // funkciji dobijaju ove vrijednosti jer ovi pokazivači pokazuju na a i b u glavnoj funkciji
int main()
{
int a = 5;
int b = 3;
StaviNovuVrijednost(&a, &b); // predaju se adrese varijabli kao argumenti funkcije
printf("a = %d\nb = %d", a, b); // ispisuje vrjednosti pridružene u funkciji StaviNovuVrijednost
}
Vi sa TVZ-a, već sam vam napomenuo, svi zadaci koje radite napravljeni su poput ovih ovdje
http://www.skolskaknjiga.hr/hrv/page.asp?item=021154&act=add2basket
Ista škola ,
Današnja boleština od zadatka je:
Napisati C program koji simulira igru potapanja brodova.
Napisati funkciju koja u dvodimenzionalno polje dimenzija 3x3 upisuje nasumične brojeve iz
raspona (0, 1). Tako kreirano polje predstavlja ploču za igru. Pravilo koje pri tome treba uzeti
u obzir je da vrijednost 1 označava mjesto gdje se nalazi brod, a 0 prazno mjesto. Također,
smatra se da jedan brod zauzima samo jedno mjesto u polju. Funkcija vraća broj generiranih
brodova koje je potrebno pogoditi, te je ovaj podatak potrebno ispisati na početku igre.
Od korisnika se zatim traži uzastopni unos mjesta na ploči (željenog stupca i retka) koje se
želi pogoditi, te ispis trenutačnog stanja polja. Ako je brod pogođen, u polje na odgovarajuće
mjesto potrebno je upisati znak ‘P’, a za svaki promašaj znak ‘X’.
Provjeru pogotka i upis novih vrijednosti u polje potrebno je realizirati u zasebnoj funkciji.
Pri tome treba voditi računa o gore navedenim oznakama za promašaj i pogodak.
Ispis polja potrebno je realizirati u zasebnoj funkciji. Pri ispisu sve elemente polja koji sadrže
vrijednost 0 ili 1 potrebno je ispisati zamjenskim znakom ‘+’ kako se ne bi otkrile pozicije
brodova.
Sve funkcije pozivaju se iz glavne funkcije.
Cilj igre je potopiti sve brodove. Kada su svi brodovi potopljeni igra se prekida i ispisuje
poruka o kraju igre.
Primjer izvođenja programa:
Broj brodova koje treba potopiti: 2
1 2 3
1 + + +
2 + + +
3 + + +
Unesite željeno mjesto pogotka: 1 2
POGODAK!
1 2 3
1 + P +
2 + + +
3 + + +
Unesite željeno mjesto pogotka: 3 3
PROMAŠAJ! :(
1 2 3
1 + P +
2 + + +
3 + + X
Pao sam na guzicu kada sam ovo vidio. Što da radim?
Dečki pomagajte nemam blage veze o ovom.
Ovo sam do sada napisao:
#include <stdio.h>
#include <stdlib.h>
#define DIMENZIJA 3
#define DIMENZIJA2 3
int *ptr_polje;
srand((unsigned)time(NULL));
int ploca(int a, int b);
{
int polje[DIMENZIJA][DIMENZIJA2];
for (a=0;a<DIMEZIJA;a++){
for (a=b;b<DIMEZIJA;b++){
polje[a][b]=(rand()%999);
printf("\n polje je:%d\n",polje[a][b]);
}
}
ptr_polje=polje;
return ptr_polje;
}
int main()
{
system("PAUSE");
return 0;
}
e kolega da pitam koju verziju C-a koristis? jer meni to neradi u express 2010 verziji
e kolega da pitam koju verziju C-a koristis? jer meni to neradi u express 2010 verziji
Misliš na programsko sučelje?
Koristim Dev C++. 3000x bolji od Codeblocksa.
a joj zast skole ne koriste c sa ljestvama il bar rade u c-u od microsofta(ovak i onak besplatan)
a joj zast skole ne koriste c sa ljestvama il bar rade u c-u od microsofta(ovak i onak besplatan)
Koje škole? Ja sam na fakultetu. :)
Uostalom, naš profesor ne voli Micro$oft i njihove izmišljotine. Ja radije preferiram C++ nego C#.
a joj zast skole ne koriste c sa ljestvama il bar rade u c-u od microsofta(ovak i onak besplatan)
Koje škole? Ja sam na fakultetu. :)
Uostalom, naš profesor ne voli Micro$oft i njihove izmišljotine. Ja radije preferiram C++ nego C#.
a jebiga.... zast nebi volio microsoft ak je to od njih aplikacija? i c sa plusevima i c sa ljestvama i sql database i velika vecina stvari koje internet aplikacije koriste ( ni java nije potpuni exception)
koristim c sa ljestvama jer se u tom razvijaju aplikacije, to je vise developer c, ovaj c++ je vise user friendly okruzje... u c sa ljestvama nema printf scanf, jednostavnija je deklaracija, ispis, nema srand i time nego se mora drugacije rjesit... lakse ak se mene pita, manje ima opcija (kljucnih rijeci) i nemoras toliko komplicirat algoritam..
zapravo, kad bolje promislim, c sa ljestvama ima vise keywords nego c++ i moras znat di se sto koristi... =D
al svejedno c++ se nepotrebno komplicira... printf i scanf funkcije i matematicke funkcije unutar programa se mogu strpat u istu naredbu dok bi to u c-u bilo 4 reda....
zapravo, kad bolje promislim, c sa ljestvama ima vise keywords nego c++ i moras znat di se sto koristi... =D
al svejedno c++ se nepotrebno komplicira... printf i scanf funkcije i matematicke funkcije unutar programa se mogu strpat u istu naredbu dok bi to u c-u bilo 4 reda....
Jao molim te stani, ako već nemaš pojma o čemu pričaš bar nemoj soliti pamet ljudima okolo.
C s ljestvama, keywordsi !?
zapravo, kad bolje promislim, c sa ljestvama ima vise keywords nego c++ i moras znat di se sto koristi... =D
al svejedno c++ se nepotrebno komplicira... printf i scanf funkcije i matematicke funkcije unutar programa se mogu strpat u istu naredbu dok bi to u c-u bilo 4 reda....
Jao molim te stani, ako već nemaš pojma o čemu pričaš bar nemoj soliti pamet ljudima okolo.
C s ljestvama, keywordsi !?
da znam da pricam budalastine, nemogu stavit znak ljestve jer mi tipka neradi, keywordse kazem a mislim na naredbe koje mozes radit u c-u
i ne, ovo ne radi, treba se prepravit jer nemam c koji radi sa vašom verzijom.... ali algoritam valja pa bi moralo radit kak spada
pokazivaci za ovo nisu potrebni, da se rjesit i bez toga... vracanje vrijednosti isto netreba jer radi na brojanju
i ovo ima gresaka, nemam blage kak se pravi taj random pa me nemojte razapinjat zbog toga.... time(null) i to vrlo vjerojatno ne radi al pokazuje kak bi trebalo radit
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
int a[5][5], b, c, i, j, e, f, g, h;
{ srand ((unsigned) time(NULL));
for (i=1;i<=5;i++) //matrica iliti polje pocinje sa brojem 1 ne sa brojem 0, zato je i=1 tako da nema kordinata 0x nesta ili nesta x0
for(j=1;j<=5;j++){
a[i][j]=rand()%2; //sad neznam kak napravit random za ovaj vrag... napamet sam radio, treba se prepravit
printf("\n polje je:%d\n",a[i][j]);
if(a[i][j]=='1') //brojac koliko je random napravio brodova, tj koliko ih treba potopit
e++;
}
printf("\nBroj brodova koje se treba potopiti:%d",e);
printf("Unesite željeno mjesto pogotka: ");
scanf("%d %d", &b, &c);
}
for (i=1;i<=5;i++)
for(j=1;j<=5;j++)
if(a[i][j]=='1')&&(b==i)&&(c==j){
printf("\nPogodak!"); f++;} //f je brojac
else {printf("\nPromašaj!"); g++;} //g je isti vrag
h=g+f; //h je sveukupni pokusaji, f broj pogodaka, g broj promasaja
printf("\nBroj pokušaja:%d\nBroj pogodaka:%d\nBroj promašaja:%d", h, f, g);
if(e==f) break; //ovo vam je izlaz iz igre, prekine kada se pogodi jednak broj brodova koliko ih je random napravio
//e broji broj brodova, kad broj pogodaka bude isti kao broj brodova, igra je gotova
//i ovo je samo ugrubo, nemam verziju c-a koja ovo moze pokrenit, napamet radio
system("PAUSE");
return 0;
}
zaboravih graficko sucelje... sec pravim...
Neznam u čemu ti je problem pa sam si postao rješenje ? Jedina razlika je što kod tebe matrica 5x5
a u prvom zadatku 3x3.
Al eto da imate jos jedno rješenje obadvoje, za promjenu dimenzije samo je potrebno promijeniti konstantu DIM
na pocetku, tebi treba biti 5 a vexu 3.
zapravo, kad bolje promislim, c sa ljestvama ima vise keywords nego c++ i moras znat di se sto koristi... =D
al svejedno c++ se nepotrebno komplicira... printf i scanf funkcije i matematicke funkcije unutar programa se mogu strpat u istu naredbu dok bi to u c-u bilo 4 reda....
Jao molim te stani, ako već nemaš pojma o čemu pričaš bar nemoj soliti pamet ljudima okolo.
C s ljestvama, keywordsi !?
da znam da pricam budalastine, nemogu stavit znak ljestve jer mi tipka neradi, keywordse kazem a mislim na naredbe koje mozes radit u c-u
Nema veze s c "ljestvama" ni naredbama (ilitiga keywordsima) nego da po oneme što si napisao u svoja 3 posta očito nemaš
dovoljno znanja o programiranju, programskim jezicima i razvojnim okruženjima opčenito da bi mogao nešto smisleno o tome pričati
ali si svejedno došao tu pametovati.
Neznam u čemu ti je problem pa sam si postao rješenje ? Jedina razlika je što kod tebe matrica 5x5
a u prvom zadatku 3x3.
Al eto da imate jos jedno rješenje obadvoje, za promjenu dimenzije samo je potrebno promijeniti konstantu DIM
na pocetku, tebi treba biti 5 a vexu 3.
zapravo, kad bolje promislim, c sa ljestvama ima vise keywords nego c++ i moras znat di se sto koristi... =D
al svejedno c++ se nepotrebno komplicira... printf i scanf funkcije i matematicke funkcije unutar programa se mogu strpat u istu naredbu dok bi to u c-u bilo 4 reda....
Jao molim te stani, ako već nemaš pojma o čemu pričaš bar nemoj soliti pamet ljudima okolo.
C s ljestvama, keywordsi !?
da znam da pricam budalastine, nemogu stavit znak ljestve jer mi tipka neradi, keywordse kazem a mislim na naredbe koje mozes radit u c-u
Nema veze s c "ljestvama" ni naredbama (ilitiga keywordsima) nego da po oneme što si napisao u svoja 3 posta očito nemaš
dovoljno znanja o programiranju, programskim jezicima i razvojnim okruženjima opčenito da bi mogao nešto smisleno o tome pričati
ali si svejedno došao tu pametovati.
probah sam rjesit... onak bez uvrede nisam te pitao dal imam dost znanja nit sam dosao pametovat, imam bipolarni poremecaj pa mi je nekad tesko slozit smislenu recenicu al glavno da ti mozes pricat drugima da nist nevaljaju, ja se bar trudim
di je tu grijeh terat svoje da mi je znat... sta sad fali ak ja hocu rjesit drugacije... sam ti stavljaj palac dole jer bez toga linkanja rjesenja i prigovaranja drugim kak nist ne valjaju nebi imao osjecaj zadovoljstva kak si najbolji
Nema veze s c "ljestvama" ni naredbama (ilitiga keywordsima) nego da po oneme što si napisao u svoja 3 posta očito nemaš
dovoljno znanja o programiranju, programskim jezicima i razvojnim okruženjima opčenito da bi mogao nešto smisleno o tome pričati
ali si svejedno došao tu pametovati.
probah sam rjesit... onak bez uvrede nisam te pitao dal imam dost znanja nit sam dosao pametovat, imam bipolarni poremecaj pa mi je nekad
tesko slozit smislenu recenicu al glavno da ti mozes pricat drugima da nist nevaljaju, ja se bar trudim di je tu grijeh terat svoje da mi je znat...
sta sad fali ak ja hocu rjesit drugacije... sam ti stavljaj palac dole jer bez toga linkanja rjesenja i prigovaranja drugim kak nist ne valjaju nebi imao osjecaj zadovoljstva kak si najbolji
Daj nebudi toliko sentimentalan, niti sam rekao da ništa nevaljaš (?) niti sam kritizirao tvoje rješenje ili pokušaj rješenja.
Kritizirao sam tvoje izjave što se tiče razvojnih okruženja i programskih jezika jer jednostavno nisu na mjestu te si zapravo
u prva 3 posta samo spamao bezveze.
a u prvom zadatku 3x3.
Al eto da imate jos jedno rješenje obadvoje, za promjenu dimenzije samo je potrebno promijeniti konstantu DIM
na pocetku, tebi treba biti 5 a vexu 3.
aaa, moj fail, jer sam žurio pa nisam svoj zadatak ni gledao. sad vidim da su potpuno indentični, samo je razlika u veličini polja
evo malo sam modificirao onaj kod sa onog foruma, i naizgled je sve dobro, samo što na kraju kad pogodim sve brodove, ne ispiše "Igra je gotova". gdje je greška? ja ju nigdje ne vidim
edit: našao sam grešku. sad je sve dobro
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DIM 5
int fja1 (char P[DIM][DIM]) {
srand ((unsigned) time(NULL));
int i, j, brodova=0;
for (i=0; i<DIM; i++) {
for (j=0; j<DIM; j++) {
P[i][j]=rand()%2;
if (P[i][j]==1) {
P[i][j]=49;
brodova++;
}
else P[i][j]=48;
}
}
return brodova;
}
int fja2 (char P[DIM][DIM]) {
int br=1, i, j;
printf (" 1 2 3 4 5\n");
for (i=0; i<DIM; i++) {
for (j=0; j<DIM; j++) {
if (j==0)
printf ("%d", br);
if ((P[i][j]=='X') || (P[i][j]=='P'))
printf (" %c", P[i][j]);
else
printf (" +");
if (j==4) {
printf ("\n");
br++;
}
}
}
}
int fja3 (char P[DIM][DIM], int x, int y, int f) {
if (P[x-1][y-1]==49) {
printf ("\nPogodak!\n\n");
P[x-1][y-1]='P';
f++;
fja2(P);
return f;
}
else if (P[x-1][y-1]==48) {
printf ("\nPromasaj! :(\n\n");
P[x-1][y-1]='X';
fja2(P);
return f;
}
else if ((P[x-1][y-1]=='P')||(P[x-1][y-1]=='X')) {
printf ("\nVec ste pogodili u to mjesto!\n\n");
fja2(P);
return f;
}
}
int main() {
srand ((unsigned) time(NULL));
char P[DIM][DIM];
int brodova, br = fja1(P), i, j, x, y, f=0;
printf ("\nBroj brodova koje treba potopiti: %d\n\n", br);
fja2(P);
do {
printf ("\nUnesite zeljeno mjesto: ");
scanf ("%d %d", &x, &y);
if (((x<0)||(x>5)) || ((y<0)||(y>5))) {
printf ("\nPogresan unos. Unesite koordinate ponovno: ");
scanf ("%d %d", &x, &y);
}
f = fja3(P, x, y, f);
}
while (f!=br);
printf("\nIgra je gotova!");
getch();
return 0;
}
jeli zna netko što mi je krivo?
slovima:
#include<stdio.h>int main(void){
double x,min,max,i,f;
scanf("%lf",&x);
min=x;
max=x;
for(i=1;i<9;i++){
scanf("%lf",&x);
if(abs(x)<abs(min))
min=x;
if(abs(x)>abs(max))
max=x;}
f=max*min;
printf("%g",f);
return 0;
}
Za abs(x) trebaš imati #include<stdlib.h>
Nevalja ti ispis varijable 'f' jer ne postoji %g.
Hvala , pretpostavio sam da mi je nešto tako krivo ,ali ovo %g pise u zadatku da se mora ispisivati sa %g.
Postoji %g i njega se i preporuča, jer daje najljepši ispis.
:O
Nisam znao za to. Oprosti.