Forum » Programiranje » c++ rabim pomoč
c++ rabim pomoč
kretze ::
dober dan imam 2 vprašanji...na spodnji kodi ko bi rad podal ime mi enostavno preskoči in gre takoj na podajanje golov(verjetno nimam nekaj dobro pri vnosu cin)...in pa zanima me če imam prav funkcijo odtrani....pa hvala za odgovore
#include <iostream> #include <stdlib.h> #include <string> using namespace std; class nogometasi { string ime[50]; int stevilo_golov[50]; int stevec = 0; public: void vpis_nogometasev() { cout << "ime nogometasa " << endl; cin >> ime[stevec]; cout << "stevilo golov nogometasa " << endl; cin >> stevilo_golov[stevec]; stevec++; } void skipnoSteviloGolov() { int skupaj = 0; for (int i = 0; i < stevec; i++) skupaj += stevilo_golov[i]; cout << "stevilo skupnih golov je " << skupaj; } void odstrani() { string a; for (int i = 0; i < stevec; i++) if (ime[i]==a) stevilo_golov[i] = 0; } void izpis() { for (int i = 0; i < stevec; i++) { cout << "\n" << ime[i]; cout << " " << stevilo_golov[i]; } } }; int main() { nogometasi n; int x; do { cout << "sedaj sledite stevilkam...in izberite eno izmed moznosti" << "stevila 5 je za IZHOD!! " << endl; cout << "\n1: vpis nogometasa "; cout << "\n2: skupno stevilo golov "; cout << "\n3: odstrani nogometasa "; cout << "\n4:izpis nogometasa "; cout << "\n5: IZHOD " << endl; cin >> x; switch (x) { case 1: n.vpis_nogometasev(); break; case 2: n.skipnoSteviloGolov(); break; case 3: n.odstrani(); break; case 4: n.izpis(); break; case 5: break; default: cout << "napacen vnost izberi eno izmed stevil!! "; } } while (x != 5); system("pause");// return 0; }
moose_man ::
Kaj naj bi po tvojem metodo odstrani() počela? Najbrž si ne predstavljaš prav, kaj ta koda počne, zato sem metodo opremil s komentarji, da ti osvetlijo, kaj si pravzaprav napisal:
void odstrani() { string a; // ustvariš string, ki je po defaultu prazen (ima dolžino 0) for (int i = 0; i < stevec; i++) if (ime[i]==a) // preveriš, če je i-to ime enako a (a pa je prazen string) stevilo_golov[i] = 0; // število golov i-tega nogometaša postaviš na 0 }
Zgodovina sprememb…
- spremenilo: moose_man ()
BivšiUser2 ::
Kaj nucas za IDE? Devc++? Presaltaj na VS in se nauci z in built debuggerjem delat. Ti bo pomagalo. Btw, a ni za string "getline" funkcija?
SloTech - če nisi z nami, si persona non grata.
kretze ::
vem da funkcija odstrani postavi število golov na nič....S4NNY1 sem sprobal getline(cin ime) pa mi še vedno ne deluje..
moose_man ::
Poskusil ti bom pomagat, da boš sam odkril je narobe, tako da boš mel kaj od tega.
Korak 1: Poženi ta preprost program. Najprej vpiši ime z eno besedo ("ime"), nato pa še ime z dvema besedama ("ime priimek"). Nato pojdi na internet in v dokumentacijo poiskat zakaj je temu tako.
Korak 2: V zgornjem programcku std::cin nadomesti s klicem na getline in ponovno opazuj kaj se zgodi. Na internetu pobrskaj za informacijami da boš lahko razumel, zakaj sta rezultata v obeh korakih drugačna.
Korak 3: Tole je pa že zdaj zelo močan hint. Preuči delovanje spodnjega programa in se na internetu poduči o tem, na kaj moraš pazit če izmenično uporabljaš cin in getline ...
Korak 1: Poženi ta preprost program. Najprej vpiši ime z eno besedo ("ime"), nato pa še ime z dvema besedama ("ime priimek"). Nato pojdi na internet in v dokumentacijo poiskat zakaj je temu tako.
int main(int argc, char** argv[]) { std::string str; std::cout << "Input: " << std::endl; std::cin >> str; std::cout << "What was read: " << str << std::endl; return 0; }
Korak 2: V zgornjem programcku std::cin nadomesti s klicem na getline in ponovno opazuj kaj se zgodi. Na internetu pobrskaj za informacijami da boš lahko razumel, zakaj sta rezultata v obeh korakih drugačna.
Korak 3: Tole je pa že zdaj zelo močan hint. Preuči delovanje spodnjega programa in se na internetu poduči o tem, na kaj moraš pazit če izmenično uporabljaš cin in getline ...
int main(int argc, char** argv[]) { int num = 0; std::string str; std::cout << "Input an integer: " << std::endl; std::cin >> num; std::cout << "Input a string: " << std::endl; std::getline(std::cin, str); std::cout << "Integer from cin: " << num << std::endl; std::cout << "String from getline" << str << std::endl; return 0; }
BivšiUser2 ::
Mene pa zanima kaki problemi lahko nastanejo, če imaš
using namespace std;namesto
std::cin ...?
SloTech - če nisi z nami, si persona non grata.
Vesoljc ::
BivšiUser2 je izjavil:
Mene pa zanima kaki problemi lahko nastanejo, če imašusing namespace std;namestostd::cin ...?
ne bi smel imet nobenih problemov. prej se lahko zgodi kontra, da uporabljas vec namespaceov in pride konfliktov, ko prevajalnik ne ve kaj klices.
predstavli si, da mas 2 namespacea, kjer mata oba isto funkcijo. potem pa reces using a, using b; in klices func(). katero klices?
Abnormal behavior of abnormal brain makes me normal...
BivšiUser2 ::
Saj verjetno so namespacei večinoma itak, deviantni, da res če ne pišeš svoje ne rabiš tega met.
SloTech - če nisi z nami, si persona non grata.
moose_man ::
Na velikih projektih (stotisoci, miljoni vrstic), sploh ce je vkljucenih veliko zunanjih knjiznic, ugotovis zakaj je pomembno da vzdrzujes osnoven nivo higiene pri namespaceih. Na internetu je ogromno napisanega na to temo ...
legacy_header.hpp
my_shiny_new_header.hpp
some_cpp_somewhere.cpp
PS: in jap, da se dobit kar lepe denarje če si sposoben takšne projekte vzdrževat, nadgrajevat in spravljat v red.
legacy_header.hpp
// // Nekdo je nekoc napisal funkcijo za vsoto, ki bo zelo // hitro overflowala ce bodo stevila v vectorju 8-bitni inti, // ta funkcija je v globalnem namespaceu in v headerju z nekaj // 10000 vrsticami in nihce vec se ne spomni da je tam // template<typename T> T sum(std::vector<T> const& vec) { T sum = 0; for(auto number : vec) sum += number; return sum; }
my_shiny_new_header.hpp
namespace moose_man; // // Jaz sem v svoji knjiznici v nekem headerju napisal taksno funkcijo za vsoto. // Funkcija je dobro preizkusena, zanjo je narejen dober unit test in ji 100% zaupam. // uint64_t sum(std::vector<uint8_t> const& vec) { uint64_t sum = 0; for(auto number : vec) sum += number; return sum; }
some_cpp_somewhere.cpp
#include <my_shiny_new_header.hpp> // Spodnji header includea nek drug header, ki includea nek // tretji header, ..., v katerem je vrstica #include <legacy_header.hpp> #include <some_header.hpp> void foo() { std::vector<uint8_t> integers; // Ce ne preverim namespaceov in napisem tole nastane grd problem ... uint64_t number = sum(integers); }
PS: in jap, da se dobit kar lepe denarje če si sposoben takšne projekte vzdrževat, nadgrajevat in spravljat v red.
Zgodovina sprememb…
- spremenilo: moose_man ()
moose_man ::
Pri sestavljanju zgornjega posta sem se v naglici seveda zatipkal in pozabil oklepaje pri namespaceu:
my_shiny_new_header.hpp
my_shiny_new_header.hpp
namespace moose_man { uint64_t sum(std::vector<uint8_t> const& vec) { uint64_t sum = 0; for(auto number : vec) sum += number; return sum; } }
kretze ::
int main(int argc, char** argv[]) { int num = 0; std::string str; std::cout << "Input an integer: " << std::endl; std::cin >> num; std::cout << "Input a string: " << std::endl; std::getline(std::cin, str); std::cout << "Integer from cin: " << num << std::endl; std::cout << "String from getline" << str << std::endl; return 0; }
jas probavam gledam na netu pa še vedno nevem v čem je fora ker mi ne deluje...ker korešim za string mi pa integer ne deluje
kretze ::
oi kaj bi lahko kdo povedal kaj je vse s to kodo narobe oz kaj je sploh prav?? ker še zdaj nevem pa googlam kar veliko zdaj sem ugotovil(nekako) koka vnes string in integer not dodal sem cin.ignore(nevem če je to trajna rešitev al samo začasana) mi pa funlcija odstrani sploh ne dela ko pritisnem 3 za odstrani mi kar to funlcijo preskoči pri funkciji izpis pa mi vedno zadnjega izpiše...
#include <iostream> #include <stdlib.h> #include <string> using namespace std; class nogometasi { string ime[15]; int stevilo_golov[50]; int stevec = 0; public: void vpis_nogometasev() { cin.ignore(); cout << "ime nogometasa " << endl; getline(cin, ime[15]); cout << "stevilo golov nogometasa " << endl; cin >> stevilo_golov[stevec]; stevec++; } void skipnoSteviloGolov() { int skupaj = 0; for (int i = 0; i < stevec; i++) skupaj += stevilo_golov[i]; cout << "stevilo skupnih golov je " << skupaj; } void odstrani() { string a; getline(cin, a); for (int i = 0; i < stevec; i++) if (ime[i]==a) stevilo_golov[i] = 0; } void izpis() { for (int i = 0; i < stevec; i++) { cout << ime[15] << endl; cout << stevilo_golov[i] << endl; } } }; int main() { nogometasi n; int x; do { cout << "sedaj sledite stevilkam...in izberite eno izmed moznosti" << "stevila 5 je za IZHOD!! " << endl; cout << "\n1: vpis nogometasa "; cout << "\n2: skupno stevilo golov "; cout << "\n3: odstrani nogometasa "; cout << "\n4:izpis nogometasa "; cout << "\n5: IZHOD " << endl; cin >> x; switch (x) { case 1: n.vpis_nogometasev(); break; case 2: n.skipnoSteviloGolov(); break; case 3: n.odstrani(); break; case 4: n.izpis(); break; case 5: break; default: cout << "napacen vnost izberi eno izmed stevil!! "; } } while (x != 5); system("pause");// return 0; }
BivšiUser2 ::
Pri sestavljanju zgornjega posta sem se v naglici seveda zatipkal in pozabil oklepaje pri namespaceu.
Ja, sem ravno prišel do take zmede. V Unityja sta dve Random funkciji, katerima moraš pisat namespace, ker drugače kompiler res ne ve kero si mislil.
SloTech - če nisi z nami, si persona non grata.
Zgodovina sprememb…
- spremenil: BivšiUser2 ()
Blazzz ::
Za branje imena lahko uporabis
formatiranje kode je nekonsistentno, uporabi clang-format ali karkoli drugega.
Poimenovanje je nekonsistentno, enkrat za ime metode uporabljas lowerCamelCase, naslednjic snake_case.
tole je krneki. Uporabi katerega od stl kontejnerjev. Morda,
tu predpostavljam, da so imena unikatna in da zelis imeti samo eno stevilko na ime. Ce predpostavka ne drzi, potem uporabi kaj drugega.
in nato
je undefined behavior. Namesto, da operiras z c arrayi, raje uporabi kater od struktur v stl.
.....
std::string ime; std::cin > ime;
formatiranje kode je nekonsistentno, uporabi clang-format ali karkoli drugega.
Poimenovanje je nekonsistentno, enkrat za ime metode uporabljas lowerCamelCase, naslednjic snake_case.
string ime[15]; int stevilo_golov[50]; int stevec = 0;
tole je krneki. Uporabi katerega od stl kontejnerjev. Morda,
std::map<std::string, int>
tu predpostavljam, da so imena unikatna in da zelis imeti samo eno stevilko na ime. Ce predpostavka ne drzi, potem uporabi kaj drugega.
string ime[15];
in nato
cout << ime[15] << endl;
je undefined behavior. Namesto, da operiras z c arrayi, raje uporabi kater od struktur v stl.
.....
Zgodovina sprememb…
- spremenil: Blazzz ()
moose_man ::
Za branje imena lahko uporabis
std::string ime;
std::cin > ime;
Je to res dobra ideja, če delaš s stringi? ^^
int main(int argc, char** argv[]) { std::string str; std::cout << "What is my name: " << std::endl; std::cin >> str; std::cout << "My name is: " << str << std::endl; return 0; }
O ostalem pa ne bi. Vem, da hočeš samo dobro. Ampak problem OP-jeve kode ni v formatiranju, poimenovanju, STL algoritmih. Vse to bi kodo izboljšalo (STL sploh, itak), ampak v tej kodi ki jo je predstavil OP, to ni kritično. Kritično je, da ne razume konceptov, ki jih uporablja.
Zgodovina sprememb…
- spremenilo: moose_man ()
moose_man ::
kretze:
Pri branju številke z operatorjem >> od std::cin ostane v input streamu poseben znak - tako imenovani newline character. Pri naslednjem klicu na getline se branje nadaljuje pri tem znaku. Ker ima ta znak poseben pomen (poišči na netu kakšen), se branje v string takoj uspešno zaključi in rezultat branja je prazen string, kljub temu, da uporabnik ni ničesar vpisal.
Če hočeš obdržat kombinacijo cin >> in getline, ti priporočam, da cin.ignore() kličeš takoj za klicem na cin >>. Če vpišeš številko 3 in če se ti kliče funkcija odstrani(), se zgodi to, kar sem napisal zgoraj.
Pri branju številke z operatorjem >> od std::cin ostane v input streamu poseben znak - tako imenovani newline character. Pri naslednjem klicu na getline se branje nadaljuje pri tem znaku. Ker ima ta znak poseben pomen (poišči na netu kakšen), se branje v string takoj uspešno zaključi in rezultat branja je prazen string, kljub temu, da uporabnik ni ničesar vpisal.
Če hočeš obdržat kombinacijo cin >> in getline, ti priporočam, da cin.ignore() kličeš takoj za klicem na cin >>. Če vpišeš številko 3 in če se ti kliče funkcija odstrani(), se zgodi to, kar sem napisal zgoraj.
Isotropic ::
je to res, da sta cin in cout smatrana kot bolj faila sintakse cppja?
ne vem zakaj ze, mogoce zato, ker je drugacna sintaksa kot _vse ostalo_ ali nekaj takega.
mislim da obstaja tudi ena knjiznica, ki ju nadomesti z modernim analogom printf in omogoča še replacement fields za stringe (kot python) itd.
ne vem zakaj ze, mogoce zato, ker je drugacna sintaksa kot _vse ostalo_ ali nekaj takega.
mislim da obstaja tudi ena knjiznica, ki ju nadomesti z modernim analogom printf in omogoča še replacement fields za stringe (kot python) itd.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | c++ problem z chariOddelek: Programiranje | 1950 (1657) | kretze |
» | Kruskalov algoritem težave pri implementacijiOddelek: Programiranje | 1625 (1399) | zacetnik11 |
» | Pomoč pri programiranju v C++Oddelek: Programiranje | 1817 (1384) | amacar |
» | C++ sort -> helpOddelek: Programiranje | 1500 (1435) | robotek87 |
» | [C++][Naloga_polja]MIN in MAX polja, izpis za x.100 stevilOddelek: Programiranje | 2944 (2755) | snow |