1 00:00:00,000 --> 00:00:00,493 2 00:00:00,493 --> 00:00:09,860 >> [Música tocando] 3 00:00:09,860 --> 00:00:13,520 >> ZAMYLA CHAN: Prefire recibir 10 millóns de dólares agora ou recibir 4 00:00:13,520 --> 00:00:17,460 tostões todos os días do mes, cando cada día posterior, que obtén 5 00:00:17,460 --> 00:00:21,280 dobrar a cantidade de moedas que recibida o día anterior? 6 00:00:21,280 --> 00:00:24,010 En tostões, imos probar por que ten que 7 00:00:24,010 --> 00:00:27,000 asumir definitivamente os tostões. 8 00:00:27,000 --> 00:00:29,130 A súa tarefa é escribir pennies.c-- 9 00:00:29,130 --> 00:00:33,330 un programa que pide ao usuario como primeiro Hai moitos días no mes e 10 00:00:33,330 --> 00:00:38,780 entón pregunta cantos centavos o usuario vai recibir, o primeiro día. 11 00:00:38,780 --> 00:00:41,780 O programa debe entón calcular a importe que o usuario terá 12 00:00:41,780 --> 00:00:46,530 acumulado ao final do mes e amosar-lo. 13 00:00:46,530 --> 00:00:49,670 >> Podemos dividir este programa para un par de tarefas. 14 00:00:49,670 --> 00:00:52,830 Imos ter para solicitar múltiples entradas de usuario - 15 00:00:52,830 --> 00:00:55,510 días e meses, e moedas de un centavo o primeiro día. 16 00:00:55,510 --> 00:00:59,390 Necesitamos manter o control de canto diñeiro o usuario ten e actualiza-lo cada 17 00:00:59,390 --> 00:01:03,060 día, dobrando a cantidade de tostões que reciben. 18 00:01:03,060 --> 00:01:06,710 E, finalmente, imprimir o seu total final, en dólares. 19 00:01:06,710 --> 00:01:08,570 >> Imos atacar a entrada do usuario en primeiro lugar. 20 00:01:08,570 --> 00:01:11,560 Vou abrir apples.c, programa curto, que trata 21 00:01:11,560 --> 00:01:13,840 con entradas e saídas. 22 00:01:13,840 --> 00:01:17,310 Na parte superior aquí, eu incluín algúns das bibliotecas que eu teño - 23 00:01:17,310 --> 00:01:20,450 Biblioteca de CS50 e un patrón I / O da biblioteca. 24 00:01:20,450 --> 00:01:24,310 Eu imprimir unha ventá utilizando o función printf do 25 00:01:24,310 --> 00:01:25,660 biblioteca estándar de E / S. 26 00:01:25,660 --> 00:01:29,740 Pero o impulso efectivo do usuario ocorre na seguinte liña con este 27 00:01:29,740 --> 00:01:33,650 Función GetInt na biblioteca CS50. 28 00:01:33,650 --> 00:01:38,300 >> GetInt obtén a entrada do usuario e asegura que a entrada é un número enteiro. 29 00:01:38,300 --> 00:01:45,160 Entón eu gardar a entrada do usuario no integer i, subtraia 1 do i, e, a continuación, 30 00:01:45,160 --> 00:01:47,610 imprimir o novo valor se i. 31 00:01:47,610 --> 00:01:53,050 Despois de compilar apples.c mediante o mando "facer mazás," Eu teño unha 32 00:01:53,050 --> 00:01:55,770 mazás arquivo executábel. 33 00:01:55,770 --> 00:01:58,760 Execución que, eu vou entrada 1. 34 00:01:58,760 --> 00:02:02,600 O programa dime que Teño 0 mazás esquerda. 35 00:02:02,600 --> 00:02:05,480 E así que funcionou como se esperaba. 36 00:02:05,480 --> 00:02:09,740 >> Entón, imos realizar este novo e unha entrada negativa. 37 00:02:09,740 --> 00:02:13,950 Agora, tendo un valor negativo de mazás non ten moito sentido, pero 38 00:02:13,950 --> 00:02:18,370 o programa acepta-lo, porque o negativo 1, tamén, que é un número enteiro. 39 00:02:18,370 --> 00:02:22,740 E agora, o programa ou o monstro dentro do programa come un negativo 40 00:02:22,740 --> 00:02:26,250 mazá, e agora eu teño 2 mazás negativos. 41 00:02:26,250 --> 00:02:28,610 Hm, entón iso é unha lección - 42 00:02:28,610 --> 00:02:32,965 aínda que a función GetInt e funcións relacionadas, como GetFlow ou 43 00:02:32,965 --> 00:02:38,100 GetString obter o tipo de datos para a dereita, vostede ten que estar seguro de que a entrada fai 44 00:02:38,100 --> 00:02:41,430 sentido para o seu programa. 45 00:02:41,430 --> 00:02:45,500 >> En tostões, non fará máis que un poder a un enteiro, teñas que facer 46 00:02:45,500 --> 00:02:49,550 seguro de que o usuario inserir un enteiro que ten sentido dado o contexto. 47 00:02:49,550 --> 00:02:55,690 Mes pode ter só 28, 29, 30 ou 31 días. 48 00:02:55,690 --> 00:02:59,160 Queremos esixir continuamente un número enteiro válido. 49 00:02:59,160 --> 00:03:03,240 Se introducir un número enteiro fóra do noso límites aceptados, imos levalos 50 00:03:03,240 --> 00:03:07,190 unha e outra vez, ata que ofrécenos un enteiro válido. 51 00:03:07,190 --> 00:03:10,070 >> Teña en conta que do "repeat ata" bloquear en cero? 52 00:03:10,070 --> 00:03:13,070 Podes facer unha construción semellante en C usando un loop "while" 53 00:03:13,070 --> 00:03:14,830 ou "-mentres facer" loop. 54 00:03:14,830 --> 00:03:18,280 A estrutura de loop while ten unha condición que deben ser cumpridos á 55 00:03:18,280 --> 00:03:20,160 corpo do loop para realizar. 56 00:03:20,160 --> 00:03:23,080 >> Isto debe parecer algo similar, porque a condición é igual a 57 00:03:23,080 --> 00:03:25,970 Bloques cero cos ángulos e nos soportes 58 00:03:25,970 --> 00:03:27,950 do loop "while". 59 00:03:27,950 --> 00:03:30,600 Entón, esta condición pode comprobar se o número enteiro queda 60 00:03:30,600 --> 00:03:32,680 os límites axeitados. 61 00:03:32,680 --> 00:03:36,620 Pode pedir o número enteiro usando GetInt e, a continuación, realizar o seu "tempo" 62 00:03:36,620 --> 00:03:41,030 loop, repetindo o poder e impresión instrucións, mentres que a entrada 63 00:03:41,030 --> 00:03:43,470 non é válido. 64 00:03:43,470 --> 00:03:47,610 >> Outra forma de garantir a entrada do usuario correcto está a usar un "do-while" loop, 65 00:03:47,610 --> 00:03:50,400 o que é moi semellante a un loop. 66 00:03:50,400 --> 00:03:54,950 O "faga mentres" lazo execútase o código dentro do corpo e, a continuación, os cheques 67 00:03:54,950 --> 00:03:57,150 a condición de ser satisfeita ou non. 68 00:03:57,150 --> 00:04:00,590 Isto é útil para a obtención de entrada do usuario, porque vostede sabe que precisa 69 00:04:00,590 --> 00:04:02,980 para levalos polo menos unha vez. 70 00:04:02,980 --> 00:04:07,200 Se a condición non se responde, o programa utilizará a liña tras 71 00:04:07,200 --> 00:04:08,530 seu ", mentres fan" loop. 72 00:04:08,530 --> 00:04:13,230 Se a condición se responde, porén, o ciclo se repetirá 73 00:04:13,230 --> 00:04:17,490 >> A "faga mentres" volta para a validación de usuario entrada será algo parecido a isto. 74 00:04:17,490 --> 00:04:24,530 Eu declaro unha variable n, GetInt e Repita ata que non é válido. 75 00:04:24,530 --> 00:04:28,040 E este proceso, eu expliquei, estaba usando o tipo integer-data, que 76 00:04:28,040 --> 00:04:29,820 vai empregar para os días do mes. 77 00:04:29,820 --> 00:04:33,560 Pero sabemos que o número de moedas de un centavo se acumulan rapidamente, polo que, a fin de 78 00:04:33,560 --> 00:04:39,160 almacenar números grandes, usa o tipo de datos LongLong, pero lembre se a mesma 79 00:04:39,160 --> 00:04:42,590 principio de validación se aplica. 80 00:04:42,590 --> 00:04:47,070 >> Impresionante, entón cando temos dous válido entradas do usuario - 81 00:04:47,070 --> 00:04:49,530 días do mes e as moedas de un centavo o primeiro día - 82 00:04:49,530 --> 00:04:52,870 podemos pasar á seguinte parte do programa. 83 00:04:52,870 --> 00:04:56,680 O primeiro día, o usuario comeza con porén moitos tostões eles especificados 84 00:04:56,680 --> 00:05:00,370 e a cantidade de moedas que recibir, o día seguinte é dobrada. 85 00:05:00,370 --> 00:05:03,130 Polo tanto, ten sentido manter o control destes dous valores - 86 00:05:03,130 --> 00:05:08,890 canto diñeiro o usuario ten e como moitos tostões que será dado. 87 00:05:08,890 --> 00:05:13,760 >> Agora facer algo por 28 a 31 días é repetitivo, por iso imos usar un "for" 88 00:05:13,760 --> 00:05:18,220 loop para iterado sobre os días no mes, actualizar o total e peso 89 00:05:18,220 --> 00:05:21,010 cantidade de cada vez. 90 00:05:21,010 --> 00:05:23,550 "Para" sintaxe de loop contén o seguinte - 91 00:05:23,550 --> 00:05:27,510 unha inicialización, unha condición, e unha actualización. 92 00:05:27,510 --> 00:05:29,590 O seu bucle "for" pode arrincar unha variable, cando 93 00:05:29,590 --> 00:05:31,380 entra por primeira vez o loop. 94 00:05:31,380 --> 00:05:34,860 Se a condición se responde, o corpo do loop será executado. 95 00:05:34,860 --> 00:05:36,860 Despois diso, a actualización será executada. 96 00:05:36,860 --> 00:05:40,900 Se a condición é aínda cumprida, o loop executarase e actualizar e 97 00:05:40,900 --> 00:05:45,820 repetir, sempre que a súa condición valorada como certa. 98 00:05:45,820 --> 00:05:51,080 >> Velaquí un loop "é" que divide unha número enteiro de 2 p por un total de 10 veces. 99 00:05:51,080 --> 00:05:55,380 Observe como eu declarei o enteiro p fóra do meu loop "a", de xeito que o 100 00:05:55,380 --> 00:05:59,850 enteiro pode ser accesible fóra do loop "a". 101 00:05:59,850 --> 00:06:03,620 Despois de que o mes pasou, é hora para informar ao usuario canto diñeiro 102 00:06:03,620 --> 00:06:04,790 eles quedaron. 103 00:06:04,790 --> 00:06:08,740 Pola especificación, ten que informar ao usuario cantos dólares, e non como moitos 104 00:06:08,740 --> 00:06:10,780 tostões, que eles teñen. 105 00:06:10,780 --> 00:06:14,620 Pero ata agora, mantivo o control do total e os tostões que utilizan LongLongs, 106 00:06:14,620 --> 00:06:16,640 que son números enteiros. 107 00:06:16,640 --> 00:06:20,560 >> Hai 100 centavos a US $ 1, salvo que o número de moedas é unha 108 00:06:20,560 --> 00:06:24,860 múltiplo de 100, vai ter representar cifras decimais. 109 00:06:24,860 --> 00:06:28,060 O autotype dobrou permite que faga iso. 110 00:06:28,060 --> 00:06:32,790 Entón, como imos converter de representar tostões para dólares? 111 00:06:32,790 --> 00:06:35,330 >> Imos dar un ollo pi.c. 112 00:06:35,330 --> 00:06:41,690 Este programa ten un big_pi LongLong e divídese por 100 mil, e imprime 113 00:06:41,690 --> 00:06:44,270 o resultado de cinco cifras decimais. 114 00:06:44,270 --> 00:06:48,560 Se quixésemos ver catro decimal lugares, entón podemos simplemente substituír este 115 00:06:48,560 --> 00:06:49,760 número aquí. 116 00:06:49,760 --> 00:06:58,370 Entón, imos gardar, compilar pi, e entón ver o resultado, que 117 00:06:58,370 --> 00:07:02,240 esperar ser 3,1415 - 118 00:07:02,240 --> 00:07:04,540 os cinco primeiros díxitos do pi. 119 00:07:04,540 --> 00:07:06,300 >> Non é con todo. 120 00:07:06,300 --> 00:07:07,390 E por que? 121 00:07:07,390 --> 00:07:11,920 Ben, porque big_pi é un LongLong, que é un número enteiro, o que non 122 00:07:11,920 --> 00:07:13,740 manter o control de cifras decimais. 123 00:07:13,740 --> 00:07:16,850 A modificación que eu teño facer é en división. 124 00:07:16,850 --> 00:07:23,300 Eu teño converter a un double aquí antes división, porque dobres non pode manter 125 00:07:23,300 --> 00:07:25,260 seguir de cifras decimais. 126 00:07:25,260 --> 00:07:28,080 E eu estou indo a engadir unha nova liña aquí para unha mellor formato. 127 00:07:28,080 --> 00:07:33,090 128 00:07:33,090 --> 00:07:34,230 >> E aquí temos que - 129 00:07:34,230 --> 00:07:37,660 3,1416. 130 00:07:37,660 --> 00:07:43,520 Pode notar que imprime 3.1416 no canto de 3,1415 como se esperaba. 131 00:07:43,520 --> 00:07:47,550 Isto porque roldas durante o proceso de división, en vez de só 132 00:07:47,550 --> 00:07:50,490 truncando o valor. 133 00:07:50,490 --> 00:07:53,710 Agora ten que ser capaz de imprimir a total final correctamente, que remata 134 00:07:53,710 --> 00:07:54,870 o programa. 135 00:07:54,870 --> 00:07:55,930 >> Parabéns. 136 00:07:55,930 --> 00:07:57,340 O meu nome é Zamyla. 137 00:07:57,340 --> 00:07:58,720 E iso foi tostões. 138 00:07:58,720 --> 00:08:05,589 >> [Música tocando]