Hirdetés
Új hozzászólás Aktív témák
-
b.kov
senior tag
válasz
dangerzone #4218 üzenetére
Szia,
Tudnám ajánlani ezt az oldalt: ExercismVannak fent egyszerűbb, illetve összetettebb feladatok is. Én csak a Swift-es dolgokat néztem, de nekem nagyon jól jött gyakorolni. Főleg, hogy a megoldásod után lehet nézni a community által megírtakat is, és tanulni belőlük.
-
b.kov
senior tag
válasz
gergoavideki #4176 üzenetére
Szia!
Szerintem nyugodtan írhatod ide is a problémádat, több szem többet lát. -
b.kov
senior tag
Hát akkor tényleg azt tudom mondani, hogy bekéred az első sorban az adatot, h melyik konstruktornak kell lefutnia, aztán az alapján annyit olvasol std::cin-nel, ahány paraméteres a kiválasztott konstruktor.
Igazából ha nem engednek STL konténereket (meg gondolom algoritmusokat sem), akkor talán ez a legegyszerűbb módszer.
szerk.: a scanf-es megoldás, meg vagdosás sokkal inkább favágómódszernek tűnik nekem
-
b.kov
senior tag
válasz
choco01 #4056 üzenetére
Ennek a pointernek a segítségével hozod létre az egyes kölcsönzőkhöz tartozó tömböket, amiknek az eleme "kolcsonzes" típusúak. Tehát ha pontosabbak akarunk lenni, akkor azt is lehet mondani, hogy a k pointered ennek a tömbnek a fejelemére mutat. A
k[i]
pedig a fejelemtől i. távolságra lévő elemre.Ennek a pointernek pontosan azért kell privátnak lennie, mivel minden egyes "kolcsonzo" példány létrehozásával egy file-ból olvasod be a kölcsönzéseket. Ezek ugye statikus adatok, amiken később nem szeretnél vátloztatni. Tehát ne lehessen azt mondani, h pl. "mintaKolcsonzo" objektumon keresztül, a 3. kolcsonzés idejét megváltoztatod. Tehát:
kolcsonzo mintaKolcsonzo("inputFile_1");
Ekkor beolvasod ugye a fájlból a statikus adatokat. Nem lenne jó, ha ezután tudnál ilyet csinálni:
mintaKolcsonzo.k[2]->datum = "Buddha szobor";
Persze létezik igény fájlból beolvasott adatok utólagos módosítására (sőt), viszont ez akkor sem szép megoldás. Arra külön setter függvényeket szokás írni, csakúgy mint a mostani getter függvények.
Tehát az előző példában ha megengednénk a dátum módosítását, akkor így lenne mondjuk szép:
mintaKolcsonzo.modifyDate(2, "2018.02.03");
Ahol ez első paraméter a kölcsönzés száma, a második pedig az új kölcsönzési dátum. -
b.kov
senior tag
válasz
choco01 #4054 üzenetére
Ha van valami konkrét kérdésed, akkor írd nyugodtan, de egyébként jól látod szerintem a dolgokat.
Ha nincs öröklődés, akkor a protectedet felejtsd el egy kicsit, és csak a public-private részre koncentrálj.Nagyon egyszerűen tényleg csak annyi a dolog, hogy a privát adattagokhoz/függvényekhez kintről (az osztály példányain keresztül) nem lehet közvetlenül hozzáférni. Ez ugye az enkapszuláció lényege, előttem jól meg lett fogalmazva.
-
b.kov
senior tag
válasz
choco01 #4052 üzenetére
Nem rosszabb semmivel, azonban ekkor a stack-en jön létre az objektum, ahogy írták is korábban.
Amíg nem indokolt pointerek használata, addig egyébként is érdemes kerülni őket. Majd ha belemerülsz jobban a témába, és szembe jön veled a dinamikus kötés, referencia szerinti paraméterátadás, öröklődés, stb... akkor érdemes foglalkozni jobban a pointerekkel is. Addig tanulgatni teljesen jó ez a módszer is, ahogyan most csinálod.
-
b.kov
senior tag
válasz
m.zmrzlina #4008 üzenetére
Ha ingyenes, és jó IDE-t szeretnél használni, akkor Windowson van Visual Studio, amiben tudsz C++ alkalmazásokat készíteni.
Én Linuxon/macOS-en semmi ingyeneset nem használok, inkább parancssor, vagy CLion, ami nem ingyenes.De egyébként kisebb programokhoz felesleges IDE-vel bajlódni szerintem, hacsak nem szeretnéd elsajátítani az adott fejlesztői környezet tulajdonságait.
-
b.kov
senior tag
válasz
m.zmrzlina #4001 üzenetére
Esetleg próbáld meg ugyanezt a kódot parancssorból fordítani, -std=c++11 flaggel.
-
b.kov
senior tag
válasz
PandaMonium #3989 üzenetére
Nálunk detto 50 sor, persze néha kivitelezhetetlen.
-
b.kov
senior tag
-
b.kov
senior tag
válasz
m.zmrzlina #3971 üzenetére
Hát igen, azt mondják, hogy a programozás egyik legkihívóbb feladata a konzisztens nevek használata. Tehát egyébként sem szokás a, b, c neveket adni változónak, mert ha egy kicsit is összetettebb a program, akkor rengeteg idő elmehet azzal, hogy megértse más, te mire is gondoltál éppen akkor.
Egyébként igen, amit írtál az "teljesen jó", tehát lefordul, és működni is fog. Én személy szerint azért kerülöm, és kiírom a paraméterneveket is. Ez főleg akkor is hasznos, ha majd pl interfészeket írsz osztályokhoz, aztán szintén jön megint valaki, akinek sokkal egyszerűbb lesz megérteni egy-egy függvény működését, ha látja a paramétereit is annak.
-
b.kov
senior tag
válasz
m.zmrzlina #3968 üzenetére
Szia!
Felesleges ilyenkor külön változókat létrehozni csak azért, hogy egyenlővé tedd a paraméterekkel, hiszen a paraméterek is ekkor lokális változók lesznek a függvényre nézve, melyek a függvény hívásakor lesznek megkonstruálva az adott paraméterek alapján.Tehát a fenti példádban az a, b és c akkor fog létrejönni, mikor meghívod a main-ben a fvAkarmi-t, és ekkor a megadott értékekkel fognak inicializálódni (2, 5, 10). Ezek után teljesen felesleges még 3 változót létrehozni, nem leszel előrébb semmivel.
A másik kérdésre pedig: a függvény deklarációjánál nem fontos neveket megadni, de definíciónál annál inkább, hogy tudj hivatkozni a paraméterekre. Lefordulni lefordul ha nem teszed meg, de én nem láttam még ilyet a gyakorlatban.
-
b.kov
senior tag
válasz
m.zmrzlina #3939 üzenetére
Mondjuk szélsőséges esetben túlcsordul az int változó, és a legnagyobb felvett értéke után megnöveled -> felveszi a lehető legkisebb értéket (valami mínusz szám, attól függ, hány byte-on van ábrázolva). Ez ugye akkor probléma, ha pl. az arr.size() nagyobb, mint az int változó maximálisan felvehető értéke.
És konkrétan így nézne ki (egy általános esetben):
i = 0, i = 1, ... , i = 32767 , i = –32767 , ... , i = 32767 -> végtelen ciklus, ha pl az arr.size() nagyobb, mint 32767 . De mégegyszer említem, ez elég szélsőséges eset.Próbálj minél pontosabb típusokat használni, szebb, később olvashatóbb kódot fogsz így írni, illetve elkerülöd a warningokat (amiket pont az ilyen esetek miatt szeretünk).
Szerk.: igen, az előttem szólóhoz hozzákapcsolódva, size_t-vel jobban jársz.
-
b.kov
senior tag
válasz
daninet #3925 üzenetére
Nem-nem, az std konténereknek pont ez a feladatuk, hogy helyettesítsék a régi tömböket.
Nagyobb a választék, feladatonként eltérően tudsz dönteni közülük, hogy melyik számodra éppen a legoptimálisabb.
Sok esetben nem kell a memória allokálásával, deallokálásával foglalkoznod.
Sok jó setter/getter műveleteik vannak, és működnek rájuk az std algoritmusok.Szóval ha van egy kis időd, nagyon érdemes rájuk szánni.
Érdemes esetleg itt kutakodni. -
b.kov
senior tag
válasz
daninet #3923 üzenetére
Beolvasod az N-et, aztán indítasz egy ciklust, ami N-szer fog lefutni. A ciklusmagban pedig szépen belepakolod a vectorba a beolvasott értéket, hiszen az egy tároló, amivel a tömböt helyettesíted.
Nagyon egyszerűen:
#include <iostream>
#include <vector>
int main(int argc, char** argv)
{
int N; // jatekosok szama
std::cin >> N;
std::vector<std::string> names;
for(int i = 0; i < N; ++i)
{
// beolvasas
std::string tmpName;
std::cin >> tmpName;
// vektorba iras
names.push_back(tmpName);
}
return 0;
} -
b.kov
senior tag
válasz
m.zmrzlina #3899 üzenetére
Esetleg használhatnál funktorokat, ebben az esetben ideálisak lehetnek.
Ha nem ismernéd, akkor kb ennyit csinál:
A functor is pretty much just a class which defines the operator(). That lets you create objects which "look like" a function:Lényegében csinálsz 2 struct-ot (Less, Greater), amiben túlterheled a () operatort. Ekkor a csere függvényed sablonargumentuma lehetne pl. Compare, az utolsó függvényargumentum pedig ilyen Compare típusú.
Ha bővebben érdekel a téma: C++ jegyzet, 71. oldal (Funktorok).
-
b.kov
senior tag
válasz
dobragab #3896 üzenetére
Mentségemre szóljon, hogy igyekeztem valamiféle párhuzamot vonni az előző kódokkal, így van benne getline, és stringstream.
De természetesen igazad van, felesleges stringekbe olvasgatni.
Másrészt, az olvashatóság szerintem teljesen szubjektív dolog, és megszokás kérdése.
Mobilról viszont elhiszem, hogy gyötrelem olvasni megfelelő indentálás nélkül, kódtól függetlenül. -
b.kov
senior tag
válasz
#74220800 #3893 üzenetére
Üdv!
Nem egy kezdőszelet, de ha tanulod a nyelvet, előbb-utóbb úgyis el fogod hagyni a tömböket valószínűleg, és helyette stl konténereket, és algoritmusokat fogsz használni.Itt van egy gyors szösszenet C++11-es módszerrel a problémádra:
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <iterator>
#include <algorithm>
// Returns a matrix (N x M), storing read data from file
std::vector<std::vector<int32_t>> readData(std::string fileName)
{
// Open file
std::ifstream input;
try
{
input.open(fileName);
}catch(std::ios_base::failure& e)
{
std::cerr << e.what() << std::endl;
return std::vector<std::vector<int32_t>>();
}
std::string line; // For reading line by line
input >> line; // Reading N
std::vector<std::vector<int32_t>> result(std::stoi(line)); // Returnable vector
std::getline(input, line); // Reading M, but do not store
// Write from file to matrix
for(auto& matrixLine : result)
{
std::getline(input, line);
std::istringstream stringOfNumbers(line); // Split line into individual strings
// Perform a transform for storing string chunks as integers in line of matrix
std::transform(std::istream_iterator<std::string>(stringOfNumbers),
std::istream_iterator<std::string>(),
std::back_inserter(matrixLine),
[](const std::string& stringOfNumber)
{
return std::stoi(stringOfNumber);
});
}
return result;
}
int main(int argc, char** argv)
{
std::vector<std::vector<int32_t>> result = readData("input.txt");
// Writing the output into stdout
for(auto line : result)
{
for(auto elem : line)
{
std::cout << elem << ", ";
}
std::cout << std::endl;
}
return 0;
}Természetesen nem teszteltem teljes körűen, csak egyetlen bemenetre, de arra működött.
input.txt:
5 7
2 3 4 -4 3 1 0
-3 2 1023 3 -32 8 9
-2 1 0 22 3 4 93
5 3 8 2 -9 3 -9321
2 3 4 -4 3 1 0
Ú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!
- Autós topik
- Samsung Galaxy A56 - megbízható középszerűség
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- BestBuy topik
- OLED TV topic
- Blu-ray lejátszók
- Megérkeztek a Xiaomi 15T sorozatának telefonjai Magyarországra
- Mibe tegyem a megtakarításaimat?
- pusszycat: JEYI - okos, színes, interaktív, ssd külső ház.
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- További aktív témák...
- ÁRGARANCIA!Épített KomPhone Ryzen 5 7600X 32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
- Samsung Galaxy A32 128GB, Kártyafüggetlen, 1 Év Garanciával
- Samsung Galaxy S23 Ultra 256GB Kártyafüggetlen 1Év Garanciával
- GYÖNYÖRŰ iPhone 14 Pro 256GB Deep Purple -1 ÉV GARANCIA - Kártyafüggetlen, MS3351
- iPhone 14 Pro Max 128GB Space Black -- 100% EREDETI AKKU, 1ÉV
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft.
Város: Budapest