Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Frecventa modificata radio

Un nou pericol pt batrani

Ar trebuii sa vindem imobiliarele...

Dupa renuntarea la aparat dentar
 pelerinaj in Balcik

Noul format Jpegli iși propu...

Dade, dade

Parola la lock screen
 Deparazitare externa pisici fara ...

Seriale turcesti/coreene online H...

Merita un Termostat Smart pentru ...

Sfat achizitie MTB Devron Riddle
 Problema mare cu parintii= nervi ...

switch microtik

Permis categoria B la 17 ani

Sfaturi pentru pregatirea de eval...
 

[wellcode] Analiza unui inceput prost

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

#1
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
Scriu acest articol din considerente didactice, dar si datorita tendintei crescute privind numarul de topice ce apar cu probleme de pe acest site.

Petru (mentor si fondator wellcode) mi-a aparut intr-o reclama de pe YouTube amintidu-mi ca am cont, dar totodata sugerand (in linii mari) ca o sa ne invete sa scriem cod asa cum vorbim limba romana.

Challenge Accepted.

intru in cont, verific problemele propuse si imi dau seama ca matematica este echivalenta cu limba romana.

Eu nu sunt academician, si nici nu lucrez in domeniu, ca atare pot fi candidatul ideal.
Ce am gasit si ce ma deanjeaza o sa prezint in posturile urmatoare; mai exact problemele prezentate, rezolvarile asteptate.

Denumirea variabilelor: https://learn.wellco...e/variabile-int

Prezentarea este concisa si exemplele pertinente pentru a oferi suport prezentarii. Desi se incepe bine, apoi se incurajeaza repetat, mecanic, folosirea unor denumiri abstracte gen a, b, i, x, z. Pai ce e gresit cu asta? - o sa va intrebati. Am promis ca vorbim limba romana. Plus ca vorbind "matematica" in loc de limba romana ne pierdem in litere. Efectiv, pe masura ce avansam in "tutorial" ramanem la stadiul de litere.

Ana are mere: https://learn.wellco...riabile-afisare

Ce este corect este corect. Dar de ce nu se poate mai des ?

Quote

#include <iostream>
using namespace std;
int main() {
int mere = 3;
cout << "Ana are " << mere << " mere!";
return 0;
}
Ana are 3 mere

Introducerea in matematica: https://learn.wellco.../page/operatori

Din nou, exemplele sunt  pe aproape bune. Ce e gresit? Pare ok, NU?
Pai de ce sa scriem ingramadit si sa amestecam varibile initializate cu variabile neinitilizate pe aceiasi linie ?
Mai mult, de ce sa initializam doua varibile pe aceiasi linie?
Acest stil de a lucra neordonat este motivul pentru care deseori apar probleme.

Apreciez totusi folosirea unui variabile terte, rezultat (pentru ca "limba romana").

#2
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
#1 Adunare
https://learn.wellcode.ro/page/adunare

Prima linie se afla doua numere, dar cine decide ca sunt a si b?
Ne uitam la umbra (masca) solutiei oficiale si facem presupuneri.

#include <iostream>
using namespace std;
int main(){
█████████
9 caractere;
int a, b;
██████████████
14 caractere;
cin >> a >> b;
██████████████
14 caractere;
cout << b + a;
return 0;
}

De ce nu se in curajeaza folosirea variabilelor "rezultat" sau "calcul" in rezolvarea problemelor, dar se incurajeaza "a" si "b"?
Sunt doua numere intregeri, primul_numar si al_doilea_numar

O sa spuneti ca este doar o adunare si ca ce rost are.
Pai in clasa intai am inceput cu bastonase, si alea erau doar o linie.
Linie cu linie se umple un caiet, respectiv linie cu linie se scrie un program.
De ce am alege sa nu comunicam ce reprezinta aceste variabile.

int main(){
int primul_numar;
int al_doilea_numar;
cin >> primul_numar;
cin >> al_doilea_numar;


int main(){
int primul_numar;
int al_doilea_numar;
cin >> al_doilea_numar;
cin >> primul_numar;

Intre aceste doua coduri este evident care din ele respecta modul de gandire.

#2 Calcul
https://learn.wellcode.ro/page/calcul

#include <iostream>
using namespace std;
int main(){

Quote

█████████
9 caractere;
int a, b;
Si iarasi, nu avem o variabila terta care sa memoreze rezultatul.

Oare ce se intampla cand cineva are o dificultate si posteaza pe forum o asemenea problema ?

Quote

Cum se implemnteaza (a - b) ?
pai in functie de forumuri  'b paranteza' este emoticon, si mergi la ghici

Quote

████████████████████████████████
32 de caractere
toata matematica pe aceiasi linie cu cout

Pai e frumos asa ?

int primul_numar;
int al_doilea_numar;
int cubul_diferentei;
int diferenta;

cin >> primul_numar;
cin >> al_doilea_numar;
diferenta = primul_numar - al_doilea_numar;
cubul_diferentei = diferenta * diferenta * diferenta;



#3
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
#3 Like
https://learn.wellcode.ro/page/like

Nu dragii mei, de la tastatura se vor citi numar_likeuri si numar_postari.

int main()
{
int numar_postari, numar_likeuri, total_likeuri;
cin >> numar_postari;
cin >> numar_likeuri;

total_likeuri = numar_postari * numar_likeuri;

cout << total_likeuri << endl;
return 0;
}

int main()
{
int a, b;
cin >> a >> b;
cout >> a * b;
return 0;
}

Un program sec care nu spune nimic despre problema ceruta. Ceea ce ar fi fost super ok daca cerinta era pur matematica "afisati produsul a doua numere citite de la tastatura".

#4
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
#4 Cutii
https://learn.wellcode.ro/page/cutii

Repetitia este mama invataturii, iar wellcode va incurajeaza sa scrieti in mod repetat "a si b", desi in "teorie" ni s-a spus ca variabilele pot avea orice* nume.

De ce ne-am obosit sa ne imagimam cutiile si cadourile ca la final sa avem probleme de matematica ?
int total_cadouri;
int cadouri_per_cutie;
int cadouri_ramase;
cin >> total_cadouri;
cin >> cadouri_per_cutie;
cadouri_ramase = total_cadouri % cadouri_per_cutie;
if (cadouri_ramase){
	 cout << "imposibil" ;
} else {
cout << "posibil";
}


variabila "cadouri_ramase" sugereaza ca operatia de dupa egal trebuie sa ofere un rest,
Se intampla ca avem un operator numit modulo care ne ofera restul impartirii a doi termeni

#5
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
#5 Pitagora
https://learn.wellco...o/page/pitagora

Nici la matematica (geometrie) nu ne mai pricepem. Desi va amintiti, "vorbim limba romana".

Quote

Din Teorema lui Pitagora reiese că în orice triunghi dreptunghic, suma pătratelor lungimilor laturilor alăturate unghiului drept (catetelor) e egală cu pătratul lungimii laturii opuse (ipotenuzei). (cateta12 + cateta22 = ipotenuza2)

Si atunci de ce nu "citim"

#include <iostream>
using namespace std;
int main() {
int cateta1, patratul_catetei1;
int cateta2, patratul_catetei2;
int suma_patratelor_catetelor;
int ipotenuza, patratul_ipotenuzei;
bool conditie;
cin >> cateta1;
cin >> cateta2;
cin >> ipotenuza;
patratul_catetei1 = cateta1 * cateta1;
patratul_catetei2 = cateta2 * cateta2;
suma_patratelor_catetelor = patratul_catetei1 + patratul_catetei2;
patratul_ipotenuzei = ipotenuza * ipotenuza;
conditie = (suma_patratelor_catetelor == patratul_ipotenuzei);
// if (conditie) { } else { }
return 0;
}


Este overkill ? Probabil !

Este alternativa un lucru pe care un incepator l-ar intelege foarte usor ?
if ((a*a)+(b*b) == (c*c)) {

Se pot folosi operatiile pe care le-au prezentat in tutorial? de genul
a*=a

Desigur, dar care este graba ?

#6
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
#6 FizzBuzz
https://learn.wellco...o/page/fizzbuzz

Si iarasi suntem incurajati sa folosim variabile sterile de lungime 1 caracter.

#7
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
#8 Crescator2
https://learn.wellco...page/crescator2

Desi solutia este eficienta nu prezinta nimic nou, pastrand tendinta de a folosi variabile "de o litera"

#8
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
#9 Crescător 3
https://learn.wellco...page/crescator3

Aici se asteapta la o multime de combinatii folosind if-uri, fara a urmari o schema logica.

De exemplu, daca am rezolvat problemele precedente folosind subprograme, pana acum am fi avut:
- un program care primeste doua numere si ne ofera maximul (#7)
- un program care primeste doua numere si ne ofera minimul  (#8)
Ce ne ramane de facut ?

Sa determinam numarul mijlociu si sa afisam numerele dupa formatul mentionat.

mic = min( min(primul_numar, al_doilea_numar), al_treilea_numar);
mare = max( max(primul_numar, al_doilea_numar), al_treilea_numar);
mijlociu = min( max(primul_numar, al_doilea_numar), al_treilea_numar);


cout << mic << " " << mijlociu << " " << mare << endl;

Si testam noi cateava seturi de numere si "admitem" ca l-am rezolvat si pe asta.
Dar ne-am fi inselat;

Asa ca mutam logica si afisarea intr-un alt subprogram care primeste 3 numere
void sorteaza(int x, int y, int z)
Vai, dar ce-am facut ?
Pai este destul de clar, avem o functie care sorteaza 3 numere intregi, si sunt argumente nu variabile.

void sorteaza(int x, int y, int z){
int mic, mare, mijlociu;
mic = min( min(x,y), z );
mare = max ( max(x,y), z);
mijlociu = min ( max(x,y), z);
cout << mic << " " << mijlociu << " " << mare << endl;
}

int main(){
// declara
// citeste
sorteaza(primul_numar, al_doilea_numar, al_treilea_numar);
sorteaza(primul_numar, al_treilea_numar, al_doilea_numar);
return 0;
}
Executam si verificam daca rezultatul este cel asteptat, in mare parte va fi, pana cand ca "din oarece motive", desi numerele sunt distincte, maximul este egal cu mijlociul.
Moment in care ne gandim cum modificam "formula" pentru determinarea numarului mijlociu.

sorteaza(primul_numar, al_doilea_numar, al_treilea_numar);
sorteaza(primul_numar, al_treilea_numar, al_doilea_numar);
sorteaza(al_doilea_numar, primul_numar, al_treilea_numar);
sorteaza(al_doilea_numar, al_treilea_numar, primul_numar);
sorteaza(al_treilea_numar, primul_numar, al_doilea_numar);
sorteaza(al_treilea_numar, al_doilea_numar, primul_numar);


#9
jm2010

jm2010

    Senior Member

  • Grup: Senior Members
  • Posts: 4,999
  • Înscris: 14.03.2013
Marian, chiar daca se spune ca oricine poate invata programare, realitatea arata ca nu e chiar asa. Trebuie un anumit tip de gandire logica care o ai sau nu o ai. Desigur, se pot invata instructiunile unui limbaj, se pot lua exemple si se pot rula dar, pentru a crea (programarea este munca creativa), pentru a putea face legaturile intre diverse lucruri invatate de-a lungul timpului pentru o soutie particulara, pentru a intelege cum transpui o problema in cod mai ai nevoie de acel ceva... Nu e chiar asa simplu. Am vazut asta de multe ori inclusiv la persoane care au terminat facultati tehnice (presupui ca au o gandire mai analitica) dar nu reuseau sa inteleaga chestii simple. Si am vazut asta la persoane care au terminat arhitectura si se prindeau imediat cum trebuie sa transpuna o problema in cod. Pur si simplu intelegeau.
Sa iti dau un simplu exemplu de intelegere (nu am timp sa disec toate posturile):
int variabila_mea, alta_variabila, litereMariSiMici;
in multe limbaje se foloseste notatia Camel Case. Adica, atunci cand numele unei variabile este compus din mai multe cuvinte, primul cuvant incepe cu litera mica apoi toate celelalte incep cu litera mare.
e.g.
counter -> un singur cuvant, toate litere mici
indexOnProductsTable -> mai multe cuvinte, primul incepe cu litera mica restul cu litera mare.

Edited by jm2010, 18 February 2021 - 07:39.


#10
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
Pana unde ai citit?

#11
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 20,033
  • Înscris: 24.02.2006

View PostMarianG, on 18 februarie 2021 - 00:16, said:

Quote

De exemplu dacă ți se spune că programul tău va citi un număr, iar în rubrica de restricții se spune că numărul nu va fi niciodată mai mare decât 100, atunci înseamnă că programului tău îi va fi dat tot timpul un număr mai mic sau egal cu 100 atunci când este testat de către noi.
Pardon, dar textul citat vorbeste despre o garantie, nu despre o restrictie.
Restrictia este o masura care limiteaza un aspect, si este datoria celui care scrie cod sa o implementeze.
in viata reala lucrurile sunt un pic mai delicate, dar in mediul academic (ex: la olimpiade sau concursuri), restrictiile mentionate in enuntul problemei sunt garantate si te poti baza pe ele, fara sa fie nevoie sa le verifici sau sa le implementezi.

#12
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
Si de ce nu le-a numit garantii ?

Poate pentru ca zilele astea al nostru coleg avea dreptate referitor la limba in care trebuie sa inveti programare.

Scrii programul, si daca il folosesti in alta parte il ai fara restrictii.

In viata reala e si mai delicat, nimeni nu-ti garanteaza input curat.
Iar acest mediu academic te invata sa ignori restrictiile si sa te bazezi pe vorbe.

Mie legea nu-mi garanteza ca masinile se opresc la semafor.

Edited by MarianG, 18 February 2021 - 09:24.


#13
lyanna

lyanna

    Active Member

  • Grup: Members
  • Posts: 1,319
  • Înscris: 02.09.2007

View PostMarianG, on 18 februarie 2021 - 09:13, said:

Mie legea nu-mi garanteza ca masinile se opresc la semafor.

Daca ai 3 ani, mama si tata iti spun ca e rosu pentru noi si stam sa se faca verde. Cand se face verde pentru noi e rosu pentru masini si ele stau.
Pe la 10 ani inveti ca e bine sa te uiti de 10 ori si sa nu presupui ca aia se opresc, chiar daca e rosu.

Ei te-nvata cu exemplele lor ca pentru 3 ani.
Daca e bine sau e rau ca te-nvata asa, asta poate fi dezbatut. De-asta sunt sute de carti/cursuri cu invatati programare. Fiecare are nivelul ei/lui si i se potriveste mai bine o metoda sau alta.

Daca nu ai mai avut nici o experienta cu programarea si esti la inceputul inceputului sunt foarte bune exemplele.
Fi-mea (10 ani) face fix probleme de genul asta. Inputul este clar, marginit, cu teste automate, te-nvata sa te uiti la boundary conditions, e ok!

Daca vrei sa devii productiv repede sau ai mai avut experiente cu programarea prin scoala sau te duce capul, poti sa treci un pic mai repede. Mi se pare important ca fiecare sa mearga in ritmul lui de intelegere.

#14
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
Iar mie mi se pare important ca oamenii sa nu se invete cu obiceiuri proaste.

View Postlyanna, on 18 februarie 2021 - 10:39, said:


Fi-mea (10 ani) face fix probleme de genul asta. Inputul este clar, marginit, cu teste automate, te-nvata sa te uiti la boundary conditions, e ok!

Tot cu "int a, b; " ?

#15
Nenea Zap

Nenea Zap

    Zuperman

  • Grup: Senior Members
  • Posts: 17,052
  • Înscris: 10.04.2006

View PostMarianG, on 18 februarie 2021 - 09:13, said:

Si de ce nu le-a numit garantii ?

Poate pentru ca zilele astea al nostru coleg avea dreptate referitor la limba in care trebuie sa inveti programare.

Scrii programul, si daca il folosesti in alta parte il ai fara restrictii.

In viata reala e si mai delicat, nimeni nu-ti garanteaza input curat.
Iar acest mediu academic te invata sa ignori restrictiile si sa te bazezi pe vorbe.

Mie legea nu-mi garanteza ca masinile se opresc la semafor.
Come on, e prima data cand vezi exercitii de olimpiada?
De obicei cand iti spune ca e maxim 100 sau maxim un anumit numar, de fapt iti da un hint ca poti folosi structuri asignate de la inceput de fixed size.
Spre exemplu faci un bitset de 100 ca sa economisesti spatiu.
Evident ca acea solutie nu s-ar preta la un exemplu in realitate unde poti primi un numar de 6 cifre sau 234 de cifre.
E doar mediul academic si restrictiile/garantiile astea te forteaza sa te gandesti si sa optimizezi solutia.
Mediul academic != lumea reala :console:

#16
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
Si unde sunt aceste solutii optimizate pe site-ul wellcode ?
Eu n-am dedus solutie oficiala care sa fie optimizata.

#17
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,443
  • Înscris: 10.08.2005
de ce este atat anevoios sa invatam lumea cu
if (out_of_bounds(value)) { return EXIT_FAILURE ;}


#18
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012

View PostNenea Zap, on 18 februarie 2021 - 11:19, said:

E doar mediul academic si restrictiile/garantiile astea te forteaza sa te gandesti si sa optimizezi solutia.
Ah, nu - doar iti permit sa eviti niste validari minime.
Lucru care-si are sensul... la inceput, cand abia reusesti sa scrii un programel de trei linii.

View PostNenea Zap, on 18 februarie 2021 - 11:19, said:

Mediul academic != lumea reala Posted Image
Prea diferita, din pacate. In "mediul academic" ar trebui sa te pregatesti pentru lumea reala.
Ma intreb insa daca nu cumva alte medii academice or fi o idee mai OK.

Edited by TS030, 18 February 2021 - 11:59.


Anunturi

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

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