- D1Rect: Nagy "hülyétkapokazapróktól" topik
- sziku69: Szólánc.
- btz: Internet fejlesztés országosan!
- gban: Ingyen kellene, de tegnapra
- Luck Dragon: Asszociációs játék. :)
- Gurulunk, WAZE?!
- sziku69: Fűzzük össze a szavakat :)
- VoidXs: Tényleg minden játék optimalizálatlan?
- Hieronymus: Három júniusi képem
- Magga: PLEX: multimédia az egész lakásban
Új hozzászólás Aktív témák
-
WonderCSabo
félisten
-
j0k3r!
őstag
válasz
Jester01 #797 üzenetére
setlocale(LC_ALL,"Hun"); - ebben en sem vagyok biztos, ezert a vegen kiszedtem a kodbol
numberofstars - teljesen igazad van ez inkabb numberofnotstars vagy numberofpoints
if(numberoftips<=10 && numberofstars==unknownlength) - ezt nem teljesen ertem azert nem numberoftips<10 -et irtam, mivel ha az user pont 10. tippre talalja ki, akkor is mukodjon
system("pause"); - ezt pont a tanar mutatta, hogy ne szalljon el futtatas utan a win32 console application, ergo latod, hogy nyertel-e vagy sem
+1: kellene egy #include <cstdlib> a (s)rand miatt. - mostmar ezt is tudom
es koszonom az epito jellegu kritikat!
-
Jester01
veterán
Háááát, ha egyszer úgyis 1000 elemű fix méretű tömbbe olvasol, akkor aztán tök mindegy utána mit varázsolsz. Totál felesleges átmásolni egy másik (immár megfelelő méretű) tömbbe.
setlocale(LC_ALL,"Hun"); ebben nem vagyok olyan biztos, hogy működik. Nálam tuti nem. Persze ha nem is ellenőrzöd a visszatérési értéket akkor sose tudod meg.
numberofstars ez jó félrevezető változónév az imperialista kémek megtévesztésére ... mivelhogy még véletlenül sem a csillagokat számolja.
if(numberoftips<=10 && numberofstars==unknownlength) itt szerény véleményem szerint mindenképp numberoftips<=10
system("pause"); ezért, ha én tanár lennék, azonnal egyest adnék...
+1: kellene egy #include <cstdlib> a (s)rand miatt.
-
j0k3r!
őstag
válasz
WonderCSabo #794 üzenetére
nem nem fagyott ki, data.txt mindig volt, csak kicsit felreerthetoen irtam az "elso" do while ciklust.
itt a 'vegleges'
ha vektort hasznaltam volna, az miben egyszerusitette volna meg a munkamat?
es megegyszer koszonom mindenkinek, aki segitett. -
j0k3r!
őstag
hello megint!
valaki ranezne erre, hogy miert szall el az elso do while utan? (ha valaki kiprobalna, akkor az adatatok a data.txt-ben vannak soronkent 1 szo)
elore is koszonom. -
j0k3r!
őstag
válasz
WonderCSabo #788 üzenetére
nem gyozom megkoszonni! igen, akasztofa : )
holnap remelem befejezem, szerdara kell a sracnak, nem holnapra. -
WonderCSabo
félisten
Magyarul akasztófázni kell.
Szerk.
for (int i=0;i<vector[randomodik].length();i++)
{
if ( vector[randomodik].substr(i,1) == betu)
{
// csinálja ezt
}
} -
j0k3r!
őstag
na lassan csak kesz lesz.
inkabb leirom a teljes feladatot.
szoval txt-ben szavak -> szavakat beolvas -> kivalasztok veletlenszeruen egy szot -> ahany betu, annyi *-ot kiirok -> aztan 10et tippelhet az userpl az adott szo barack: ******
es a tipp 'a' betu volt akkor: *a*a** igy kell modositanom, mindaddig mig ki nem talaljak, vagy le nem telik a 10 'esely'namost mar megvan a random resze, megvan a random szo, kiirja a megfelelo szamu csillagot, csak ott akadtam el, hogy hogy tudom a bekert betut egyesevel vegigellenorizni az adott indexu vector karakterein?
-
Jester01
veterán
Az alap operator>> az éppenséggel benyel mindenféle szóközt (whitespace). Most akkor tuti, hogy vectort nem szabad használni? Mert azzal kb ennyi az egész:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
ifstream file("teszt.txt", ios::in);
if(!file.good())
{
cout<<"Hiba a fajllal...";
return 1;
}
vector<string> words;
while(file.good())
{
string word;
file >> word;
words.push_back(word);
}
for(int i = 0; i < words.size(); i++)
{
cout <<"i: "<< i <<".: " << words[i] << endl;
}
return 0;
} -
Sk8erPeter
nagyúr
Ezt könnyű megoldani, csináld azt, hogy az if(c==' ') count++; rész után tegyél egy nagy else blokkot, a következőképpen:
if(c==' ') count++; //szóközt kaptunk, növelünk, következő helyre tároljuk a szót
else{
if(count<default_size){ //még beleférünk
words[count].push_back(c);
}
else{ //nyújtózkodunk
//........
//........
}
}És ezzel elvileg jó.
-
j0k3r!
őstag
mostmar szokozzel is mukodik, en voltam a hibas, mivel enterekkel voltak elvalasztva a szavak, nem pedig szokozzel
Sk8erPeter ismet
mar csak egyetlen szepseghibaja van, hogy az elso szo kivetelevel minden szo elso karaktere szokoz : )
nincs valami parancs, ami ha szokozt lat eldobja a karaktert? (ignore vagy valami ilyesmi) -
j0k3r!
őstag
válasz
Sk8erPeter #779 üzenetére
koszonom szepen!
futas kozbe neztem lepesrol lepesre es nalam 1 gond van:
if(c==' ') count++;
ez a feltetel sosem teljesul be, ergo count 0 marad es 1 hosszu stringbe osszefuzi oket szokozzel elvalasztva :/ sot a vegen a kiiratasnal hiaba van 1 hosszu stringben az egesz meg azt se irja ki :/szerk: viszont ha ponttal valasztom el oket, akkor elvalasztja a szavakat!
-
Sk8erPeter
nagyúr
Ja bocsi, az elkerülte a figyelmem, hogy az a lényeg, hogy szavanként tárold el.
Az sem túl nehéz, akkor meg csináld azt, hogy mondjuk sima string helyett string*-ot használsz.Írtam egy példát, bevallom, nem igazán néztem át, hogy helyes-e, és mivel láttam, hogy sürgős, elég gyorsan írtam, így lehetnek benne hibák, mindenesetre kipróbáltam, és működik.
Az eredeti példa analógiájára csináltam, de kissé átalakítva.Így néz ki:
// string::push_back
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main ()
{
ifstream file ("teszt.txt",ios::in);
if( !file.good() ){ //Fájlpara
cout<<"Hiba a fajllal...";
}
else //OK
{
string* words;
const int default_size=100; //kezdetben pl. 100 méretű tömböt hozunk létre
words=new string[default_size];
int size=default_size; //eltároljuk az alapértelmezett (kezdő)méretet, ha kell, növelünk
int count=0; //hol tartunk a tömbben? (egyszerűbb nyilvántartani)
while( file.good() ) //countot majd a cikluson belül növeljük
{
char c=file.get();
if(c==' ') count++; //szóközt kaptunk, növelünk, következő helyre tároljuk a szót
if(count<default_size){ //még beleférünk
words[count].push_back(c);
}
else{ //nyújtózkodunk
//pl. duplázzuk a kezdőméretet
string* tmp=new string[size*2]; //átmeneti változó, kétszeres kezdőmérettel
for(int uj=0;uj<count;uj++){ //csak count-ig van értelme menni, csak addig töltöttük fel
tmp[uj]=words[uj];
}
size*=2; //duplázzuk
tmp[count].push_back(c);
delete[] words; //töröljük az eredeti adatait
words=tmp; //végül belemásoljuk a nyújtott mérettel
}
}
for(int i=0;i<count;i++){
cout <<"i: "<<i<<".: "<< words[i] << endl;
}
}
return 0;
} -
j0k3r!
őstag
válasz
WonderCSabo #777 üzenetére
szavankent rakja bele egy string tombbe?
-
j0k3r!
őstag
up!
-
j0k3r!
őstag
nem is kellett olyan sokat varni...
ez a megoldas jol mukodik:
// string::push_back
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main ()
{
string str;
ifstream file ("test.txt",ios::in);
while (!file.eof())
{
str.push_back(file.get());
}
cout << str;
return 0;
}de mivel karakterenkent menti el, nem pedig szavankent, ezert nem jo nekem.
get helyett getline meg nem mukodik, vagy valamit rosszul csinaltam :/
(a txt fileban soronkent vannak irva a szavak) -
válasz
Sk8erPeter #772 üzenetére
A fajlmeret-beolvasas nem mukodik - gondolom szavankent kell belerakni a tombbe, azt meg elore nem tudja, hogy hany szo van.
-
j0k3r!
őstag
emvy, Sk8erPeter nagyon szepen koszonom a segitseget!
majd jelentkezem, ha elakadok : ) -
Sk8erPeter
nagyúr
Akár úgy is megoldhatod, ahogy itt szerepel: istream::read - C++ Reference
// read a file into memory
#include <iostream>
#include <fstream>
using namespace std;
int main () {
int length;
char * buffer;
ifstream is;
is.open ("test.txt", ios::binary );
// get length of file:
is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);
// allocate memory:
buffer = new char [length];
// read data as a block:
is.read (buffer,length);
is.close();
cout.write (buffer,length);
delete[] buffer;
return 0;
}Viszonylag primitív (de végül is célravezető) megoldás, a fájl végére ugrik, így tudja meg a fájl méretét, ennek megfelelő helyet foglal, majd vissza az elejére, és elkezdi a beolvasást fájl végéig.
De emvy megoldás-javaslata is tökéletes.
---------------------------------------------------------------------------------------------
Szerk.:
(#771) j0k3r!
persze, a string típus is teljesen jó.PÉLDA:
string::push_back// string::push_back
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main ()
{
string str;
ifstream file ("test.txt",ios::in);
while (!file.eof())
{
str.push_back(file.get());
}
cout << str;
return 0;
}Sokkal rövidebb is a kód.
-
j0k3r!
őstag
hello!
egy nagyon egyszeru kerdesem lenne, megsem tudok rajonni.
a feladat az, hogy olvassak be txt-bol szavakat, es taroljam el oket egy tombben.
a gondom az, hogy ki van kotve, hogy nem "tudhatom" elore, hogy hany adatbol all a txt, ezert is gondoltam dinamikus tombre, megsem mukodik :/a kodom:
#include <iostream>
#include <fstream>
using namespace std;
void main ()
{
int x=0;
char *szavak;
szavak= new char[];
ifstream be("adatok.txt");
if(!be)
{
cerr<<"hiba a filemegnyitas soran";
}
else
{
do
{
be.read(szavak[x],15);
x++;
}
while (!be.eof());
be.close();
}
for (int i=0;i<x;i++)
{
cout<<szavak[i]<<endl;
}
}havernak csinalom a hazifeladatat, ami holnapra kellene neki.
nagyon megkoszonnem, ha valaki tudna segiteni. -
-
Mr. Teddy
őstag
válasz
Sk8erPeter #766 üzenetére
Na szal félreértjük egymást.
Szal úgy növelem meg, hogy átírom az értéket, majd újrafordítom.
Tehát Char[100]-al megy, Char[200]-al nem. Persze nem 100-as mértéken fagy ki, hanem ilyen 1000000 nagyságban. Stack overflow hiba... -
Mr. Teddy
őstag
válasz
Sk8erPeter #764 üzenetére
Úgy hozom létre, hogy unsigned char [100000];
Első körben fix nagy tömbre van szükségem, szal nem akarom dinamikusan növelni.
Jó lenne kb 1MB adat tárolására képes tömböt létrehozni. -
Sk8erPeter
nagyúr
válasz
Mr. Teddy #763 üzenetére
Nem ártott volna, ha leírod, milyen módon hoztad most létre a tömbödet.
Hogyan növeled a méretét? Dinamikusan kezeled, nyújtózkodó tömbről van szó?Amúgy ha string osztályt használsz az #include <string> után, akkor azzal elég kényelmesen tudsz dinamikusan hozzápakolászni elemeket, pl. egy string * buffer változóba (feladattól függően simán string buffer is elég (* nélkül) ), és azon is ugyanúgy végig tudsz rohangászni indexeléssel.
Itt vannak az elérhető függvények: string class, itt meg példa pl. a hozzáfűzésre: append. -
Mr. Teddy
őstag
Sziasztok!
Az volna most a problémám, hogy egy unsigned char tömböt használok puffernek, miután olvasok hálózatról bájtokat.
Az a baj, hogyha megnövelem a méretét, kifagy a program. Mitől lehet ez, vagy mit tudtok javasolni, hogy csináljak kellően nagy buffert? Eddig a tömb indexeivel szépen körbe tudtam járni a bufferem, keresgélni ami kell nekem, csak ilyesmi buffer féle lenne jó.
Köszi -
Jester01
veterán
válasz
Tuostein #758 üzenetére
Igen, ott a hiba.
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400cca in keres (n=@0x7fff4645dc2c, m=@0x7fff4645dc28, k=0x18960b0, min=0x0, kutya=0x0) at t.cpp:118
118 if (kutya[i-1][j-1]<=min[j-1]) {Innen rögtön látszik mi a baj: a min és a kutya paraméter is 0. Ha közelebbről megnézed, az is kiderül miért: mert a beolvas függvény az érték szerinti átadásból következően nyilván nem módosítja a main-ben lévő változókat.
Egyébiránt ezt a fordító (gcc) nekem jelzi is:
t.cpp:15: warning: 'max' is used uninitialized in this function
t.cpp:15: warning: 'min' is used uninitialized in this function
t.cpp:15: warning: 'kutya' is used uninitialized in this functionHa ezeket referenciaként adod át már jobb lesz a helyzet, ekkor működni is látszik a programod
-
Tuostein
csendes tag
Sziasztok!
Van egy beadandóm és valamiért nem akar lefutni, hibát nem dob ki, csak simán kiakad! CodeBlocks-ban írom... tudom van jobb is... a debuggal arra jutottam hogy megakad a keres fgv-ben az if-es sorban. legalábbis oda rakta a sárga nyilat a debug..
A feladat: "Egy N résztvevőjű kutyaszépségversenyen M különböző szempont szerint pontoznak minden kutyát, s az eredményt a KUTYA(N,M) mátrix tartalmazza. Minden szempont alapján maximum MAX(I) pont adható (nem negatív egész szám). Az összetett versenyből automatikusan kiesik az a kutya, amely valamelyik kategóriában nem éri el a kategóriánként megadott alsó ponthatárt (MIN(I)). Készítsen C++ programot, amely megadja azt a kategóriát, ahol a legkevesebb kieső volt!"
És a kód:
#include <iostream>
using namespace std;
void beolvas(int&, int&, int*, int*, int**);
void keres(int&, int&, int*, int*, int**);
void kiir(int&, int&, int*);
int main()
{
int n,m;
cout << "Kutyaszepsegverseny" << endl << endl;
int *min, *max, *k;
int** kutya;
beolvas(n,m,max,min,kutya);//ellenőrzött beolvasás
k = new int[m];
keres(n,m,k,min,kutya);//legkevesebb kieső keresése
kiir(n,m,k);//az összes legkevesebb kieső kiírása
return 0;
}
void beolvas(int &n, int &m, int* max, int* min, int** kutya){
bool rossz=true;
string temp;
do {
cout << "Hany kutya szerepel (1-...): ";
cin >> n;
if (cin.fail()) {
cout << "Nem szamot adott meg!" << endl << "Adjon meg egy pozitiv egesz szamot!" << endl;
rossz=true;
}else {
rossz= (n<1);
if (rossz) {
cout << "Helytelen erteket adott meg!" << endl << "Adjon meg egy pozitiv egesz szamot!" << endl;
}
}
cin.clear(); getline (cin,temp,'\n');
}while (rossz);//kutyák számának (n) ellenőrzött beolvasása
do {
cout << endl <<"Hany szempontot pontoznak (1-...): ";
cin >> m;
if (cin.fail()) {
cout << "Nem szamot adott meg!" << endl << "Adjon meg egy pozitiv egesz szamot!" << endl;
rossz=true;
}else {
rossz= (m<1);
if (rossz) {
cout << "Helytelen erteket adott meg!" << endl << "Adjon meg egy pozitiv egesz szamot!" << endl;
}
}
cin.clear(); getline (cin,temp,'\n');
cout << endl;
}while (rossz);//szempontok számának (m) ellenőrzött beolvasása
max = new int[m];
for (int i=1; i<=m; i++){
do{
cout << i << ". szempont maximum ponthatara (2-...): "; cin >> max[i-1];
if (cin.fail()) {
cout << "Nem szamot adott meg!" << endl << "Adjon meg egy kettonel nagyobb egesz szamot!" << endl;
rossz=true;
}else {
rossz= (max[i-1]<2);
if (rossz) {
cout << "Helytelen erteket adott meg!" << endl << "Adjon meg egy kettonel nagyobb egesz szamot!" << endl;
}
}
cin.clear(); getline (cin,temp,'\n');
}while (rossz);
}//szempontok maximum ponthatára
min = new int[m];
for (int i=1; i<=m; i++){
do{
cout << i << ". szempont minimum ponthatara (0-" << max[i-1]-1 << "): "; cin >> min[i-1];
if (cin.fail()) {
cout << "Nem szamot adott meg!" << endl << "Adjon meg egy nem negativ szamot (0-" << max[i-1]-1 << ")!" << endl;
rossz=true;
}else {
rossz= ((min[i-1]<0) || (min[i-1]>=max[i-1]));
if (rossz) {
cout << "Helytelen erteket adott meg!" << endl << "Adjon meg egy nem negativ szamot (0-" << max[i-1]-1 << ")!" << endl;
}
}
cin.clear(); getline (cin,temp,'\n');
}while (rossz);
}//szempontok minimum ponthatára
kutya = new int*[n];
for (int i=1; i<=n; i++){
kutya[i-1] = new int[m];
}
for (int i=1; i<=n; i++){
for (int j=1; j<=m; j++){
do{
cout << i << ". kutya " << j << ". szempontra kapott pontja (maximum: " << max[j-1] << "): "; cin >> kutya[i-1][j-1];
if (cin.fail()) {
cout << "Nem szamot adott meg!" << endl << "Adjon meg egy nem negativ szamot (0-" << max[j-1] << ")!" << endl;
rossz=true;
}else {
rossz= ((kutya[i-1][j-1]<0) || (kutya[i-1][j-1]>max[j-1]));
if (rossz) {
cout << "Helytelen erteket adott meg!" << endl << "Adjon meg egy nem negativ szamot (0-" << max[j-1] << ")!" << endl;
}
}
cin.clear(); getline (cin,temp,'\n');
}while (rossz);
}
}
}
void keres(int &n, int &m, int* k, int* min, int** kutya){
for (int j=1; j<=m; j++){
k[j-1]=0;
for (int i=1; i<=n; i++){
if (kutya[i-1][j-1]<=min[j-1]) {
k[j-1]=k[j-1]+1;
}
}
}
}
void kiir(int &n, int &m, int* k){
int v=n;
for (int i=1; i<=m; i++){
if (k[i-1]<v) {
v=k[i-1];
}
}
if (v==0) {
for (int i=1; i<=m; i++){
if (k[i-1]==v) {
cout << i <<". szempont szerint nem volt kieső kutya!" << endl;
}
}
}else {
for (int i=1; i<=m; i++){
if (k[i-1]==v) {
cout << i <<". szempont szerint volt a legkevesebb kieső kutya!" << endl;
}
}
}
}Nagyon megköszönném a segítségeteket, mert már semmi ötletem sincs hogy miért nem megy!
üdv: Péter -
Sk8erPeter
nagyúr
Hali!
Az eredeti kód azért nem fordul, mert void visszatérési értékű a getParameter() függvényed a Gift osztályban, ami miatt a cout elszáll.
Ezt megoldhatod úgy, hogy inkább double visszatérési értékűvé változtatod:
double getParameter(){ return 0; }; /// void getParameter(){} helyettDe ennél a kiíratást egyszerűbben oldanám meg, mondjuk lehetne minden osztálynak egy void print() művelete, ami épp a feladat által kiírt tulajdonságokat írná ki.
Egy lehetséges példa a Te feladatodra vonatkozóan:
-a Gift osztályban deklarálj egy
virtual void print();
függvényt, az összes többi osztályban pedig egy sima (nem virtuális)
void print();
függvényt.
-maga a megvalósítás pedig a következőképpen nézhetne ki (csak egy lehetséges megoldás, lehetne rajta bőven csiszolni, de gyorsmegoldásként szerintem megfelel):using namespace std;
void Gift::print()
{
cout << "Weight: " << baseWeight << endl;
cout << "Quantity: " << db << endl;
}
void ColoredEgg::print()
{
cout << "Name: Colored Egg" << endl;
cout << "Quantity: " << getWeight() << endl;
//Paraméter:
char colours[4][7] = { "RED", "GREEN", "BLUE", "VIOLET" };
cout <<"Color: "<< colours[colour] << endl;
}
void ChocolateFigure::print()
{
cout << "Name: Chocolate Figure" << endl;
cout << "Quantity: " << getWeight() << endl;
//Paraméter:
std::cout <<"Melting Point: "<< MeltingPoint << endl;
}
void Candy::print()
{
cout << "Name: Candy" << endl;
cout << "Quantity: " << getWeight() << endl;
//Paraméter:
char quality_names[4][5] = { "HARD" , "SOFT" };
std::cout <<"Quality: "<< quality_names[quality] << endl;
}-Ezenkívül szerintem a destruktort a Gift osztályban virtuálissá kellene tenned, hogy ne legyen memóriaszivárgás:
virtual ~Gift() {}
A Testing.cpp-ben pedig a for ciklus akkor ez alapján a következőképpen nézhetne ki (a többi rendben van):
for (int i = 0; i < 3; i++) // kiíratjuk
{
cout << "************************" <<endl; //csak az elválasztás kedvéért
Present[i]->print();
} -
Mr. Teddy
őstag
Sziasztok!
Egy conosle applicationt szeretnék grafikus felülettel megáldani. Lényegébe a graf felhasználói felületen csak indulóparamétereket kérnék be, amivel majd fog futni a program.
Próbáltam windows form-ban a meglévő kódomat alkalmazni, de van pár hely ahol hibát dob, mert nem managed kódban történtek a dolgok (ilyen pl.egy új szál indítása).Megoldható e úgy a dolog, hogy a meglevő programomból egy függvényt csinálok, majd lefordítom DLL-be? Majd ezt a DLL-t felhasználni a windows form programban a megfelelő paraméterek meghívása után?
-
papa019
senior tag
Sziasztok!
Van egy új problémám. :S
A feladat szövege:
Írjunk C++ programot a következő feladatra:
A Húsvéti Nyúl háromfajta ajándékot (Gift) oszt:
színes tojást (ColoredEgg),
csokitfigurát (ChocolateFigure),
cukrot (Candy).
Mindegyik különböző súlyú, az alapegység egy statikus változója az alaposztálynak (baseWeight=10).
A színes tojás súlya darabonként ennek konstansszorosa (eggFactor=9), míg a csoki esetében ez a tényező chocolateFactor=10.5, a cukornál candyFactor=13.2.
A Nyúlnak írt programunk egy tömbben tartja nyilván a kiosztott ajándékokat. Az egyes ajándékok darabszámot is tartalmaznak. A színes tojásnál saját paraméterként nyilvántartjuk még a színt (RED, GREEN, BLUE, VIOLET), a csokifiguránál az olvadáspontot (MeltingPoint), a cukorkánál a minőséget (HARD, SOFT). A célunk kiszámolni és kiírni az egyes ajándékok súlyát (getWeight()).
a) Implementáljuk az osztályokat és konstansokat az EasterBunny névtérben figyelve arra, hogy esetlegesen egyes konstansokat is tagként vagy statikus tagként érdemes implementálni. Ne legyen egy függvénytörzsben sem felesleges, nem használt kód! Egy új ajándéktípus esetleges felvételéhez ne kelljen a már meglévő osztályokat módosítani!
b) Írjon egy egyszerű programot (nem dinamikus tömbbel!), ami megmutatja legalább három különböző típusú ajándék felvételét, valamint kiírja a nevüket a súlyukat és a paraméterüket.A nem működő megoldásom az alábbi linkeken látható:
Headers.h
http://pastebin.com/YWd9tYSb
Functions.cpp
http://pastebin.com/hYSd5Vu3
Testing.cpp
http://pastebin.com/6SveRAWVA problémáim:
- A Testing.cpp fájlban létrehozott tömböm elemeinek neveit miként tudom kiírni a for ciklusban?
- Az alosztályok egyedi paramétereit hogy tudnám kiírni?
Az általam használt módszer igazábból már ott "megbukott", hogy a getParameter függvényt kéri a Gift osztályba is, de oda a feladat kritériumai szerint nem tehetem be. Ezen megoldásomban még benne van, de itt az ostream ír hibát.Kérlek segítsetek.
Előre is köszönöm.
Üdvözlettel: Papa -
papa019
senior tag
Oké, köszi.
-
Sk8erPeter
nagyúr
Legközelebb azért az ilyen hosszúakat légyszi a pastebin.com-ra, vagy a pastie.org-ra copy-paste-eld, ezeken az oldalakon szépen kiemeli a szintaktikát is (ha bejelölöd, hogy pl. C++ nyelvű forráskód), és így könnyebb áttekinteni, mint itt a PH-n.
Ja, és ide csak dobd be a linket, amit kapsz a bemásolás után.
-
papa019
senior tag
válasz
Jester01 #748 üzenetére
Köszi, rengeteget segítettél, kijavítottam az általad említett hibákat.
A Vector.h-ban a 2. paraméter elé odaírtam a const-ot, illetve beírtam az os<<' '<<v.at(i).print(os); sort is.Nekem viszont nem fordul és ezt írja ki:
"d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(127) : error C2662: 'HomeMadeString::String::print' : cannot convert 'this' pointer from 'const HomeMadeString::String' to 'HomeMadeString::String &'"
-
Jester01
veterán
Neked igen érdekes hibát dob a fordító, az enyém az "érthetően" megmondja mi a baj:
Vector.cpp:127: error: no match for 'operator<<' in 'std:
perator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)((std:
stream*)os)), 32) << ((const Vector*)v)->Vector::at(i)'
Magyarul, a Vector-t kiíró operator<< a String-et kiíró operator<< függvényt szeretné hívni, csakhogy ilyen nincs. Van helyette viszont String::print, szóval ez jobb: os<<' '; v.at(i).print(os); Ehhez még szükséges a String::print const-tá alakítása, illetve a Vector.h-ban az operator<< prototípusát is javítani kell mert nem egyezik az implementációval. Ha ez mind megvan, akkor már fordul, csak nem működik
Felhívom a figyelmed továbbá, hogy a string konstansok azok bizony konstansok, tehát const char* típusúak.
-
papa019
senior tag
Sziasztok.
Van egy hatalmas problémám. :SStringekből (osztály) álló vektor osztályt kellett készítenünk.
Minden megy szuperül egy dolgot kivéve://using namespace std;
ostream & operator << (ostream& os, const Vector &v)
{
for(unsigned int i=0;i<v.elementNum;i++)
{
os<<' '<<v.at(i);
}
return os;
}Így olyan hibákat dob ki a rendszer, hogy:
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(124) : error C2143: syntax error : missing ';' before '&'
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(124) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(124) : error C2065: 'os' : undeclared identifier
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(124) : error C2059: syntax error : 'const'
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(125) : error C2143: syntax error : missing ';' before '{'
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(125) : error C2447: '{' : missing function header (old-style formal list?)
Ha a namespace nincs kikommentezve, akkor pedig egy nagyon hosszú hibasort, mely az ostream-re mutat...A forráskódok:
Vector.cpp:
#include <limits.h>
#include <assert.h>
#include <iostream>
#include "Vector.h"
#include "string.h"
using namespace HomeMadeString;
Vector::Vector(const Vector& theOther)
{
pData=NULL;
*this=theOther;
}
void Vector::clear()
{
elementNum=0;
delete [] pData;
}
void Vector::erase(unsigned int position)
{
assert(position<elementNum);
if(elementNum==1)
{
delete []pData;
pData=NULL;
elementNum=0;
return;
}
elementNum--;
String* pTemp=new String[elementNum];
for(unsigned int i=0, j=0;i<elementNum+1;i++,j++)
{
if(i==position)
{
j--;
}
else
{
pTemp[j]=pData[i];
}
}
delete[] pData;
pData=pTemp;
}
String& Vector::at(unsigned int position)
{
assert(position<elementNum);
return pData[position];
}
const String& Vector::at(unsigned int position)const
{
assert(position<elementNum);
return pData[position];
}
bool Vector::insert(unsigned int position, String element)
{
if(elementNum==UINT_MAX)
{
return false;
}
if(position<elementNum)
{
String* pTemp=new String[elementNum+1];
for(unsigned int i=0,j=0;i<elementNum;i++,j++){
if(j==position){
pTemp[i]=element;
j--;
}
else pTemp[i]=pData[j];
}
delete[] pData;
pData=pTemp;
elementNum++;
}
else{
String* pTemp=new String[position+1];
for(unsigned int i=0;i<=position;i++){
if(i<elementNum)pTemp[i]=pData[i];
else{
if(i==position)pTemp[i]=element;
else pTemp[i]=0;
}
}
delete[] pData;
pData=pTemp;
elementNum=position+1;
}
return true;
}
String & Vector::operator [](unsigned int position)
{
return at(position); // Miért nem return pData[position]; ???
}
const String & Vector::operator [](unsigned int position)const
{
return at(position); // Miért nem return pData[position]; ???
}
const Vector& Vector::operator= (const Vector & theOther)
{
assert(this!=&theOther);
delete[] pData;
elementNum=theOther.elementNum;
if(elementNum==0) pData=NULL;
else {
pData=new String[elementNum];
for(unsigned int i=0;i<elementNum;i++) pData[i]=theOther.pData[i];
}
return *this;
}
using namespace std;
ostream & operator << (ostream& os, const Vector &v)
{
for(unsigned int i=0;i<v.elementNum;i++)
{
os<<' '<<v.at(i);
}
return os;
}Vector.h:
#ifndef VECTOR_H
#define VECTOR_H
#include <iostream>
#include "string.h"
// Egy dinamikus tömb osztály
using namespace HomeMadeString;
class Vector
{
// A tömb mérete
unsigned int elementNum;
// Az adatokra mutató pointer
String *pData;
// Diagnosztikai célú globális kiiratóoperátor
friend std::ostream & operator << (std::ostream& os,const Vector& v);
public:
// Konstruktorok, destruktor
Vector() {elementNum=0;pData=NULL;}
Vector(const Vector& theOther);
~Vector() {delete[]pData;}
// Visszatér a tömb méretével.
int size()const{return elementNum;}
// Törli a tömböt (ez konzisztens állapotba is hozza a tömböt, nem csak a dinamikus adatterületet szabadítja fel)
void clear();
// Törli a megadott indexu elemet. A 0 és size()-1 közötti indexek érvényesek.
void erase(unsigned int position);
// Visszatér a megadott indexu elemmel, amely módosítható is egyben.
// A 0 és size()-1 közötti indexek érvényesek.
String& at(unsigned int position);
// Visszatér a megadott indexu elemmel, amely csak olvasható.
// A 0 és size()-1 közötti indexek érvényesek. Az int típus esetén nem kellene
// const referencia, de saját típus esetén igen, lásd házi feladat.
const String& at(unsigned int position)const;
// Beszúr egy elemet a megadott indexu helyre.
// Ha az index nagyobb, mint a tömb mérete, megnöveli a tömb méretét,
// és a szükséges új helyeket nullákkal tölti fel.
bool insert(unsigned int position, String element);
// Operator=
const Vector& operator= (const Vector & theOther);
// Két operator[]. Az at() tagfüggvény operator formában is.
String & operator [](unsigned int position);
const String & operator [](unsigned int position)const;
};
// Diagnosztikai célú kiiratás
std::ostream & operator << (std::ostream& os, Vector& v);
#endif /*VECTOR_H */String.h:
#ifndef STRING_H
#define STRING_H
#include <iostream> // A coutnak
namespace HomeMadeString
{
class String
{
// A karakterek aktuális száma:
int elementsNum;
// A karaktereket tartalmazó memóriaterületre mutató pointer:
char *pData;
public:
// Argumentum nélküli konstruktor:
String();
// Másoló konstruktor:
String(const String & string);
// Egy NULL végu sztringet váró konstruktor
String(char * str);
// Egy karaktert és egy elojel nélküli egészet (times) váró konstruktor,
// amely times darab c karakterrel inicializálja a stringet:
String(char c, unsigned int times);
// A destruktor:
~String();
// A string objektum tartalmát a megadott bufferbe másolja, és NULL-lal lezárja
// (a buffernek a hívó foglal helyet):
void getStr(char * pBuff);
// Visszatér a sztring hosszával
unsigned int getLength(){return elementsNum;}
// Kiírja a sztringet a megadott kimeneti adatfolyamba (A 'cout' ostream típusú.
// A .h állományban nem használunk using namespace-t, mert nem tudjuk, hova lesz
// beépítve, és ott milyen hatása lesz. Ezért kiíjuk az std::-t. Ez a .cpp állományban
// már nem kell, ot használhatjuk a using namespace std utasítást):
void print(std::ostream& os);
// Visszaadja a megadott pozícióban lévo karaktert, egyébként nullát:
char getChar(unsigned int pos);
// --- Statikus függvények. Ezek két stringen végeznek muveletet. ---
// Összefuz két sztringet, és visszatér vele:
static String concatenate(const String& string1,const String& string2);
// Összehasonlít két sztringet:
static bool compare(const String& string1,const String& string2);
// A második sztringet az elso sztringbe másolja:
static void copy(String& string1,const String & string2);
};
}
#endif /* STRING_H */String.cpp:
#include <iostream>
#include <locale>
#include <string.h>
#include "String.h"
using namespace std;
using namespace HomeMadeString;
String::String()
{
elementsNum=0;
pData=NULL;
}
String::String(const String & string)
{
int i;
this->elementsNum=string.elementsNum;
this->pData=new char[elementsNum];
for (i=0;i<elementsNum;i++)
pData[i]=string.pData[i];
pData[i]='\0';
}
String::String(char *str)
{
int i;
for (i=0;str[i];i++);
elementsNum=i;
pData=new char[i];
for (i=0;str[i];i++)
pData[i]=str[i];
pData[i]='\0';
}
String::String(char c, unsigned int times)
{
int i;
elementsNum=times;
if (!times)
pData=NULL;
else
{
pData=new char [times];
for (i=0;i<elementsNum;i++)
pData[i]=c;
pData[i]='\0';
}
}
String::~String()
{
//delete[] pData;
}
void String::getStr(char *pBuff)
{
int i;
for (i=0;pData[i];i++)
pBuff[i]=pData[i];
pBuff[i]='\0';
}
char String::getChar(unsigned int pos)
{
if (elementsNum>pos)
return pData[pos];
else
return 0;
}
String String::concatenate(const String& string1,const String& string2)
{
String str;
str.elementsNum=string1.elementsNum+string2.elementsNum;
str.pData=new char[str.elementsNum];
int i,j;
for (i=0;string1.pData[i];i++)
str.pData[i]=string1.pData[i];
for (j=0;string2.pData[j];j++)
str.pData[i+j]=string2.pData[j];
return str;
}
bool String::compare(const String& string1,const String& string2)
{
if (!(strlen(string1.pData)==strlen(string2.pData)))
return false;
for (int i=0;i<string1.elementsNum;i++)
if (!(string1.pData[i]==string2.pData[i]))
return false;
return true;
}
void String::copy(String & string1,const String & string2)
{
delete[] string1.pData;
string1.elementsNum=string2.elementsNum;
if (!string1.elementsNum)
string1.pData=NULL;
else
{
string1.pData=new char[string1.elementsNum];
int i;
for (i=0;string2.pData[i];i++)
string1.pData[i]=string2.pData[i];
}
}
void String::print(std::ostream & os)
{
for (int i=0;i<elementsNum;i++)
os<<pData[i];
}És a tesztelésre használt VectorSample.cpp:
#include "Vector.h"
#include "String.h"
using namespace std;
int main()
{
Vector v1;
// Insert tesztelése
for(int i=1;i<10;i++)
{
v1.insert(i,"i");
}
// A kiírás (operator<<) és az at() függvény tesztelése
cout<<v1<<endl;
//Helyes eredmény:
// 0 1 2 3 4 5 6 7 8 9
// Másoló konstruktor
Vector v2(v1); // Lehetne: Vector v2=v1;
// op=
Vector v3;
v3=v2;
// Megváltoztatjuk v1-t (erase tesztelése)
v1.erase(0);
// v1.erase(9); //Ennek assertelni kell
cout<<endl<<v1<<endl<<v2<<endl<<v3<<endl;
// Helyes eredmény:
// 1 2 3 4 5 6 7 8 9
// 0 1 2 3 4 5 6 7 8 9
// 0 1 2 3 4 5 6 7 8 9
v2.insert(0,"-1");
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 9
v2.insert(10,"-1");
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 -1 9
v2.insert(12,"-1");
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 -1 9 -1
v2.insert(15,"-1");
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 -1 9 -1 0 0 -1
v2[15]="-2";
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 -1 9 -1 0 0 -2
// v2[16]=3; //Ennek assertelni kell
return 0;
}Kérem valaki segítsen nekem, már több órája ezzel harcolok, de nem jövök rá, hogy mi a probléma. :S
Üdvözlettel: Papa
-
j0k3r!
őstag
koszonom mindkettotoknek!
c alapom nincs, mivel algoritmuselmelet utan egybol c++ jott. -
Sk8erPeter
nagyúr
Eddigi olvasgatások alapján a Szoftverfejlesztés C++ nyelven c. könyv elég jónak tűnik, de feltételezi a C nyelv ismeretét, nem írtad, hogy van-e ilyen alapod.
Ha nincs, akkor pl. a Programozzunk C++ nyelven c. könyv.Ezenkívül/ehelyett biztos a többiek is tudnak még ajánlani megfelelő forrásokat.
-
j0k3r!
őstag
egyebkent valaki tudna ajanlani c++ hoz valami jo ebookot/konyvet?
-
Jester01
veterán
ss << year << '.'; //Ev
if (month < 10) { // 1 helyett 01 legyen
ss << 0;
}
ss << month << '.'; //Honap
if (day < 10) {
ss << 0;
}
ss << day << '.'; //NapEzt c++ nyelvjárásban úgy mondják, hogy
ss << setfill('0')
<< setw(4) << year << '.'
<< setw(2) << month << '.'
<< setw(2) << day << '.'; -
Gyuri16
senior tag
#include <iostream>
#include <sstream>
#include <time.h>
using namespace std;
int main() {
time_t t;
time(&t);
struct tm * tt = localtime(&t); // feltoltjuk a tm structot
// kiszamoljuk az ertekeket a struct leirasa alapjan
int year = 1900 + tt->tm_year;
int month = 1 + tt->tm_mon;
int day = tt->tm_mday;
stringstream ss; // Int -> String konverziohoz
ss << year << '.'; //Ev
if (month < 10) { // 1 helyett 01 legyen
ss << 0;
}
ss << month << '.'; //Honap
if (day < 10) {
ss << 0;
}
ss << day << '.'; //Nap
string datum = ss.str(); //stringet csinalunk belole
cout << datum << endl;
return 0;
}most vettem csak eszre, hogy char tombot hasznalsz, szoval akkor meg stringbol csinalni kell egy char[]-t, pl igy:
char d[12];
strcpy(d, datum.c_str());
(strcpynek a string.h include kell)
vigyazz mert a te kododban csak 11 byteot foglalsz le a datumnak, de az 12 byteot foglal (a null byte a vegen) -
j0k3r!
őstag
hello! elakadtam :/
van egy ilyen strukturam:
struct user
{
char nev[20];
char ok[30];
char datum[11];
};egy ilyen bovitofuggvenyem:
int banlist::bovit()
{
user adat;
system("cls");
cout<<"uj ban hozzaadasa"<<endl;
cout<<"-----------------"<<endl;
cout<<"nev: ";
cin>>adat.nev;
cin.ignore(80,'\n');
cout<<"ban oka: ";
cin.getline(adat.ok, 30);
cout<<"datum: ";
cin.getline(adat.datum, 11);
cout<<endl;
lista.push_back(adat);
cout << "\nsikeresen bovitettuk a listat";
cin.clear();
cout << endl;
return 0;
}teszt celjabol ugy csinaltam meg, hogy kezzel kelljen bevinni a datumot, de a te modszereddel sehogy se megy. tudnal segiteni, hogy az adat.datum -ba az aktualis datum keruljon?(2000.01.01. formaban)
elore is koszi. -
j0k3r!
őstag
hello mindenkinek!
olyan programot szeretnek irni, ami beker 2 adatot (nev char[20], ok char[50]) es ezek melle hozzafuzi az adott datumot a datum char[11] valtozoba. (ilyen formaban pl.: 2009.01.23.)
aztan az egesz cuccost hozzafuzi az adatok-txt-hez. (es igy majd folyamatosan bovul a lista)
egy otletet szeretnek kerni toletek az aktualis datum lekerdezesehez es valtozoba mentesehez.
a segitsegetek elore is koszonom. -
sghc_toma
senior tag
válasz
Sk8erPeter #731 üzenetére
hmm, ezt az STL-dolgot beneztem, bocs.. figyelmetlenul olvastam el a feladatot
en a file-t reprezentalo osztalyba nem pakolnam bele a tail megvalositasat.. legyen neki megnyitas/bezaras metodusa, meg iteratorai.. szerintem a tail objektum kap egy file objektumot megkozelites jo; a file iteratorait hasznalva kenyelmesen megvalosithatod a tail osztalyt.. ez azert jobb, mintha beleraknad a file osztalyba, mert ha pl. kesobb kelleni fog a head parancs is, akkor nem kell megbolygatni a file osztalyt, eleg irni egy head-et..
-
Sk8erPeter
nagyúr
válasz
sghc_toma #730 üzenetére
Hali!
Köszi, de a feladatkiírásban az is benne van, hogy STL-tárolót NEM szabad használni, így értelemszerűen nem tárolhatom a könyvtári vectorban, saját tárolót kell létrehozni. Épp ez nehezíti az ügyet, ha lehetne STL-t használni, akkor elég gyorsan kész lenne a feladat.
Az std::for_each ugyanígy STL-algoritmus...Az iterátorok létrehozására itt található egy elég jó módszer: [link].
Igazából az operator+ fájlösszefűzés, meg a többi felüldefiniálás jó ötlet, de pl. az összefűzésnek a tail program szempontjából nem biztos, hogy van értelme, mivel ennek nem is alapfunkciója az összefűzés.
Igen, a szöveges állomány egy objektum, de akkor ennek az osztálynak milyen tagfüggvényei legyenek? Beolvasás, utolso_x_sor(), utolso_x_byte(), stb., egyéb ötletek?
Vagy akkor inkább az lenne a jobb módszer, ha ezt az egész objektumot átpasszolnám egy Tail osztálynak, amiben lennének az említett utolso_x_sor(), utolso_x_byte() függvények, amik aztán feldolgozzák az objektumot, és a kívánt sorokat/byte-okat visszaadják a mainnek?
Bocs, hogy ennyi kérdésem van, csak mielőtt nekimegyek a feladatnak, mint tót az anyjának, azelőtt jobb gondolkodni, mi lenne az ideális és egyben kényelmes módszer. -
sghc_toma
senior tag
válasz
Sk8erPeter #727 üzenetére
"Maga a fájl beolvasása legyen külön osztály, aminek a tagfüggvényeit örökli egy másik, pl. a Tail osztály?"
nem.. a feladatkiirasban benne van, hogy magat a szoveges allomanyt kell reprezentalnod egy objektummal.. pl. csinalsz egy osztalyt, aminek van egy std::vector<std::string> adattagja, es ebben tarolod a sorokat.. mondjuk a konstruktor kap parameterkent egy filenevet, megnyitja, beolvassa a file-t, es eltarolja a tartalmat a vektorban.. az operator<< lehet uj sor vektorba rakasa, az operator>> meg egy sor olvasasa.. operaor+ ket file osszefuzese, stb.. az iterator meg a sorokon megy vegig, tulajdonkeppen ugyanaz, mint a vektor iteratora.. igy a tail egesz egszeruen megvalosithato mondjuk az std::for_each-csel, vagy egy sima for ciklussal.."de jelen esetben nem igazán látom gyakorlati hasznát, itt nem kell randomszerűen tudni elérni elemeket, vagy gyorsan az elejére, majd a végére ugrani, vagy hasonló, mint a klasszikus iterátoroknál"
az iterator pont nem a random hozzaferesre lett kitalalva.. ahogy a neve is mutatja, arra valo, hogy egy kontener elemein vegiglepkedj.. -
Mr. Teddy
őstag
Sziasztok!
Volna egy problémám, nem értem mi lehet a hiba.
Van nekem egy "unsigned __int64" változóm. Enek a változónak meg szeretnm pl. adni ezt az értéket: p= 0x0F5<<25 és nagyon fals számot ír ki. Vagyis kiírja a számot jól, csak a felső biteket 1-esekkel feltölti: FFFFFFFFEA000000. És azt kéne, hogy kapjam hogy simán: EA00000000.Mitől lehet ez?
-
Sk8erPeter
nagyúr
válasz
Sk8erPeter #727 üzenetére
A legutsó hülye kérdés volt, ott volt a válasz, hogy "A parancs nevét követő zárójelben a man kötet sorszáma található."
Azt az operátor átdefiniálós dolgot ilyen sablonszerűen minden feladatba beleírták, tehát ahhoz szerintem az én esetemben nem igazán kell ragaszkodni, tekintve, hogy szerintem itt nincs igazán értelme mit overloadolni.
Már nagyjából tanultuk, hogyan lehet saját iterátort létrehozni, de jelen esetben nem igazán látom gyakorlati hasznát, itt nem kell randomszerűen tudni elérni elemeket, vagy gyorsan az elejére, majd a végére ugrani, vagy hasonló, mint a klasszikus iterátoroknál, így itt nem látom olyan sok értelmét. Vagy mégis van? Esetleg velük végig lehet menni a sorokon, esetleg karaktereken....
De ez sima indexeléssel is elérhető, most itt nem tudom, van-e értelme készíteni iterátort.Ha valakinek eszébe jut ötlet, akkor megköszönöm, ha leírja.
-
Sk8erPeter
nagyúr
Hali!
Van egy olyan feladatom, amivel kapcsolatban kíváncsi lennék a véleményetekre, hogy milyen megoldásokat javasoltok.
Egész pontosan ez a feladat szövege:
"Készítsen tetszőleges hosszúságú sorokból álló szöveges állományt reprezentáló objektumot! Valósítsa meg a UNIX tail(1) program funkcióit!
Valósítsa meg az összes értelmes műveletet operátor átdefiniálással (overload), de nem kell ragaszkodni mindenáron az operátorok átdefiniálásához!
Amennyiben lehetséges használjon iterátort!
Demonstrálja a működést külön modulként fordított tesztprogrammal!
A UNIX parancsok pontos leírását a man paranccsal kérdezheti le.
A parancs nevét követő zárójelben a man kötet sorszáma található.
A megoldáshoz NE használjon STL tárolót vagy algoritmust!"A tail() program lényege, hogy kiírja a standard outputra egy paraméterként kapott állomány utolsó 10 sorát. További paraméterezéssel az is elérhető, hogy az utsó n sort vagy n byte-ot írja ki az állományból (a 10 csak alapértelmezett), vagy akár az n-edik sortól kezdődően írja ki egy állomány tartalmát.
Kérdésem hozzátok az lenne, hogy ennek az OOP-s szemléletben történő megvalósítását hogy képzelnétek el? Maga a fájl beolvasása legyen külön osztály, aminek a tagfüggvényeit örökli egy másik, pl. a Tail osztály?
Itt találtam egy lehetséges megvalósítást (átláthatóság kedvéért felraktam a pastebinre), aminek azonban az OOP-hez nem túl sok köze van, nekem viszont objektum-orientáltan kell megvalósítanom az egészet. Ja, és STL-tároló sem használható.Így elsőre milyen javaslataitok lennének a konkrét megvalósítással kapcsolatban?
Hány osztály, milyen tagfüggvények, stb.?Ja, és miért tail(1)? Mi zárójelben az az (1)?
Előre is köszi minden javaslatot!
-
labuwx
tag
Sziasztok!
Szeretnék építeni egy robotot, ami bluetooth-on keresztül kommunikál a számítógéppel.
Arra lennék kíváncsi, hogy mennyire nehéz/hogyan lehet megoldani egy ASUS USB-BT211-gyel történő adat küldést illetve fogadást visual c++-ban? -
WonderCSabo
félisten
válasz
Sk8erPeter #722 üzenetére
Jaja, elvártam volna...
nepszter1: A változók száma attól függ, hogy hány fajta sokszöget, hány fajta módszerrel számolsz, de persze pl a háromszög magassága lehet ua. változó, mint a téglalap magassága és a négyzet oldalhossza. Meg persze csinálhatod egy változóval is, egy vectortt push_backelni, de sztem azt hagyjuk.
-
WonderCSabo
félisten
válasz
Sk8erPeter #717 üzenetére
Vhogy sosem szerettem a caset, de úgy csinálja a kolléga, ahogy akarja.
shev7: hello world már fordul.
-
Sk8erPeter
nagyúr
válasz
WonderCSabo #716 üzenetére
Dehát akkor ilyen alapon az if-ek helyett valóban lehet switch-case is, semmivel sem csúnyább, sőt.
-
WonderCSabo
félisten
válasz
nepszter1 #715 üzenetére
Ha úgy szeretnéd, hogy először megkérdezze, hogy melyik sokször legyen, akkor kell.
Pl.if (teglalap)
{
cout<<"magasság?"
cin>>magassag;
cout<<endl<<"szélesség?";
cin>>szelesseg;
kerulet=(2*magassag)+(2*szelesseg);
terulet=magassag*szelesseg;
cout<<kerulet<<endl<<terulet;
}
if (haromszog)
{
... -
nepszter1
addikt
Üdv, valahogy szeretnék egy progit csinálni c++ hogy adott pl. egy négyzet és a kerülete területe kiszámítása . Vagy pl. téglalap stb .
Hogyan lehetne ezt megoldani ? -
sghc_toma
senior tag
Gyuri16: segiteni sajnos nem tudok, en is nemreg gondolkodtam azon, hogy jo lenne a Vim-et hasznalni IDE-kent, de nem volt tul sok idom foglalkozni vele.. az exVim-re guglizas kozben talaltam, feltettem, kiprobaltam egy projekten, de nem igazan melyedtem meg bele..
doc: nincs mit..
-
Gyuri16
senior tag
válasz
sghc_toma #709 üzenetére
valami ilyesmit ajanl:
ctags -o./_tags -R --c++-kinds=+p --fields=+iaS --extra=+q \
--languages=c,c++,c#,python,vim,html,lua,javascript,uc,math \
--langmap=c++:+.inl,c:+.fx,c:+.fxh,c:+.hlsl,c:+.vsh,c:+.psh,c:+.cg,c:+.shd,javascript:+.as ..
nekem igy se mukodik.egyelore jobb otletem nincs, mint meghekkelni az omnicpp plugint, valahogy ugy, hogy legyen ket kulon tags file (egyik a completenek a masik az ugralasra), es ravenni, hogy mielott kidobja a talalatokat allitsa at a tags valtozot.
lehet majd kesobb megnezem, most a c++ leckemet kellene csinalnom -
Gyuri16
senior tag
nem annyira c++ programozos kerdes, de ide illik inkabb:
most kezdek c++-ban programozni, es ezt vimben teszem. masik topicban mar kaptam helpet ctags-rol, ami nagyjabol mukodott is c-ben. most viszont osszeveszik a omnicppcompletion pluginnal (auto completion). az utobbinak ilyen tags generalast hasznalok: ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
ha ezt hasznalom akkor a completion mukodik, de a fajlban ugralas nem (ctrl+], ctrl+t). ha csak ctags -R * hasznalok akkor pedig az ugralas mukodik de a completion nem. valaki tud ezzel segiteni? -
Sk8erPeter
nagyúr
philoxenia jóarc volt, és kérésemre megváltoztatta a topic nevét egy kissé tisztességesebbre.
Szerintem a "C++ gyors segitseg kellene" cím helyett a "C++ programozás" kicsit jobban hangzik.
-
sghc_toma
senior tag
válasz
WonderCSabo #703 üzenetére
hmm.. milyen forditot hasznalsz? 4.4.3-as GCC-vel mukodik mindket megoldas.. esetleg egy forraskodreszletet be tudsz masolni ide (hatha mashol van a hiba)?
-
sghc_toma
senior tag
válasz
WonderCSabo #701 üzenetére
legjobb tudomasom szerint szep modszer nincs ra, de a clear + str("") kombonak mukodnie kellene.. az, hogy nem tudsz bele irni, mit jelent? hibat dob, vagy csak siman ures marad a stream?
esetleg meg megprobalhatod, hogy torlod az error flag-eket, es a put/get pointereket meg beallitod a stream elejere:stringstreamneve.clear();
stringstreamneve.seekp(0);
stringstreamneve.seekg(0);"Ha csak cleart használok, nem csinál semmit"
nem meglepo, a clear az error flag-eket allitja be... -
WonderCSabo
félisten
Sziasztok!
stringstreammel szívok. Hogy lehet normálisan törölni, majd megint írni bele?
stringstreamneve.str("");
strinstreamneve.clear();függvényekkel törölni tudok, de már újra beleírni nem... Ha csak cleart használok, nem csinál semmit, ha csak strt, akkor kitörli, de megint nem tudok bele írni...
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Olcsó Laptop! Új akkumulátor! Dell Latitude E6540 : I7 4600M / AMD HD8790M / 8GB DDR3 / 128GB SSD
- ÁRGARANCIA!Épített KomPhone i5 10600KF 16/32/64GB RAM RTX 3060 12GB GAMER PC termékbeszámítással
- ÁRGARANCIA!Épített KomPhone Ryzen 7 5800X 16/32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
- Samsung Galaxy Tab S6 Lite 64GB, Újszerű, 1 Év Garanciával
- Apple iPhone 12 Pro Max 128GB Kártyafüggetlen 1Év Garanciával
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest