{ "cells": [ { "cell_type": "markdown", "id": "02ce8c22-fe54-435a-85b2-894c081c3592", "metadata": {}, "source": [ "We illustrate modular design." ] }, { "cell_type": "markdown", "id": "6493ae5c-c212-4fa4-be43-fbe9ded499bf", "metadata": {}, "source": [ "# 1. An Abstraction of a Stack" ] }, { "cell_type": "markdown", "id": "d64cf8e5-9d91-4f2a-99c6-cd10042b50b3", "metadata": {}, "source": [ "A stack is a data structure with access protocol *first in last out* and its two main operations are\n", "\n", "1. pop the top element from the stack,\n", "\n", "2. push an element to the top of the stack." ] }, { "cell_type": "markdown", "id": "156718de-2391-46ab-b607-4234a2e4b017", "metadata": {}, "source": [ "Python does not have a stack type, although we can use a list as a stack." ] }, { "cell_type": "code", "execution_count": 1, "id": "8bcdf337-059e-46ae-a514-f48c4cf1e8c6", "metadata": {}, "outputs": [ { "data": { "image/png": "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mjTJ9FXeMxGHtxo3biyvvvqqTJ482VSz0YorTz31lN0KAJWXL8/PPi5WZmamxMTE2CV3OTk5Zh4VFWXmwfDqWEW8bojXHfG6K694//zzTzOc/RNPPGFGz9TuEJqUFyXS4w1WuMarfcn1W4wlS5bIpZdear7FOPTQQ+1Wzl9XxOuOeN0Rb3Bc4qVlHEClpBU7dDh7TcTHjh0r7777brGJOMKH9h3X7iraSv7cc8+ZZVrJAVRWJOMAKhXt3zdixAjp0qWL1KtXTz744AMZNWqU3YpIoq3ja9askZNPPll69+4tvXr1Mn3/AaAyIRkHUGlohRRtDdd64UOHDpVPPvnEDG+PyKV14PX/9Z577jF9/7WVXPv+A0BlQTIOoFK44447pH379qK3wTz77LMmeUPloR+udHTUE088UW688Ua5/PLL5ZdffrFbASBykYwDiGjLly+XU0891STfOpDM559/LmeffbbdispEK6wsXbrUdENKTU01reSzZ8+2WwEgMpGMA4hY48ePN91Q9G71+fPny/Tp00t9xzsixw033CCfffaZNGvWTK644gozeqrW8gWASEQyDiDi6E192vqtN2bqjX06nL3esImqIyEhQd5++22ZOHGiPPPMM6aVfM6cOXYrAEQOknEAEUVrTmt3Ba1FrUmYli488MAD7VZUNcOHDzc36h577LGSlJQkV199tfz22292KwCEP5JxABFh48aN0qlTJ1PurkePHqY1XG/iA0455RR57733TLelWbNmmVZyvYkXACIByTiAsPfII4+YkoXaLUEf60AwsbGxdiuQLzk5WT7++GNp2LCh9OzZU/r06SPbtm2zWwEgPJGMAwhbP//8s2kFv/766+Xcc881lVKuvfZauxXYm1bW0YGedNTVJ598krrkAMIeyTiAsKQl67Q1/IUXXjD9xF999VVp1KiR3QoUT2/uXbFihRx55JFy6aWXSr9+/eSPP/6wWwEgfJCMAwgrv//+u/Tt29dUSdHRF1evXi233HKL3Qq4a9mypalDP3r0aDMqq974O2/ePLsVAMKDLyMjI88+LtauXbukRo0adsmdjoanfD6fmQfDq2MV8bohXnfEW7JFixbJyJEjTfeU22+/vdRJOP+/bqpSvFpxRZPyVatWmRt/x40bJ/vtt5/dWjL+f90Rb3CI101ljtfn/yH5P6UEOqhGTEyMXXKXk5Nj5qUZiMOrYxXxuiFed8RbNN33pptukhkzZpg+v1OmTDGtmpU13j2V5VhFvG70544ZM8bUJm/QoIHp/uRanz5S41VV6f9XEW/JiNddKOKlmwoAT73xxhumb7gm4nfccYephqGJOFARNBl///33pV69etK1a1fp37+/7Ny5024FgNAjGQfgmaFDh0qHDh1kn332kTfffFPuuusuuwWoOGeccYasXLlSRowYIQ8//LCpuPLyyy/brQAQWiTjAEJOS8+dfPLJcu+998qNN95oShZq6UIglCZMmCDvvvuu1K1bVy6++GIZOHCg/O9//7NbASA0SMYBhJTWf27Tpo0Zsvyll16SBx54QKpV41IEb5x55pny6aefyrBhw0xXKW0lX7hwod0KABWPd0AAIaFVLDTx0T67WrpQh7O/6KKL7FbAW3feeacZ4fWAAw6QCy+8UG644QbJzs62WwGg4pCMA6hwkydPNt1SNmzYIKmpqfL4449L7dq17VYgPJx99tnmQ6OW1Zw+fbppJddymwBQkUjGAVSYr7/+Ws4//3y57bbb5LLLLjN9w3v16mW3AuHp7rvvlqVLl8q+++4rF1xwgSm7+c8//9itAFC+SMYBVIhHHnnEjHioZeQee+wxmTt3bqlqywJeSExMNKO/6gfJadOmyYknniivv/663QoA5YdkHEC5+vHHH+WSSy6RQYMGyXnnnWdaw/v162e3ApFl0qRJpuxm9erVpXPnzmZUWMex8gDACck4gHIza9YsM4DPvHnzzOiGCxYskIYNG9qtQGTSsptpaWkmEZ86darpS66DVQFAeSAZB1BmW7dulauuukquvvpqc6OmtoZrNQqgMtFWcu2q4vP5zGBVgwcPtlsAoPRIxgGUyYsvvmhaw59++mmZOHGivPXWW2YZqIy065WW5bz55pvNtz/6WtduLABQWr7s7Gynzm9ZWVkSHR1tl9zl5uaaeWkG9fDqWEW8bojXXWWLV0cqvPXWW+XRRx+V0047zSQmp556qt1a+eItCfG6qyzxaiu53uC5fv16cy7cc889dsvuKku8rog3OMTrpjLHW7pnBlClaRISHx9vEvE77rjDDG9fMBEHqgLtqqIVV/RmZf0wmpCQIMuWLbNbAcCNL8/xtvDMzMxSlSXLyckx86ioKDMPhlfHKuJ1Q7zuKku8Q4YMkSlTppiv5/VmNi0BV5jKEq8r4nVXGePVwYG0dVxr6w8dOnS3VvLKGG9xiDc4xOumMsdLyzgAJ++9955pDddEXPvL6k2aRSXiQFXTqVMn+fLLL00rud7oqeeKDq8PACUhGQdQotGjR8tZZ50lf/zxh7zyyity//332y0AArQW+YMPPmjOkb/++st8WB02bJjdCgCFIxkHUKTPPvvMJOHjxo2Ta665xlSR0IFPABRNzxFtJR8wYIAZWl/vp9BvlgCgMCTjAAqlX7W3bNlSvv32WzOUvd6sud9++9mtAIpTs2ZNSUlJkZdeekm2bdsmbdu2lREjRtitAPAfknEAu1m3bp2ppXz77bdLz549ZdWqVXLZZZfZrQCCcdFFF8maNWvk2muvlTvvvNO0kmv1IQAIIBkH8K/p06ebKikrVqyQmTNnmoF86tWrZ7cCKI19993XtJLPnz9f/u///k/atGkjo0aNslsBVHUk4wDk+++/l65du5oh7C+44AJTKaVPnz52K4Dy0KVLF9OXXFvJx48fb7qBLV++3G4FUFWRjANV3JNPPmlaw19++WWZNm2a6ePaoEEDuxVAedp///3lkUcekRdffFG2bNkip59+uowZM8ZuBVAVkYwDVdSvv/4ql19+uWkB1+HstTVcW8YBVLxu3bqZVvJ+/frJ2LFjpXXr1vLRRx/ZrQCqEpJxoAp6/vnnTWt4amqq3HXXXbJkyRJp1qyZ3QogFA444AB57LHHzPn4ww8/SKtWrUwZUQBVC8k4UIXs3LlTrrvuOrn00kslLi5OVq5cKXfccYfdCsAL3bt3N63k+i2VDrB1xhlnmHMTQNVAMg5UEYsWLTKt4VovPDk5WT788ENp0aKF3QrASwcddJCpYPTss89Kenq66To2YcIEuxVAZebLzs7Os4+LlZWVJdHR0XbJXW5urplXqxZ83u/VsYp43RCvOy/jHThwoEnCTzjhBLnvvvvMqJouIjVeXs9uiNddKI/dunWrDBkyxJQW1VZy/fCsgwYFK1Li3ROvZzfE6y7c4y3dMwOICO+8844kJCSYRPzmm2/+d3h7AOGrbt26ppX8mWeekU2bNkmHDh3MsPoAKidfnp99XKzMzEyJiYmxS+5ycnLMPCoqysyD4dWxinjdEK+7UB87cuRI8zV3o0aNTOm0pKQku8VdJMVbEK9nN8TrzqtjterRgAEDzE2e+kFav9nSD9guIjFexevZDfG6C/d4aRkHKhm98UvLpGkirjdrfvHFF3LuuefarQAiySGHHGLq/8+ePVvWrVsnJ598Mq3kQCVDMg5UIlqmUG/8+u677+S5556Thx9+WGrVqmW3AohU+s2WVlzRsQGGDRsmiYmJsnr1arsVQCQjGQcqga+++kratWsnw4cPN2/WOoBPjx497FYAlUG9evVMP3K9sVO/8YqPj5dJkybZrQAiFck4EOH0K2wtWfjJJ5+Yoe31zVq/2gZQOV1xxRUmGe/Vq5fcfvvtphuafgAHEJlIxoEItXnzZrn44ovlpptuMnN9M7766qvtVgCVWf369c0IuvoBPC0tTU488USZPHmy3QogkpCMAxFIy55pa7gO5DN9+nSZP3++HHnkkXYrgKpCP4BrK7mOqnvbbbdJ+/btTd9yAJGDZByIIL/88ov5arpfv35y+umnm9ZwHdAHQNV16KGHmpE79UO6VlPSD+paAhFAZCAZByKEVkfRETTnzp0r99xzj7z++uvSpEkTuxVAVdenTx/TKt69e3cZPHiwdOrUyZRDBBDeSMaBMLd9+3ZTL1yrpBxzzDHy6aefytChQ+1WAPjP4YcfbgYIeuyxx2TFihWmL/nUqVPtVgDhiGQcCGOvvPKK+cr5iSeekOTkZHn//ffNoB8AUBztyqZ1yLt06SK33HKLdOzYUTZs2GC3AggnJONAmLr55pvloosukjp16siyZctk9OjRdgsAlExv6tbubY888oi899570rx5c3nwwQftVgDhgmQcCDNLly41reEPPPCADBkyRFatWiVt2rSxWwEgONdee63pS965c2e58cYbzXzjxo12KwCv+bKzs/Ps42JlZWVJdHS0XXKXm5tr5tWqBZ/3e3WsIl43xOvO5diRI0fK3XffbfqGazWEDh06mPWVNd6iEG9wiNcN8Yo8+uij5kP+P//8Y+qS9+/f327ZXWWJ1xXxuiPe4LjEW7pnBlCuPv74Y1OqUBNxvVlT+3oGEnEAKC/aSr5mzRpzfdFW8q5du8q3335rtwLwgi/Pzz4uVmZmpsTExNgldzk5OWYeFRVl5sHw6lhFvG6I111Rx06cONHcnKlVEO6//3655JJL7Jb/VKZ4XRBvcIjXDfHubsaMGXLrrbeKz+cz38QVbCWvjPEWh3jdEW9wXOKlZRwoZ9rH24WOmte2bVuTiF955ZVmAJ/CEnEAqAgDBgwwfcnbtWtnHmvllfT0dLsVQKiQjAPlbMKECaZ6QXG07q8O4JOWliazZs0yU926de1WAAiNRo0amRKqWmVl0aJFpuJKSdevgnbs2GEfASgtknGgHL366quyYMECuemmm2TTpk127X+0b6ZWMtC6v926dTOt4doqDgBeGjRokGklP+ecc+T666+XHj16yHfffWe3Fk27uQAoG5JxoByNGzfO9CvLzs42dcILmjlzpsTHx8uSJUtMX80XX3zR9BMHgHBw7LHHmgYFLauqreUnnXSSGcmzKNrwoK3o+s0egNIjGQfKib5pffLJJ+ZmDy2FpF/56g2ZGRkZctlll5nWpjPPPNP0FS+qnBgAeE2rrGjFlTPOOMNUX+nevbv88MMPdmu+7du3m/203NuoUaPsWgClQTIOlANNvseMGWOX/qNf4TZp0sSMgnfPPffIwoULTesTAISz4447zlyvtEFh3rx5pi+5frsXoNe2H3/80Vz7vv/+exk/frzdAiBYJONAOdCbNn/++We79J999tnHzLXCCn0rAUQa7W6nfclbtWol/fr1k0svvVQef/xxM3hQQWPHjt2r9RyAG5JxoIy0dUj7ihdGR7nbtm2b6bICAJGoadOm8vrrr8uUKVPk+eefN13u9hyNUK91RV0HARSPZBwoI20V1zei4ugw9x999JFdAoDIo9/u6VgIer0LDBFekLaYf/DBB3YJgCuScaAM9IZNl5q8WmFlz+oqABBJtO+4VoEqil7naB0HgkcyDpSBtooH+oWX5LPPPjOjbQJApPnzzz//rZ5SFK0k9eabb8rcuXPtGgAuSMaBUnr55ZdNLV79ytbn85lWoT0dfPDBctppp5mbnjQR10oq77//vt0KAJFBu6joTeqFdU8pSJN1vZkTgDuScaCUtFVcHXHEEdK2bVvp06ePKV/4wgsvmOopeuPmr7/+avqKz549W0aPHm1G22zTpo05DgAigXZN0f7gBek3goV9K6jJ+jfffCOTJk2yawCUxJeRkZFnHxdr165dUqNGDbvkLi8v/+m15TBYXh2riNdNVY337bfflqOOOspMhbWIFyaS461q/7/EWzLidVcZ4v39999NPXEtXxiY67R582Yz37lzp9kvQH/fTz/9VP7f//t/do07/n/dEK+7cI/X5/8h+T+lBJmZmRITE2OX3GkfMuWa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p+ag4TJ4n2fJuDruuOPMyF16wl533XVy2WWXyddff223At7Qk1W/cg10TSERBwB3I0eOlEceecRcQ/VaSmMbvKa5peaYmmtqzqm5p+ag4cLTZFwdcsghZuSjSZMmybx588wfR7/e0jJJQKjo6HFPPPGEnHzyyeZk1Vria9asoWsKAJRCnz59zDVUr6V6TdVrq15jGakToaS5pOaUmltqjqm5puacmnuGE19GRkaefVysXbt2SY0aNeySu7y8/Kf3+XxmXpyff/5ZHnzwQXnyySfNckJCgimXdNppp0nTpk3l0EMPldq1a5ttQGnpm8Gvv/4q3377raSlpZlPyDqcs44id9JJJ8m1114rXbt2tXvvLpjX8568OlaF4vzdE/G6I97gEK+bcIl3/vz5pnV89erVst9++5mWyTPPPFPi4+OlYcOGJjGKiooy+wKl9ddff5k8cu3atfLxxx/LkiVL/m3Y7d27twwaNEgOO+wwsxyMUJy/Pv8Pyf8pJcjMzJSYmBi75C7wKTiYE00TJR0RScvOcHMnKlqDBg2kQ4cOZljnkkbWLM3rOcCrY1Uoz98A4nVHvMEhXjfhFu+yZcvkhRdekNdff102b95s1wIVQ9/PL7roIlM15aCDDjLrwvX8DctkPECP1U8Un3/+uWzcuFEyMjJM66XLr5ybm2vm1aqVrifO9u3bZf/997dL7sryc8vjWC3X89FHH5lPiI0aNTJle44++mizrTiRGm9pjtXXok7NmzeXZs2aBXUDR0W8QbkIxcWgMMTrjnjdEW9wKmO86enpZrCV7777TrZu3frvMaoqvR8p4nVT3M/VVmv91kVvzDzmmGNMz4qCrdFenQvK5fwN+2RchesfrzDhEK++YKdOnWqmH374Qc4991y56aabii1qz/+vG+J1R7zuiDc4xOuGeN0RrzviDY5LvKX7WIOwpp8ab731Vvn+++9l2rRppm+09tE7++yzZcGCBXYvAAAAeI1kvJK74YYb5JtvvjE1X7Wbj96Y2Lp1a3n++eftHgAAIJR27txpyj8CimS8irj++utl/fr18vjjj8uff/4pl156qbRo0cLcKAsAACpeVlaWGRRJR3/Ub64BRTJexfTt21e++OILmTVrlvzzzz9y+eWXm3J+zz33nN0DAACUJ71RdfDgwSYJHz9+vKngpYPKAYpkvIq68sorTf3NOXPm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ifLKK6/YvQAgcqxatcpUkGrWrJm5QVPHXdCxGPTmzJNPPtnuBaA8kYwD5SAweqd2X9HkPDDgxbx58+weABC+3n//fenevbtJuLWClI6WGbim6VgMACoOyThQjgKjdz766KPy22+/mf6VLVu2NG9uABButGudfqOnXU/0ZswxY8aYWuF33323HH744XYvABWJZByoAIHRO5988klz01PPnj3l1FNPldmzZ9s9AMA7L774opx11lkmEddrlfYL19EyR48eLXXr1rV7AQgFknGgAgVG79QkXGuU9u7dW0444QR54okn7B4AEDqzZs0yXVG0S8r//d//yYwZM8yow3r/S40aNexeAEKJZBwIAR2986OPPpI5c+ZI7dq1pW/fvqZO7yOPPGL3AICKo0m39v3WBgJtGHj66adl7dq10r9/f7sHAK+QjAMhpK1Ry5cvl/nz58v/+3//zwwb3ahRI1PDFwDKk3aRmzJliilPOHDgQKlfv765qfyTTz6RK664wu4FwGsk44AHunTpIu+++64Zwa5BgwZy4403ylFHHSX33XefOI7DBQCF+vXXX82NmDpa5h133GG6xr3++uvyzjvvSNeuXe1eAMIFyTjgoQsuuEDeeust80bZtGlTU07ssMMOk3vuuUd27dpl9wKAkn3//fem7/ehhx4qY8eOlbZt25oEfNGiRWZQMgDhiWQcCAOB0TuXLl0qp5xyimnN0qR8woQJsn37drsXAOxNB+XRvt/67Zp2S9F7VHTwnrlz58rpp59u9wIQrkjGgTASGL3zvffeM3V/R44c+W8r17Zt2+xeACBmePorr7zSfKumo2UOGjRINmzYYKo1xcfH270AhDuScSAMBUbvXLFihZx//vmmhVz7fw4fPtyUIwNQden9Jt26dZMWLVqYeuG33367/PTTT+ZG8GOPPdbuBSBS+DIyMpzuFtP+q6WpQRq4Gc3n85l5MLw6VhGvG+J1V5Zj16xZY0b11AQ9KipKrr32WjNpdQQX/P+6IV53xOuuvOLV+0tmzpxpRso8+OCDpV+/fmY68MAD7Z67i/R4g0W87ojXXSji9fl/SP5PKUFmZqbExMTYJXc5OTlmrglEsLw6VhGvG+J1Vx7Hal3gqVOnmpE91U033SS33HKL6StaHP5/3RCvO+J1V9Z4H3vsMVMX/IMPPjDVl2644QZTgamk54vUeHk9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OeecI2+88YZpIT/llFOkTZs28vDDD5v643Cn7T36oUYHTzr88MPNtw1awWb16tV2DwCo2kjGAaAI7du3N6N5Tps2zQz6079/fzn44IPNyJKamKelpdk9UZB+gNFRNm+//XY58sgj5ayzzjKDJ2mZyLVr18r06dPNTbIAAJJxAChUwRbwQYMGyY8//mhqj2v1j++//94k5tp1RW/w1FbzW2+9VebNmydfffWVPapqyMjIMMPda9eT7t27y1FHHWVuVtJBk7R7jw708/TTT5ubYXV+3HHH2SPz/f777/YRAFRN9BkvAvG6IV53xOvO63i1z7hWU9G74Ivy22+/mST0ww8/NMPqL1++3G7JFxcXZxLPpk2bytFHH20eaz/pQw891NQwjyT6QeTnn382fbw3btwo69evl6+//tpMf/zxh91L5IgjjjBderQlXKeTTjrJbtlbamqqXH755dK1a1fzISYYvJ7dEK874nVHvMFxiZdkvAjE64Z43RGvO6/j1WRcaf9mbQl39fHHH8u6detk06ZNJmH95ptvCu0bvf/++5ukXJPz2NhYk8Rqt41atWoVOtWuXdsMUKSPtexiYCq4vN9++5nn/vPPP+Xvv/+W//3vf2Yq+FgnHf4/sH7PSbdpS7cm3jr/4YcfzN9yT/q764eLY445Rho1aiTNmjWTFi1aSL169ewexdOk/rzzzjN/p+HDhwc9EievZzfE64543RFvcFziJRkvAvG6IV53xOvO63gLVlM5+eSTZcaMGaa7RWl99913JjH/6aefTKK756T90sOFdjHRZFs/JBT8wKCP9QZMTbz33Xdfu3dwtJrK+PHj5e677zZJvCbjVFMpGfG6IV53xOsuFPGSjBeBeN0Qrzvided1vJqMa4J4+umnm8of2kdcH/fq1cuMzKkjR1YE7fJRsKV6zxbsQOt2wccFl/XvtWeLecHlgvPAVHA50Lpe3rQ7z5w5c+TZZ581MQ4cONCUODzooINIxh0QrxvidUe87kIRL8l4EYjXDfG6I153XscbSMY1UVRa/UNbc7VlW3Xu3Fk6duwop512msTHx5t1+I9WU9G+9DppEq59zpWOuDlixIh/b+LUm19JxktGvG6I1x3xugtFvFRTAYBCUE3FDdVUAKBsaBkvAvG6IV53xOvO63ipprI7qqlE9uuZeEtGvO6INzgu8ZKMF4F43RCv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", "text/plain": [ "" ] }, "execution_count": 1, "metadata": { "image/png": { "width": 500 } }, "output_type": "execute_result" } ], "source": [ "from IPython import display\n", "display.Image(filename = 'stack_relations.png', width=500)" ] }, { "cell_type": "markdown", "id": "8a37b4a0-8664-43cc-89e8-5758b27b20c1", "metadata": {}, "source": [ "The diagram expresses the relationship between the modules. At the bottom is the stack, represented as a list, but that representation is hidden from the user. The user applies the operations and input/output functions in the modules to work with the stack." ] }, { "cell_type": "markdown", "id": "bfd3616d-c201-42d1-b2a3-21ce34a4fa53", "metadata": {}, "source": [ "The diagram is made with `UML`, where `UML` stands for *Unified Modeling Language*." ] }, { "cell_type": "markdown", "id": "5bb2ca23-9dfb-4abf-9813-0be10bb5b5b0", "metadata": {}, "source": [ "# 2. The Modules" ] }, { "cell_type": "markdown", "id": "41c4dd54-cf8a-4913-a0fd-33553fde3b7c", "metadata": {}, "source": [ "All code is in a folder `Code` which must be added to the path, as done below." ] }, { "cell_type": "markdown", "id": "c6a6f6c4-200a-4fbc-bb9b-700155690bc8", "metadata": {}, "source": [ "The argument of the `path.insert()` is specific to Windows (the double backslashes `\\\\`) and of course, the absolute path name will not work in general." ] }, { "cell_type": "code", "execution_count": 2, "id": "7a1c2ac8-81ba-4ba9-b228-6040b5ca9b2d", "metadata": {}, "outputs": [], "source": [ "from sys import path" ] }, { "cell_type": "code", "execution_count": 3, "id": "57da45c1-abf3-4a3b-ad41-52c6a261022e", "metadata": {}, "outputs": [], "source": [ "path.insert(0, 'C:\\\\Users\\\\jan\\Courses\\\\MCS260\\\\Summer23\\\\Lec23\\\\Code')" ] }, { "cell_type": "code", "execution_count": 4, "id": "2a815f9c-00a1-4174-a6b9-73e3a5a1c2e8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['C:\\\\Users\\\\jan\\\\Courses\\\\MCS260\\\\Summer23\\\\Lec23\\\\Code',\n", " 'C:\\\\Users\\\\jan\\\\Courses\\\\MCS260\\\\Summer23\\\\Lec23',\n", " 'C:\\\\Users\\\\jan\\\\miniconda3\\\\python310.zip',\n", " 'C:\\\\Users\\\\jan\\\\miniconda3\\\\DLLs',\n", " 'C:\\\\Users\\\\jan\\\\miniconda3\\\\lib',\n", " 'C:\\\\Users\\\\jan\\\\miniconda3',\n", " '',\n", " 'C:\\\\Users\\\\jan\\\\miniconda3\\\\lib\\\\site-packages',\n", " 'C:\\\\Users\\\\jan\\\\miniconda3\\\\lib\\\\site-packages\\\\win32',\n", " 'C:\\\\Users\\\\jan\\\\miniconda3\\\\lib\\\\site-packages\\\\win32\\\\lib',\n", " 'C:\\\\Users\\\\jan\\\\miniconda3\\\\lib\\\\site-packages\\\\Pythonwin']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path" ] }, { "cell_type": "code", "execution_count": 5, "id": "fcaacef7-99ae-4a33-8d10-02f52c3b1ce9", "metadata": {}, "outputs": [], "source": [ "import stack_of_data" ] }, { "cell_type": "code", "execution_count": 6, "id": "37681c77-40cc-4d1a-8751-0bd11cf73689", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on module stack_of_data:\n", "\n", "NAME\n", " stack_of_data\n", "\n", "DESCRIPTION\n", " Definition of a module to store a stack\n", " of some data.\n", "\n", "FUNCTIONS\n", " length()\n", " Returns the length of the stack.\n", " \n", " pop()\n", " Pops an item off the stack.\n", " \n", " push(item)\n", " Pushes the item on the stack.\n", "\n", "FILE\n", " c:\\users\\jan\\courses\\mcs260\\summer23\\lec23\\code\\stack_of_data.py\n", "\n", "\n" ] } ], "source": [ "help(stack_of_data)" ] }, { "cell_type": "code", "execution_count": 7, "id": "2de6fb9f-d4f9-421f-af75-ff77083cbf3c", "metadata": {}, "outputs": [], "source": [ "import stack_of_data_io" ] }, { "cell_type": "code", "execution_count": 8, "id": "47af7565-037a-45af-9253-b18e43016133", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on module stack_of_data_io:\n", "\n", "NAME\n", " stack_of_data_io - Definition of input/output operations for a stack.\n", "\n", "FUNCTIONS\n", " prompt_item()\n", " Prompts for an item and pushes\n", " the item to the stack.\n", " \n", " show_all()\n", " Shows all elements in the stack.\n", " \n", " show_top()\n", " Shows the top element of the stack.\n", "\n", "FILE\n", " c:\\users\\jan\\courses\\mcs260\\summer23\\lec23\\code\\stack_of_data_io.py\n", "\n", "\n" ] } ], "source": [ "help(stack_of_data_io)" ] }, { "cell_type": "markdown", "id": "5db3a94a-52df-4ae6-921b-8369c69507bb", "metadata": {}, "source": [ "After the import, the `help()` on the module shows the available operations with the documentation strings." ] }, { "cell_type": "markdown", "id": "e9ffc7a4-9ca8-4209-8677-aa83c8b63b1e", "metadata": {}, "source": [ "# 3. The Main Program" ] }, { "cell_type": "markdown", "id": "36ad4d8f-fd09-4458-a4f8-cb8309d06301", "metadata": {}, "source": [ "The main program is in a separate file `stack_user.py`." ] }, { "cell_type": "code", "execution_count": 9, "id": "ffe4fb88-8999-4303-9bf8-204e7dec4a9c", "metadata": { "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "outputs": [], "source": [ "import stack_user" ] }, { "cell_type": "code", "execution_count": 10, "id": "d5214cb8-afac-4bf3-a8dc-8364c4706e65", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on module stack_user:\n", "\n", "NAME\n", " stack_user - This program uses the stack_of_data.\n", "\n", "FUNCTIONS\n", " main()\n", " Displays a menu and executes the selection.\n", " \n", " pop_or_push(choice)\n", " Calls pop and push functions.\n", " \n", " test_input_output()\n", " Tests input/output operations.\n", "\n", "FILE\n", " c:\\users\\jan\\courses\\mcs260\\summer23\\lec23\\code\\stack_user.py\n", "\n", "\n" ] } ], "source": [ "help(stack_user)" ] }, { "cell_type": "markdown", "id": "3673601e-772f-44f7-981b-8414b4e2e615", "metadata": {}, "source": [ "The last two lines in `stack_user.py` allow to consider the `stack_user` as a module and as a program." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 5 }