ÏÝ º ÙÒ Ð Ö Ò ÙÒ ËÔÓ Ó Ý ÔÖÞ ÞÝÛ Ò Ö ÙÑ ÒØ Û ÞÛÖ Ò Û ÖØÓ ÈÖÞ ÞÝÛ Ò Ö ÙÑ ÒØ Û ÔÖÞ Þ Û ÖØÓ ÔÖÞ Þ Ö ÈÖÞÝ Ý ÔÖÓ Ö Ñ Û È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ ¾»
Þ Á Ð Ö Ò ÙÒ È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ»
Ð Ö Ò ÙÒ ÙÒ Û ÞÝ Ù Ù Ý Ó Ó Ð Þ Ò Ô ÛÒÝ Û ÖØÓ ÐÙ ÛÝ ÓÒÝÛ Ò Ô ÛÒÝ ÞÝÒÒÓ º Í ÝØ ÓÛÒ Ò ÑÙ Ò ÞÒ ÞÞ Û ÑÔÐ Ñ ÒØ º ÙÒ Û ÞÝ Ù Ø Ö ÛÒÓÛ Ò ÔÖÓ ÙÖÞ ÐÙ ÙÒ Û È ÐÙº ÈÓ Ø Ò ÙÒ ØÝÔ Û ÖØÓ Ò ÞÛ ÙÒ Ð Ø Ô Ö Ñ ØÖ Ûµ ß Ð Ö Ò ØÖÙ Ð È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ»
ÈÖÞÝ Ð Ö Ò ÙÒ ÈÖÞÝ ÓÙ Ð ÖÑ ÒØµ ÃÄ Ê Â ÈÊÇÌÇÌ Èµ ÓÙ Ð ÖÑ ÒØ Òµ ÁÆÁ Â ß ÓÙ Ð ½º¼ ÒØ ÓÖ ¾ < Ò µ ½º¼» Ö ØÙÖÒ Ð È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ»
ËÔÓ Ó Ý ÔÖÞ ÞÝÛ Ò Ö ÙÑ ÒØ Û ÞÛÖ Ò Û ÖØÓ Ñ ÒÒ ÛÝ ØÔÙ Ò Ð Ô Ö Ñ ØÖ Û Ò ÙÒ Ò ÞÝÛ Ò Ø Ô Ö Ñ ØÖ Ñ ÐÙ Ö ÙÑ ÒØ Ñ ÓÖÑ ÐÒÝÑ ÔÓ Þ Ý Ó ÔÓÛ Ò Ù ÝÛ ÒÝ ÔÖÞÝ ÛÝÛÓ Ò Ù ÙÒ ÒÓ Ò ÞÛ Ö ÙÑ ÒØÙ ØÙ ÐÒ Óµº Ö ÙÑ ÒØÝ ÙÒ ÔÖÞ ÞÝÛ Ò ÔÖÞ Þ Û ÖØÓ Ó ÓÞÒ Þ ÛÝÛÓ Ò ÙÒ ÓØÖÞÝÑÙ ÝÒ Û ÖØÓ ÔÖÞ ÓÛÙ Ò ÞÑ ÒÒÝ ØÝÑÞ ÓÛÝ Ò ÓØÖÞÝÑÙ Ò ÑÝ Ö ÙÑ ÒØ Ûº Ø Ñ ÙÒ Ò ÑÓ ÞÔÓ Ö Ò Ó ÞÑ Ò Û ÖØÓ Ö ÙÑ ÒØÙ ÙÒ º ÅÓ Ý Ö ÙÑ ÒØÙ ÑÓ ÑÝ Ò ÙÞÝ ÔÓÔÖÞ Þ Û õò Ö Ý ÔÖÞ ÞÝÛ Ò Ô Ö Ñ ØÖÙ ÔÖÞ Þ Ö µº Ê ÓÖ ÛÝÛÓ Ò ÙÒ Ò º Ø Ú Ø ÓÒ Ö ÓÖ Ø Ö Ñ µ Ó Ö Ð Ý Ø Ò ÔÓ Þ Þ Ò Þ Û Ö ¹ Û ÖØÓ Ö ÙÑ ÒØ Û ¹ ÞÑ ÒÒ ÐÓ ÐÒ ¹ Ö ÔÓÛÖÓØÙ ¹ ÝÒ Ñ ÞÒ ÓÛ Þ Ò Û õò Ó Ö ÓÖ Ù ÛÝÛÓ Ò ÔÖÓ Ù ÛÝÛÓ Ò ÙÒ ¹ ÞÛÖ Ò Û ÖØÓ Ð ÙÒ Ò Ø ØÝÔÙ ÚÓ µº È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ»
ÈÖÞÝ Þ Ñ Ò Û ÖØÓ ÞÑ ÒÒÝ ÒÐÙ < Ø Óº > ÚÓ Û Ô½ ÒØ ÒØµ» ÈÖÞ ÞÝÛ Ò Ô Ö Ñ ØÖ Û ÔÖÞ Þ Û ÖØÓ º» ÚÓ Û Ô¾ ÒØ ÒØ µ» ÈÖÞ ÞÝÛ Ò Ô Ö Ñ ØÖ Û ÔÖÞ Þ Ö º» ÒØ Ñ Ò ÚÓ µ ß ÒØ Ü Ý ½¼ ÔÖ ÒØ Ü ± Ý ± \Ò Ü Ýµ Û Ô½ Ü Ýµ ÔÖ ÒØ ÈÓ ÛÝ ÓÒ Ò Ù Û Ô½ Ü Ýµ \Ò µ ÔÖ ÒØ Ü ± Ý ± \Ò Ü Ýµ ÔÖ ÒØ ÈÓ ÛÝ ÓÒ Ò Ù Û Ô¾ ²Ü ²Ýµ \Ò µ Û Ô¾ ²Ü ²Ýµ ÔÖ ÒØ Ü ± Ý ± \Ò Ü Ýµ Ù Ø Òµ ÔÖ ÒØ Ý Þ ÓÒÞÝ Ò Ò ÆÌ ʺ µ Ø Ö µ Ö ØÙÖÒ ¼ Ð È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ»
ÈÖÞÝ Þ Ñ Ò Û ÖØÓ ÞÑ ÒÒÝ º º ÚÓ Û Ô½ ÒØ ÒØ µß ÒØ ÔÓÑ ÔÓÑ Ð ÚÓ Û Ô¾ ÒØ ÒØ µß ÒØ ÔÓÑ ÔÓÑ Ð È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ»
ÈÖÞÝ Þ Ñ Ò Û ÖØÓ ÞÑ ÒÒÝ º º» ÏÝÒ Ü Ý ½¼ ÈÓ ÛÝ ÓÒ Ò Ù Û Ô½ Ü Ýµ Ü Ý ½¼ ÈÓ ÛÝ ÓÒ Ò Ù Û Ô¾ ²Ü ²Ýµ Ü ½¼ Ý Ý Þ ÓÒÞÝ Ò Ò ÆÌ ʺ» È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ»
ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ È ÓØÖ ÆÓÛ ½ ÁÒ ØÝØÙØ ËÝ Ø ÑÓÛÝ È Æ ½ ¹Ñ Ð ÔÒÓÛ Ô ÒºÛ ÛºÔÐ È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ ½» ½
ÏÝ º Ò ÓÛ Û»ÛÝ Ù Ý ÞÒ ÓÛ ÙÒ Ó Ù Ù ÞÒ ÓÛ Û»ÛÝ ÈÓ Ù ÞÒ ÓÛ Ó ËØ ÞÑ ÒÒ Ù ÓÛ ÇÔ Ö Ò Ù ÞÒ ÓÛÝ È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ ¾» ½
Þ Á ÙÒ Ó Ù Ù ÞÒ ÓÛ Û»ÛÝ È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ» ½
ØÓ ÓÛ Ò ÙÒ ÔÙØ Ö µ Ø Ö µ ÙÒ ÒØ Ø Ö ÚÓ µ ÞÛÖ Ó ÞÒ Ù Þ Ø Ò Ö ÓÛ Ó Û ØÖ ØÓÛ ÒÝ Ó ÙÒ Ò Ö ÔÖÞ ÞØ ÓÒÝ Ó ØÝÔÙ ÒØº Ï ÔÖÞÝÔ Ù Ó ÔÐ Ù ÐÙ Ù ÙÒ ÞÛÖ Û ÖØÓ Ç º ÙÒ ÒØ ÔÙØ Ö ÒØ µ ÛÝ Ý ÞÒ Ó Ø Ò Ö ÓÛ Ó ÛÝ ÞÛÖ Ó ÞÒ Ù ØÖ ØÓÛ ÒÝ Ó ÙÒ Ò Ö ÔÖÞ ÞØ ÓÒÝ Ó ØÝÔÙ ÒØº ÏÝÛÓ Ò ÔÙØ Ö µ Ø Ö ÛÒÓÛ Ò ÛÝÛÓ Ò Ù ÔÙØ Ø ÓÙØµº Ï ÔÖÞÝÔ Ù Ù ÙÒ ÞÛÖ Û ÖØÓ Ç º È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ» ½
ÈÖÞÝ ÔÖÞ Ô ÝÛ Ò Û Ò ÛÝ º ÈÖÞÝ Ç Ò Ó Ð µ ÒÐÙ Ø Óº ÒØ Ñ Ò ÚÓ µ ß Ö Þ Þ Ø Ö µ Û Ð Þ Ç µ ß ÔÙØ Ö Þµ Þ Ø Ö µ Ð Ö ØÙÖÒ ¼ Ð È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ» ½
ÈÖÞÝ ¹ ÞÐ Þ Ò Û Û Ø ÈÖÞÝ ÒÐÙ < Ø Óº > ÒØ Ñ Ò ÚÓ µ ß ÒØ Ð ¼ Û ÐÓÛ ¼ Ö ÞÒ Û Ð ÞÒ Ø Ö µµ ³\Ò³µ ÞÒ ³ ³µ Û ÐÓÛ ¼ Ð Û ÐÓÛ µ ß Û ÐÓÛ ½ Ð Ð ÔÖ ÒØ \Ò± Ð µ Ö ØÙÖÒ ¼ Ð È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ» ½
ÈÖÞÝ ¹ Ù ÙÛ Ò Ò Ñ ÖÓÛÝ Ô ÈÖÞÝ ÒÐÙ < Ø Óº > ÒØ Ñ Ò ÚÓ µ ß ÒØ ½»» Ô Ñ»» Ó Ø ØÒ Ó ÞÝØ Ò Ý Ð Ø Ö ººº Ö ÞÒ Û Ð ÞÒ Ø Ö µµ ³\Ò³µ ß ½ ²² ÞÒ ³ ³µß ¼ ÔÙØ Ö ÞÒµ Ð ÞÒ ³ ³µµ ß ½ ÔÙØ Ö ÞÒµ Ð Ð Ö ØÙÖÒ ¼ Ð È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ» ½
ÈÖÞÝ ¹ ÛÝ ÞÙ Û Ò ÓÛ Û Ø ÈÖÞÝ ÒÐÙ < Ø Óº > ÒØ Ñ Ò ÚÓ µ ß ÒØ ¼ Ø Ò ½ ÒÖ ¼ Ö Û Ð ²² Ø Ö µµ Ç µ ß Û Ø µ ß ³ ³ Ø Ò ½µ Ø Ò ¾ Ð Ø Ò µ Ø Ò ¾ Ð Ø Ò µ ½ Ö ³ ³ Ø Ò ¾µ Ø Ò Ð Ø Ò µ Ø Ò Ð Ø Ò µ Ø Ò ½ Ö ÙÐØ Ø Ò ½ Ð È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ» ½
ÈÖÞÝ ¹ ÛÝ ÞÙ Û Ò ÓÛ Û Ø ÈÖÞÝ Ð ÒÖ Ð µ ÔÖ ÒØ \ÒÛ Ø Ø ÐÓÛÓ Ò ÔÓÞÝ ± ÒÖ¹ µ Ð ÔÖ ÒØ \ÒÛ Ø Ò Ñ ÐÓÛ µ Ö ØÙÖÒ ¼ Ð È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ» ½
Þ ÁÁ ÈÓ Ù ÞÒ ÓÛ Ó È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ ½¼» ½
Ù ÞÒ ÓÛÝ Ù Ñ ÞÒ ÓÛÝÑ Ò ÞÝÛ ÑÝ ÞÒ Ûº Ï ÞÝ Ù Ò ØÒ Ô ÐÒÝ ØÝÔ Ù ÓÛݺ Ó Ö ÔÖ Þ ÒØ Ù Û ÞÒ ÓÛÝ Û ÞÝ Ù Ù Ø Ð ØÝÔÙ Öº Ç Ø ØÒ Ñ ÞÒ Ñ Û Ø Ø Ð Ø ÞÒ ³\¼³º Á ØÒ ÔÙ ØÝ Ù ÞÒ ÓÛÝ Û ÛÞ Ø Ð Þ Û Ö ØÝÐ Ó ³\¼³µº Ù Ñ ÞÒ ÓÛÝÑ ÑÓ Ò ÔÓ Ù Û ÔÓ Ó Ò Ø Ð º È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ ½½» ½
Þ ÁÁÁ ËØ ÞÑ ÒÒ Ù ÓÛ È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ ½¾» ½
ËØ ÞÑ ÒÒ Ù ÓÛ Å ØÓ Ý Ð Ö ÞÑ ÒÒÝ Ù ÓÛÝ Ö Ò Ô ¾ Ö Ò Ô ¾ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò Ö Ò Ô ¾ ß ³È³ ³Ó³ ³ ³ ³ ³ ³Ø³ ³ ³ ³Û³ ³Ý³ ³ ³ ³Ô³ ³Ö³ ³Ó³ ³ ³ ³Ö³ ³ ³ ³Ñ³ ³Ó³ ³Û³ ³ ³ ³Ò³ ³ ³ ³ ³ ³\¼³Ð Ö Ò Ô ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ËØ Ò Ù Ø Ð Ø ÝÑ Ù ÓÛÝÑ Ø ÝÑ Ø Ð Ñ ÞÒ Û Þ Ó ÞÓÒÝÑ ÞÒ Ñ ³\¼³ µº  РÞÑ ÒÒ Ù ÓÛ Ò ÓÛ Ò Ù Ñ Ö Ø ÞÝÑ Ó Ù Ó ÔÓÞÓ Ø ÔÓÞÝ Û Ø Ð Ý ÛÝÔ Ò Ò ÞÒ Ñ Þ ÖÓÛÝÑ º È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ ½» ½
Þ ÁÎ ÇÔ Ö Ò Ù ÞÒ ÓÛÝ È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ ½» ½
ÈÐ Ò Û ÓÛÝ ØÖ Ò º ÛÝ Ö Ò ÙÒ Þ Ø ØÖÐ Ò ÓÒ Ø Ö µ Ù Ó Ù Þ ÞÒ Ù \¼³µ ÒØ ØÖÑÔ Ö Ø½ Ö Ø¾ µ ÙÒ ÔÓÖ ÛÒÙ Ù Ý Û ÔÓÖÞ Ù Ð Ý Ó Ö ÞÒÝÑ ÞÛÖ Û ÖØÓ <¼ Ý Ø½<ؾ ¼ Ý Ø½ ؾ >¼ Ý Ø½>ؾ Ö ØÖÔÝ Ö Ø ÓÒ Ø Ö Öµ ÓÔ ÓÛ Ò Ù Ö Ó Ø Ð Ý Ø Ö ØÖ Ø Ö Ø ÓÒ Ø Ö Ö µ Ó Ò Ù Ö Ó Ù Ø ÞÛÖ Ò Ö Ù ÔÓ ÞÓÒ Ó Ù Øµ Ö ØÖ Ö ÓÒ Ø Ö ÒØ µ Ö Ô ÖÛ Þ Ó ÛÝ Ø Ô Ò ÞÒ Ù Û Ù Ù ÐÙ Ö ÆÍÄÄ Û ÔÖÞÝÔ Ù Ý Ò ÛÝ ØÔÙ Ö ØÖ ØÖ Ö ÓÒ Ø Ö Ù µ Ö Ô ÖÛ Þ Ó ÛÝ Ø Ô Ò Ù Ù Û Ù Ù ÐÙ Ö ÆÍÄÄ Û ÔÖÞÝÔ Ù Ý Ù Ò ÛÝ ØÔÙ È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ ½» ½
Ç ÞÝØÝÛ Ò ÛÝÔ ÝÛ Ò Ù Û ÞÒ ÓÛÝ ÒØ ÔÖ ÒØ ÓÒ Ø Ö ÓÖÑ Ø ºººµ ÛÝÔ ÝÛ Ò Ù ÞÒ ÓÛ Ó Þ Ô Ý ØÓÖ Ñ ± ÒØ Ò ÓÒ Ø Ö ÓÖÑ Ø ºººµ ÛÞÝØ Ò Ù ÞÒ ÓÛ Ó Þ Ô Ý ØÓÖ Ñ ± Ó ÞÝ Û ÑÓÑ Ò Ò ÔÓØ Ò ÞÒ Ù Ò ÖÙ ÓÛ Ò Ó ÒØ ÔÙØ ÓÒ Ø Ö µ ÛÝÔ Ù Þ Û ÖØÓ Ù ÞÒ ÓÛ Ó ÔÓÛÓ Ù ÔÖÞ Ó ÒÓÛ Ð Ò Ö Ø Ö µ ÛÞÝØÙ Û Ö Þ ÞÒ Û Þ Ó ÞÓÒÝ ³\Ò³µ ÙÑ ÞÞ Û Ù Ù Þ ØÔÙ ³\Ò³ ÞÒ Ñ ³\¼³µ ÞÛÖ Ö ÔÓÞ Ø Ù È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ ½» ½
Ò ÛÝ Ö ÒÝ ÙÒ Ð ÓØ ÞÒÝ Ö ØÖÔÝ Ö ½ ÓÒ Ø Ö ¾µ ß ÒØ ÓÖ ¼ ½ ¾ µ ³\¼³ µ Ö ØÙÖÒ ½ Ð Ö ØÖ Ø Ö ½ ÓÒ Ø Ö ¾µ ß ÒØ ÓÖ ¼ ½ ³\¼³ µ ÓÖ ¼ ½ ¾ µ ³\¼³ µ Ö ØÙÖÒ ½ Ð ÒØ ØÖÑÔ ÓÒ Ø Ö ½ ÓÒ Ø Ö ¾µ ß Û Ð ½ ¾µ ²² ½ ²² ¾µ ß ½ ¾ Ð Ö ØÙÖÒ ½ ¹ ¾µ Ð È ÓØÖ ÆÓÛ Á Ë È Æµ ÈÓ Ø ÛÝ ÔÖÓ Ö ÑÓÛ Ò ÛÝ ½» ½
Podstawy programowania wykład Piotr Nowak 1 Instytut Badań Systemowych PAN 1 e-mail: pnowak@ibspan.waw.pl Piotr Nowak (IBS PAN) Podstawy programowania wykład 1 / 14
Wykład 6. Dynamiczna alokacja pamięci Pojęcie zmiennych i tablic dynamicznych Przydzielanie pamięci, funkcje: malloc(), calloc() i realloc() Zwalnianie pamięci za pomocą funkcji free() Piotr Nowak (IBS PAN) Podstawy programowania wykład 2 / 14
Część I Pojęcie zmiennych i tablic dynamicznych Piotr Nowak (IBS PAN) Podstawy programowania wykład 3 / 14
Obszary pamięci i zmienne dynamiczne Wyróżniamy cztery obszary pamięci komputera, dostępne dla programu : kod programu; dane statyczne ( np. stałe i zmienne globalne programu); zmienne automatyczne (lokalne zmienne funkcji przechowywane na stosie, ang. stack); zmienne dynamiczne przechowywane na stercie, ang. heap, czyli pamięci wolnej komputera (zmienne tworzone i usuwane podczas działania programu). Dostęp do zmiennych dynamicznych uzyskujemy poprzez ich adres w pamięci (przechowywany przez zmienną wskaźnikową). Piotr Nowak (IBS PAN) Podstawy programowania wykład 4 / 14
Część II Przydzielanie pamięci, funkcje: malloc(), calloc() i realloc() Piotr Nowak (IBS PAN) Podstawy programowania wykład 5 / 14
Funkcje: malloc() i calloc() Przydział pamięci o zadanej wielkości: void *malloc( size_t rozmiar ); W szczególności, aby utworzyć tablicę o liczbie elementów liczba_elementow, z których każdy zajmuje rozm bajtów, wywołujemy funkcję malloc z argumentem równym liczba_elementow*rozm. Przydział tablicy o zadanej wielkości: void *calloc( size_t liczba_elementow, size_t rozm); Funkcja calloc zeruje przydzieloną tablicę. Jeżeli operacja przydzielania pamięci zakończy się niepowodzeniem, obie funkcje zwracają NULL. Piotr Nowak (IBS PAN) Podstawy programowania wykład 6 / 14
Przykład operacji na zmiennej dynamicznej typu int Przykład #include<stdio.h> #include<stdlib.h> int main( void ){ int *ptr; /* zmienna wskaźnikowa do zapamiętania adresu zmiennej dynamicznej */ ptr = (int*) malloc( sizeof(int) ); /* przydzielenie pamięci dla zmiennej*/ if( ptr == NULL ){ printf( "Błąd przydziału pamięci" ); exit(-1); } *ptr = 111; printf( "*ptr==%d\n", *ptr ); Piotr Nowak (IBS PAN) Podstawy programowania wykład 7 / 14
Przykład operacji na zmiennej dynamicznej typu int Przykład } /* **************KONTYNUACJA***************** */ printf("podaj nowa wartosc: "); scanf( "%d", ptr ); printf( "*ptr==%d\n", *ptr ); free( ptr ); /* zwolnienie pamięci */ puts("aby zakonczyc nacisnij ENTER!"); fflush(stdin); getchar(); return 0; Piotr Nowak (IBS PAN) Podstawy programowania wykład 8 / 14
Przykład operacji na dynamicznej tablicy typu double Przykład #include<stdio.h> #include<stdlib.h> int main( void ){ int n,i; double *tab; printf( "Podaj liczbe elementow: " ); scanf( "%d", &n); if( tab = (double*) calloc( n, sizeof(double) ) ){ for(i = 0; i<n; i++ ) *( tab+i ) = 1.0/(i+1.0); /* tab[ i ] = 1.0/(i+1.0);*/ for(i = 0; i<n; i++ ) printf("%.2lf, ",tab[i ]); } free( tab ); puts("\naby zakonczyc nacisnij ENTER!"); fflush(stdin); getchar(); return 0; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 9 / 14
Funkcja realloc() Funkcja realloc ma nastepującą postać: void *realloc(void *wsk, size_t rozm); Funkcja realloc zmienia rozmiar przydzielonego wcześniej obszaru pamięci o adresie wsk do rozm bajtów. Pierwsze n bajtów obszaru nie ulegnie zmianie, gdzie n jest równe minimum z rozmiaru poprzedniego obszaru i wartości rozm. Jeżeli wsk jest równy NULL, funkcja realloc odpowiada funkcji malloc. Piotr Nowak (IBS PAN) Podstawy programowania wykład 10 / 14
Część III Zwalnianie pamięci za pomocą funkcji free() Piotr Nowak (IBS PAN) Podstawy programowania wykład 11 / 14
Zwalnianie pamięci i funkcja free() Pamięć przydzielona podczas wykonywania programu, powinna być zwolniona przed jego zakończeniem. W tym celu używamy funkcji: void free( void *wskaznik); Wskaźnik, który jest argumentem funkcji powinien zawierać adres wcześniej zaalokowanego obszaru pamięci. Dealokacja pamięci musi być poprzedzona jej wcześniejszym przydzieleniem. Piotr Nowak (IBS PAN) Podstawy programowania wykład 12 / 14
Przykład programu z wykorzystaniem dynamicznej tablicy dwuwymiarowej Przykład #include<stdio.h> #include<stdlib.h> int main(void) { int n=5,m=10,i,j,**tab; if((tab=(int**)malloc(n*sizeof(int*)))==null) { printf("blad alokacji."); exit(-1); } for(i=0;i<n;i++) if((tab[i]=(int*)malloc(m*sizeof(int)))==null) { printf("blad alokacji."); exit(-1); } Piotr Nowak (IBS PAN) Podstawy programowania wykład 13 / 14
Przykład programu z wykorzystaniem dynamicznej tablicy dwuwymiarowej Przykład /* **************KONTYNUACJA***************** */ for(i=0;i<n;i++){ for(j=0;j<m;j++) { tab[i][j]=(i+1)*(j+1); printf("%3d",tab[i][j]); } printf("\n"); } for(i=0;i<n;i++) free(tab[i]); free(tab); system("pause"); return 0; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 14 / 14
Podstawy programowania wykład Piotr Nowak 1 Instytut Badań Systemowych PAN 1 e-mail: pnowak@ibspan.waw.pl Piotr Nowak (IBS PAN) Podstawy programowania wykład 1 / 26
Wykład 7. Wprowadzenie do rekurencji Zalety i wady używania rekurencji Funkcje rekurencyjne w języku C proste przykłady Piotr Nowak (IBS PAN) Podstawy programowania wykład 2 / 26
Część I Zalety i wady używania rekurencji Piotr Nowak (IBS PAN) Podstawy programowania wykład 3 / 26
Funkcja rekurencyjna Funkcja rekurencyjna w języku C umożliwia implementację algorytmu rekurencyjnego. Wewnątrz funkcji rekurencyjnej występuje wywołanie jej samej. Wywołanie jest wykonywane w celu rozwiązania prostszego problemu (np. dla mniejszej wartości argumentu.) Funkcja rekurencyjna zawiera warunek zatrzymania. Warunek ten pozwala zakończyć funkcję bez wywoływania jej samej. Poprawność funkcji rekurencyjnej dowodzi się za pomocą indukcji matematycznej. Piotr Nowak (IBS PAN) Podstawy programowania wykład 4 / 26
Niebezpieczeństwa rekurencji Możliwość wystąpienia rekurencji nieskończonej. Nadmierne obciążenie stosu. Nieuzasadniona (nieefektywna) rekurencja. Jeżeli rekurencja nie gwarantuje dobrej wydajności, należy zastąpić ją iteracją. Piotr Nowak (IBS PAN) Podstawy programowania wykład 5 / 26
Część II Funkcje rekurencyjne w języku C proste przykłady Piotr Nowak (IBS PAN) Podstawy programowania wykład 6 / 26
Silnia Przykład int silniarek(int n) { if(n==1) return 1; else return silniarek(n-1)*n; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 7 / 26
Konwersja z układu dziesiętnego do układu dwójkowego Przykład void konw(int a){ if(a<2) cout<< a; else { konw(a / 2); cout<< a % 2; } } Piotr Nowak (IBS PAN) Podstawy programowania wykład 8 / 26
Przykład nieprawidłowego zastosowania rekurencji (rekurencji nieefektywnej) Obliczanie wyrazów ciągu Fibonacciego Przykład int fibrek(int n) { if(n<3) return 1; else return fibrek(n-1)+fibrek(n-2); } Piotr Nowak (IBS PAN) Podstawy programowania wykład 9 / 26
Największy wspólny dzielnik Przykład int nwd(int a,int b) { if(b==0) return a; else return nwd(b,a%b); } Piotr Nowak (IBS PAN) Podstawy programowania wykład 10 / 26
Szybkie mnożenie Przykład int szm (int a, int b) { if(b==0) return 0; return a*(b%2)+szm(2*a, b/2); } Piotr Nowak (IBS PAN) Podstawy programowania wykład 11 / 26
Szybkie potęgowanie Przykład int szp (int a, int b) { if(b==0) return 1; if(b%2) return a*szp(a*a, b/2); return szp(a*a, b/2); } Piotr Nowak (IBS PAN) Podstawy programowania wykład 12 / 26
Wieże Hanoi Mamy do dyspozycji trzy wieże: A, B i C i n krążków różnej wielkości, ułożonych na wieży A w porządku malejącym (licząc od dołu). Należy przełożyć n krążków z wieży A na wieżę C, korzystając z wieży B, przestrzegając następujących zasad: Krążki przenosimy pojedynczo. Nigdy nie kładziemy większego krążka na mniejszy. Piotr Nowak (IBS PAN) Podstawy programowania wykład 13 / 26
Wieże Hanoi Przykład #include<stdio.h> #include<stdlib.h> void hanoi(int, char, char, char); int main(void) { int n; hanoi(3, A, B, C ); system("pause"); return 0; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 14 / 26
Wieże Hanoi Przykład void hanoi(int n, char A, char B, char C) { if (n>0) { hanoi(n-1,a,c,b); printf("krazek %d: %c > %c\n",n,a,c); hanoi(n-1,b,a,c); } } Piotr Nowak (IBS PAN) Podstawy programowania wykład 15 / 26
Rozkład liczby naturalnej Problem: znajdź liczbę przedstawień danej liczby naturalnej n w postaci sumy liczb naturalnych. Wprowadzamy następujące ograniczenie: składniki nie mogą przekraczać pewnej liczby naturalnej m. Wspomnianą liczbę przedstawień oznaczamy f (n, m). Przykład f (5,3) = 5; f (5,4) = 6; f (5,5) = 7. Istotnie, w porządku odwrotnym do leksykograficznego, przedstawienia liczby 5 są następujące: 5 4 + 1 3 + 2 3 + 1 + 1 2 + 2 + 1 2 + 1 + 1 + 1 1 + 1 + 1 + 1 + 1 Piotr Nowak (IBS PAN) Podstawy programowania wykład 16 / 26
Rozkład liczby naturalnej Przykład int f(int n, int m) { if(n==1 m==1) return 1; else if(m>n) return f(n,n); else if(m==n) return 1+f(n,n-1); else return f(n,m-1)+f(n-m,m); } Piotr Nowak (IBS PAN) Podstawy programowania wykład 17 / 26
Wyszukiwanie binarne Przykład #include<stdio.h> #define n 7 int BinSearch(int[], int, int, int); int main(void) { int t[n]={1,3,4,5,6,8,9},i; for(i=0;i<15;i++) printf("%d? : %d\n",i,binsearch(t,0,n-1,i)); getchar(); return 0; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 18 / 26
Wyszukiwanie binarne Przykład int BinSearch(int tab[], int lewy, int prawy, int x) { int srodek; if (lewy>prawy) return -1; else { srodek = (lewy+prawy)/2; if (tab[srodek] == x) return srodek; if (tab[srodek]<x) return BinSearch(tab, srodek+1, prawy, x); else return BinSearch(tab, lewy, srodek-1,x); } } Piotr Nowak (IBS PAN) Podstawy programowania wykład 19 / 26
Wyszukiwanie binarne Wynik działania programu: 0? : -1 1? : 0 2? : -1 3? : 1 4? : 2 5? : 3 6? : 4 7? : -1 8? : 5 9? : 6 10? : -1 11? : -1 12? : -1 13? : -1 14? : -1 Piotr Nowak (IBS PAN) Podstawy programowania wykład 20 / 26
Szybkie sortowanie Przykład #include<stdio.h> #define n 15 void swap(int*,int*) ; void qsort(int [],int,int); int main(void) { int i; int tab[n]={6,5,4,4,3,3,7,2,4,4,1,3,8,0,9}; /* max na a[n-1]!*/ for(i=0;i<n;i++) printf("%d,",tab[i]); qsort(tab,0,n-2); printf("\n"); for(i=0;i<n;i++) printf("%d,",tab[i]); getchar(); return 0; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 21 / 26
Szybkie sortowanie Przykład void qsort(int data[],int l,int p) { int v=data[l],i=l,j=p+1; /* poczatek partition*/ do{ do{i++;}while(data[i]<v); do{j ;}while(data[j]>v); if(i<j) swap(&data[i],&data[j]); } while(j>i); data[l]=data[j];data[j]=v; /* koniec partition*/ if((j-1)>l) qsort(data,l,j-1); if((j+1)<p) qsort(data,j+1,p); } void swap(int* px, int* py) /* x:=:y */ { int temp=*px; *px=*py; *py=temp; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 22 / 26
Szybkie sortowanie Wynik działania programu: Tablica poczatkowa: 6,5,4,4,3,3,7,2,4,4,1,3,8,0,9, partition 0 do 13, i=6, j=13: 6,5,4,4,3,3,0,2,4,4,1,3,8,7,9, partition 0 do 13, i=12, j=11: 6,5,4,4,3,3,0,2,4,4,1,3,8,7,9, koniec partition 0 do 13, i=12, j=11: 3,5,4,4,3,3,0,2,4,4,1,6,8,7,9, partition 0 do 10, i=1, j=10: 3,1,4,4,3,3,0,2,4,4,5,6,8,7,9, partition 0 do 10, i=2, j=7: 3,1,2,4,3,3,0,4,4,4,5,6,8,7,9, partition 0 do 10, i=3, j=6: 3,1,2,0,3,3,4,4,4,4,5,6,8,7,9, partition 0 do 10, i=4, j=5: 3,1,2,0,3,3,4,4,4,4,5,6,8,7,9, Piotr Nowak (IBS PAN) Podstawy programowania wykład 23 / 26
Szybkie sortowanie partition 0 do 10, i=5, j=4: 3,1,2,0,3,3,4,4,4,4,5,6,8,7,9, koniec partition 0 do 10, i=5, j=4: 3,1,2,0,3,3,4,4,4,4,5,6,8,7,9, partition 0 do 3, i=4, j=3: 3,1,2,0,3,3,4,4,4,4,5,6,8,7,9, koniec partition 0 do 3, i=4, j=3: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, partition 0 do 2, i=1, j=0: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, koniec partition 0 do 2, i=1, j=0: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, partition 1 do 2, i=2, j=1: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, koniec partition 1 do 2, i=2, j=1: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, Piotr Nowak (IBS PAN) Podstawy programowania wykład 24 / 26
Szybkie sortowanie partition 5 do 10, i=6, j=5: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, koniec partition 5 do 10, i=6, j=5: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, partition 6 do 10, i=7, j=9: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, partition 6 do 10, i=8, j=8: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, koniec partition 6 do 10, i=8, j=8: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, partition 6 do 7, i=7, j=7: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, koniec partition 6 do 7, i=7, j=7: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, Piotr Nowak (IBS PAN) Podstawy programowania wykład 25 / 26
Szybkie sortowanie partition 9 do 10, i=10, j=9: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, koniec partition 9 do 10, i=10, j=9: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, partition 12 do 13, i=14, j=13: 0,1,2,3,3,3,4,4,4,4,5,6,8,7,9, koniec partition 12 do 13, i=14, j=13: 0,1,2,3,3,3,4,4,4,4,5,6,7,8,9, Wynik koncowy: 0,1,2,3,3,3,4,4,4,4,5,6,7,8,9, Piotr Nowak (IBS PAN) Podstawy programowania wykład 26 / 26
Podstawy programowania wykład Piotr Nowak 1 Instytut Badań Systemowych PAN 1 e-mail: pnowak@ibspan.waw.pl Piotr Nowak (IBS PAN) Podstawy programowania wykład 1 / 23
Wykład 8. Rekurencja, iteracja i programowanie dynamiczne Analiza i porównanie wybranych programów w wersji rekurencyjnej oraz iteracyjnej Algorytmy z powrotami Metody programowania dynamicznego, prezentacja przykładów Piotr Nowak (IBS PAN) Podstawy programowania wykład 2 / 23
Część I Analiza i porównanie wybranych programów... Piotr Nowak (IBS PAN) Podstawy programowania wykład 3 / 23
Rekurencja versus iteracja Silnia Szybkie mnożenie i potęgowanie Ciągi Fibonacciego Wyszukiwanie binarne Piotr Nowak (IBS PAN) Podstawy programowania wykład 4 / 23
Część II Algorytmy z powrotami Piotr Nowak (IBS PAN) Podstawy programowania wykład 5 / 23
Problem ośmiu hetmanów Opis problemu Na szachownicy należy tak ustawić osiem hetmanów, aby nie mogły się "bić" wzajemnie. Szukamy rozwiązań w postaci ciągów liczb, przy czym kolejny wyraz ciągu, odpowiadający kolejnej kolumnie, oznacza numer wiersza, w którym należy postawić hetmana. Stan szachownicy reprezentowany jest ponadto za pomocą trzech tablic: a,b,c. Piotr Nowak (IBS PAN) Podstawy programowania wykład 6 / 23
Program znajdujący jedno rozwiązanie Przykład #include<stdio.h> #define w 8 int a[w],b[2*w-1],c[2*w-1]; int x[w]; void jedynki(); int probuj(int); void drukuj(); int main(void) { jedynki(); if(probuj(0)) {printf("jakies rozwiazanie:\n"); drukuj();} getchar(); return 0; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 7 / 23
Program znajdujący jedno rozwiązanie Przykład \ *ciąg dalszy*\ void jedynki() { int i; for(i=0;i<w;i++) a[i]=1; for(i=0;i<2*w-1;i++) b[i]=c[i]=1; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 8 / 23
Program znajdujący jedno rozwiązanie Przykład \ *ciąg dalszy*\ int probuj(int i){ int j; for(j=0;j<w;j++) if(a[j]&&b[i-j+w-1]&&c[i+j]) { a[j]=b[i-j+w-1]=c[i+j]=0; x[i]=j; if(i<w-1) if(!probuj(i+1)) a[j]=b[i-j+w-1]=c[i+j]=1; else return 1; else return 1; } return 0; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 9 / 23
Program znajdujący jedno rozwiązanie Przykład \ *ciąg dalszy*\ void drukuj() { int i; for(i=0;i<w;i++) printf("%d, ",x[i]); printf("\n"); } Piotr Nowak (IBS PAN) Podstawy programowania wykład 10 / 23
Funkcja znajdująca wszystkie rozwiązania Przykład void wszystkie(int i) { int j; for(j=0;j<w;j++) if(a[j]&&b[i-j+w-1]&&c[i+j]) { a[j]=b[i-j+w-1]=c[i+j]=0; x[i]=j; if(i<w-1) wszystkie(i+1); else drukuj(); a[j]=b[i-j+w-1]=c[i+j]=1; } } Piotr Nowak (IBS PAN) Podstawy programowania wykład 11 / 23
Część III Metody programowania dynamicznego, prezentacja... Piotr Nowak (IBS PAN) Podstawy programowania wykład 12 / 23
Programowanie dynamiczne wstępujące Programowanie dynamiczne wstępujące jest techniką programowania polegającą na obliczaniu wszystkich wartości pewnej funkcji, począwszy od najmniejszej wartości argumentu. Przy wyznaczaniu (w każdym kroku) bieżącej wartości funkcji korzysta się z wartości wcześniej obliczonych. Jako przykłady zastosowania programowania dynamicznego wstępującego przedstawione zostaną przykłady: Droga żuka po kwadracie Kwadraty Najdłuższy wspólny podciąg Najdłuższy podciąg rosnący Piotr Nowak (IBS PAN) Podstawy programowania wykład 13 / 23
Droga żuka po kwadracie Przykład #include<stdio.h> #define n 4 int main() { int a[n][n]; int i, j, min; for( i = 0; i<n;i++ ) for( j = 0; j<n;j++) { printf(" a[%d,%d]= ", i, j); scanf(" %d ", &a[i][j]); }; printf("\n"); Piotr Nowak (IBS PAN) Podstawy programowania wykład 14 / 23
Droga żuka po kwadracie Przykład \ *ciąg dalszy*\ for( i = 0; i<n;i++ ) { for( j = 0; j<n;j++) printf(" %d, ", a[i][j]); printf("\n "); }; printf("\n "); Piotr Nowak (IBS PAN) Podstawy programowania wykład 15 / 23
Droga żuka po kwadracie Przykład \ *ciąg dalszy*\ for( i = 1; i<n; i++ ) a[0][i] += a[0][i-1]; for( j = 1; j<n; j++ ) a[j][0] += a[j-1][0]; for( i = 1; i<n;i++ ) for( j = 1; j<n;j++ ) { if( a[i-1][j]>a[i][j-1]) min = a[i][j-1]; else min = a[i-1][j]; a[i][j] += min; } printf(" %d ", a[n-1][n-1]); fflush(stdin); getchar(); return 0; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 16 / 23
Droga żuka po kwadracie - przykładowe rozwiązanie Tablica początkowa: Tablica podczas obliczeń: Tablica końcowa: Najmniejsza suma wynosi 5. 1, 2, 0, 3, 2, 1, 0, 1, 2, 0, 1, 1, 2, 3, 0, 1, 1, 3, 3, 6, 3, 4, 5, 7, 1, 3, 3, 6, 3, 4, 3, 4, 5, 4, 4, 5, 7, 5, 4, 5, Piotr Nowak (IBS PAN) Podstawy programowania wykład 17 / 23
Kwadraty Problem: W tablicy binarnej (o wartościach 0, 1) znajdź największy kwadrat składający się z samych jedynek. Przykład #include<stdio.h> #include<stdlib.h> #include<time.h> #define lw 5 #define lk 7 int main(void) { int tab[lw][lk]; int w = 0, k = 0, min; srand(time(0)); Piotr Nowak (IBS PAN) Podstawy programowania wykład 18 / 23
Kwadraty Przykład \ *ciąg dalszy*\ for(w = 0; w<lw; w++) { for(k = 0; k<lk; k++) { tab[w][k]=(rand()%11>0)?1:0; printf("%d", tab[w][k]); } printf("\n"); } Piotr Nowak (IBS PAN) Podstawy programowania wykład 19 / 23
Kwadraty Przykład \ *ciąg dalszy*\ printf("\n"); for(w = 1; w<lw; w++) for(k = 1; k<lk; k++) { if(tab[w][k] == 1) { if(tab[w-1][k-1] < tab[w-1][k]) min = tab[w-1][k-1]; else min = tab[w-1][k]; if(min>tab[w][k-1]) min = tab[w][k-1]; tab[w][k]= min + 1; } } Piotr Nowak (IBS PAN) Podstawy programowania wykład 20 / 23
Kwadraty Przykład \ *ciąg dalszy*\ for(w = 0; w<lw; w++) { for(k = 0; k<lk; k++) printf("%d", tab[w][k]); printf("\n"); } getchar(); return 0; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 21 / 23
Kwadraty Tablica początkowa: Wynik działania programu: 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 2 2 2 1 2 2 2 3 3 1 2 3 3 3 4 1 2 3 0 1 0 1 2 3 1 1 1 Piotr Nowak (IBS PAN) Podstawy programowania wykład 22 / 23
Programowanie dynamiczne zstępujące Programowanie dynamiczne zstępujące polega na tym, że funkcja rekurencyjna zapisuje obliczoną przez siebie wartość na końcowym miejscu struktury danych (np. tablicy) i sprawdza zapisane wartości w jej części początkowej, tak aby nie obliczać jeszcze raz tych samych wartości. Przykład int Fib(int n) /*Ciągi Fibonacciego metodą dynamiczną zstępującą*/ { int k=n; static int znanefib[n]; if(znanefib[n]!=0) return znanefib[n]; if(n<0) return 0; if(n>=2) k=fib(n-2)+fib(n-1); return znanefib[n]=k; } Piotr Nowak (IBS PAN) Podstawy programowania wykład 23 / 23