» »

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.

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;
namesto
std::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
//
// 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
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 ::

moose_man je izjavil:

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.:D
SloTech - če nisi z nami, si persona non grata.

Zgodovina sprememb…

Blazzz ::

Za branje imena lahko uporabis
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 ::

Blazzz je izjavil:

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;
}


 I am a very good CPP programer

I am a very good CPP programer



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…

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.

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.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

c++ problem z chari

Oddelek: Programiranje
171950 (1657) kretze
»

Kruskalov algoritem težave pri implementaciji

Oddelek: Programiranje
51625 (1399) zacetnik11
»

Pomoč pri programiranju v C++

Oddelek: Programiranje
141819 (1386) amacar
»

C++ sort -> help

Oddelek: Programiranje
61500 (1435) robotek87
»

[C++][Naloga_polja]MIN in MAX polja, izpis za x.100 stevil

Oddelek: Programiranje
222944 (2755) snow

Več podobnih tem