All posts by chen

C programming

【授業の概要】

コンピュータプログラム開発言語の中で広く利用されているC言語をCプログラミング開発環境ソフト:
CPad for Borland C++ Compilerを使った一人一台のPCを使い実習により学びます. 毎回問題に取り組み理解を深めます。復習問題としてプログラミング課題を出題する。

【授業要旨】

回数 題目 授業内容 学習課題 予習時間(分) 復習時間(分)
1 ガイダンス 学習目的 情報工学系科目のC言語の位置づけ CPad開発環境 PCを持っている学生は開発環境をインストする 60
2 C言語の基本作法 Cプログラムの作成 文字列の表示
printf関数:書式化して表示を行う関数
テキスト(P2-9)を読む
授業内容を復習する
30 60
3 C言語の基本作法 変数と宣言 代入 初期化 テキスト(P10-11)を読む
授業内容を復習する
30 60
4 C言語の基本作法 scanf関数:読込みを行う関数
puts関数:表示を行う関数
テキスト(P12-16)を読む
授業内容を復習する
30 60
5 演算と型 演算子とオペランド テキスト(P17-24)を読む
授業内容を復習する
30 60
6 演算と型 型と演算 テキスト(P24-34)を読む
授業内容を復習する
30 60
7 1回~6回までのまとめ 演算に関する演習問題をグループで解く 授業内容を復習する 30 60
8 プログラムの流れの分岐 if文 ブロック複合文  if else 文 テキスト(P35-44)を読む
授業内容を復習する
30 60
9 プログラムの流れの分岐 if ~else~if~ else~ 文
if文の ネスト 条件演算子
テキスト(P45-53)を読む
授業内容を復習する
30 60
10 プログラムの流れの分岐 switch文  break 文 テキスト(P54-58)を読む
授業内容を復習する
30 60
11 プログラムの流れの繰返し do ~ while文 テキスト(P60-67)を読む
授業内容を復習する
30 60
12 プログラムの流れの繰返し while文  for文とwhile文 テキスト(P68-73)を読む
授業内容を復習する
30 60
13 プログラムの流れの繰返し for文 for文と配列 for文の多重ループ テキスト(P74-76)を読む
授業内容を復習する
30 60
14 プログラムの流れの繰返し 多重ループ テキスト(P78-85)を読む
授業内容を復習する
30 60
15 前期のまとめ まとめと総括。小テストの実施 授業内容を復習する 30 60

 

【テキスト】

新・明解C言語 入門編 (明解シリーズ)

参考:

 

[BCC32]How to use Cpad

Cpad とは

CPad for C# .NET(以下CSCPad or CPad)は、
Microsoft社のC#実装系「C# .NET」用のC#開発環境です。
GUI環境で簡単にC#プログラミングができます。

簡単に「コンパイル」&「実行」ができるので、プログラミング初心者の
学習用途はもちろん、ちょっとしたテストコードの実行に手間を
かけたくない中上級者にとっても有用なツールとなっています。

BCPadのインストール

Cドライブ下にbcpad231フォルダーをコピー

cpad.exe をダブルクリックして実行します

立ち上げると設定のパネルが出てくる。

コンパイラのパス

C:\borland\bcc55\Bin\bcc32.exe を(入力するか)参照する。

ヘルプファイルのパス

C:\bcpad231\cpad_manual.html

標準のデータ保存フォルダ

C:\Users\student \Documents\C (studentの場合)

バックアップフォルダなしです。

Cpadの使い方

デスクトップから、下記のアイコンを探して、ダブルクリックで、Cpadを起動してください。

BCPAD

(似ているアイコンがあるので、アイコンにC++と書いてあるの方が正解です)

CPad01

Cpadのカスタマイズ

文字と背景色が変更できます、すきのように変更してください。

「メニュー」ー「実行」ー「設定」-「フォント」順に[フォント]ページを開き

スクリーンショット 2016-04-15 10.32.48

ページの説明:

[エディタフォント]

エディタのフォントを指定します。

[メッセージのフォント]
メッセージウィンドウ・ファイル検索結果ウィンドウのフォントを指定します。

[文字色]
文字色を指定します。

[背景色]
背景色を指定します。

[選択領域の文字色]
選択領域の文字色を指定します。

[選択領域の背景色]
選択領域の背景色を指定します。

[改行マークの色]
改行マーク・[EOF]マーク・Tabマーク・全角空白を表示する場合の色を指定します。

[標準の色設定に戻す]
CPadデフォルト(インストール時)の色指定に戻します。

設定例:

キャプチャ1

[BCC32]Install Borland C++ Compiler 5.5

Borland C++ Compiler 5.5開発環境

Windows PCを持っている学生は開発環境をインストールする

Borland C++ Compiler 5.5のインストール手順

https://www.embarcadero.com/jp/free-tools よりダウンロード

大まかな流れ

  1. 圧縮ファイル「freecommadlinetoos」の解凍
  2. インストーラー「freecommandlinetools2」 の起動
  3. 使用許諾契約の同意
  4. コンパイラのインストール先の指定
  5. コンパイラのインストール開始
  6. インストール終了

freecommandlinetools2.exe を実行してください。[同意する]ボタンを押して先へ進んでください。

コマンドラインツールをインストールしたいドライブとフォルダを選択します。

c:BorlandBcc55Bin

がインストール先です。

C:borlandbcc55Binbcc32.exe

とインストールされます。

次にbcc32.cfg と ilink32.cfg のファイルをC:borlandbcc55Binの中にいれます。

( bcc32.cfgファイルは,Include および Lib パスのコンパイラオプション(コンパイラの -I および -L スイッチ)を設定するものです。

bcc32.cfgファイルには

-I”c:BorlandBcc55include”

-L”c:BorlandBcc55lib” と書かれています。

ilink32.cfg ファイルは,Lib パスのリンカオプションを設定するものです。-L”c:BorlandBcc55lib” と書かれています。)

 

コマンドラインでコンパイルする場合、環境変数「PATH」に”c:BorlandBcc55bin”を追加する必要

バージョン情報

> >bcc32
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Syntax is: BCC32 [ options ] file[s] * = default; -x- = turn switch x off
 -3 * 80386 Instructions -4 80486 Instructions
 -5 Pentium Instructions -6 Pentium Pro Instructions
 -Ax Disable extensions -B Compile via assembly
 -C Allow nested comments -Dxxx Define macro
 -Exxx Alternate Assembler name -Hxxx Use pre-compiled headers
 -Ixxx Include files directory -K Default char is unsigned
 -Lxxx Libraries directory -M Generate link map
 -N Check stack overflow -Ox Optimizations
 -P Force C++ compile -R Produce browser info
 -RT * Generate RTTI -S Produce assembly output
 -Txxx Set assembler option -Uxxx Undefine macro
 -Vx Virtual table control -X Suppress autodep. output
 -aN Align on N bytes -b * Treat enums as integers
 -c Compile only -d Merge duplicate strings
 -exxx Executable file name -fxx Floating point options
 -gN Stop after N warnings -iN Max. identifier length
 -jN Stop after N errors -k * Standard stack frame
 -lx Set linker option -nxxx Output file directory
 -oxxx Object file name -p Pascal calls
 -tWxxx Create Windows app -u * Underscores on externs
 -v Source level debugging -wxxx Warning control
 -xxxx Exception handling -y Produce line number info
 -zxxx Set segment names

 

Hello World

参考:

  • http://8cmp.blog.fc2.com/blog-entry-40.html -【C言語】 Borland C++Compiler 5.5 日本語版のダウンロード/インストール方法
  • http://www.chem.scphys.kyoto-u.ac.jp/nonnonWWW/ogawara/lecture/borland.html – Borland C++ Compiler 5.5をインストールする

15.Summary

Webアプリケーション作成(コーディング・テスト、デバッグ、仕上げ)、全員発表する

発表課題: オープンデータの取得と利用
使用言語:processing もしくは Java
発表時間:5分程度

課題:

オープンデータの取得と利用

  1. オープンデータの材料選び
  2. オープンデータの取得 (URL)
  3. オープンデータの利用 (processing もしくは Java)
  4. オープンデータ応用のWEB公開 (Google sitesに埋め込み)

ヒント:

これまで演習したプログラムの組み合わせが必要です。

nextbus, java参考例:

import java.util.Calendar;

class busapp{

        public static void main(String args[]){

                String[] data = {
                        "00:00",
                        "8:30",
                        "9:10",
                        "10:00",
                        "11:00",
                        "12:15",
                        "14:15",
                        "15:15",
                        "16:15",
                        "17:15",
                        "18:15",
                        "19:15",
                        "20:15",
                        "23:59"
                };

                Calendar calendar = Calendar.getInstance(); //現在(実行時点)時刻でCalendarのインスタンス生成
                int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);   // 0..23
                int minute = calendar.get(Calendar.MINUTE);      // 0..59

                int cnt = 0;

                for (String value: data) {
                        String[] hhmm = value.split(":");
                        int hh = Integer.parseInt(hhmm[0]);
                        int mm = Integer.parseInt(hhmm[1]);
                        if (hh > hourOfDay || hh == hourOfDay && mm > minute) {
                                System.out.println(hh + ":" + mm + ">" + hourOfDay + ":" + minute);
                                System.out.println("\n");
                                if (++cnt >= 3) break;
                        }

                }
        }
}

nextbus, java実行例:

$ javac api-json-nextbus-sample.java
$ java api-json-nextbus-sample
16:15
17:15
18:15

Processing で作る場合、下記のバスの絵も入れて、よりリアルなアプリができます。

3台のバスを描く(自分で定義した関数を使って)

int h=60; // ボディの高さ、幅の基準
int d=30; // 車輪の直径の基準

void setup() {
  size(400, 400);
  noLoop(); // 繰り返さない
}

void draw() {
  drawBus(200, 200); //中央のバス
  drawBus(100, 100); //左上のバス
  drawBus(300, 300); //右下のバス
}

void drawBus(int x, int y) {
  rectMode(CENTER);
  rect(x, y, h*2, h); // ボディ
  ellipse(x-35, y+h/2, d, d); // 後輪・外側
  ellipse(x+35, y+h/2, d, d); // 前輪・外側
  ellipse(x-35, y+h/2, d-10, d-10); // 後輪・内側
  ellipse(x+35, y+h/2, d-10, d-10); // 前輪・内側
  rectMode(CORNER);
  rect(x+45, y-20, h/4, h/3); // 窓・前
  rect(x-5, y-20, h/2, h/3); // 窓・中
  rect(x-50, y-20, h/2, h/3); // 窓・後
}

14.REST and JSON

REST

RESTは「REpresentational State Transfer」の略で、大まかに言えば、アドレス(URL)とHTTPのメソッド(GETなど)を組み合わせて、サーバー上のデータを操作する仕組みです。

RESTは、Roy Fieldingという方が、2000年に発表した博士論文で提唱されたアーキテクチャスタイルです。Roy FieldingさんはHTTP仕様の策定者の一人であったことから、HTTPはRESTの基準をよく満たしています。

RESTの例として、WordPress JSON REST API (WP API, http://wp-api.org/) あります。それを利用して、Javaなどから最新の記事の取得、記事の投稿、写真の添付などが可能です。

JSON

JSON(ジェイソン、JavaScript Object Notation)は、JavaScriptにおけるオブジェクトの表記法をベースとした軽量なデータ記述言語である。

JSONの紹介
http://www.json.org/json-ja.html

このフォーマットの特徴は、

  1. 名前/値のペアで表記される、連想配列のような構造
  2. カンマで区切られたリスト(配列)のような構造

オブジェクト

オブジェクトは中括弧({ , })で囲み、中の要素は文字列/値で表現します。複数の要素を利用する場合は、カンマで区切り、続けて記述します。

{文字列:値,文字列:値,..文字列:値}

配列

配列は大括弧([ , ])で囲み、中の要素を値の連続(0個以上)で表現します。複数の要素を利用する場合は、カンマで区切り、続けて記述します。

[ 値, 値, ..., 値]

値は以下の7種類です

  • 文字列
  • 数値
  • オブジェクト
  • 配列
  • true
  • false
  • null

文字列は2重引用符(“)で囲まれます。

学バス時刻表の取得

JSONArray json = loadJSONArray("http://busapp.wasedaonline.com/api/getvalue/?tag=20");
JSONObject content = json.getJSONObject(2);
String data = content.getString("post_content");
println(data);

参考

  • http://labo.mamezou.com/special/sp_013/sp_013_001.html — RESTのコンセプトと特徴
  • http://www.agilegroup.co.jp/technote/java-rest-client01.html — JavaでRESTクライアントを作成する【第一回】
  • http://thinkit.co.jp/article/70/1/page/0/1 — JSONってなにもの?
  • http://d.hatena.ne.jp/seinzumtode/20130426/1366934641 — JavaでJSONを使う
  • http://gootara.org/library/2014/04/javaapijsonjdk1618.html — Java SEの標準APIだけでJSONを扱うサンプル(JDK 1.6以降、1.8も対応)

13.Web Application

Webアプリケーション作成に必要な概念を理解する

Web Service

Webサービスとは、大まかにいえば、Webの通信の仕組みを利用して、コンピュータ同士でさまざまなデータをやり取りし、分散処理を行うシステムです。

通信手順の取り決めのことを、「プロトコル」(Protocol)と呼びます。Webの世界では、「HTTP」(HyperText Transfer Protocol)というプロトコルで、通信が行われています。

HTTPは、WebブラウザなどのクライアントがWebサーバーにデータを要求し、それにWebサーバーが答える、という形のプロトコルです。

API

アプリケーションプログラミングインタフェース (API、英: Application Programming Interface) とは、ソフトウェアコンポーネントが互いにやりとりするのに使用するインタフェースの仕様である。APIには、サブルーチン、データ構造、オブジェクトクラス、変数などの仕様が含まれる。

Webサービス大まかに言えば、以下のような流れで処理を進めます。

(1)クライアントからサーバーに対して、HTTPで接続して処理を要求します。
(2)サーバーは処理結果をクライアントに送信します。
(3)クライアントは(2)の結果を受信し、必要に応じて各種の処理を行います。

「HTTPで通信する」上位層に位置するプロトコル

  1. 「XML-RPC」
  2. 「SOAP」(Simple Object Access Protocol)
  3. 「REST」(REpresentational State Transfer) :  REST and JSON

Open Data

open-data

お天気Webサービスの利用

お天気Webサービス(Livedoor Weather Web Service / LWWS)は、現在全国142カ所の今日・明日・あさっての天気予報・予想気温と都道府県の天気概況情報を提供しています。

(例)「福岡県・久留米の天気」を取得する場合

下記URLにアクセスしてJSONデータを取得します。
基本URL + 久留米のID(400040)

学バス時刻表

Javaを利用して、学バスの時刻表取得と処理を行う

2016-09-04 (6)

課題:

オープンデータを利用したWebアプリの作成(1)

  1. オープンデータの選択
    1. 郵便番号検索
    2. 天気予報検索
    3. その他
  2. オープンデータをブラウザで確認

12.Map

Map構造 コレクションクラス

Map構造は、キーと値をセットにしたものを1つの要素として管理するデータ構造です。
HashMap」「TreeMap」の2種類があります。

Map構造

要素がキーと値で管理されているので、キーを指定して値の取得や更新、削除を行います。

Map構造は、キーによって値を管理するためキーの重複は不可です。
(同じキーがセット(put)された場合は上書きされます。)

マップ(HashMap)

HashMap は、名前(キー)と値の組み合わせを要素として持つ配列です。

HashMapは格納順は管理されません。キーと値にnullを使用することが可能です。

HashMap hm = new HashMap();

hm.put("Brian Kernighan","A REGULAR EXPRESSION MATCHER");
hm.put("Karl Fogel","SUBVERSION'S DELTA EDITOR: INTERFACE AS ONTOLOGY");
hm.put("Jon Bentley","THE MOST BEAUTIFUL CODE I NEVER WROTE");
hm.put("Tim Bray","FINDING THINGS");

println("Get a Element > " + hm.get("Brian Kernighan") );
println("Get a Element > " + hm.get("Jon Bentley") );

マップ(TreeMap)

TreeMap も HashMap と同じように使用できます。要素がキーによって自動的にソートされる点が HashMap と異なります。TreeMapはnullは使用することができません。

インタフェイスの活用

さらに便利なことに,コレクションクラスはCollectionMapというインタフェイスを実装しています。Java言語の仕組み上,インタフェイスのオブジェクトにはそのインタフェイスを実装したクラスのオブジェクトへの参照を持たせることができます。

次のスケッチのように,カチッ!カチッ!とコードを切り替えて,ほとんど同じコードで全く別のデータを取り扱えます。これこそコレクションクラスを利用するメリットです。もっと言えば,オブジェクト指向プログラミングのメリットです。

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

HashMap hm = new HashMap();
Map m;
m = hm;
m.put("Brian Kernighan","A REGULAR EXPRESSION MATCHER");
m.put("Karl Fogel","SUBVERSION'S DELTA EDITOR: INTERFACE AS ONTOLOGY");
m.put("Jon Bentley","THE MOST BEAUTIFUL CODE I NEVER WROTE");
m.put("Tim Bray","FINDING THINGS");

HashMap hm2 = new HashMap();
m = hm2;
m.put(1,123);
m.put(2,223);
m.put(3,323);

m = hm;
println("Get a Element from Interface m > " + m.get("Tim Bray") );
m = hm2;
println("Get a Element from Interface m > " + m.get(2) );

m = hm;
Set s = m.keySet();
for(Object o : s){
  println("Element is " + m.get(o) );
}
m = hm2;
s = m.keySet();
for(Object o : s){
  println("Element is " + m.get(o) );
}

演習

(難易度:easy)

MapInterface.pdeのコード末尾にあるforループを切り分けましょう。そして,Mapインタフェイスを実装したクラスであれば何であれ,受け取って要素に格納された値を列挙するメソッドにしてください。ファイル名はUsefulMapInterface.pdeとしてください。

11.List

List構造 コレクションクラス

List構造は、要素を順番付けして管理するデータ構造です。
「ArrayList」「LinkedList」の2種類があります。

List構造

要素がインデックス(番号)順に並んでいるので、番号を指定して要素の取得、挿入、更新、削除ができます。また、Iteratorや拡張for構文を使って先頭から順番に要素を取得することも出来ます。

ArrayListは要素の取得が早いが挿入や削除が遅い、LinkedListは要素の挿入や削除は早いが取得が遅いという特徴があります。
List構造は、要素の重複は可能です。

リスト(ArrayList)

ArrayList は配列を扱う一般的なクラスです。

下記などのメソッドが用意されています。

  • list.add(o) – オブジェクト o を配列の末尾に追加する
  • list.add(n, o) – オブジェクトを n で指定した場所に追加する
  • list.get(n) – n番目の要素を得る
  • list.remove(n) – n番目の要素を削除する
  • list.set(n, o) – n番目の要素をオブジェクト o で置き換える
  • list.size() – 要素の個数を得る
  • list.isEmpty() – 空かどうか調べる
  • list.indexOf(o) – オブジェクト o と等しい要素のインデックスを探す
  • list.contains(o) – オブジェクト o と等しい要素があるか調べる
  • list.addAll(list2) – 配列の末尾に配列 list2 を追加する

ArrayListの使用例

ArrayListUsage.pdeArrayListの使用例

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

String n[] = {"Tim Bray",
              "Brian Kernighan",
              "Jon Bentley",
              "Karl Fogel"};
ArrayList<String> names = new ArrayList(Arrays.asList(n));


//配列と同様の方法,添字で要素にアクセスします。
println("* Access with FOR *");
for(int i = 0; i<names.size(); ++i){
  println(names.get(i));
}

names.add(1,"Eliotte Rusty Harold"); // 2番目位置に要素を挿入します。
names.remove(2); // 3番目の要素を削除します。

//コレクションクラスならではの方法で要素にアクセスします。
println("* Access with ITERATOR *");
Iterator<String> it = names.iterator();
while(it.hasNext()){
  println(it.next());
}

リスト(LinkedList)

LinkedList も ArrayList と同じように使用することができます。挿入や削除を頻繁に行う場合は ArrayList よりも LinkedList の方が高速です。ただし、get() による参照は ArrayList の方が高速です。

リスト(Vector)

Vector クラスも ArrayList や LinkedList と同じように扱うことができますが、パフォーマンスが悪いため、現在ではあまり推奨されていません。

10.String Searching

文字列を検索する – indexOf/lastIndexOfメソッド

文字列に含まれる部分文字列を検索するには、indexOfメソッドを利用します。indexOfメソッドは、指定された部分文字列が最初に登場した位置を、文字列の先頭を0としたインデックス番号で返します。文字列が見つからなかった場合、戻り値は-1となります。
第2引数で、検索開始位置を指定することもできます。

1
2
3
String str = "にわにはにわにわとりがいる";
System.out.println(str.indexOf("にわ"));  // 結果:0
System.out.println(str.indexOf("にわ", 1));   // 結果:4

部分文字列を文字列の末尾から検索するならば、lastIndexOfメソッドを利用してください。

1
System.out.println(str.lastIndexOf("にわ"));  // 結果:6

match() 正規表現を使った検索

 正規表現を使って、文字列(String)を検索します。結果は文字列の配列として返されます。
【構文】
match(str, regexp)
【パラメータ】
str 検索対象の文字列
regexp 検索条件をあらわす正規表現
【戻り値】
String[] (一致する文字がないときはnull)

 次の例は文字列からデータを取り出します。

String t = "本日の気温は28度です";
String[] m = match(t, "([0-9]+)度");	// 「度」の前の数値を取り出す

if(m != null) {
  println("t=" + m[1]);				// 検索結果(m[1])を出力
  println(m[0]);						// 一致した文字全体(m[0])を出力
} else {
  println("不一致");
}

 

参考:

9.Set

Set構造は、要素を順番付けしないで管理するデータ構造です。
「HashSet」「TreeSet」の2種類があります。

Set構造

Listのような順番付けや、Mapのようなキー管理もないため、要素の取得にはIteratorや拡張for構文で取得します。
このようなことからHashSetは要素の取得順は保証されませんが、TreeSetは自動ソートされて管理されるのでソートされた順番で要素が取得されます。
また、HashSetは要素にnullを使用する事が可能ですが、TreeSetはnullを使用する事ができません。
Set構造は、要素の重複は不可です。(同じキーがセット(add)された場合は上書きされます。)

セット(HashSet)

HashSet も配列を扱いますが、要素の重複が許されない、順序の保障が無い点が ArrayList や LinkedList と異なります。要素を参照する際には Iterator を用います。

§HashSetTest.java
import java.util.*;

class HashSetTest {
    public static void main(String[] args) {
        HashSet set = new HashSet();
        set.add("AAA");
        set.add("BBB");
        set.add("CCC");
        set.add("AAA");
        Iterator it = set.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

実行結果は下記のようになります。AAA を 2回 add() していますが、重複要素がひとつにマージされます。結果の順序は add() した順序に関係なくバラバラになります。

C:java>java HashSetTest
CCC
AAA
BBB

下記などのメソッドが用意されています。

  • set.add(o) – オブジェクト o を配列の末尾に追加する
  • set.clear() – 配列をクリアする
  • set.contains(o) – オブジェクト o と等しい要素があるか調べる
  • set.isEmpty() – 空かどうか調べる
  • set.remove(o) – オブジェクト o にマッチする要素を削除する
  • set.size() – 要素の個数を得る

2016-09-04 (4)

セット (TreeSet)

TreeSet も HashSet と同じように使用できます。要素が自動的にソートされる点が HashSet と異なります。

§HashSetTest.java
import java.util.*;

class TreeSetTest {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        set.add("CCC");
        set.add("AAA");
        set.add("BBB");
        set.add("AAA");
        Iterator it = set.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

C:java>java TreeSetTest
AAA
BBB
CCC

2016-09-04 (3)