diff options
Diffstat (limited to 'Beginning_C_By_Ivon_Horton/chapter9.ipynb')
-rw-r--r-- | Beginning_C_By_Ivon_Horton/chapter9.ipynb | 826 |
1 files changed, 826 insertions, 0 deletions
diff --git a/Beginning_C_By_Ivon_Horton/chapter9.ipynb b/Beginning_C_By_Ivon_Horton/chapter9.ipynb new file mode 100644 index 00000000..d7adce09 --- /dev/null +++ b/Beginning_C_By_Ivon_Horton/chapter9.ipynb @@ -0,0 +1,826 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Chapter 9: More on Functions" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Program 9.1, page no. 351" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "\"\"\"\n", + "Pointing to functions\n", + "\"\"\"\n", + "\n", + "def sum(x, y):\n", + " return x + y\n", + " \n", + "def product(x, y):\n", + " return x * y\n", + " \n", + "def difference(x, y):\n", + " return x - y\n", + "\n", + "a = 10\n", + "b = 5\n", + "pfun = sum # points to sum() \n", + "result = pfun(a, b)\n", + "print \"pfun = sum result = \", result\n", + "pfun = product # points to product()\n", + "result = pfun(a, b)\n", + "print \"pfun = product result = \", result\n", + "pfun = difference # points to difference()\n", + "result = pfun(a, b)\n", + "print \"pfun = difference result = \", result" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "pfun = sum result = 15\n", + "pfun = product result = 50\n", + "pfun = difference result = 5\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Program 9.2, page no. 353" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "\"\"\"\n", + "Arrays of Pointers to functions\n", + "\"\"\"\n", + "\n", + "def sum(x, y):\n", + " return x + y\n", + " \n", + "def product(x, y):\n", + " return x * y\n", + " \n", + "def difference(x, y):\n", + " return x - y\n", + "\n", + "a = 10\n", + "b = 5\n", + "result = 0\n", + "pfun = []\n", + "pfun.append(sum)\n", + "pfun.append(product)\n", + "pfun.append(difference)\n", + "\n", + "for i in range(3):\n", + " result = pfun[i](a, b)\n", + " print \"result = \", result\n", + "\n", + "result = pfun[1](pfun[0](a, b), pfun[2](a, b))\n", + "print \"The product of the sum and the difference = \", result" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "result = 15\n", + "result = 50\n", + "result = 5\n", + "The product of the sum and the difference = 75\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Program 9.3, page no. 356" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "\"\"\"\n", + "Passing a Pointer to a function\n", + "\"\"\"\n", + "\n", + "def sum(x, y):\n", + " return x + y\n", + " \n", + "def product(x, y):\n", + " return x * y\n", + " \n", + "def difference(x, y):\n", + " return x - y\n", + " \n", + "def any_function(pfun , x, y):\n", + " return pfun(x, y);\n", + "\n", + "a = 10\n", + "b = 5\n", + "pf = sum\n", + "result = any_function(pf, a, b)\n", + "print \"result = \", result\n", + "result = any_function(product, a, b)\n", + "print \"result = \", result\n", + "print \"result = \", any_function(difference, a, b)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "result = 15\n", + "result = 50\n", + "result = 5\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Program 9.4, page no. 359" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "\"\"\"\n", + "Static versus automatic variables\n", + "note: there is no static in python. Output will be different from book.\n", + "\"\"\"\n", + "\n", + "def test1():\n", + " count = 0\n", + " count += 1\n", + " print \"test1 count = \", count\n", + "\n", + "def test2():\n", + " count = 0\n", + " count += 1\n", + " print \"test2 count = \", count\n", + "\n", + "for i in range(5):\n", + " test1()\n", + " test2()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "test1 count = 1\n", + "test2 count = 1\n", + "test1 count = 1\n", + "test2 count = 1\n", + "test1 count = 1\n", + "test2 count = 1\n", + "test1 count = 1\n", + "test2 count = 1\n", + "test1 count = 1\n", + "test2 count = 1\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Program 9.5, page no. 361" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "\"\"\"\n", + "Global variables\n", + "note: output will vary from textbook because of static variable\n", + "\"\"\"\n", + "\n", + "count = 0\n", + "\n", + "def test1():\n", + " global count\n", + " count += 1\n", + " print \"test1 count = \", count\n", + "\n", + "def test2():\n", + " count = 0\n", + " count += 1\n", + " print \"test2 count = \", count\n", + "\n", + "for i in range(5):\n", + " test1()\n", + " test2()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "test1 count = 1\n", + "test2 count = 1\n", + "test1 count = 2\n", + "test2 count = 1\n", + "test1 count = 3\n", + "test2 count = 1\n", + "test1 count = 4\n", + "test2 count = 1\n", + "test1 count = 5\n", + "test2 count = 1\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Program 9.6, page no. 364" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "\"\"\"\n", + "Calculating factorials using recursion\n", + "\"\"\"\n", + "\n", + "def factorial(n):\n", + " if(n < 2):\n", + " return n\n", + " return n*factorial(n - 1)\n", + " \n", + "print \"Enter an integer value: \",\n", + "number = int(raw_input())\n", + "print \"The factorial of %d is %d \"% (number, factorial(number))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Enter an integer value: " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "5\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " The factorial of 5 is 120 \n" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Program 9.7, page no. 368" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "\"\"\"\n", + "Calculating an average using variable argument lists\n", + "note: output will vary from that given in textbook\n", + "\"\"\"\n", + "\n", + "def average(*arg):\n", + " sum = arg[0] + arg[1]\n", + " count = 2\n", + " for i in arg:\n", + " count += 1\n", + " sum += i\n", + " average = sum/count\n", + " return average\n", + " \n", + "v1 = 10.5\n", + "v2 = 2.5\n", + "num1 = 6\n", + "num2 = 5\n", + "num3 = 12\n", + "num4 = 20\n", + "print \"Average = %.2f \" %(average(v1, 3.5, v2, 4.5, 0.0))\n", + "print \"Average = %.2f \" %(average(1.0, 2.0, 0.0))\n", + "print \"Average = %.2f \" %(average(num2, v2, num1, num4, num3, 0.0))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Average = 5.00 \n", + "Average = 1.20 \n", + "Average = 6.62 \n" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Program 9.8, page no. 370" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "\"\"\"\n", + "A program to list the command line arguments\n", + "\"\"\"\n", + "\n", + "import sys\n", + "\n", + "print \"Program name: \", sys.argv[0]\n", + "for i in range(1, len(sys.argv)):\n", + " print \"Argument %d: %s \"%(i, sys.argv[i])" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Program name: -c\n", + "Argument 1: -f \n", + "Argument 2: /tmp/tmpL28uUI/profile_default/security/kernel-d2752270-d981-4bb2-b2bc-3d505dfa3dd5.json \n", + "Argument 3: --IPKernelApp.parent_appname='ipython-notebook' \n", + "Argument 4: --profile-dir \n", + "Argument 5: /tmp/tmpL28uUI/profile_default \n", + "Argument 6: --parent=1 \n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Program 9.9, page no. 377" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "\"\"\"\n", + "REVERSI An Othello type game\n", + "\"\"\"\n", + "\n", + "SIZE = 6\n", + "comp_c = '@'\n", + "player_c = '0'\n", + "board = [[0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0]]\n", + "\n", + "moves = [[False, False, False, False, False, False],\n", + " [False, False, False, False, False, False],\n", + " [False, False, False, False, False, False],\n", + " [False, False, False, False, False, False],\n", + " [False, False, False, False, False, False],\n", + " [False, False, False, False, False, False]]\n", + "no_of_moves = 0\n", + "invalid_moves = 0\n", + "again = 0\n", + "next_player = True\n", + "\n", + "def get_score(board, player):\n", + " global comp_c\n", + " global player_c\n", + " return player_counters(board, player) - player_counters(board, (comp_c if player == player_c else player_c)) \n", + " \n", + "def player_counters(board,player):\n", + " count = 0;\n", + " for row in range(SIZE):\n", + " for col in range(SIZE):\n", + " if(board[row][col] == player):\n", + " count += 1\n", + " return count;\n", + "\n", + "def computer_move(board,moves, player):\n", + " best_row = 0;\n", + " best_col = 0;\n", + " new_score = 0;\n", + " score = SIZE*SIZE;\n", + " temp_board = []\n", + " temp_moves = []\n", + " for i in range(SIZE):\n", + " a = []\n", + " b = []\n", + " for j in range(SIZE):\n", + " a.append(0)\n", + " b.append(False)\n", + " temp_board.append(a)\n", + " temp_moves.append(b) \n", + " opponent = comp_c if (player == player_c) else player_c\n", + " for row in range(SIZE):\n", + " for col in range(SIZE):\n", + " if(not moves[row][col]):\n", + " continue;\n", + " temp_board = board\n", + " make_move(temp_board, row, col, player);\n", + " valid_moves(temp_board, temp_moves, opponent);\n", + " new_score = best_move(temp_board, temp_moves, opponent);\n", + " if(new_score < score):\n", + " score = new_score;\n", + " best_row = row;\n", + " best_col = col;\n", + " make_move(board, best_row, best_col, player);\n", + "\n", + " \n", + "def best_move(board, moves, player):\n", + " new_board = []\n", + " for i in range(SIZE):\n", + " a = []\n", + " for j in range(SIZE):\n", + " a.append(0)\n", + " new_board.append(a)\n", + " score = 0;\n", + " new_score = 0;\n", + "\n", + " for row in range(SIZE):\n", + " for col in range(SIZE):\n", + " if(not moves[row][col]):\n", + " continue;\n", + " new_board = board\n", + " make_move(new_board, row, col, player);\n", + " new_score = get_score(new_board, player);\n", + " if(score < new_score):\n", + " score = new_score;\n", + " return score;\n", + "\n", + "\n", + "def make_move(board,row,col,player):\n", + " rowdelta = 0;\n", + " coldelta = 0;\n", + " x = 0;\n", + " y = 0;\n", + " if player == player_c:\n", + " opponent = comp_c\n", + " else:\n", + " opponent = player_c \n", + " \n", + " board[row][col] = player\n", + " for rowdelta in range(-1,2):\n", + " for coldelta in range(-1,2):\n", + " if((row == 0 and rowdelta == -1) or row + rowdelta >= SIZE or(col == 0 and coldelta == -1) or col + coldelta >= SIZE or\n", + "(rowdelta == 0 and coldelta == 0)):\n", + " continue;\n", + "\n", + " if(board[row + rowdelta][col + coldelta] == opponent):\n", + " x = row + rowdelta;\n", + " y = col + coldelta;\n", + " \n", + " while True:\n", + " x += rowdelta;\n", + " y += coldelta;\n", + " if(x >= SIZE or y >= SIZE or board[x][y] == ' '):\n", + " break;\n", + " if(board[x][y] == player):\n", + " x -= rowdelta\n", + " y -= coldelta\n", + " while(board[x][y] == opponent):\n", + " board[x][y] = player;\n", + " x -= rowdelta\n", + " y -= coldelta\n", + " \n", + " break;\n", + "\n", + "def reset_board(board):\n", + " global SIZE\n", + " global player_c\n", + " global comp_c\n", + " for row in range(SIZE):\n", + " for col in range(SIZE):\n", + " board[row][col] = ' '\n", + " \n", + " mid = SIZE/2\n", + " board[mid][mid] = player_c\n", + " board[mid-1][mid-1] = board[mid][mid]\n", + " board[mid][mid - 1] = comp_c\n", + " board[mid-1][mid] = board[mid][mid - 1]\n", + "\n", + "def display(board):\n", + " col_label = 'a'\n", + " print \"\"\n", + " for col in range(SIZE):\n", + " print \"%c\" %((chr(ord(col_label) + col))),\n", + " print \"\"\n", + " for row in range(SIZE):\n", + " print \" +\",\n", + " for col in range(SIZE):\n", + " print \"---+\",\n", + " print \"\\n%2d|\" %(row + 1)\n", + " \n", + " for col in range(SIZE):\n", + " print \" %c |\" %(board[row][col]),\n", + " print \"\"\n", + " print \" +\"\n", + " for col in range(SIZE):\n", + " print \"---+\",\n", + " print \"\"\n", + "\n", + "def valid_moves(board, moves, player):\n", + " global SIZE\n", + " global player_c\n", + " global comp_c\n", + " rowdelta = 0\n", + " coldelta = 0\n", + " x = 0\n", + " y = 0\n", + " global no_of_moves\n", + " opponent = comp_c if (player == player_c) else player_c\n", + " for row in range(SIZE):\n", + " for col in range(SIZE):\n", + " moves[row][col] = False\n", + " for row in range(SIZE):\n", + " for col in range(SIZE):\n", + " if(board[row][col] != ' '):\n", + " continue\n", + " for rowdelta in range(-1, rowdelta+1):\n", + " for coldelta in range(-1, coldelta+1):\n", + " if((row == 0 and rowdelta == -1) or row + rowdelta >= SIZE or (col == 0 and coldelta == -1) or col + coldelta >= SIZE or (rowdelta == 0 and coldelta == 0)):\n", + " continue\n", + " if(board[row + rowdelta][col + coldelta] == opponent):\n", + " x = row + rowdelta\n", + " y = col + coldelta \n", + " while(True):\n", + " x += rowdelta\n", + " y += coldelta\n", + " if(x < 0 or x >= SIZE or y < 0 or y >= SIZE or board[x][y] == ' '):\n", + " break\n", + " if(board[x][y] == player):\n", + " moves[row][col] = True\n", + " no_of_moves += 1\n", + " break\n", + " return no_of_moves\n", + "\n", + " \n", + "print \"REVERSI\"\n", + "print \"You can go first on the first game, then we will take turns.\"\n", + "print \"You will be white - (%c)\\nI will be black - (%c). \" %(player_c, comp_c)\n", + "print \"Select a square for your move by typing a digit for the row and a letter for the column with no spaces between.\"\n", + "print \"Good luck! Press Enter to start.\"\n", + "raw_input()\n", + "while(True):\n", + " reset_board(board)\n", + " next_player = not(next_player)\n", + " no_of_moves = 4\n", + " while(True):\n", + " display(board)\n", + " next_player = not next_player\n", + " if(True == next_player):\n", + " if(valid_moves(board, moves, player_c)):\n", + " while(True):\n", + " print \"Please enter your move (row column - no space): \",\n", + " x = int(raw_input(\"row: \"))\n", + " y = raw_input(\"col: \")\n", + " y = ord(chr(ord(y.lower()) - ord('a')))\n", + " x -= 1\n", + " if(y < 0 or y >= SIZE or x >= SIZE or (not moves[x][y])):\n", + " print \"Not a valid move, try again.\\n\"\n", + " continue\n", + " make_move(board, x, y, player_c)\n", + " no_of_moves += 1\n", + " break\n", + " else:\n", + " invalid_moves += 1\n", + " if(invalid_moves < 2):\n", + " print \"You have to pass, press return\",\n", + " again = raw_input()\n", + " else:\n", + " print \"\\nNeither of us can go, so the game is over. \"\n", + " else:\n", + " if(valid_moves(board, moves, comp_c)):\n", + " invalid_moves = 0\n", + " computer_move(board, moves, comp_c)\n", + " no_of_moves += 1\n", + " else:\n", + " invalid_moves += 1\n", + " if(invalid_moves < 2):\n", + " print \"I have to pass, your go \"\n", + " else:\n", + " print \"Neither of us can go, so the game is over.\",\n", + " display(board)\n", + " print \"The final score is: \"\n", + " print \"Computer %d User %d \" %(player_counters(board, comp_c), player_counters(board, player_c))\n", + "\n", + " print \"Do you want to play again (y/n): \", \n", + " again = raw_input()\n", + " if again == 'y':\n", + " continue;\n", + " else:\n", + " break \n", + " if (no_of_moves < SIZE*SIZE and invalid_moves < 2):\n", + " continue\n", + " else:\n", + " break\n", + " if again == 'n':\n", + " break\n", + "print \"\\nGoodbye\\n\"" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "REVERSI\n", + "You can go first on the first game, then we will take turns.\n", + "You will be white - (0)\n", + "I will be black - (@). \n", + "Select a square for your move by typing a digit for the row and a letter for the column with no spaces between.\n", + "Good luck! Press Enter to start.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "a b c d e f \n", + " + ---+ ---+ ---+ ---+ ---+ ---+ \n", + " 1|\n", + " | | | | | | \n", + " + ---+ ---+ ---+ ---+ ---+ ---+ \n", + " 2|\n", + " | | | | | | \n", + " + ---+ ---+ ---+ ---+ ---+ ---+ \n", + " 3|\n", + " | | 0 | @ | | | \n", + " + ---+ ---+ ---+ ---+ ---+ ---+ \n", + " 4|\n", + " | | @ | 0 | | | \n", + " + ---+ ---+ ---+ ---+ ---+ ---+ \n", + " 5|\n", + " | | | | | | \n", + " + ---+ ---+ ---+ ---+ ---+ ---+ \n", + " 6|\n", + " | | | | | | \n", + " +\n", + "---+ ---+ ---+ ---+ ---+ ---+ \n", + "Please enter your move (row column - no space): " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "row: 3\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "col: e\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " \n", + "a b c d e f \n", + " + ---+ ---+ ---+ ---+ ---+ ---+ \n", + " 1|\n", + " | | | | | | \n", + " + ---+ ---+ ---+ ---+ ---+ ---+ \n", + " 2|\n", + " | | | | | | \n", + " + ---+ ---+ ---+ ---+ ---+ ---+ \n", + " 3|\n", + " | | 0 | 0 | 0 | | \n", + " + ---+ ---+ ---+ ---+ ---+ ---+ \n", + " 4|\n", + " | | @ | 0 | | | \n", + " + ---+ ---+ ---+ ---+ ---+ ---+ \n", + " 5|\n", + " | | | | | | \n", + " + ---+ ---+ ---+ ---+ ---+ ---+ \n", + " 6|\n", + " | | | | | | \n", + " +\n", + "---+ ---+ ---+ ---+ ---+ ---+ \n", + "The final score is: \n", + "Computer 1 User 4 \n", + "Do you want to play again (y/n): " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "n\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " \n", + "Goodbye\n", + "\n" + ] + } + ], + "prompt_number": 1 + } + ], + "metadata": {} + } + ] +}
\ No newline at end of file |