Er is helemaal niets mis met scanf en printf gebruiken in C++-code. Sterker nog, ik zie cout en cin zelden buiten leerboeken, en dat heeft een reden.quote:Op zaterdag 8 september 2012 16:29 schreef GS42 het volgende:
[..]
Ten eerste: waarom probeer je het te doen? Het lijkt op of een opgave uit een leerboek of een huiswerkopdracht. Iets meer context is handig.
Als het uit een leerboek is: hoe oud is je boek? Je gebruikt conio.h en int main(void) waardoor ik een beetje het idee heb weer in de jaren '80 te zitten.En als je boek werkelijk over C++ gaat, doe je er beter aan weg te gooien. Als je boek over C gaat, kan je er misschien wel iets mee.
Dat is namelijk het tweede punt: als je C++ code probeert te schrijven, kan je beter helemaal overnieuw beginnen: het gebruik van printf en scanf is een doodszonde. Beter kan je het vanaf het begin goed leren. (Als je echter een C programma probeert te schrijven, is het prima.)
En je lijkt nogal wat basisconcepten niet duidelijk te hebben, zoals wat er opgeslagen wordt in een fundamenteel type en wat de operatoren doen. Het helpt om hierover te lezen voordat je begint te typen.
Tja, ik weet niet hoor maar std::cin en std::cout zijn zeg maar gemaakt voor C++ en scanf en printf zijn "oude" functies vanuit C overigens kunnen ze nog nuttig zijn maar het heeft een reden dat ze niet in de std zittenquote:Op zaterdag 8 september 2012 17:39 schreef FrankRicard het volgende:
[..]
Er is helemaal niets mis met scanf en printf gebruiken in C++-code. Sterker nog, ik zie cout en cin zelden buiten leerboeken, en dat heeft een reden.
En waarom weet je dit dan niet als je die opdrachten moet maken?quote:Op zaterdag 8 september 2012 16:48 schreef dfdsdfds het volgende:
[..]
Ik moet voor a.s. woensdag 4 opdrachten inleveren en zit pas op 1/4Klakkeloos overnemen van anderen heeft geen zin bij dit vak, dat weet ik. Bovendien weet de docent dat snel genoeg te achterhalen dus daar ben ik niet op uit. Eerder informatie zodat ik een beetje op gang geholpen kan worden.
Die conio die je bedoelt is overbodig weet ik, maar ik laat 'm maar erbij staan.
Ik heb nog een vaag dictaat gevonden op school maar daar kom ik ook niet erg wijs uit. Weet jij een gratis betere NLse versie?
Heb een heel schooljaar gemist. Docent is maandag wel bereikbaar voor vragen. Programmeren valt eigenlijk niet uit te leggen. De stof komt al snel over als 'blackmagic'. Pas na 10 keer oefenen leer je er iets van.quote:Op zaterdag 8 september 2012 18:47 schreef netolk het volgende:
[..]
En waarom weet je dit dan niet als je die opdrachten moet maken?
niet naar college geweest of is het een slechte docent?
of ben je gewoon te laat begonnen???
Klopt, dat is dus ook de reden waarom je de basis moet begrijpen want anders zal het je niet lukken...quote:Op zaterdag 8 september 2012 18:53 schreef dfdsdfds het volgende:
[..]
Heb een heel schooljaar gemist. Docent is maandag wel bereikbaar voor vragen. Programmeren valt eigenlijk niet uit te leggen. De stof komt al snel over als 'blackmagic'. Pas na 10 keer oefenen leer je er iets van.
Je hebt nog niet aangegeven of de cursus nu in C of C++ wordt gegeven, maar op basis van de code neem ik aan dat het C is. Dan is dit een prima en online beschikbaar boek om te lezen: ftp://ftp.icce.rug.nl/pub/frank/tmp/cbook.pdfquote:Op zaterdag 8 september 2012 16:48 schreef dfdsdfds het volgende:
[..]
Ik moet voor a.s. woensdag 4 opdrachten inleveren en zit pas op 1/4Klakkeloos overnemen van anderen heeft geen zin bij dit vak, dat weet ik. Bovendien weet de docent dat snel genoeg te achterhalen dus daar ben ik niet op uit. Eerder informatie zodat ik een beetje op gang geholpen kan worden.
Die conio die je bedoelt is overbodig weet ik, maar ik laat 'm maar erbij staan.
Ik heb nog een vaag dictaat gevonden op school maar daar kom ik ook niet erg wijs uit. Weet jij een gratis betere NLse versie?
Ah, leuk. Waarom denk je dat er niets mis mee is en welke reden denk je gevonden te hebben?quote:Op zaterdag 8 september 2012 17:39 schreef FrankRicard het volgende:
Er is helemaal niets mis met scanf en printf gebruiken in C++-code. Sterker nog, ik zie cout en cin zelden buiten leerboeken, en dat heeft een reden.
Er bestaat al een Nls C++ forum...quote:Op zaterdag 8 september 2012 18:56 schreef netolk het volgende:
[..]
Klopt, dat is dus ook de reden waarom je de basis moet begrijpen want anders zal het je niet lukken...
kijk hier anders eens: klik
en verder kun je heel veel vinden op google en wikipedia...
| 1 2 3 4 5 6 7 8 9 10 | ??=include <iostream> %:include <algorithm> #include <iterator> auto main() -> decltype(std::ios_base::xalloc() & false) ??< decltype(main()) _int<::> = <%??-??-72,101,??-??-108,108,111,??-??-32,119,111,??-??-114,108,100,??-??-46,10??>; std::copy(_int, _int + sizeof(_int) / sizeof(_int??(??--1U??)), std::ostream_iterator<decltype('??!')>(std::cout)); // Vreemd, he??/ std::cout << "Program done.\n"; ??> |
Ik heb bij verschillende bedrijven code gezien en geschreven. Over het algemeen werd printf, scanf, cout en cin daar alleen gebruikt voor debug/logging. Vooral fprintf en fscanf dus. Deels zal dat zeker komen door mensen die overgestapt zijn uit C, maar zelf heb ik bijvoorbeeld eerst C++ geleerd (met cout en cin) en daarna pas C. Ik vind het gebruik van (f)printf en (f)scanf fijner omdat je op een makkelijkere en snellere manier meer controle hebt over hoe de formatting van je data is.quote:Op maandag 10 september 2012 10:41 schreef GS42 het volgende:
[..]
Ah, leuk. Waarom denk je dat er niets mis mee is en welke reden denk je gevonden te hebben?
Misschien is mijn 'doodszonde' een beetje sterk uitgedrukt (), maar ik sta er zeker achter dat in een C++ programma scanf en printf niet gebruikt moeten worden, tenzij daar heel erg goede en gedocumenteerde redenen voor zijn (waarvan ik geen enkel voorbeeld kan verzinnen...). En dat is niet omdat ze slecht zijn, maar wel omdat C++ voor beide een beter alternatief levert.
Beide oude C-functies verwachten een format-string en scanf verwacht pointers naar types. Dit zijn twee punten waarop gemakkelijk fouten gemaakt kunnen worden die met de C++-functies onmogelijk zijn. Daarnaast geven de input en output streams van C++ betere uniformiteit (schrijven naar bestanden of sockets kan op dezelfde manier als schrijven naar cout), meer formatting opties (zie iomanip) en meer mogelijkheden (zo is het mogelijk een class direct in std::cout te stoppen). Vroeger waren er nog wel eens verhalen dat het een of het ander sneller zou zijn, maar de compiler-kwaliteit is nu zo dat ik geen enkel verschil verwacht; er is namelijk geen technische reden waarom er verschil zou zijn.
Ik zie ook wel eens (niet vaak) printf en scanf in C++-code staan en ik denk ook dat het een reden heeft. Die reden is volgens mij omdat veel C-programmeurs 'overgestapt' zijn naar C++ zonder hun programmeerstijl aan te passen: ze gebruiken C++ gewoon als C met een beetje STL. Prima natuurlijk, maar het levert geen nette C++ code op.
Maar zoals ik al zei, ik ben benieuwd naar jouw kant. Kijk je veel naar andermans code en naar welke reden verwijs je?
| 1 | fprintf(dumpfile,"%.1f\t%.5f\n",input,result); |
| 1 2 3 4 | dumpfile.setprecision(1); dumpfile << fixed << input << "\t"; dumpfile.setprecision(5); dumpfile << result << endl; |
| 1 | dumpfile << fixed << setprecision(1) << input << "\t" << setprecision(5) << result << endl; |
Ik kan me wel voorstellen dat je het gemakkelijker en sneller vindt, omdat het inderdaad een stuk korter is om te typen. Echter, zover ik weet geeft printf niet "meer" controle. In jouw voorbeeldcode vind ik zelf de C++ code mooier om te lezen: ik vind het duidelijker om te zien wat er gebeurt, vooral omdat "setprecision" meer betekenis heeft dan "%.1f". Maar dit zal ook grotendeels gebaseerd zijn op voorkeur. De voordelen van de C++-aanpak die ik al genoemd heb, blijven natuurlijk onafhankelijk van mening.quote:Op vrijdag 14 september 2012 11:23 schreef FrankRicard het volgende:
Ik vind het gebruik van (f)printf en (f)scanf fijner omdat je op een makkelijkere en snellere manier meer controle hebt over hoe de formatting van je data is.
Hm even analyseren.quote:Op woensdag 12 september 2012 23:52 schreef GS42 het volgende:
C++ is ook een erg goede taal om verschikkelijke code in te schrijven. De volgende code is geldige C++(11). Het is dus prima te compileren en te runnen. Kan je voorspellen wat de output is? En waarom?
[ code verwijderd ]
Dit demonstreert mooi het nut van niet alleen juist maar ook duidelijk programmeren.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $ g++ -Wall -Wextra -std=c++11 -o meuk meuk.cpp meuk.cpp:1:1: warning: trigraph ??= converted to # [-Wtrigraphs] meuk.cpp:5:58: warning: trigraph ??< converted to { [-Wtrigraphs] meuk.cpp:6:35: warning: trigraph ??- converted to ~ [-Wtrigraphs] meuk.cpp:6:36: warning: trigraph ??- converted to ~ [-Wtrigraphs] meuk.cpp:6:44: warning: trigraph ??- converted to ~ [-Wtrigraphs] meuk.cpp:6:45: warning: trigraph ??- converted to ~ [-Wtrigraphs] meuk.cpp:6:58: warning: trigraph ??- converted to ~ [-Wtrigraphs] meuk.cpp:6:59: warning: trigraph ??- converted to ~ [-Wtrigraphs] meuk.cpp:6:71: warning: trigraph ??- converted to ~ [-Wtrigraphs] meuk.cpp:6:72: warning: trigraph ??- converted to ~ [-Wtrigraphs] meuk.cpp:6:85: warning: trigraph ??- converted to ~ [-Wtrigraphs] meuk.cpp:6:86: warning: trigraph ??- converted to ~ [-Wtrigraphs] meuk.cpp:6:92: warning: trigraph ??> converted to } [-Wtrigraphs] meuk.cpp:7:54: warning: trigraph ??( converted to [ [-Wtrigraphs] meuk.cpp:7:55: warning: trigraph ??- converted to ~ [-Wtrigraphs] meuk.cpp:7:59: warning: trigraph ??) converted to ] [-Wtrigraphs] meuk.cpp:7:95: warning: trigraph ??! converted to | [-Wtrigraphs] meuk.cpp:8:18: warning: trigraph ??/ converted to \ [-Wtrigraphs] meuk.cpp:8:5: warning: multi-line comment [-Wcomment] meuk.cpp:10:1: warning: trigraph ??> converted to } [-Wtrigraphs] |
| 1 2 3 4 5 | auto main() -> decltype(std::ios_base::xalloc() & false) { decltype(main()) _int<::> = <%~~72,101,~~108,108,111,~~32,119,111,~~114,108,100,~~46,10}; std::copy(_int, _int + sizeof(_int) / sizeof(_int[~-1U]), std::ostream_iterator<decltype('|')>(std::cout)); } |
Netjes, dat is de eerste stap. Dat zijn inderdaad twee vuile truukjes die ik erin heb gestopt: het gebruik van trigraphs en (gerelateerd) de dubbele commentaar-regel die schijnbaar uitgevoerde code verstopt.quote:Op vrijdag 14 september 2012 18:25 schreef t4rt4rus het volgende:
[..]
Hm even analyseren.
Krijg wel leuke warnings.
trigraphs...
[ code verwijderd ]
-edit-
Als je wil weten wat dit wordt, gebruik -E in gcc
[ code verwijderd ]
Let op dat ??/ in de comment er voor zorgt dat de regel erna ook een comment is.
Als je dan ook nog de digraphs eruit haalt en de dubbele not operators, is het toch wel te lezen?quote:Op vrijdag 14 september 2012 23:18 schreef GS42 het volgende:
[..]
Maar zelfs nadat de preprocessor erover is geweest, is de code nog niet gemakkelijk te lezen. Er zit nog een aantal andere vreemde constructies in, waarbij de compiler-waarschuwingen je niet gaan helpen.
Je bedoelt met "dubbele not operators" de bitwise complement operators (~)? En die digraph vond ik inderdaad ook leuk om de template-achtige notitie. Het is niet vreemd dat de preprocessor de digraphs er niet uithaalt, omdat dit niet door de preprocessor gedaan wordt. De digraphs worden tijdens het compileren zelf verwerkt.quote:Op zaterdag 15 september 2012 12:10 schreef t4rt4rus het volgende:
[..]
Als je dan ook nog de digraphs eruit haalt en de dubbele not operators, is het toch wel te lezen?
Vond die digraph <::> wel leuk, dan denk je dat het een één of andere template is maar het is gewoon een array.
Wel vreemd dat de preprocessor de digraphs niet er niet uithaalt.
Even kijken of dat echt zo is...
-edit-
En volgens mij mag `decltype(main())' niet.
Bitwise not of complement ja.quote:Op zondag 16 september 2012 01:47 schreef GS42 het volgende:
[..]
Je bedoelt met "dubbele not operators" de bitwise complement operators (~)?
warning: ISO C++ forbids taking address of function ‘::main’quote:Waarom mag decltype(main()) niet, denk je? Ik ben er niet 100% zeker van dat het mag, maar ik heb niets gevonden dat zegt dat het niet mag. De functie wordt niet uitgevoerd (daarom is decltype(i++) ook zo'n gemeen statement) en main() levert een rvalue int op, dus ik neem aan dat dat type gewoon gebruikt wordt. Mis ik iets?
Wanneer zou dat niet compatible zijn dan?quote:Ik ben er ook nog steeds niet helemaal zeker van of "~-1U" wel portable is. Er is natuurlijk wel een elegant en portable alternatief, maar toch.
Ik wist niet dat ~ ook wel not genoemd wordt; ik dacht gelijk aan operator!.quote:Op zondag 16 september 2012 11:04 schreef t4rt4rus het volgende:
Bitwise not of complement ja.
[..]
warning: ISO C++ forbids taking address of function ‘::main’
Ik snap hem ook niet.
[..]
Wanneer zou dat niet compatible zijn dan?
ISO/IEC 14882:2011quote:Op zondag 16 september 2012 17:24 schreef GS42 het volgende:
[..]
En nee, ik snap niet waarom GCC over decltype(main()) klaagt. Misschien iets in de implementatie van decltype(), waardoor de compiler toch denkt dat de operand ergens uitgevoerd wordt. Of het mag echt niet om een of andere reden...
quote:The function main shall not be used within a program.
Boeit voor het programma verder ook niet.quote:Ik twijfel aan ~-1U omdat ik niet zeker weet of -1U ook gegarandeerd alle bits op 1 zet op rare systemen.
Zou USACO kunnen zijn?quote:Op zondag 16 september 2012 12:16 schreef t4rt4rus het volgende:
Een tijdje terug heb ik op een site gezeten die vergelijkbaar is met Project Euler.
Alleen ging het daar echt om het programmeren en was het wat minder mathematisch.
Je had net als Project Euler vaste vragen, echter was er geen vast antwoord voor een vraag.
Voor elke vraag kreeg je een input die je moest gebruiken in je programma.
Deze input veranderde echter elke keer en je moest binnen een tijdslimiet je antwoord invullen of je moest de pagina herladen om een andere input te krijgen.
Kent iemand deze site?
Die had ik ook gevonden, maar het verduidelijkt hier niet. C++ noemt code namelijk "gebruikt" als het op een plek staat die geevalueerd kan worden, wat binnen decltype() duidelijk niet het geval is.quote:
Dat klopt in deze context inderdaad. Ik vraag het me alleen nog wel af.quote:Boeit voor het programma verder ook niet.
primaquote:Op woensdag 19 september 2012 21:06 schreef t4rt4rus het volgende:
Zitten er hier nog mensen op IRC?
Leuk om te channel te maken voor C++ op irc.fok.nl, irc.tweakers.net?
echt welquote:Op vrijdag 28 september 2012 10:40 schreef thabit het volgende:
Werkt dat echt, irc-kanalen over dit soort onderwerpen?
Dat ziet er inderdaad interessant uitquote:Op zaterdag 29 december 2012 14:12 schreef thabit het volgende:
Het volgende pdf'je is aardig leesvoer voor mensen die denken dat C geen object-georiënteerde taal is: http://www.planetpdf.com/codecuts/pdfs/ooc.pdf
C biedt ruime mogelijkheden om volledig OOP te gaan, op een manier die veel dynamischer is dan wat er in het "++"-deel van C++ zit.
In mijn ogen is het belangrijkste voordeel van C++ over C dan ook niet de OOP-structuur, maar de extra type safety die het te bieden heeft.
Thanks! Mooie pdf. Laatste is ook een belangerijke reden waarom kernels ook nog steeds vaak in C worden geschreven,quote:Op zaterdag 29 december 2012 14:12 schreef thabit het volgende:
Het volgende pdf'je is aardig leesvoer voor mensen die denken dat C geen object-georiënteerde taal is: http://www.planetpdf.com/codecuts/pdfs/ooc.pdf
C biedt ruime mogelijkheden om volledig OOP te gaan, op een manier die veel dynamischer is dan wat er in het "++"-deel van C++ zit.
In mijn ogen is het belangrijkste voordeel van C++ over C dan ook niet de OOP-structuur, maar de extra type safety die het te bieden heeft.
Hangt ervan af hoe slim je bent.quote:Op woensdag 13 februari 2013 20:22 schreef ufopiloot12 het volgende:
Even een kick,
Sinds kort begonnen met C++ tot nu toe gaat het wel goed, maar het geheugenbeheer schijnt vaak een probleem te zijn bij C++, zeker voor een beginner. Is C++ te doen voor een beginneling of is het te hoog gegrepen en zou je beter met een taal kunnen beginnen waar het geheugen is afgeschermd? Of het valt het allemaal wel mee?
Als je het principe snapt dat je geheugen kan alloceren en je dit ook weer terug moet geven, hoeft het geen probleem te zijn.quote:Op woensdag 13 februari 2013 20:22 schreef ufopiloot12 het volgende:
Even een kick,
Sinds kort begonnen met C++ tot nu toe gaat het wel goed, maar het geheugenbeheer schijnt vaak een probleem te zijn bij C++, zeker voor een beginner. Is C++ te doen voor een beginneling of is het te hoog gegrepen en zou je beter met een taal kunnen beginnen waar het geheugen is afgeschermd? Of het valt het allemaal wel mee?
Uh, wat? Oh wacht, sarcasme.quote:Op woensdag 13 februari 2013 23:50 schreef Wolfje het volgende:
Nee, dat is geen enkel probleem. Indien nodig gaat je computer vanzelf het extra geheugen swappen met disk ruimte op je harde schijf. Dat is tevens een mooi moment om een koffie/thee pauze te nemen.
Voor C++ gekozen of met Java bezig?quote:Op woensdag 13 februari 2013 20:22 schreef ufopiloot12 het volgende:
Even een kick,
Sinds kort begonnen met C++ tot nu toe gaat het wel goed, maar het geheugenbeheer schijnt vaak een probleem te zijn bij C++, zeker voor een beginner. Is C++ te doen voor een beginneling of is het te hoog gegrepen en zou je beter met een taal kunnen beginnen waar het geheugen is afgeschermd? Of het valt het allemaal wel mee?
Ik heb voor C++ gekozen.quote:Op woensdag 20 februari 2013 16:32 schreef t4rt4rus het volgende:
[..]
Voor C++ gekozen of met Java bezig?
Goed zoquote:Op woensdag 20 februari 2013 18:42 schreef ufopiloot12 het volgende:
[..]
Ik heb voor C++ gekozen.
Ben nu bezig de syntax te leren, maar ik heb het deze week best druk dus ik kan pas in het weekend weer aan de slag.
Met andere talen kun je niet zo makkelijk een willekeurig stuk geheugen overschrijven. Je hebt een buffer overflow voordat je er erg in hebt en krijgt geen enkele waarschuwing hierover. Dat is het probleem voor beginners met C of C++.quote:Op donderdag 14 februari 2013 00:35 schreef trancethrust het volgende:
[..]
Als het wel een probleem is dan is geen enkele taal een goed alternatief; slimmer programmeren is dan beter.
Klopt, maar dat zijn dingen die je een paar keer fout zal doen en dan heb je door hoe je zelf kan voorkomen dat het gebeurt en weet je dat je programma normaal gesproken crashed als je geheugen probeert te beschrijven wat niet "eigendom" van het programma is. (op Windows dan neem aan dat tegenwoordig elk besturingssysteem wel zoiets heeft)quote:Op woensdag 20 februari 2013 20:25 schreef Tijn het volgende:
[..]
Met andere talen kun je niet zo makkelijk een willekeurig stuk geheugen overschrijven. Je hebt een buffer overflow voordat je er erg in hebt en krijgt geen enkele waarschuwing hierover. Dat is het probleem voor beginners met C of C++.
Niet overschrijven van geheugen doet niets tegen memory leaks. Verder zijn buffer overflows niet de eerste dingen waar nieuwelingen overheen vallen; dat zijn de segfaults, en die krijg je vrijwel altijd direct in je gezicht. En dat is juist goed en leerzaam, m.i.quote:Op woensdag 20 februari 2013 20:25 schreef Tijn het volgende:
[..]
Met andere talen kun je niet zo makkelijk een willekeurig stuk geheugen overschrijven. Je hebt een buffer overflow voordat je er erg in hebt en krijgt geen enkele waarschuwing hierover. Dat is het probleem voor beginners met C of C++.
precies, en memory leaks is vooral niet vergeten je geheugen weer vrij te geven na gebruik (maw. gelijk na het maken van geheugen ook het vrijmaken van geheugen schrijven dan kan het eigenljik niet meer fout gaan)quote:Op woensdag 20 februari 2013 23:40 schreef trancethrust het volgende:
[..]
Niet overschrijven van geheugen doet niets tegen memory leaks. Verder zijn buffer overflows niet de eerste dingen waar nieuwelingen overheen vallen; dat zijn de segfaults, en die krijg je vrijwel altijd direct in je gezicht. En dat is juist goed en leerzaam, m.i.
Al vragen over de syntax?quote:Op woensdag 20 februari 2013 18:42 schreef ufopiloot12 het volgende:
[..]
Ik heb voor C++ gekozen.
Ben nu bezig de syntax te leren, maar ik heb het deze week best druk dus ik kan pas in het weekend weer aan de slag.
nou niet veel geloof ik zo...quote:Op zaterdag 23 februari 2013 23:45 schreef t4rt4rus het volgende:
[..]
Al vragen over de syntax?
Verschil i++ en ++i snap je?
Wat valt er verder eigenlijk te leren over syntax?
| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |