Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cu ce va aparati de cainii agresi...

Nu imi platiti coletul cu cardul ...

Mi-au disparut amigdalitele ?

Exista vreun plan de terorizare p...
 Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024

Suprasolicitare sistem electric
 CIV auto import

Mutare in MOZAMBIC - pareri, expe...

Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...
 Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...

Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...
 

Critici tehnice bilaterale

- - - - -
  • Please log in to reply
5 replies to this topic

#1
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007

 WinstonMontana, on 06 aprilie 2018 - 12:01, said:


mai jos ai nucleul codului care face ce vrei tu(codul  a fost compilat cu Microsoft Visual Studio):

#include "stdafx.h"
#include <string>
#include <iostream>
#include <vector>
using namespace std;
struct elev {
string nume;
int nota;
elev(string nume0, string nota0) {
nume = nume0;
nota = (nota0 != "10") ? (int)nota0[0] - 48 : 10; //vezi https://www.asciitable.com/, coloanele Dec si Chr incepand cu Dec = 48
}
};
int main(){
string fisier[17] = {
"[se ignora acest rand]",
"Gigel", "3",
"Miaunel", "10",
"Gargamel", "5",
"Broscuta", "9",
"Patratel", "4",
"Costica", "3",
"Luta", "9",
"Asparaghel","5"
};
//construim catalogul nostru
vector<elev> catalog;
for (int i = 1; i <= (17-2); i++) {
catalog.push_back(elev(fisier[i], fisier[i + 1]));
}

//construim listarea elevilor in ordine descrescatoare a notelor
string rezultat = "";
for (int i = 10; i >= 1; i--) {
for (auto &elev : catalog) {
if (elev.nota == i) {
rezultat += elev.nume + ", ";
}
}
rezultat = rezultat.substr(0, rezultat.size()-2);
cout << "nota " << i << " au elevii:" << (rezultat.size() == 0 ? "nici unul" : rezultat)<<endl;
rezultat = "";
}
system("PAUSE");
return 0;
}

outputul este:

O solutie logica, dar cam de nota 6-7 daca e sa avem pretentii. Observatiile mele:
  • Ce e stdafx.h? Eu stiu ce e, dar initiatorul putin probabil. Iar daca tot avem precompiled header, de ce sunt headerele de baza incluse separat (defeats the purpose)
  • De ce e folosit acel 0 in cadrul elev(string nume0, string nota0)?
  • De ce se face referire la ascii table pentru a justifica valoarea lui 48, cand se poate scrie direct '0'?
  • De ce se face parsare manuala string -> int?
  • De ce e hardcodat inputul sub forma unui array de stringuri? Utilizarea stringstream e mult mai asemanatoare cerintei care zice de citirea dintr-un fisier
  • De ce e introdus un rand doar pentru a-l ignora?
  • Constante magice: 17, 2... Se pot evita cu totul chiar in forma actuala
  • Rezultatul separa valorile prin ", " cand cerinta specifica separare prin spatiu
  • system("pause"), folosit pentru a aduce beneficii neglijabile, e un risc destul de mare din punct de vedere al securitatii

Edited by dani.user, 06 April 2018 - 22:33.


#2
WinstonMontana

WinstonMontana

    Active Member

  • Grup: Members
  • Posts: 1,913
  • Înscris: 20.02.2018

Quote

Ce e stdafx.h? Eu stiu ce e, dar initiatorul putin probabil. Iar daca tot avem precompiled header, de ce sunt headerele de baza incluse separat (defeats the purpose)
Nici eu nu stiu, Visual Studio mi l-a pus.El stie

Quote

De ce e folosit acel 0 in cadrul elev(string nume0, string nota0)?
ca sa nu am : nume = nume ( si nu vreau sa folosesc pointeri)

Quote

De ce se face referire la ascii table pentru a justifica valoarea lui 48, cand se poate scrie direct '0'?
Ca userul sa observe ca de fapt C-ul vede caracterele ca pe numar

Quote

De ce se face parsare manuala string -> int?
Ca sa observi acest lucru.Scad numere, nu caractere.
Poate tu si multi veti spune ca asta este un feature,dar nu este un mecanism intern expus programatorului, mecanims care nu a mai fost acoperit in momentul publicarii limbajului

Quote

De ce e hardcodat inputul sub forma unui array de stringuri? Utilizarea stringstream e mult mai asemanatoare cerintei care zice de citirea dintr-un fisier
Pentru ca metoda pedagogica foloseste array-uri ,doarece gandirea umana intelege mai repede conceptul de "colectie" decat cel de "streaming"

Quote

De ce e introdus un rand doar pentru a-l ignora?
Deoarece cerinta spune ca numele trebuie sa fie puse pe numere impare si notele pe numere pare, iar fisiere nu poate incepe cu o nota.

Quote

Constante magice: 17, 2... Se pot evita cu totul chiar in forma actuala
Orice se poate evita,insa in acest caz, in mod intentionat l-am scris asa ca userul sa observe anumite chestii.

Quote

Rezultatul separa valorile prin ", " cand cerinta specifica separare prin spatiu
Programul e facut de mine, deci il pot separa prin ce vreau eu.

Quote

system("pause"), folosit pentru a aduce beneficii neglijabile, e un risc destul de mare din punct de vedere al securitatii
Este folosit pentru a vedea valorile in consola , in rest ce spui tu se poate aplica in cod productie ,asta daca viitorii elevi mai ajung sa  faca cod productie
in C++. Statistica spune ca numarul acestora este cam zero !

Pe scurt:
Dpdv pedagocig, nucleul algoritmului face o ceea ce trebuie sa faca, folosind o structura dedicata denumite "elev"  pt a stoca datele necesare.
Sub aspect pedagogic este un program  care invata userul cum sa foloseasca o structura create de el si ii arata cum sa faca un program   evitand pointerii pe cat se poate
Totodata , acest program arata ca se poate limita pe cat posibil folosirea C-ului in C++.

Acum am unele observatii pentru tine:
atunci cand redactezi  un program pentru incepatori  in scop pedagogig, nu mai folosi boost sau alte 3rd party API-uri.
atunci cand redactezi  un program pentru incepatori  in scop pedagogig nu mai folosi stream-uri sau alte liburi de streaming.
atunci cand redactezi  un program pentru incepatori  in scop pedagogic in C++, incearca sa folosesti struct sau clase pentru a invata incepatorii cum sa inceapa sa
gandeasca un  program in OOP

A da si inca o chestie: eu habar n-am C++, nici C si nici Visual Basic, sau C# dar asta nu ma impiedica sa scriu programe in limbajele pe care nu le cunosc atat
timp cat stapanesc  OOP & OOAD & Design Patterns

Ce am observat eu este ca majortitatea celor care scriu in C++ de fapt scriu in C iar  codul lor, in 90 % nici macar nu se atinge de C++
C++ este implementarea OOP in viziunea lui Stroustroup, dar nu trebuie sa fie unica.Oricine isi poate creea prorpiul C++ daca isi face un framework care implementeaza OOP-ul si C-ul.

#3
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007

 WinstonMontana, on 06 aprilie 2018 - 15:01, said:

atunci cand redactezi  un program pentru incepatori  in scop pedagogig, nu mai folosi boost sau alte 3rd party API-uri.

Nu redactez programe pentru incepatori ce trantesc o cerinta si asteapta sa le rezolve altii temele. Ofer ocazional solutii mai interesante pentru altii ce mai citesc pe aici si care au trecut de nivelul "sa se".

 WinstonMontana, on 06 aprilie 2018 - 15:01, said:

atunci cand redactezi  un program pentru incepatori  in scop pedagogig nu mai folosi stream-uri sau alte liburi de streaming.

Aproape toate cerintele din exercitii/examene/concursuri solicita citirea datelor dintr-un si scrierea rezultatelor intr-un fisier. Vor/nu vor, de streamuri nu scapa.

 WinstonMontana, on 06 aprilie 2018 - 15:01, said:

atunci cand redactezi  un program pentru incepatori  in scop pedagogic in C++, incearca sa folosesti struct sau clase pentru a invata incepatorii cum sa inceapa sa
gandeasca un  program in OOP

Cand dezbat o problema de structuri de date & algoritmi, caut sa exprim cat mai simplu & clar acel algoritm. Daca OOP ma ajuta ocazional in acest scop, foarte bine; altfel n-are ce cauta. Mai repede ma folosesc de elemente functionale.

 WinstonMontana, on 06 aprilie 2018 - 15:01, said:

A da si inca o chestie: eu habar n-am C++, nici C si nici Visual Basic, sau C# dar asta nu ma impiedica sa scriu programe in limbajele pe care nu le cunosc atat
timp cat stapanesc  OOP & OOAD & Design Patterns

Viata nu se rezuma la OOP. C++ e un limbaj multiparadigma, iti ofera destule solutii fara legatura cu OOP.

 WinstonMontana, on 06 aprilie 2018 - 15:01, said:

Ce am observat eu este ca majortitatea celor care scriu in C++ de fapt scriu in C iar  codul lor, in 90 % nici macar nu se atinge de C++

De acord.

#4
WinstonMontana

WinstonMontana

    Active Member

  • Grup: Members
  • Posts: 1,913
  • Înscris: 20.02.2018

 dani.user, on 06 aprilie 2018 - 17:06, said:

Ofer ocazional solutii mai interesante pentru altii ce mai citesc pe aici si care au trecut de nivelul "sa se".
Aceia fac deja cod de productie si nu au nevoie de ajutor pe forumuri, pt ca fie stiu sa faca sau sa caute

Quote

Aproape toate cerintele din exercitii/examene/concursuri
De aceea mai nimeni nu-i cauta.Ei s-au specializat in rezolvarea de probleme si concursuri care efectiv n-au nici o legatura cu problemele din lumea reala

Quote

Cand dezbat o problema de structuri de date & algoritmi, caut sa exprim cat mai simplu & clar acel algoritm.
Cand dezbat o problema caut s-o modelez cat mai aproape de realitate doarece solutii mai simple decat realitatea nu le poate oferii  nimenea
OOP -ul nu se rezuma la clase si obiecte , OOP-ul inseamna insusi modelarea realitati in  limbaj abstract. Toate relatiile intre evenimente si concepte din viata reala sunt legate de acelasi principii pe
care OOP-ul le gestioneaza.Paradigma OOP  transforma modelul din realitate in modul informational.
Folosita cum trebuie aceasta paradigma,cu ajutorul ei  poti usor programa in limbaje de programare pe care nici nu le stii.

Quote

Daca OOP ma ajuta ocazional in acest scop, foarte bine; altfel n-are ce cauta.
Asta pt ca privesti OOP-ul superificial si asta din cauza modului cum ai fost invatat sa gandesti in C++
Pentru cine stie OOP-ul este de fapt OOP si OOAD impreuna.

Quote

Mai repede ma folosesc de elemente functionale.
Programez in limbaje functionale, si OOP-ul sta la baza acestora.De fapt OOP-ul si OOAD-ul  stau la baza paradigmei  AOP (Aspect Oriented Programming) , paradigma pe
care(zic eu si banuiesc) ca orice programator ar trebui s-o stapaneasca.
The success of AOP has been almost viral and nearly all areas in Software Engineering and Programming

Quote

Viata nu se rezuma la OOP. C++ e un limbaj multiparadigma, iti ofera destule solutii fara legatura cu OOP.
Pai nu intelegi ce inseamna de fapt OOP-ul,L-ai invatat asa cum ti s-a predat de altii care n-au nici o tangenta cu realitatea
OOP-ul se combina cu OOAD-ul si asa rezulta AOP-ul care este paradigma limbajelor functionale.

Edited by WinstonMontana, 06 April 2018 - 17:42.


#5
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004
Esti plin de acronime si foarte sfatos, dar progamelul ala din primul post e un kkt. Si asta  nu pentru ca nu stii C++, ci pentru ca nu respecta reguli de baza, cum ar fi hardcodarile. Folosesti cind array, cind vector. In plus folosesti struct cu membrii publici, desi ai o logica la nota, ceea ce nu prea are nici o treaba cu OOP de care tot vorbesti

Daca aveai cea mai mica idee despre OOP, ai fi facut o clasa care face toate calculele alea, folosind principii OOP sanatoase si functii care fac un singur lucru etc blabla.

Insasi implementarea este vai de capul ei, nu exista nici un motiv sa citesti datele dintr-un fisier intr-un vector de elevi si apoi sa iterezi de 10 ori prin vector. Macar daca eliminai elevul din vector dupa ce-l gaseai, dar nici de aia n-ai fost in stare. Sigur ca pentru aia trebuia sa folosesti altceva decit vector, oare ce... Conversia de la string la int este extrem de comica. Nota 7 data de user.dani este exagerata Posted Image

Practic dovedeste cit se poate de bine ce-am spus in celalat thread, ca degeaba stii un limbaj, daca-l schimbi nu inseamna c-o sa-l stii pe celalalt, pentru ca esti foarte destept. Pur si simplu folosesti chestii de care habar n-ai, pentru ca "asa l-a pus IDE-ul" sau faci aberatii lingvistice cum ar fi "nume = nume0", ca cica "nu vreau sa folosesc pointeri". De parca nu se poate scrie "this->nume = nume", aia e folosire de pointeri Posted Image

#6
Geth

Geth

    Senior Member

  • Grup: Senior Members
  • Posts: 2,903
  • Înscris: 17.11.2017

 WinstonMontana, on 06 aprilie 2018 - 15:01, said:

Nici eu nu stiu, Visual Studio mi l-a pus.El stie
Normal ca nu stii. Insa programatori(chiar si de alte limbaje) nu-s multi care sa nu stie. Posted Image

elev(string nume0, string nota0) {
nume = nume0;
nota = (nota0 != "10") ? (int)nota0[0] - 48 : 10; //vezi https://www.asciitable.com/, coloanele Dec si Chr incepand cu Dec = 48
}

for (int i = 1; i <= (17-2); i++) {


 WinstonMontana, on 06 aprilie 2018 - 15:01, said:

ca sa nu am : nume = nume ( si nu vreau sa folosesc pointeri)
Treaba asta arata ca esti incepator si balmajesti aiurea niste chestii, poate-poate iese ceva..

 WinstonMontana, on 06 aprilie 2018 - 15:01, said:

Pentru ca metoda pedagogica foloseste array-uri ,doarece gandirea umana intelege mai repede conceptul de "colectie" decat cel de "streaming"

Deoarece cerinta spune ca numele trebuie sa fie puse pe numere impare si notele pe numere pare, iar fisiere nu poate incepe cu o nota.
Pentru ca blabla... in primul rand cerinta precizeaza clar ca se citeste dintr-un fisier - ti se prezinta si structura acestuia: numar par de linii, numele pe primul rand, nota pe al doilea -> poti citi direct, separat si stringuri si int-uri, nu e nevoie de conversii... apoi se precizeaza ca trebuie sa creezi un fisier, cu o anumita structura... aspectele astea sunt importante, nicidecum cai verzi cu oop(care nici nu prea exista in ce-ai balmajit tu acolo)..

Abordarea ce mai simplista a acestei probleme in particular - in stil mai "scolaresc"(ca asa e si cerinta), ar fi sa se creeze un array de 10 stringuri(cel mai simplu ar fi cu <string>, dar nici c-style nu e chiar rocket science), fiecare index fiind nota - 1, iar pentru fiecare nota sa se concateneze numele...

 WinstonMontana, on 06 aprilie 2018 - 15:01, said:

Deoarece cerinta spune ca numele trebuie sa fie puse pe numere impare si notele pe numere pare, iar fisiere nu poate incepe cu o nota.
N-are absolut nicio logica ce zici tu acolo. Si daca nu pot incepe cu nota, ce? Posted Image Pentru ce sa pui un rand inutil in array si sa parcurgi arrayu-ul incepand cu 1, in loc sa incepi direct cu un nume si sa parcurgi arrayul de la 0? Copilas, copilas... Posted Image

 WinstonMontana, on 06 aprilie 2018 - 15:01, said:

timp cat stapanesc  OOP & OOAD & Design Patterns
Daca stapaneai ceva macar vag de acolo, te-ar fi preocupat macar incapsularea...

 WinstonMontana, on 06 aprilie 2018 - 17:39, said:

Programez in limbaje functionale, si OOP-ul sta la baza acestora.

OOP-ul se combina cu OOAD-ul si asa rezulta AOP-ul care este paradigma limbajelor functionale.
Ce face? Ai de pacul meu... oooops, capul... Deci cum? OOP + OOAD = AOP(= paradigma limbajelor functionale???) ???????????????  Posted Image

Nu vad logica in ce faci, dar din toate interactiunile rezulta asta: te chinui sa inveti cate un limbaj, citesti tot felul de chestii pe net despre tot felul de acronime, dupa care vii pe aici si te pretinzi programator, trantesti termenii aia despre care citesti la nimereala fiind evident ca nu intelegi mai nimic, mai bagi cate o bucata de cod varza si pentru un incepator(nu m-ar sa fie copy-paste modificat, din alte surse), spui tot felul de chestii lipsite de sens...

Edited by Geth, 08 May 2018 - 23:12.


Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

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