Pereiti prie turinio

Rekomenduojami pranešimai

Sveiki, taigi nesenai pradėjau mokytis C++ ir kilo keletas klausimų:

 

1. Kam reikalingas setw ? Įmesiu savo programą, gal susigaudysit. http://pastebin.com/gTAqffu1 Esmė tame, kad be setw man grybauja t.y rodo minutes kad ir 180, kai turėtų šitas minutes pridėti prie valandų, bet kai parašiau setw(3) prie cout - viskas susitvarkė, bet niekaip negaliu suprasti kodėl :D

 

2. Kodėl negalima parašyt kelių kintamųjų per kablelį? Kalbu apie cin >> a, b .Errorų lyg ir nemeta kompiliuojant, bet paleidus programa lūžta. Kai parašau cin >> a >> b; - viskas gerai.

Redagavo Tw1stex
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveiki, taigi nesenai pradėjau mokytis C++ ir kilo keletas klausimų:

 

1. Kam reikalingas setw ? Įmesiu savo programą, gal susigaudysit. http://pastebin.com/gTAqffu1 Esmė tame, kad be setw man grybauja t.y rodo minutes kad ir 180, kai turėtų šitas minutes pridėti prie valandų, bet kai parašiau setw(3) prie cout - viskas susitvarkė, bet niekaip negaliu suprasti kodėl :D

 

2. Kodėl negalima parašyt kelių kintamųjų per kablelį? Kalbu apie cin >> a, b .Errorų lyg ir nemeta kompiliuojant, bet paleidus programa lūžta. Kai parašau cin >> a >> b; - viskas gerai.

 

 

1.setw=set width. Kitaip sakant,pasakai,kiek vietos gali uzimt tavo isvedimas. Cia realiai tvarkingam isvedimui jis naudojamas :)

2. Deja,bent jau kiek man teko su C++ susidurt,tai nebuna tokiu situaciju, kad kintamaji nuskaitytu per kableli. Matyt sintakse tiesiog tokia ir tiek :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

 

2. Kodėl negalima parašyt kelių kintamųjų per kablelį? Kalbu apie cin >> a, b .Errorų lyg ir nemeta kompiliuojant, bet paleidus programa lūžta. Kai parašau cin >> a >> b; - viskas gerai.

 

Žinai kas yra funkcija?

 

cin >> something >> something_else yra ekvivalentu operator>>(operator>>(cin, something), something_else)). operator>>(ifstream, ..) funkcija grąžina tą streamą, kurį jam padavei kaip pirmą argumentą.

 

Kadangi nėra funkcijos operator>>(ofstream, a, b), todėl tau ir nesigauna „per kablelį“.

 

 

 

Tai va, labai nuostabu, jog mokyklose moko C++, kuri yra pati lengviausia kalba.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai va, labai nuostabu, jog mokyklose moko C++, kuri yra pati lengviausia kalba.

 

Man dar neteko susidurti su kalba, kurioje nuskaityti įvestį būtų paprasčiau, nei C++. Visur kitur arba turi skaityti po vieną simbolį, arba skaityti visą eilutę, ją split'inti ir cast'inti į norimą tipą, arba žasiti su Tokenizer'iais. Gal tik Pascal'yje dar yra nesunku nuskaityti įvestį.

 

O be to, kai kuriems ir „Komenskio Logo“ per sudėtingas…

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Man dar neteko susidurti su kalba, kurioje nuskaityti įvestį būtų paprasčiau, nei C++. Visur kitur arba turi skaityti po vieną simbolį, arba skaityti visą eilutę, ją split'inti ir cast'inti į norimą tipą, arba žasiti su Tokenizer'iais. Gal tik Pascal'yje dar yra nesunku nuskaityti įvestį.

 

O be to, kai kuriems ir „Komenskio Logo“ per sudėtingas…

 

2.1.3 :003 > a, b, c = gets.split
1111 222 333    
=> ["1111", "222", "333"] 
2.1.3 :004 > a
=> "1111" 
2.1.3 :005 > b
=> "222" 
2.1.3 :006 > c
=> "333" 
2.1.3 :007 > 

 

Ne taip ir sudėtinga yra „žaisti su splitteriais ir tokenaizeriais“.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

2.1.3 :003 > a, b, c = gets.split
1111 222 333    
=> ["1111", "222", "333"] 
2.1.3 :004 > a
=> "1111" 
2.1.3 :005 > b
=> "222" 
2.1.3 :006 > c
=> "333" 
2.1.3 :007 > 

 

Ne taip ir sudėtinga yra „žaisti su splitteriais ir tokenaizeriais“.

 

Noriu peskaityti du sveikuosius skaičius ir vieną simbolį, tai atitinkamai ir rašau: skaityti int a, skaityti int b, skaityti char c;

 

int a, b;
char c;
cin >> a >> b >> c;

 

Kai tą patį darau su „split“, tai pirma perskaitau visą eilutę kaip string'ą, tada tą eilutę split'inu, kiekvieną gauto masyvo elementą priskiriu atitinkamam kintamajam, prieš tai dar pakeisdamas į atitinkamą tipą. Tavo pavyzdyje gelbsti tik tai, kad parašyta su dinamine kalba (o gal net ir funkcinė čia pas tave) – šiek tiek kodas paprastesnis, nei būtų su statine. Ir tai, cast'inimo neparašei.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na ok, nuskaitymas nėra sudėtingas. Dabar pakalbėkim apie segmentation fault vs index out of bounds exception. :-)

 

Ne, nu tai gali dešimtoj klasėj ir „Komenskio Logo“ mokyti, nebus nei sudėtingų nuskaitymų, nei segmentation fault, nei pačių masyvų.

 

C++ nėra itin simple ar reliable. Bet tai nesukelia problemų, jeigu mokaisi palaipsniui. Visose kalbose tie patys ciklai, tokie patys sąlygos sakiniai, tie patys masyvai, daugiau mažiau panaši sintaksė (neinant į kraštutinumus) – tik su nedideliais prieskoniais. Sakai, kad 16 metų asmuo nesugebės suprasti, jog negalima už masyvo ribų užeiti? Ar kad dalinti iš nulio negalima? Abejoju.

 

Čia tas pats, kas mokant vairuoti mašiną, būtų pradedama ne nuo mechano, o tokia tvarka: dviratis – triratis – keturratis – mašina su automatine pavarų dėže – mašina su mechanine pavarų dėže. Sugebės išmokti ir tokiu būdu, bet viso proceso metu reikės nuolat keitinėti įpročius. O vairuojant automatą galima prisidaryti negerų įpročių…

 

Dar negalima pamiršti, kad iš klaidų pasimokoma geriau, nei iš sėkmių. O programavimo aplinka yra pakankamai saugi erdvė daryti klaidoms – tikimybė patirti kokių nuostolių yra maža. Tai kam tada uždaryti žmogų į kambarį su minkštom sienom, kur jis neturės galimybės sužinoti, kad daužyti galvą į sieną yra negerai?

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sakai, kad 16 metų asmuo nesugebės suprasti, jog negalima už masyvo ribų užeiti? Ar kad dalinti iš nulio negalima? Abejoju.

 

Nesupras, jeigu iš pažiūros gera programa išmes „don't send“ lentelę. Supras, jeigu gaus padorų error message. T_PAAMAYIM_NEKUDOTAYIM much?

 

Čia tas pats, kas mokant vairuoti mašiną, būtų pradedama ne nuo mechano, o tokia tvarka: dviratis – triratis – keturratis – mašina su automatine pavarų dėže – mašina su mechanine pavarų dėže. Sugebės išmokti ir tokiu būdu, bet viso proceso metu reikės nuolat keitinėti įpročius. O vairuojant automatą galima prisidaryti negerų įpročių…

 

Ne, čia tas pats kas mokyti drožinėti su industriniu pjūklu. Kalba su normaliais error message'ais nėra triratukas.

 

Kitas dalykas, kurio, matomai, nesupranti – mokyklinis kursas yra skirtas supažindinti su programavimu, o ne išugdyti dar vieną programuotoją.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nesupras, jeigu iš pažiūros gera programa išmes „don't send“ lentelę. Supras, jeigu gaus padorų error message. T_PAAMAYIM_NEKUDOTAYIM much?

Don't send dažniausiai išmeta dviem atvejais – kai užeini už masyvo ribų ir kai dalini iš nulio.

 

Turbūt visi sutiks, kad niekas negimė mokėdamas šviesofo. Bet visiems pavyksta susieti galvoje, kad kai žalia – galima eiti per gatvę. Visi tai supranta ir nebūtina rašyti „GalimaEitiPerGatvęException“.

 

Žalia reiškia galima eiti per gatvę.

Don't send reiškia užėjai už masyvo ribų.

Žalia ≡ eiti per gatvę.

Don't send ≡ peržengtos masyvo ribos.


 

Ne, čia tas pats kas mokyti drožinėti su industriniu pjūklu. Kalba su normaliais error message'ais nėra triratukas.

Jei pritaisai prie dviračio pagalbinius ratukus, tai nesakyčiau, kad taip padidinamas meistriškumas.


Kitas dalykas, kurio, matomai, nesupranti – mokyklinis kursas yra skirtas supažindinti su programavimu, o ne išugdyti dar vieną programuotoją.

Ne programavimo kalbos sintaksėje visas sudėtingumas. Galim paimti, pavyzdžiui, matematiką. Konkrečiau – integralus:

http://upload.wikimedia.org/math/9/1/3/9139899de25f8fe8281820ac8648a1f7.png

Sakyčiau, pakankamai sudėtinga. Užrašykim viską supaprastintai:

integralas nuo 0 iki 1 √x dx

Akivaizdžiai dabar viskas pasidarė daug aiškiau ir dabar net penktokas galėtų suskaičiuoti tokį integralą!

 

Kaip matematika sprendžia visą šį sudėtingumą? Ar susigalvoja atskirą sintaksę? Ne. Tiesiog viskas, kas svarbu, duodama palaispniui. Iš pradžių išmoksti paprastus aritmetinius veiksmus, vėliau kintamuosius, tada lygtis, dar vėliau šaknį ir galiausiai integralą. Ir taip, nors ir sintaksiškai sudėtingas integralas tampa išsprendžiamas. Ir tampa išsprendžiamas ne dėl to, kad vietoj to kringelio užrašytas žodis integralas, o todėl, kad pasidaro aišku, kas yra integralas ir kokia jo prasmė.

 

 

Dabar su ciklais. Jeigu žmogus supranta, ką šitas kasdieniniame nenaudojamas simbolis reiškia:

http://upload.wikimedia.org/math/d/f/1/df17b3410e58ac4c285bc61a6777aa45.png

tai pagal visą logiką reikės metų metus studijuoti, kol jis sugebės suprasti šitai?

int sum = 0;
for (int i = 1; i <= 100; i++)
   sum = sum + i;

 

 

O ką, jei paimsim autoriaus pavyzdį:

cin >> a, b;

Ar taip sunku suprasti, kad sum + a , b negalima rašyti, o reikia rašyti sum + a + b?

 

 

Nepamirškim ir pointer'ių. Matyt visas sudėtingumas kyla dėl to, kad atsiranda žvaigždutė:

int *p = new int(0);

O pasiėmę Java ir C# kalbas visi galėtų išsamiai paaiškinti objektus ir jų reference'us, nes čia jau nebėra žvaigždutės:

Integer p = new Integer(0);


 

Visas programavimo sudėtingumas kylo iš to, kad mokiniai nesugeba suvokti kaip veikia kintamieji, kaip veikia masyvas, kaip veikia pointer'iai, kaip veikia atmintis, kokia eilės tvarka vykdomi programos sakiniai. Ir lygiai taip pat, kaip mįslė nepasidaro lengvesnė, jei vietoj Žemaičių tarmės aš tau ją pasakau Aukštaitiškai, taip ir programa nepasidaro lengvesnė, kai kitaip for ciklą užrašai.

 

 

Žinoma, gal kažką, kuris nesuvokia programavimo, dar ir kalba trikdo, bet tai tikrai ne lemiamas faktorius. Tikrai nerasi tokios kalbos, kad visi mokiniai puikiai suprastų programavimą. Kaip ir sakiau, kai kam ir „Komenskio Logo“ per sudėtingas:

kartok 360 [priekin 5 dešinėn 1]

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...