DOUG LLOYD: D'acord. Així que ara anem a una entrada Realment gran tema, funcions. Fins ara, en el curs, tot el programes que hem estat escrivint s'han escrit a l'interior de la principal. Són programes molt simples. Vostè no necessita tenir tots aquests branques i coses a fer. Només podem fer-ho tot dins del principal i no aconseguir terriblement aclaparador. Però a mesura que el curs segueix i a mesura que comença a desenvolupar programes independent, probablement van per començar a obtenir una gran quantitat més de 10 o 15 línies. Vostè pot obtenir centenars o milers o desenes de milers de línies de codi. I en realitat no és que boig un pensament. Com a tal, no és probablement una bona idea per mantenir tot l'interior de la principal. Pot ser una mica difícil de trobar el que estàs buscant si fas això. Afortunadament, tot i C, i més o menys qualsevol altre llenguatge de programació que podrien treballar, permet que escrivim funcions. I jo només vaig a prendre una ràpida costat aquí esmentar que les funcions és una àrea de la informàtica. I veuràs molts més d'ells en diversos punts al llarg del curs i si continua endavant. On hi ha una gran quantitat de sinònims de la mateixa paraula. Així que cridem a les funcions. Però també pot ser que sentir-los referit com a procediments, o mètodes, sobretot, si tens alguna vegada fet cap programació orientada a objectes abans-- i no et preocupis si no, no té un gran Deal-- però en orientat auditoria idiomes són cridats amb freqüència mètodes. De vegades se'ls crida subrutines. Però el que realment tots es refereixen a la mateixa idea bàsica. Anem a veure el que aquesta idea és. Què és una funció? Bé una funció és realment res més que un quadre negre. Un quadre negre que té un conjunt de zero o més entrades i una sola sortida. Així, per exemple, aquest podria ser una funció. Aquesta és una funció anomenada func. I es necessita tres entrades a, b i c. I dins d'aquesta caixa negre, ens No sé exactament el que fa, però processa les entrades d'alguna manera i llavors dóna una sola sortida, en aquest cas, z. Ara, perquè sigui una mica menys abstracte, ens Podríem dir que potser tenir una funció anomenada afegir que té tres entrades a, b, i c i processa la sortida d'alguna manera dins de la caixa de negre per produir una única sortida. Així doncs, en aquest cas, si afegir pren 3, 6 i 7. En algun lloc dins de la afegir la funció, ho faríem esperar que se sumaran per produir la sortida, la qual és 3 més 6 més 7 o 16. De la mateixa manera, té una funció anomenada mult que té dues entrades, A i B, els processa d'alguna manera que la sortida de la funció és el producte de les dues entrades. Les dues entrades multipliquen entre si. 4 i 5 es va traspassar mult, alguna cosa passa, el resultat que esperem és 20. Per què en diem un quadre negre? Bé, si no estem escrivint la Funcions a nosaltres mateixos, el que hem fet una mica en el que va CS50. Hem vist d'impressió f, per exemple, que és una funció que no escrivim nosaltres mateixos, sinó que fa ús de tot el temps. Si no estem escrivint les funcions de nosaltres mateixos, que realment no necessitem saber com és realment implementat sota el capó. Així per exemple, el quadre negre I només li va mostrar per la multiplicació, mult a, b podria ser defined-- i això és només alguns pseudocode-- podria ser definida com la producció a vegades b. Això té sentit, a la dreta. Si tenim una funció anomenada mult que té dues entrades. És d'esperar que la sortida seria ser les dues entrades multipliquen entre si, unes vegades b. Però també podria ser mult implementat com aquest, tenim un comptador variable posar-se a l'interior de mult a 0. I després repetim aquest procés b vegades agreguen un marcador. Per exemple, si multipliquem per 3 bis 5b, podríem dir establir comptador a 0, repetir cinc vegades, afegir 3 al marcador. Així que vam començar a 0 i després fem això cinc vegades 3, 6, 9, 12, 15. És el mateix resultat. Nosaltres tot i així obtenir 3 vegades 5 solament la implementació és diferent. Això és el que volem dir quan diem que un quadre negre. Només vol dir que realment no importa com s'implementa sota el capó sempre i quan la sortida és el que esperem. De fet, això és part del contracte de la utilització de les funcions, en particular funcions que altres escriuen. El comportament sempre va ser típic, impredictible basat en el nom de la funció. I és per això que és molt important a l'hora d'escriure funcions o quan altres persones escriuen funcions que pot utilitzar, que aquestes funcions tenen clares, noms relativament òbvies, i estan ben documentats. La qual cosa és certament el cas per a la funció com la impressió f. Llavors, per què fem servir funcions? Bé, com he dit abans, si escrivim tot el nostre codi dins de les coses principals pot ser realment complicat i realment complicat. Funcions ens permeten la capacitat per organitzar les coses i trencar un problema molt complicat en moltes parts sub més manejables. Les funcions també ens permeten simplificar el procés de codificació. És molt més fàcil de depurar un 10 funció de línia enfront d'una línia de 100 funció o una funció de línia de 1000. Si tan sols hem de depurar petites peces alhora, o escriure petits trossos de l'època, que fa que l'experiència en programació molt millor. Confia en mi en això. Finalment, si escrivim funcions que pot reutilitzar aquestes diverses parts. Les funcions poden ser reciclats. Poden ser utilitzats en un programa o un altre. Ja has escrit la funció, tot el que cal fer és dir-li a aquest programa on trobar aquesta funció. Hem estat reciclant i utilitzant imprimir f per més de 40 anys. Però només va ser escrit una vegada. Bastant útil, dreta. Tot bé. Així funcions són grans. Sabem això. Ara anem a començar a escriure ells. Comencem aconseguir ells en els nostres programes. Per tal de fer això, la primera El que fem és declarar la funció. Quan es declara una funció el que estàs fent, bàsicament, està dient que el compilador, bo, perquè ho sàpigues, Vaig a estar escrivint una funció més endavant i això és el que va a ser similar. La raó d'això és perquè els compiladors pot fer algunes coses estranyes si veuen un conjunt de símbols que no estan familiaritzats. Així que només ens donem el compilador 1 heads up, estic creant una funció i que va a fer això. Declaracions de funció general si vostè està organitzant el seu codi de manera que altres podran entendre i fer ús de, en general, vol posar tot de les seves declaracions de funcions a la part superior del seu codi, a la dreta abans de començar a escriure fins i tot principal. I convenientment, hi una forma molt estàndard que cada declaració segueix a la funció. Ells tots més o menys el següent aspecte. Hi ha tres parts a una funció declaració, el tipus de devolució, nom, i la llista d'arguments. Ara el tipus de retorn és quin tipus de variable de la sortida de funció voluntat. Així per exemple, si pensem tornar una Fa minuts a la multiplicació de dos funció dels números, què esperem si multipliquem un nombre enter per un nombre enter la sortida serà Probablement un nombre enter, a la dreta. Multiplica dos enters junts, s'obté un sencer. Així que el tipus de retorn d'aquesta funció seria int. Nom és el que vols per cridar a la seva funció. Aquest és probablement el menys important part de la declaració de la funció, en termes de funcionalitat. Però en realitat és probablement un de les parts més importants de la declaració de la funció en termes de saber el que la funció de realitat ho fa. Si el nom de la seva funció f o g o ho misteri o alguna cosa així, vostè està probablement va a aconseguir una mica ensopegar tractant recordar quines són aquestes funcions ho fan. Així que és important donar-li al seu noms significatius de funció. Finalment, la llista d'arguments és la llista separada per comes de totes les entrades a la seva funció, cadascun dels quals té un tipus i un nom. Així que no només ha vostè que especificar quin tipus de variable la sortida de la funció de la voluntat, també desitja especificar quin tipus i tipus de variables les la funció estarà acceptant com a entrades. Així que farem un exemple aquí. Anem a fer una ullada a un més concret. Així que aquí està un exemple d'una funció declaració per a una funció que afegiria dos enters junts. La suma de dos nombres enters va sigui un nombre sencer, així, com acabem discutit. I pel que el tipus de retorn, aquí en verd, seria int. Això només nosaltres afegir dos ints diu va, al final del dia, sortida o escopir de nou a nosaltres, un enter. Tenint en compte el que fa aquesta funció ens que desitgi donar-li un nom significatiu. Afegir dos enters sembla apropiat, tenint en compte estem prenent dos enters com entrades i és d'esperar sumar-los. Pot ser que sigui una mica molest nom i, francament, aquesta funció és probable que no sigui necessari ja que comptem amb l'addició operador, si vostè recorda de la nostra discussió dels operadors, amb anterioritat. Però diguem que pel bé de argument que aquesta funció és útil i així ho anem a cridar afegir dos enters. Finalment, aquesta funció pren dues entrades. Cada un dels quals és un nombre enter. Així que tenim aquesta comes llista separada de les entrades. Ara en general volem donar un nom a cada un d'ells de manera que puguin ser utilitzats dins de la funció. Els noms no són molt importants. En aquest cas, no ho fem necessàriament tenir algun significat unit a ells. Així que només els podem trucar a i b. Això és totalment bé. No obstant això, si vostè troba en una situació on els noms de les variables en realitat podria ser important, és possible que voleu trucar alguna cosa diferent de A i B donar-los una mica més simbòlicament significativa. Però en aquest cas, no ho fem de veritat saber alguna cosa més sobre la funció. Només volem sumar dos nombres enters. Així que només anomenarem els nombres enters a i b. Això és un exemple. Per què no et prens un segon pensar sobre això, Com escriure una funció declaració per a una funció que multiplica dos nombres de punt flotant? Te'n recordes del que és un nombre de punt flotant és? Què seria d'aquesta funció declaració sembla? Realment et recomano que pausar el vídeo aquí i pren la quantitat de temps que necessita. Penseu en el que això declaració de la funció seria? Quin seria el tipus de canvi? Quin seria un nom significatiu? Quines serien les entrades? Així que per què no fa una pausa en el vídeo aquí i escriure en marxa una declaració de funció per a una funció que es multiplicaria dos nombres de punt flotant junts. Esperem que pausa el vídeo. Així que anem a fer una ullada a un exemple d'una sola declaració possible. Flotador mult dos reals suren x, float i. El producte de dos nombres de punt flotant, recordar són la forma en què representar nombres reals o números amb valors decimals en c, serà un nombre de punt flotant. Quan multipliques 1 decimal per un nombre decimal, vostè està probablement va a aconseguir un decimal. Vols donar-li un nom rellevant. Multiplicar dos reals sembla bé. Però vostè podria realment cridar mult dos flotadors o boies mult. Res d'això, sempre que va donar un significat real al que aquest quadre negre que anava a fer. I de nou, en aquest cas, no ho fem sembla tenir cap significat adjunta als noms de la les variables que estem passant a, així que només els anomenem x i y. Ara bé, si vostè els diu alguna cosa una altra cosa, això és totalment bé. De fet, si ho has fet aquesta declaració en el seu lloc utilitzant dobles vegada de flotadors, si recordes que els dobles són una diferent manera de forma més precisa especificar els nombres reals o variables de punt flotant. Això és totalment bé també. Qualsevol dels que estaria bé. De fet, hi ha diversos diferents combinacions de maneres de declarar aquesta funció. Però aquests són dos molt bons. Hem declarat una funció, això és genial. Li hem dit que el compilador el que És a dir, el que farem. Ara anem a escriure en realitat aquesta funció. Anem a donar-li una definició, per la qual cosa dins de la caixa de negre comportament predictible està succeint. De fet, estem multiplicant dos reals números junts, o l'addició de nombres junts, o fer el que sigui que demanem nostra funció de fer. Així que, de fet, anem a tractar de definir multiplicar dos nombres reals que acabem parlat fa un segon. Ara bé, el principi de una definició de funció es veu gairebé exactament el mateix com una declaració de la funció. Tinc dos d'ells aquí. A la part superior és la declaració de la funció, tipus, nom, separats per comes argument llista, punt i coma. El punt i coma indica que que és una declaració de la funció. El principi de la funció definició es veu gairebé exactament la mateixa, tipus, nom, separats per comes llista d'arguments, sense punt i coma, obrir claudàtor. La clau d'obertura, igual que que hem estat fent amb el principal, vol dir que estem ara començant a definir el que passa dins de la caixa negre que hem decidit anomenar mult dos reals. Aquí és una manera de posar-ho en pràctica. Podríem dir, podríem declarar un nou variable del flotador anomenat tipus de producte i assignar aquesta variable al valor de x vegades i. I després tornar el producte. Què significa aquí retorn. Bé retorn és el camí indiquem que és com estem passant la sortida de tornada. Així retornar alguna cosa, és la mateixa que, aquesta és la sortida de la caixa de color negre. Així que aquesta és la forma de fer-ho. Aquí hi ha una altra manera de posar-ho en pràctica. Podríem simplement tornar x vegades i. x és un flotador. i és un flotador. Així que x vegades i també és un flotador. Ni tan sols necessitem crear una altra variable. Així que aquesta és una manera diferent de aplicar el mateix quadre negre exacta. Ara prengui un moment, pausar el vídeo de nou, i tractar de definir sumar dos sencers, que és l'altra funció que ens parlat fa un moment. De nou aquí, he posat la funció declaració, per la qual cosa el punt i coma, i un claudàtor obert i un arrissat tancada brida per indicar on anem a omplir en els continguts de sumar dos enters, de manera que definim el particular el comportament dins de la caixa de color negre. Així que fer una pausa en el vídeo. I prendre tot el temps que cal provar i definir una implementació de sumar dos sencers, com que quan la funció de sortida a un valor, ho fa, de fet, el retorn la suma de les dues entrades. Així que igual que l'exemple anterior, hi ha diverses maneres diferents que es podia aplicar afegir dos enters. Aquí n'hi ha un. Aquí a taronja tinc només tenia alguns comments-- Jo només he afegit alguns comentaris per a indicar el que està succeint en cada línia de codi. Així que em declaro una variable anomenada suma de tipus int. Dic suma és igual a més b. Aquí és on en realitat estem fent el treball afegint A i B junts. I torno suma. I això té sentit perquè suma és una variable de tipus int. I quin és el tipus de dades que aquesta funció em diu que va a la sortida? Int. Així que estic tornant suma, que és una variable sencera. I això té sentit tenint en compte el que hem declarat i definit la nostra funció fer. Ara vostè també pot definir la funció d'aquesta manera, int suma és igual a un plus B-- saltar aquesta primer step-- i després, tornar suma. Ara vostè podria tenir també implementat d'aquesta manera, que li recomano no ho recomano. Això és dolent per a un estil cosa i molt mal disseny, però ho fa, de fet, la feina. Si pren aquest codi, que és int afegir mal punt sumador de c, i l'utilitzen. En realitat, se li afegeix dos enters junts. És una aplicació molt dolenta d'aquest comportament en particular. Però funciona. És només per il·lustrar al punt que no ho fem de veritat importa el que succeeix a l'interior el quadre de negre, sempre com ho ha fet la sortida que esperem. Aquest és un quadre negre mal dissenyat. Però al final del dia, ho fa de sortida segueix sent la suma de a més b. Tot bé. Així que ens hem declarat funcions. I hem funció definida. Així que això és molt bo. Ara anem a començar a utilitzar les funcions que hem declarat i hem definit. Per trucar a un function-- en realitat bastant easy-- tot el que ha de fer és passar-ho arguments apropiats, arguments del tipus de dades que espera, i a continuació, assignar el retorn valor d'aquesta funció i esto-- excusa mi-- assignar el valor de retorn d'aquesta funció a alguna cosa del tipus correcte. Així que anem a fer una ullada a això en la pràctica en un arxiu anomenada escurçó 1 punt c, que Tinc en el meu CS50 IDE. Així que aquí està el sumador 1 punt c. A principis veieu que jo tinc la meva inclou, lliures inclouen, norma IO, i el punt CS50 h. I després tinc la meva declaració de la funció. Aquí és on sóc dient-li al compilador que sóc va a estar escrivint una funció anomenada sumar dos punts. Es va a una sortida variable de tipus sencer. Això és el que aquesta part és aquí. I després tinc dues entrades a un i b, cadascun dels quals és un nombre sencer. A l'interior de la principal, li demano a l'usuari d'entrada dient, dóna'm un sencer. I se'ls demana que s'oblidi int, que és una funció que s'inclou a la biblioteca CS50. I això s'emmagatzema en x, una variable sencera. Després impulsar per a un altre nombre enter. Tenim un altre sencer i emmagatzemar que, en i. I després, aquí a la línia 28, que és on realitzem la nostra crida a la funció. Estem dient, iguals z int afegir 2 sencers x comes i. Veus per què això té sentit? x és una variable de tipus sencer i i és una variable de tipus sencer. Així que això és bo. Això té sentit amb el que la nostra funció declaració en la línia 17 es sembla. La llista d'entrada separada per comes espera dos enters, a i b. En aquest cas, podem anomenar ells el que vulguem. Simplement s'espera que dos enters. I x és un nombre enter i i és un nombre enter. Això funciona. I sabem que la funció va a la sortida d'un sencers també. I així estem emmagatzemant el sortida de la funció, sumar dos sencers, en un tipus sencer variable, el que estem cridant z. I llavors podem dir, la suma de i cent i cent per cent i és i. x, y i z respectivament omplir els cent i de. Quina és la definició de afegeixen dos enters semblen? És molt senzill. És un dels que acabo de veure fa un segon, int suma és igual a una suma més b retorn. Funciona això? Salvem el fitxer. I després aquí al meu terminal Vaig a fer sumador 1, i jo aclareixo la pantalla. Vaig a fer un zoom perquè sé que és una mica difícil de veure. Així que compilem aquest programa com sumador 1. Així que podem fer punt slash sumador 1. Dóna'm un sencer, 10. Dóna'm un altre sencer, 20. La suma de 10 i 20 és 30. Així que vam fer una crida a la funció amb èxit. Podeu executar la funció de nou, negatiu 10, 17 suma negatiu 10 i 17 és 7. Aquesta funció funciona. Té el comportament que esperem que ho faci. I així hem fet un èxit funció, definició, declaració, i una crida a la funció amb èxit. Miscel·lània Parella punts sobre les funcions abans de concloure aquesta secció. Recordem de la nostra discussió dels tipus de dades, prèviament, que les funcions de vegades pot prendre ha entrades. Si aquest és el cas, declarar la funció com tenir una llista buida argument. ¿Recorda el que el més funció comuna que hem vist fins al moment que pren una llista d'arguments és nul? És principal. Recordem també que la funció a vegades en realitat no tenen una sortida. En aquest cas, declarem la funció com tenir un tipus de retorn void. Anem a concloure aquesta secció fer front a un problema de la pràctica. Així que aquí està el problema presentat. Jo vull que escriguis una funció anomenat triangle vàlida. El que aquesta funció ha de fer és prendre tres nombres reals que representen les longituds dels tres costats d'un triangle com els seus paràmetres, o els seus arguments, o el seu inputs-- altre conjunt de sinònims que poden sorgir. Aquesta funció ha de ja sigui de sortida vertader o fals depenent de si aquestes tres longituds són capaços de fer un triangle. Recordes el tipus de dades que utilitzem per indicar vertader o fals? Ara, com s'implementa això? Bé saben que hi ha un parell de normes relatives a triangles que són realment útil saber. Un triangle només pot tenir costats amb longitud positiva. Això té sentit. Probablement vostè està dient, duh. L'altra cosa a tenir en compte però, és que la suma de les longituds de qualsevol dos costats del triangle ha de ser major que la longitud del tercer costat. Això és realment cert. No es pot tenir un triangle de costats 1, 2 i 4, per exemple, perquè més 2 gen no és major que 4. Així que aquestes són les regles que determinar si o no els tres entrades poden formar concebible un triangle. Així que pren un parell de minuts i declarar i definir aquesta funció es diu vàlida triangle, de manera que en realitat té el comportament especificat aquí. Es donarà sortida a cert si aquests tres costats són capaços que comprèn un triangle, i false en cas contrari A punt per veure com ho va fer? Aquí hi ha una aplicació triangle vàlid. No és l'únic. El teu pot variar lleugerament. Però aquest ho fa, de fet, tenen el comportament que esperem. Declarem la nostra funció en el molt superior, bool triangle vàlida surar x flotador i flotador z. Així que de nou, aquesta funció porta tres nombres reals com els seus arguments, surant variables de valor punt, i emet una veritable o falsa valor, que és un booleà, el record. Així que per això el tipus de retorn és bool. Després definim la funció. El primer que fem és comprovar per assegurar- que tots els costats són positius. Si x és menor o igual a 0, o si i és igual a 0, o si z és menor o igual a 0, que no pot possiblement ser un triangle. No tenen aspectes positius. I així podem tornar fals en aquesta situació. A continuació, vam comprovar per assegurar- que cada parell d'entrades és més gran que la tercera. Així que si x més i és menys o igual a z, o si x més z és menor o igual a I, o si i més z és menor o igual a x, que tampoc pot haver-hi un triangle vàlida. Així que tornem falsa de nou. Suposant que passem tant dels controls però, llavors podem tornar realitat. A causa de que aquestes tres costats són capaços de returning-- de crear un triangle vàlida. I això és tot. Ara ha declarat i definit. I vostè pot ser capaç d'ara usar i cridar a aquesta funció. Bon treball. Sóc Doug Lloyd. Això és CS50.