Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Boxa membrana tweeter infundata

ajutor

Whisky for Mac

Xiaomi 14 Gpay
 Izolare zid exterior de scandura

Dezinstalare drivere W11 23H3

Recomandare masina de spalat fiab...

BSOD din cauza Intel Audio DSP dr...
 De ce sunt oamenii nostalgici

Cum vand casa fara factura Hidroe...

Scor FICO minim

Tonometru compensat CAS?
 polita RCA ONLINE

Termostat frigider - verificare

Mai au PC-urile vreun viitor?

Centrala termica immergas
 

Provocarea săptămânii – Output

* * * * * 1 votes
  • Please log in to reply
9 replies to this topic

#1
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Un set de provocari pe acelasi subiect pentru cine vrea sa-si testeze cunostiintele de C si/sau C++.

Nivel usor spre mediu (C++)

Sa se implementeze o clasa ce imita std::cout, folosind printf. Adica sa pot scrie:

std::string nume1 = "Ion";
const char* nume2 = "Vasile";
int suma = 10;
ceva << nume1 << " e cu " << suma << " euro mai bogat decat " << nume2 << '\n';


Iar codul sa afiseze in consola (cu ajutorul printf) fix ce ar fi afisat daca as fi folosit std::cout in loc de ceva.

E suficient daca suporta caractere, siruri (char*, std::string) si numere intregi (pozitive/negative).

Nivel mediu spre greu (C++)

Problema de mai sus, dar sa suporte si float/double alaturi de specificarea preciziei (setprecision)

Nivel mediu (C )

Sa se implementeze o functie similara lui printf, doar pentru (siruri de) caractere si numere intregi. Functia se va folosi de puts pentru a afisa caracterele.

Nivel mediu-ridicat (C++)

Sa se implementeze o functie similara lui printf, doar pentru (siruri de) caractere si numere intregi, ce insa nu necesita specificarea tipurilor argumentelor.

Adica, daca printf apelez ca:

printf("%s e cu %d euro mai bogat decat %s\n', nume1, suma, nume2);


Noua functie s-o apelez in felul urmator, ea dandu-si singura seama ca numele sunt siruri de caractere, pe cand suma e un intreg.

functie("%% e cu %% euro mai bogat decat %%\n', nume1, suma, nume2);


Edited by dani.user, 13 December 2017 - 18:28.


#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
~ 2 saptamani mai tarziu: nici o incercare?

#3
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,664
  • Înscris: 29.08.2013
O tentativa la primele 2 la 12 noaptea Posted Image :

Spoiler
Ma cam nemultumeste abordarea in legatura cu precizia.

Edited by sftpdt, 05 January 2018 - 00:52.


#4
LittleWho

LittleWho

    Member

  • Grup: Members
  • Posts: 288
  • Înscris: 30.11.2013
Aveam un printf facut mai de mult, asa ca m-am gandit sa implementez cout-ul cu el, momentan nu am suport pentru float-uri, doar pentru afisat string-uri si int-uri (baza 10 si 16). Ar trebui bagat niste error checking si niste cod mai generic pe la chestia cu bazele, dar o sa revin cu o versiune imbunatatita.

Spoiler

Edited by LittleWho, 05 January 2018 - 12:50.


#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Felicitari pentru curaj Posted Image

customPrint(unsigned precision)
{
	if (precision <= 15)
		this->precision = precision;
	else
		this->precision = 5;
}
customPrint()
{
	this->precision = 5;
}


Se cam obisnuieste folosirea sintaxei de initializare speciala a constructorilor.

customPrint& operator<<(const double number)
{
	char printArg[20] = "%.";
	char precisionStr[20];
	sprintf(precisionStr, "%u", this->precision);
	strcat(printArg, precisionStr);
	strcat(printArg, "f");
	printf(printArg, number);
	return *this;
}


O posibila imbunatatire: profitand de faptul ca preciziile disponibile sunt in numar redus, poti crea un array static cu ce trebuie trimis catre printf pentru fiecare valoare a preciziei.

const value


Cand pasezi by-value nu mai e atat de important const, dar poate preveni unele erori.

customPrint setPrecision(const unsigned decimals) {
	return customPrint(decimals);
}


Nu-mi place ca returnezi o noua instanta a clasei de printare. Vezi daca reusesti sa folosesti manipulatori.

outstream& operator<<(const manipulator& m) {
	if (m.precision != NOT_INITIALIZED_MANIPULATOR_FIELD)
		this->precision = m.precision;
	if (m.base != NOT_INITIALIZED_MANIPULATOR_FIELD)
		this->base = m.base;
	return *this;
}

Aici apare o problema de responsabilitati. outstream& n-ar trebui sa stie nimic legat de logica manipulatorilor (de exemplu n-ar trebui outstream sa stie ca manipulatorul modifica precizia)

Edited by dani.user, 05 January 2018 - 20:11.


#6
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,664
  • Înscris: 29.08.2013
Spoiler


#7
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Much better

#8
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,664
  • Înscris: 29.08.2013

View Postdani.user, on 13 decembrie 2017 - 18:27, said:

functie("%% e cu %% euro mai bogat decat %%\n', nume1, suma, nume2);


template<typename T>
void func(T t) {
	  std::cout << t;
}

template<typename T, typename... Args>
void func(T t, Args... args) {
	  std::cout << t;
	  func(args...) ;
}

func("Maria are ", 3, " mere si ", '5', " pere"); // Maria are 3 mere si 5 pere


Pe principiul asta?

Edited by sftpdt, 06 January 2018 - 22:41.


#9
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Da, cu variadic templates

#10
LittleWho

LittleWho

    Member

  • Grup: Members
  • Posts: 288
  • Înscris: 30.11.2013
Am gasit o solutie, intamplator, pentru cerinta cu printf-ul, nu e a mea, dar zic sa o postez oricum.
Spoiler


Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate