{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2023年度計算機演習A・B\n",
    "\n",
    "# 第3回レポート課題の解説"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習1\n",
    "\n",
    "if文を使って、点数（0以上100以下の整数）が与えられたときに次の表に従った評価を表示するコードを書いてください。\n",
    "\n",
    "| 点数 | 評価 |\n",
    "| :---: | :---: |\n",
    "| 90点～100点 | 秀 |\n",
    "| 80点～89点 | 優 |\n",
    "| 70点～79点 | 良 |\n",
    "| 60点～69点 | 可 |\n",
    "| 0点～59点 | 不可 |"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "86\n",
      "優\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "score = random.randint(0,100)  #0以上100以下のランダムな整数を与える\n",
    "print(score)\n",
    "\n",
    "if score >= 90:\n",
    "    print(\"秀\")\n",
    "elif score >= 80:  #「80 <= score <= 89」としてもよいが、elifの意味を考えると冗長な書き方である\n",
    "    print(\"優\")\n",
    "elif score >= 70:\n",
    "    print(\"良\")\n",
    "elif score >= 60:\n",
    "    print(\"可\")\n",
    "else:\n",
    "    print(\"不可\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### （別解）\n",
    "\n",
    "次のような書き方も可能ですが、scoreの値がいくつであっても条件判定を最後まで行うことになるため、コードの効率（実行にかかる時間）という観点では少し劣ります。また、条件式を適切に書かないと、複数に該当する、またはどれにも該当しないということが起こりえます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "28\n",
      "不可\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "score = random.randint(0,100)  #0以上100以下のランダムな整数を与える\n",
    "print(score)\n",
    "\n",
    "if 90 <= score <= 100:\n",
    "    print(\"秀\")\n",
    "if 80 <= score <= 89:\n",
    "    print(\"優\")\n",
    "if 70 <= score <= 79:\n",
    "    print(\"良\")\n",
    "if 60 <= score <= 69:\n",
    "    print(\"可\")\n",
    "if 0 <= score <= 59:\n",
    "    print(\"不可\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習2\n",
    "\n",
    "while文を使って、条件「nの階乗が5000以上」を満たす最小のnとその階乗の値を求めてください。ただし、階乗を求める関数を使わないこと。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "条件「nの階乗が5000以上」を満たす最小のnは 7\n",
      "その階乗の値は 5040\n"
     ]
    }
   ],
   "source": [
    "result = 1  #後で数を掛けるので、初期値は0ではなく1（そうしないと無限ループになる）\n",
    "n = 1  #初期値は0でもよい\n",
    "\n",
    "while result < 5000:\n",
    "    n = n+1\n",
    "    result = result*n\n",
    "\n",
    "print(\"条件「nの階乗が5000以上」を満たす最小のnは\",n)\n",
    "print(\"その階乗の値は\",result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習3\n",
    "\n",
    "任意の3つの数に対してそれらの最小値を返す関数my_min3を定義してください。ただし、関数minおよびmaxを使わないこと。定義した関数を呼び出す例も付けてください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "9\n"
     ]
    }
   ],
   "source": [
    "def my_min3(a,b,c):\n",
    "    if a <= b and a <= c:\n",
    "        result = a\n",
    "    elif b <= a and b <= c:\n",
    "        result = b\n",
    "    else:\n",
    "        result = c\n",
    "    return result  #代わりに「print(result)」とすると、値の表示だけして戻り値なしの関数になる\n",
    "\n",
    "#関数を呼び出す例\n",
    "print(my_min3(1,2,3))\n",
    "print(my_min3(-1,-2,-3)**2)  #関数定義においてreturnで値を返すと代入や計算に使えるため、基本的にはそうすべき"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習4（オプション）\n",
    "\n",
    "任意の複数の数からなるリストに対してその要素の最大値を返す関数my_maxを定義してください。ただし、関数maxおよびminを使わないこと。定義した関数を呼び出す例も付けてください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5\n"
     ]
    }
   ],
   "source": [
    "def my_max(num_list):\n",
    "    result = num_list[0]  #最大値の候補（初めは0番目の要素）を格納する\n",
    "    for i in range(1,len(num_list)):\n",
    "        if num_list[i] > result:  #最大値の候補より大きな要素があったら\n",
    "            result = num_list[i]  #最大値の候補を更新する\n",
    "    return result\n",
    "\n",
    "#関数を呼び出す例\n",
    "print(my_max([1,-2,3,-4,5,-6]))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
