乗算器を加算器を使って実装12月8日の授業雑記で全加算器を紹介しました。実はコンピュータ内で乗算器は加算器から作ることが可能です。乗算(mul)関数の実装例は以下の通りです。ビット演算とシフト演算以外は出てきません。int型を使用します。概念をC言語で表現1か月ほど前から、コンピュータの基礎から教えてほしいとの要望に応え、ディジタル回路、ゲート回路から始め、今は全加算器の説明に入るところです。絵で見ても概念は掴めるかと思いますが、C言語で表現するとどうなるのか挑戦しました。正確には「桁上げ伝播加算器」と呼ぶようですが、一番下の桁には下位桁からの桁上りはありませんが、加算の場合は0、減算の場合は1を入力します。減算の場合は、全加算器にビットを論理否定したものを入力します。論理否定したものに1を加算する、これが情報処理試験などで勉強する2の補数となります。うまく考えてあるなと感心します。以下はそのコードですが、完全な出来ではないのですが、加算・減算の雰囲気をつかんでいただければと思い掲載します。puts("2つの符号なし整数の和を計算します。入門編」p269の演習問題10-2は西暦の年月日の前日、翌日を求める問題です。ポインタの問題ですが、PythonのcalendarモジュールにTextCalendarクラスがあります。そのクラスのprmonthみたいなものを作ってみました。時刻関数は一切使っていません。閏年の判定、曜日(0から6の数値、0が日曜日となる)の取得、数値の曜日から日本語の曜日に変換する関数を新たに追加し、演習問題の前日、翌日を求める関数を組み合わせると、prmonth関数は意外と簡単にできます。授業では市販の参考書を使用していますが、そこからどんどん新しい問題を即興で考えてはその場で解いています。printf("%d年%d月%d日は暦上存在しません。printf("カレンダーを表示します。0;}2019-9-16(月)【Python】ISBNチェックディジットISBNISBNコードの最後の桁はチェックディジットと呼ばれ、コードが形式上正しいかを判断するためのものです。書籍コードとして正しいかまでは判定できませんが、入力ミスのチェックくらいには使用可能です。以下のコードがISBNのチェック関数となります。引数のバリデーション機能は入れていません。私がPythonを使いだしたのが1992年頃。その頃はまだPythonはラムダ式を持っていませんでした。私の記憶によれば、バージョン1からラムダ式を持つようになったはずで随分歴史があります。私にとって一番なじみのある書き方ですが、今となってはlambdaという言葉さえ不要だと考える人が多くなったのではないでしょうか。以下はJavaの例と同じことを確認するために、get_bmiメソッドを持つMemberクラスを定義した後、Memberインスタンスのlistを、ラムダ式を使用してBMI順にソートできることを示しています。他の言語と同じようにlistのsortメソッドは破壊的ですが、sort関数は非破壊的なので、元の並び順を変えたくない場合はsort関数を使うこともできます。2019-9-6(金)【Java】自作クラスのソートJavaの場合(Java8以降)Java8以降になりラムダ式が導入され、Javaもようやく高階関数を作りやすくなりました。前回のMemberクラスのListをBMI順にソートするプログラムもラムダ式を使うと以下のように非常にシンプルに書けるようになりました。}}2019-9-4(水)【Java】自作クラスのソートJavaの場合(Java7以前)Java7以前はラムダ式がないため、メソッドの引数としてロジックを流し込むにはインターフェースを使用して渡す必要があります。今回はMemberクラスのListをBMI値の昇順にソートするプログラムを作成します。JavaのListにはソート機能はなく、Collectionsのsortメソッドの引数にListを渡すことでソートします。ソートする基準が数値や文字列の場合は簡単なのですが、自作したクラスをCollectionsのsortメソッドに渡しても、Collectionsは何を基準にソートしていいか分かりません。Collectionsのsortメソッドの第2引数はそのソート基準を伝えるためのオブジェクト渡すことになります。そのオブジェクトのクラスはComparatorインターフェースを実装する必要があります。Comparatorインターフェースはcompareメソッドを持っています。compareメソッドはListの要素の型を2つ受け取り、第1引数と第2引数をある基準で比較し、第1引数の方が小さい場合は負の整数値を、大きい場合は正の整数値を、等しい場合は0を返します。Memberクラスは身長(cm)と体重(kg)のフィールドを持ち、それを元にBMI値を求めるgetBmiメソッドを持っています。したがって、sortメソッドの第2引数にはBMI値でソートするよう定義したComparatorの実装オブジェクトを渡します。以下のプログラムはMemberオブジェクトを格納したListオブジェクトをBMI順にソートする例となります。今日の授業はクラス設計の入り口当たりのこと生徒さんに考えてもらいました。頭の中ではオブジェクト指向は分かっているものの、いざ作ろうとすると手が止まってしまいがちです。最初は不格好でもいいから、思った通りにクラスを作ってもらっており、その後徐々に改良すればいいことを体得して頂ければと思っています。以下は単語帳アプリのクラスで、WordクラスとWordListクラスだけですが、最初はこれで十分です。これに肉付けしていく過程の試行錯誤が重要だということを教えています。WordListの内容をファイルまたはデータベースからの読み書きができるようになれば、ちょっとしたアプリが出来上がるはずです。これをPyQtでGUIにするか、DjangoでWebアプリにするかはたいして難しい話ではありません。クラスを別ファイルに分割し、モジュールとしてimportしたり、Dictionaryあたりの記述をもっとすっきり書けるようにするあたりを次の授業にでも教えようと思っています。print('単語を登録します。print('単語を検索します。【C言語】文字列操作C言語を学習する中での最大の難関はなんと言ってもポインタだと思います。ポインタなんてなくなればいいのにと思っている方も多いかと思います。C言語の強みであるアドレスを意識できる細かい操作を可能にしているのはポインタです。習得してC言語と仲良くなりましょう。ポインタ完全攻略」をC言語中級コースの参考書にしようと考えています。4-41を参考にポインタの使い方の一例を紹介します。C言語の標準ライブラリstring.hの中にstrstr関数があります。第1引数の文字列の中に第2引数の文字列が何番目に存在するかを調べる関数です。戻り値はchar型オブジェクトへのポインタ型です。*s2)が関数のシグネチャです。参考書はこの関数の疑似的な関数を紹介し、ポインタの理解を深めようとしています。以下がそのコードです。「*」がたくさん出てきて混乱しそうですね。*s1などのように記述する場合は、型宣言しており、s1がchar型オブジェクトへのポインタ型であることを示し、単に*s1と記述すると「参照外し」と呼ばれる、ポインタが指し示す内容となります。(1)はs1をp1にコピーしています。*となっている通り、s1と同じ型であることがわかります。p1はs1の文字列の先頭から1文字ずつ末尾に向かって進めていくために使用されます。(2)は(1)と同様、検索対象の文字列のポインタをp2にコピーしています。(3)はp1またはp2の内容、つまり*p1と*p2が両方が'\0'でない場合、処理を進めるという条件式です。この段階で文字列が見つかったかはまだ判断できません。判断は(9)で行っています。(4)はp1またはp2の内容、つまり*p1と*p2が等しいかを判定しています。(5)と(6)は等しい時の処理で、p1とp2を1つ先に進めています。(7)と(8)は等しくない時の処理です。(7)は少し難しいですね。s2」の理解ができるかがこの関数のポイントになります。s2は検索文字列の元のポインタです。それに対し、p2は(6)でs2よりも先に進んでしまっています。s2」は何個分先に進んだかを計算しています。実はこの時点でp1もこの値と同じ分だけ先に進んでしまっています。s2」でp1を元のところまで戻しています。1」の「-1」は完全に元に戻すと意味がないので1つ先に進めるためのものです。-1を引いているから+1足す結果となります。(8)はp2を元のs2に戻し、最初から検索できるようにする処理です。(9)はwhileを抜け出た時点でp2の内容(*p2)がまだ残っているようであれば、s1中にs2が見つからなかったことを意味しNULLを、見つかった場合は、(8)の理屈と同じで、検索のためにs2の文字数分先に進んでいますので、それを戻す処理です。s1の中のs2が出現する最初の位置を計算しています。*型へ型変換して戻り値としています。文字列だけの説明となりましたが、図に書き起こしてみれば理解できるようになります。チャレンジしてください。【JavScript・jQuery】DOM操作5月16日の解答例です。既存のDOMに繰り返し構文で追加しています。本来であれば、既存のDOMに存在しないNodeを作り出し、JavaScriptでいうFragmentに追加すべきでしょうが、大目に見てください。今回の問題のポイントはappendメソッドの戻り値がthisであるということを理解しているかという点です。したがって、append内部でさらにjQueryオブジェクトを生成しているのは、子のNodeを親に追加するためです。.appendメソッドがチェーンになっている場合、大元のjQueryオブジェクトへの操作となります。以下にコードを載せていますので、上記のことに留意しながら試してもらえたらと思います。【JavScript・jQuery】DOM操作データベースやWebAPIを通じて取得したオブジェクトの配列を使って表形式で表示する問題です。今ではJavaScriptの優れたフレームワークがあるからそれで済みますが、ここは参照とは何か、DOMとは何かを意識してもらうための問題です。以下のコードはjQueryのDOM操作を省略しています。以下のような表ができればOKです。チャレンジしてください。部分集合の判定など非常に充実しています。それ以外にも高速に検索する能力も持っています。それを実感してもらうためにListでの線型検索と対比します。計算量としてはListはO(N)、SetはO(1)となりデータ量が多くなるほど顕著な差が出ます。言え、Listの線形検索だとあまりにも比較にならないため、ListにもBinarySearchがありますが、アルゴリズムにも興味を持ってほしいため久しぶりに自作してみました。授業では、Setの構築、Listのソート時間も実感してもらうようにしています。これらを加味して自分の解きたい問題にふさわしいコレクションクラスを選択できるようになるからです。Stats」(原著の方を使用)という本でPythonを使って統計学を教える予定でした。Edition」を使って、pandasの基礎を勉強中です。これは「NumPy・pandas・matplotlib」コースとは違い、純粋に統計学を勉強するための特別なコースです。指標を求める統計学と考えてください。Pythonにはすぐれたモジュールが豊富に存在しており、pandasにもSeriesやDataFrameというクラスが存在し、簡単な指標であればメソッド一つで求めることが可能です。そこを敢えてPythonの組み込み関数やクラスだけで求めています。以下の手順で進めていきます。ロジック自体は数行というところです。内包表記は強力なツールですね。【Java/Servlet】生のServletで画像ファイルをダウンロードJavaでWebアプリを作るとなるとSpringなどのフレームワークを使っている方も多いと思います。今日はフレームワークを使わずServletで画像ファイルをダウンロードする方法の紹介です。/>で十分な場合もあります。パスを明かしたくない場合もあるかと思います。そのような場合、img要素のsrc属性に画像ファイルのパスを指定するのではなく、画像ファイルの出力に特化したServletを使えば簡単です。Servletを呼び出すコードは以下の通りです。src属性はServletのurlパターンです。/>;ServletのdoGetメソッドのコードは以下のようになります。ポイントはresponseからgetWriterでPrintWriterを取り出すのではなく、getOutputStreamでServletOutputStreamを取り出すところです。あとはjava.ioパッケージの定番のクラスを組み合わせることになります。【SQL】where句で集計関数が使えない理由select文のwhere句では集計関数が使えません。SQLの入門書ではその説明がありません。プログラミングの素養が必要だからです。where句はテーブルスキャンの場合、先頭の行から順に読み込み、条件式がtrueの行だけを抽出します。データベースは速度が命です。一度、where句でふるいにかけてから集計しているようでは速度が出ません。