Tako sam i pretpostavljao, hvala :)
Programiranje u C++-u - pitanja i odgovori
- poruka: 7.285
- |
- čitano: 1.702.827
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Tako sam i pretpostavljao, hvala :)
Možeš koristiti getline funkciju.
Mogu li pisati aplikaciju za Android u C++?
Mogu li pisati aplikaciju za Android u C++?
Mogu li pisati aplikaciju za Android u C++?
Ako koristiš C++ Builder onda možeš i za Android i iOS.
Mogu li pisati aplikaciju za Android u C++?
Ako koristiš C++ Builder onda možeš i za Android i iOS.
Sto se tice iOS-a Objective-C za UI i C++ za background
Trebam pomoć...
Iz maina korisnik treba unijeti brod koji će zauzimati dva mjesta u polju p1.
0 - slobodno mjesto
1 - zauzeto mjesto
Koordinate broda se šalju u klasu koja nakon provjere stavlja 1 na te koordinate u polje, što označava položaj broda.
*k1=char, k2=int
for (int i = 0; i < 2; i++)
{
cout << (i + 1) << ". mjesto za brod?" << endl;
cin >> k1 >> k2; //koordinate broda
p1.unos(k1, k2, 2); //poziv funkcije iz klase
}
Metode u klasi:
bool provjera(int a, int b)
{
if (p1[(int)a-65][b-1] == 0) //ako je mjesto u polju slobodno vraca true
return true;
}
void unos(int ko1, int ko2, int a)
{
for (int i = 0; i < a; i++)
{
pr1 = provjera(ko1, ko2); //poziv funkcije koja provjerava je li to mjesto slobodno
if (pr1)
{
p1[(int)ko1 - 65][ko2 - 1] = 1; //popunjavanje mjesta u polju
}
}
}
Moj problem je što mi se pojavi dodatna 1, jedan element prije od onoga koji je korisnik unio, ali samo ako korisnik želi brod na prvom elementu nekog reda.
Jako komplicirano za objasnit riječima zato ću vam staviti slike da vidite o čemu pričam.
Ako korisnik unese brod na B2 i B3 onda nema te jedinice viška.
Zamolio bih za malu pomoć. Imam poteškoća sa zadatkom iz knjige ''Demistificirani C++''. Zadatak je iz poglavlja o while petlji (str. 105), a glasi ovako:
''Dopunite gornji program tako da nakon sadržaja datoteke ispiše i broj iščitanih brojeva i njihovu srednju vrijednost.''
Taj 'gornji program' koji se spominje je program za ispis sadržaja datoteke s brojevima, a kod je sljedeći:
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ifstream ulazniTok("brojevi.dat");
cout << "Sadržaj datoteke:" << endl << endl;
double broj;
while ((ulazniTok >> broj) != 0)
cout << broj << endl;
return 0;
}
Srednju vrjednost bih znao uraditi, ali da bi to mogao izračunati potrebno je prvo dobiti broj iščitanih brojeva što ja ne znam kako uraditi. Da li bi netko bio voljan pomoći?
Zamolio bih za malu pomoć. Imam poteškoća sa zadatkom iz knjige ''Demistificirani C++''. Zadatak je iz poglavlja o while petlji (str. 105), a glasi ovako:
''Dopunite gornji program tako da nakon sadržaja datoteke ispiše i broj iščitanih brojeva i njihovu srednju vrijednost.''
Taj 'gornji program' koji se spominje je program za ispis sadržaja datoteke s brojevima, a kod je sljedeći:
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ifstream ulazniTok("brojevi.dat");
cout << "Sadržaj datoteke:" << endl << endl;
double broj;
while ((ulazniTok >> broj) != 0)
cout << broj << endl;
return 0;
}
Srednju vrjednost bih znao uraditi, ali da bi to mogao izračunati potrebno je prvo dobiti broj iščitanih brojeva što ja ne znam kako uraditi. Da li bi netko bio voljan pomoći?
Prebrojiš ih inkrementom varijable brojac koju prethodno inicijaliziraš na 0.
Npr. upis u datoteku 5 int brojeva, zatim ispis iz datoteke tih brojeva i izračun srednje vrijednosti.
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
int broj, brojac = 0, suma = 0;
ofstream izlaz("brojevi.dat");
for (int i = 0; i < 5; i++)
{
cin >> broj;
izlaz << broj << endl;
}
izlaz.close();
ifstream ulaz("brojevi.dat");
while (ulaz >> broj)
{
cout << broj;
brojac++;
suma += broj;
}
cout << endl;
cout << (double)suma / brojac << endl;
ulaz.close();
return 0;
}
Trebam pomoć...
Iz maina korisnik treba unijeti brod koji će zauzimati dva mjesta u polju p1.
0 - slobodno mjesto
1 - zauzeto mjesto
Koordinate broda se šalju u klasu koja nakon provjere stavlja 1 na te koordinate u polje, što označava položaj broda.
*k1=char, k2=int
for (int i = 0; i < 2; i++)
{
cout << (i + 1) << ". mjesto za brod?" << endl;
cin >> k1 >> k2; //koordinate broda
p1.unos(k1, k2, 2); //poziv funkcije iz klase
}
Metode u klasi:
bool provjera(int a, int b)
{
if (p1[(int)a-65][b-1] == 0) //ako je mjesto u polju slobodno vraca true
return true;
}
void unos(int ko1, int ko2, int a)
{
for (int i = 0; i < a; i++)
{
pr1 = provjera(ko1, ko2); //poziv funkcije koja provjerava je li to mjesto slobodno
if (pr1)
{
p1[(int)ko1 - 65][ko2 - 1] = 1; //popunjavanje mjesta u polju
}
}
}
Moj problem je što mi se pojavi dodatna 1, jedan element prije od onoga koji je korisnik unio, ali samo ako korisnik želi brod na prvom elementu nekog reda.
Jako komplicirano za objasnit riječima zato ću vam staviti slike da vidite o čemu pričam.
Ako korisnik unese brod na B2 i B3 onda nema te jedinice viška.
Do ovog dijela koda ti nije problem.
Evo, provjeri sam. Izbacio sam provjeru jer ovdje ovako postavljena nema smisla, svodi se na to da preko 1 ne staviš novi 1.
Castanje int varijable u int varijablu u funkciji unos isto je nepotrebno, kao i petlja u unos funkciji, više puta provjerava isto mjesto u matrici.
#include<iostream>
#include<fstream>
using namespace std;
int p1[6][6];
void unos(int red, int stupac)
{
p1[red - 65][stupac - 1] = 1; //popunjavanje mjesta u polju
}
void ispis()
{
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
cout << p1[i][j];
}
cout << endl;
}
}
int main()
{
char red;
int stupac;
ispis();
for (int i = 0; i < 2; i++)
{
cout << (i + 1) << ". mjesto za brod?" << endl;
cin >> red >> stupac; //koordinate broda
unos(red, stupac);
}
ispis();
return 0;
}
koja je prednost korištenja preopterećenja operatora << i>> u odnosu na cin i cout
primjera radi:
ostream& operator<<(ostream &var1, Kredit &var2);
istream& operator>>(istream &var1, Kredit &var2);
koja je prednost korištenja preopterećenja operatora << i>> u odnosu na cin i cout
primjera radi:
ostream& operator<<(ostream &var1, Kredit &var2);
istream& operator>>(istream &var1, Kredit &var2);
Je li Tracer ovdje besplatno ostavio skriptu? Jeste.
Je li obradio preopterećenje operatora u toj skripti? Jeste.
Pa u čemu je onda problem.
smiri se floki, taj post o skripti mi se omaka
smiri se floki, taj post o skripti mi se omaka
Eh, nisam ljut, više sam napisao retorički, samo ti kažem gdje to ima, čini mi se 200. strana ovdje je link, a u skripti 6. vježba, tako nekako. Na primjeru kompleksnih brojeva je objašnjeno.
Oprosti ako si pogrešno shvatio, a ovo ti je najbolji odgovor, prođi tu skriptu, provježbaj primjere i vidjet ćeš kako ćeš napredovati u znanju, kad radiš sistematski, rezultat je bolji od parcijalnog dobijanja odgovora na forumu. Kad nešto zapne u kodu, pitaj, netko će pomoći.
http://www.bug.hr/forum/topic/programiranje/programiranje-c-pitanja-odgovori/98845.aspx?page=199&jumpto=4568763&sort=asc&view=flat
Na stranici 57 je dio o prepoterećenju operatora << i >>.
Najbolji si ovakve stvari staviti u arhivu postova pa onda kasnije znaš gdje je.
ma skinia ja skriput, nek se nađe.. baš čitam lagano
Do ovog dijela koda ti nije problem.
Evo, provjeri sam. Izbacio sam provjeru jer ovdje ovako postavljena nema smisla, svodi se na to da preko 1 ne staviš novi 1.
Castanje int varijable u int varijablu u funkciji unos isto je nepotrebno, kao i petlja u unos funkciji, više puta provjerava isto mjesto u matrici.
#include<iostream>
#include<fstream>
using namespace std;
int p1[6][6];
void unos(int red, int stupac)
{
p1[red - 65][stupac - 1] = 1; //popunjavanje mjesta u polju
}
void ispis()
{
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
cout << p1[i][j];
}
cout << endl;
}
}
int main()
{
char red;
int stupac;
ispis();
for (int i = 0; i < 2; i++)
{
cout << (i + 1) << ". mjesto za brod?" << endl;
cin >> red >> stupac; //koordinate broda
unos(red, stupac);
}
ispis();
return 0;
}
BOLD: To i je cilj provjere. A kako vidim u ovome tvome kodu, ako korisnik opet unese to polje, program će to izvršiti, a ne bi smio.
Castanje mi se omaklo malo, lapsus. Petlju pojma nemam sada zašto sam je stavljao.
Do ovog dijela koda ti nije problem.
Evo, provjeri sam. Izbacio sam provjeru jer ovdje ovako postavljena nema smisla, svodi se na to da preko 1 ne staviš novi 1.
Castanje int varijable u int varijablu u funkciji unos isto je nepotrebno, kao i petlja u unos funkciji, više puta provjerava isto mjesto u matrici.
#include<iostream>
#include<fstream>
using namespace std;
int p1[6][6];
void unos(int red, int stupac)
{
p1[red - 65][stupac - 1] = 1; //popunjavanje mjesta u polju
}
void ispis()
{
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
cout << p1[i][j];
}
cout << endl;
}
}
int main()
{
char red;
int stupac;
ispis();
for (int i = 0; i < 2; i++)
{
cout << (i + 1) << ". mjesto za brod?" << endl;
cin >> red >> stupac; //koordinate broda
unos(red, stupac);
}
ispis();
return 0;
}
BOLD: To i je cilj provjere. A kako vidim u ovome tvome kodu, ako korisnik opet unese to polje, program će to izvršiti, a ne bi smio.
Castanje mi se omaklo malo, lapsus. Petlju pojma nemam sada zašto sam je stavljao.
Ne omogućava ti da odrediš druge koordinate za unos ako je mjesto zauzeto, pet puta da uneseš A1 ili samo jedan put, rezultat je isti, 1 na mjestu polje1[0][0], druga stvar bi bila da traži ponovni unos do slobodnog mjesta. Ovako razlike između mog i tvog koda nema, pet puta uneseš A1 i na mjestu polje1[0][0] se nalazi 1, unio taj 1 pet puta ili jednom koja razlika, cilj provjere ispada da bi bio spriječiti da se ponovno ne unese što već imamo, imalo bi smisla kad bi program tražio unos npr. pet točaka i ako odrediš dvije iste, provjerom ti traži unos druge koordinate.
Ali kako god, do ovog koda ti nije greška da se pojavi 1 na mjestu polje1[0][5] ako uneseš B1 i B2.
Evo onda kompletan kod, pa se nadam da ćeš naći di je greška.
I hvala za ovo objašnjenje :)
Ovo je samo ugrubo napravljen program kako bi stvar radila, a nakon šta se napravi krenit će na uljepšavanje.
#include <iostream>
using namespace std;
class polja
{
int p1[5][5];
int p2[5][5];
//char k1[] = { 'A', 'B', 'C', 'D', 'E', 'F' };
//int k2[] = { 1, 2, 3, 4, 5, 6 };
char a;
int b;
bool pr1;
public:
void popunjavanje()
{
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
p1[i][j] = 0;
p2[i][j] = 0;
}
}
}
void ispisi1()
{
//for (int i = 0; i < 6; i++)
// cout << k1[i];
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
cout << p1[i][j];
if (j == 5)
{
cout << "\n";
// cout << k2;
}
}
}
cout << endl;
}
void ispisi2()
{
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
cout << p2[i][j];
if (j == 5)
cout << "\n";
}
}
cout << endl;
}
bool provjera(int a, int b)
{
if (p1[(int)a-65][b-1] == 0) //ako je mjesto u polju slobodno vraca true
return true;
}
void unos(int ko1, int ko2, int a)
{
for (int i = 0; i < a; i++)
{
pr1 = provjera(ko1, ko2); //poziv funkcije koja provjerava je li to mjesto slobodno
if (pr1)
p1[(int)ko1 - 65][ko2 - 1] = 1; //popunjavanje mjesta u polju
}
}
};
int main()
{
polja p1;
char k1;
int k2;
p1.popunjavanje();
p1.ispisi1();
p1.ispisi2();
cout << "Imate 4 broda:" << "\n 2 broda (2 elementa)" << "\n 1 brod (3 elementa)" << "\n 1 brod (4 elementa)." << endl;
cout << "Unesi 1. brod od 2 elementa: " << endl;
for (int i = 0; i < 2; i++)
{
cout << (i + 1) << ". mjesto za brod?" << endl;
cin >> k1 >> k2; //koordinate broda
p1.unos(k1, k2, 2); //poziv funkcije iz klase
}
p1.ispisi1();
system("pause");
return 0;
}
Evo onda kompletan kod, pa se nadam da ćeš naći di je greška.
I hvala za ovo objašnjenje :)
Funkcije popunjavanje i ispisi1/2 obje imaju petlje i=0; i<6. Najveci indeks za p1[5][5] je 4,4. Upisujes i ispisujes podatke van granica matrice.
Točno to, upis i ispis van granica matrice.
Usput, ovdje pogrešno napisana funkcija provjera nema značaj da utječe na program jer ionako ničemu ne služi, mada pogrešno radi.
Pošto će ti ta funkcija trebati za napraviti provjeru koja nečemu služi, u oba slučaja funkcija mora vratiti vrijednost. Dakle, ako ne vrati true iz if bloka neka vrati false na kraju funkcije.
taman sam doša na friend u klasama, pa je bia zadatak:
Definirajte klasu Pravac sa privatnim podatkovnim članovima k i l.Definirajte klasu
Tocka sa privatnim podatkovnim članovima x i y. Napišite funkciju (nebitno kakva)
koja će biti prijatelj i klase Pravac i klase Tocka, pristupat će izravno njihovim podatkovnim
članovima i ovako je definirana: double Funkcija(Pravac &p, Tocka &t).
ja sam to ovako napravia, pa ću pitati jel ovo pravilno korištenje friend funkcije
#include<iostream>
using namespace std;
class tocka;
class pravac{
friend double udalje(pravac &p, tocka &t);
private:
double k,l;
public:
void upisik(double ka);
void upisil (double el);
double citajk(){return k;}
double citajl(){return l;}
};
void pravac::upisik(double ka){
k=ka;
}
void pravac::upisil(double el){
l=el;
}
class tocka{
friend double udalje(pravac &p, tocka &t);
private:
double x,y;
public:
void postavi(double xx, double yy){
x=xx;
y=yy;
}
int dajy(){return y;}
int dajx(){return x;}
};
double udalje(pravac &p, tocka &t){
double d=((p.k*t.x)-(t.y+p.l))/(pow(((p.k*p.k)+1),0.5));
return d;
}
int main(){
pravac d;
d.upisik(5);
d.upisil(2);
tocka r;
r.postavi(3,5);
cout<<udalje(d,r);
return 0;
}
Nadam se da nije previše offtopic.
Ugl. u školi učimo MASM(Microsoft Macro Assembler ) i trenutno radimo sa pozivanjem funkcija iz C filea.
Ne znam kako napraviti da u C fileu pomoću funkcije mogu ispisati željenu poruku koristeći printf.
U školi moramo koristiti Visual Studio 2008.
Bio bih jako zahvalan kada bi mi netko mogao pomoći oko ovoga.
Primjer MASM filea:
TITLE MASM Template (main.asm)
.386
.model FLAT
.stack 4096
WriteString PROTO stdcall
ReadChar PROTO stdcall
Crlf PROTO stdcall
ExitProcess PROTO stdcall:DWORD
veci PROTO C :DWORD, :DWORD
.data
PorukaZaIspis db "Poruka za ispis", 0
.code
_main PROC
; MJESTO ZA PROGRAMIRANJE:
comment /*
komentar kroz vise redaka
/*
push 8
push 3
call veci ; funkcija sprema veci broj u eax registar
; zelim napraviti funkciju koja ispise poruku pomocu printf
call Crlf
mov edx, OFFSET PorukaZaIspis
call WriteString
call ReadChar
Invoke ExitProcess, 0
_main ENDP
END _main
END
Primjer C filea u kojem imam funckiju veci:
int veci(int a, int b) {
if ( a > b)
return a;
else
return b;
}
Točno to, upis i ispis van granica matrice.
Usput, ovdje pogrešno napisana funkcija provjera nema značaj da utječe na program jer ionako ničemu ne služi, mada pogrešno radi.
Pošto će ti ta funkcija trebati za napraviti provjeru koja nečemu služi, u oba slučaja funkcija mora vratiti vrijednost. Dakle, ako ne vrati true iz if bloka neka vrati false na kraju funkcije.
Hvala obojici na primjećenoj grešci, stvarno početnička greška...
Jel imate neki prijedlog kako napisat tu provjeru? Trebala bi naređivati korisniku da može unijeti koordinate samo za jedno polje od početne koordinate u nekom smjeru i to ako tu već nije drugi brod...
Instalirao sam program Dev-C++, sve namjestio i pokrenuo. Sve je radilo kako treba. Malo sam vježbao u njemu, pretraživao tutoriale za C++ i pisao. Spremio sam jedan program i ugasio C++. Nakon dva sata sam ga ponovno htio uključiti, vrtio se onaj plavi krug kraj miša tj. program se učitavao ali ništa se nije dogodilo. Nekoliko puta sam ga pokušao ali nije se upalio. Deinstalirao sam program i ponovno ga instalirao. Sve riješio s postavkama i označio ''Završi i pokreni C++.'', ali opet se neće upaliti. Još jednom sam ga deinstalirao (ovaj novi) i preuzeo s iste internetske stranice. Ali opet se neće upaliti. Znači, moje pitanje je ''Što da radim i kako instalirati program, ali da radi?''. (Danas sam se registrirao pa ne znam napraviti temu.)
16.4.2015.
i ja sam koristim dev c++,meni radi normalno a skinuo sam ga sa službene stranice.koje ste vi koristili knjige za učenje c++?
imam jedno pitanje moram iz c prebacit u c++
znači imam struktru nju prebacujem u klasu
typedef struct { /* chart axes definition */
short grid; /* if TRUE draw grid lines */
short gridstyle; /* style number for grid lines */
titletype axistitle; /* axis title */
COLORREF axiscolor; /* palette color for axis */
short labeled; /* if TRUE draw tic marks and titles */
short rangetype; /* _PG_LINEARAXIS or _PG_LOGAXIS */
float logbase; /* base used for log axis */
short autoscale; /* if TRUE calculate remaining values */
float scalemin; /* minimum value for scale */
float scalemax; /* maximum value for scale */
float scalefactor; /* scale factor for axis */
titletype scaletitle; /* title for scale factor */
float ticinterval; /* interval between tic marks */
short ticformat; /* _PG_EXPFORMAT or _PG_DECFORMAT */
short ticdecimals; /* number of decimals places in tic labels */
} axistype;
ja sam to napravio ovako
class axistype {
public: /* chart axes definition */
short grid; /* if TRUE draw grid lines */
short gridstyle; /* style number for grid lines */
titletype axistitle; /* axis title */
COLORREF axiscolor; /* palette color for axis */
short labeled; /* if TRUE draw tic marks and titles */
short rangetype; /* _PG_LINEARAXIS or _PG_LOGAXIS */
float logbase; /* base used for log axis */
short autoscale; /* if TRUE calculate remaining values */
float scalemin; /* minimum value for scale */
float scalemax; /* maximum value for scale */
float scalefactor; /* scale factor for axis */
titletype scaletitle; /* title for scale factor */
float ticinterval; /* interval between tic marks */
short ticformat; /* _PG_EXPFORMAT or _PG_DECFORMAT */
short ticdecimals; /* number of decimals places in tic labels */
};
te za pristup koji izgleda ovako
float _Zero( axistype *axis )
//===============================
/* Initializes "zline" to the line closest to zero on the graph.
Modifies the "zvalue", the value closest to zero on the graph. */
{
if( axis->scalemin > 0 ) {
return( axis->scalemin );
} else {
if( axis->scalemax < 0 ) {
return( axis->scalemax );
} else {
return( 0 );
}
}
}
napraviti ovo
float axistype:: _Zero( axistype *axis )
//===============================
/* Initializes "zline" to the line closest to zero on the graph.
Modifies the "zvalue", the value closest to zero on the graph. */
{
if(scalemin > 0 ) {
return(scalemin );
} else {
if(scalemax < 0 ) {
return(scalemax );
} else {
return( 0 );
}
}
}
tu gdje sam marker stavio, jel može ostati tako kako je?