C# exercises (f) Summary

C# 演習前期のまとめ

C#プログラムは「入れ子構造」をしている

csharp_struct

ボタンクリックでメッセージボックス に表示完成したコード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace test1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // ボタンクリックでメッセージボックスに表示
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello world");
        }
    }
}
*注意:( ” “) ; は全角(漢字)にしてはいけません。全角(漢字)の文章を入れた場合、かならず半角に戻して入力しましょう。

 

●using

usingキーワードは,プログラムの処理の流れには直接関係ありません。その代わり,プログラム全体にわたってどのライブラリを利用するかを明確にする役割があります。

前回触れたように,C#では基盤にある「 .NET Framework」のライブラリを利用してアプリケーションを作ります。.NET Frameworkでは,ライブラリの各機能を処理内容ごとにツリー状のグループに分類して管理します。ちょうど,パソコンでファイルを管理するときに目的別のフォルダを用意して分類・整理しておくのと似た状態を想像すればいいでしょう。フォルダに相当するグループを .NET Frameworkのライブラリでは「名前空間」と呼びます。

●名前空間(namespace)

usingの次に出てくるnamespaceは,それに続くブロックが所属する名前空間を指定するキーワードです。usingのところで,標準ライブラリがSystem以下の名前空間に属していることを説明しましたが,自分で作るプログラムも必ずどこかの名前空間に所属させます。

●class

classは,C#プログラムを構成する最小単位である「クラス」を定義するキーワードです。必ずnamespaceのブロック内に書かれます。C#プログラムの大部分はこのようなクラス定義の集まりです。

●メソッド(method)

メソッドはクラス内で実行される具体的な処理を一つにまとめて名前を付けたものです。メソッドはクラス定義ブロックの中にいくつでも作れます。メソッドの中でほかのメソッドを呼び出したり,ほかのクラスを利用するといったことも可能です。ただ,Mainという名前のメソッドには特別な役割があります。プログラムを起動したときには自動的にMainメソッドが実行されるのです。

●//(コメント)

この構文だけはほかとは異質で,実はC#プログラムに不可欠な要素ではありません。//と書かれた個所から改行までの部分はプログラムの処理の流れからは一切無視されます。つまり,この//以降を削除してしまってもプログラムは全く同じように動作します。

この一見ムダな行は,プログラム内に動作などをメモしておくプログラマ向けの注釈文です。プログラム内での処理という点では全くムダですが,実際のプログラミングでは読みやすい注釈を記述することがプログラミングの重要なテクニックです。例えば,思った通りにプログラムが動かずにミスを探す場合などは,わかりやすいコメントがついているかどうかでミス発見までの作業の効率が大きく変わってきます。あるいは他人の作ったプログラムや過去に自分が作ったプログラムを見る場合,処理だけが書かれているのと,適切なコメントがあるのとでは理解のしやすさが大きく違います。

期末レポート:

A4 2枚以上、eメールで提出する。

  • 提出先:h.chen@ueno.daiichi-koudai.ac.jp
  • タイトル:C#期末レポート (学籍番号)
  • 提出する期限:2016/7/29
  1. C#プログラミング関連名詞の意味を説明する
    1. イベントドリブン
    2. ツールボックス
    3. コントロール
    4. イベント
    5. メソッド
    6. プロパティ
  2. Webプログラミング関連名詞の意味を説明する
    1. API
    2. REST
    3. JSON
    4. Open Data
  3. 学内Proxyを通して、Webデータ取得する方法を説明する
    1. 画面デザイン
    2. プログラム
  4. オープンデータを利用したWebアプリの作成
    1.  オープンデータの好みのどれかを選択
      1.   – 郵便番号検索
      2.   – 天気予報検索
      3.   – その他  「LinkData.org」から探す
    2. オープンデータをブラウザで確認
      1. ブラウザ画面
    3. C#を使って、オープンデータWebアプリの作成
      1. 画面デザイン
      2. プログラム

参考:

 

 

C# exercises (e) Open Data

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

オープンデータとは

オープンデータOpen Data)とは、特定のデータが、一切の著作権、特許などの制御メカニズムの制限なしで、全ての人が望むように利用・再掲載できるような形で入手できるべきであるというアイデアである。

オープンデータの利用

LinkData.org」には、誰でも無償で利用でき、商用利用も可能なオープンデータが豊富にまとまっています。
都道府県別で探したり、人気ランキングやキーワードを指定しての検索もできるので、自分が興味のあるデータを探すのも簡単でしょう。

LinkDataのサイト内には、全国の「お城データ」や「道の駅データ」、「避難所データ」、「補助金まとめデータ」、「さくら名所データ」…など、意外とユニークで面白いデータがまとまっているので、うまく利用すれば楽しいWebアプリが作れそうです。

「ダウンロード」の項目下に、「その他の形式のAPIリストを表示」というリンクがあるのでクリックします。

すると、外部APIとしてデータが取得できるURLが一覧表示されます。

そこで「JSON」形式のURLをコピーして、実際にブラウザのアドレスバーに入力してみましょう!

あとは、このデータをC#を使って、自分のWebアプリに組み込めば良い。

グループ課題

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

  1. オープンデータの選択
    1. 郵便番号検索
    2. 天気予報検索
    3. その他
  2. オープンデータをブラウザで確認
  3. C#を使って、オープンデータWebアプリの作成

C# exercises (d) REST & JSON

Visual Studio community 2015 アカウントについて (学内専用)

  1. WebBrowser (基本)
  2. Form(自動操作)
  3. HttpClient
  4. REST & JSON ←今週

RESTとは

RESTとは、RESTはREpresentational State Transferの略。2000年にRoy Fielding氏が提唱した、分散システムにおいて複数のソフトウェアを連携させるのに適した設計原則の集合。また、狭義には、それをWebに適用したソフトウェアの設計様式のこと。一般には後者の意味で用いられることがほとんどである。RESTの世界では、ネットワーク上のコンテンツ(リソース)を一意なURLで表すのが基本。各リソース(URL)に対してGET,POST,PUT,DELETEでリクエストを送信しレスポンスをXMLやjsonなどで受け取る形式(レスポンスのフォーマット形式は指定されていない)。

REST APIをを作る前に先人はどのような設計をしていたのかを見てみましょう。今ではTwitterやfacebook,Github、Amazonなど大きいところではだいたいAPIを提供しているので、お手本は山ほどあります。URL設計やリクエスト・レスポンス、HTTPヘッダなどに着目して見比べてみましょう。

Twitter REST API
レスポンスの情報量が多いので、どういった情報を返すべきか参考になります。
Github API
一番綺麗にまとまっているAPIだと思います。リクエスト・レスポンスがRESTらしく、とても綺麗。

JSONとは

JSONとは、JavaScriptにおけるオブジェクトの表記法を応用したデータ形式。 JSONで表記されたデータは、JavaScript上ではコードとして実行するだけで読み込みが完了する。JSONでは、データ全体を配列またはJavaScriptにおけるオブジェクト(キーと値のペアを列挙した構造体)として記述する。

JSONというのは「データを表現するための記法(≒文法)」です。シンプルなデータであれば、文法など気にせずにただ書けば問題ありません。少々複雑でも、我々は「表」という記法をしっているため、ある程度の複雑さには対応できます。しかし、表で表すのが困難な程度の複雑な構造を持つデータを表現しなければならないことは多々あります。このように、表形式では表現が困難な構造のデータを、人間に対するある程度の可読性を残しつつ、コンピュータに対しても伝達できるような記法、その1つがJSONです。そしてJSON形式で記述したデータのことを、JSON-textといいます。

chenlabのメンバーをJSON-textで表現

{
“name”   : “chenlab”,
“member3” : [ “14TE485”, “14TE406”, “14TE410”, “14TE449” , “14TE461″”, “14TE465″”, “14TE470”],
“member4” : [ “13TE466”, “13TE477”, “13TE486”, “13TE520” , “12TE412″”, “13TE457″”, “13TE405”],
“count”  : 4
}

 

C#でJSON

Newtonsoft.Jsonのインストール

C#でJSON扱うときは、いくつ方法があり、ここはNewtonsoft.Jsonののライブラリを使う。

NuGetパッケージ管理を開く

nuget

Newtonsoft.Jsonを選択して、インストールしてください。

2016-07-14

 

JSONデータサンプル

http://wp-api.xyz/wp-json/posts

先週のプログラムでサンプルデータを取得するように変更してください。

ダウンロード:web_get2 (2)

JSONをクラスとして貼り付け

JSONのデータ構造をC#のクラス定義に変換する。

取得したサンプルデータをコピーして、メニューの「JSONをクラスとして貼り付け」で、プログラムのnamespaceの最後部に貼り付けください。

jsonpaste

JSONプログラミング

16 行に下記の分を入れえてください

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Linq;

デザイン画面に、「button1」ボタンと、「listBox1」リストボックスを追加してください。

デザインのbutton1をダブルクリックし、DeserializeObject処理を入れてください。

private void button1_Click(object sender, EventArgs e)
{
    var json = HTTP_Results.Text;
    var posts = JsonConvert.DeserializeObject<Class1[]>(json);
    foreach(Class1 post in posts)
    {
        listBox1.Items.Add(post.ID);
    }
    // string saveJson = JsonConvert.SerializeObject(posts, Formatting.Indented);

}

実行画面

これて、Jsonデータ(ブログの投稿)の取得、Deserialize、そして(ブログID)表示ができた。

スクリーンショット 2016-07-15 11.35.51

最終プログラム構造

  • Namespace web_get2
    • Class Form1 : Form
      • Form1
      • Quit_Click
      • Request_Click
      • button1_Click
    • Class Rootobject (JSON データ構造)
    • Class Meta (JSON データ構造)
    • Class Links (JSON データ構造)
    • Class Terms (JSON データ構造)
    • 。。。

最終プログラム

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
// for httpclient
using System.Net.Http;
using System.Net;
using System.IO;
using System.Runtime.Serialization;
// using System.Runtime.Serialization.Json;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Linq;

namespace web_get2
{


    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Quit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private async void Request_Click(object sender, EventArgs e)
        {
            if (ProxyOn.Checked)
            {
                // デフォルト プロキシ情報を取得して、資格情報を設定する 
                var proxy = WebRequest.DefaultWebProxy;
                proxy.Credentials = new NetworkCredential(ProxyID.Text, ProxyPW.Text);
            }
            var client = new HttpClient();
            string response = await client.GetStringAsync(URL.Text);
            HTTP_Results.Text = response;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            var json = HTTP_Results.Text;
            var posts = JsonConvert.DeserializeObject<Class1[]>(json);
            foreach (Class1 post in posts)
            {
                listBox1.Items.Add(post.ID);
            }
            // string saveJson = JsonConvert.SerializeObject(posts, Formatting.Indented);
        }
    }


    public class Rootobject
    {
        public Class1[] Property1 { get; set; }
    }

    public class Class1
    {
        public int ID { get; set; }
        public string title { get; set; }
        public string status { get; set; }
        public string type { get; set; }
        public object author { get; set; }
        public string content { get; set; }
        public object parent { get; set; }
        public string link { get; set; }
        public DateTime date { get; set; }
        public DateTime modified { get; set; }
        public string format { get; set; }
        public string slug { get; set; }
        public string guid { get; set; }
        public string excerpt { get; set; }
        public int menu_order { get; set; }
        public string comment_status { get; set; }
        public string ping_status { get; set; }
        public bool sticky { get; set; }
        public string date_tz { get; set; }
        public DateTime date_gmt { get; set; }
        public string modified_tz { get; set; }
        public DateTime modified_gmt { get; set; }
        public Meta meta { get; set; }
        public object featured_image { get; set; }
        public Terms terms { get; set; }
    }

    public class Meta
    {
        public Links links { get; set; }
    }

    public class Links
    {
        public string self { get; set; }
        public string author { get; set; }
        public string collection { get; set; }
        public string replies { get; set; }
        public string versionhistory { get; set; }
    }

    public class Terms
    {
        public Category[] category { get; set; }
    }

    public class Category
    {
        public int ID { get; set; }
        public string name { get; set; }
        public string slug { get; set; }
        public string description { get; set; }
        public string taxonomy { get; set; }
        public object parent { get; set; }
        public int count { get; set; }
        public string link { get; set; }
        public Meta1 meta { get; set; }
    }

    public class Meta1
    {
        public Links1 links { get; set; }
    }

    public class Links1
    {
        public string collection { get; set; }
        public string self { get; set; }
    }
}

 

C# exercises (c) Web3 HttpClient

Visual Studio community 2015 アカウントについて (学内専用)

  1. WebBrowser (基本)
  2. Form(自動操作)
  3. HttpClient ←今週
  4. REST & JSON

いままで、WebBrowser コントロールを利用して、 Webサイトを表示と操作プログラムを作りました。

今回は直接 http 通信に HttpClient クラスを使用 するプログラムを作ります。

HTTPとは

httpとは、代表的な通信プロトコルの一つで、インターネット上でWebサーバー(サイトの公開側)と、クライアント(ブラウザ:サイトを閲覧する側)が、相互に通信するために使用される仕組みです。

もっと言うと、Webサーバーとクライアント間で、HTML(Webページを作成するための言語)で記載された情報をやりとりするための仕組みです。

この「http」がないと、インターネット上のサイトを見ることができなくなるので、今や無くてはならない仕組みとなります。

r10zu01-2

HTTPコマンド

主なHTTPコマンドには次のようなものがあります。

GET 指定したページの取得を要求します。
HEAD メッセージヘッダを要求します。
POST フォームに入力したデータを送る
PUT サーバーへデータをアップロードする
DELETE サーバー上のデータを削除する

 

HTTPコマンド応答メッセージ

主な応答メッセージには、次のようなものがあります。

200 OK 正常に取得できた
301 恒久的に移転した
302 一時的に移転した
403 Forbidden アクセス拒否
404 Not Found ファイルが見つからない

 

HttpClient 通信プログラム

デザイン

web_get

 

  • Form
    • Form1
  • TextBox
    • textBox1  —
      • Name : URL
      • Text : http://wp-api.xyz
    • textBox2  —
      • Name :  ProxyID
      • Text : (your_proxy_id)
    • textBox3  —
      • Name :  ProxyPW
      • PasswordChar : *
      • Text : (your_proxy_password)
    • textBox4  —
      • Name : HTTP_Results
      • Multiline : True
  • Button
    • button1 —
      • Name : Quit
    • button2 —
      • Name : Request
  • CheckBox
    • checkBox1 —
      • Name : ProxyOn

 

プログラム

HttpClient クラス

// for httpclient
using System.Net.Http;
using System.Net;
using System.IO;
using System.Runtime.Serialization;
// using System.Runtime.Serialization.Json;

Quit ボタン

        private void Quit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

Requestボタン

private async void Request_Click(object sender, EventArgs e)
{
    if (ProxyOn.Checked)
    {
        // デフォルト プロキシ情報を取得して、資格情報を設定する 
        var proxy = WebRequest.DefaultWebProxy;
        proxy.Credentials = new NetworkCredential(ProxyID.Text, ProxyPW.Text);
    }
    var client = new HttpClient();
    string response = await client.GetStringAsync(URL.Text);
    HTTP_Results.Text = response;

}

最終プログラム:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
// for httpclient
using System.Net.Http;
using System.Net;
using System.IO;
using System.Runtime.Serialization;
// using System.Runtime.Serialization.Json;


namespace web_get2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Quit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private async void Request_Click(object sender, EventArgs e)
        {
            if (ProxyOn.Checked)
            {
                // デフォルト プロキシ情報を取得して、資格情報を設定する 
                var proxy = WebRequest.DefaultWebProxy;
                proxy.Credentials = new NetworkCredential(ProxyID.Text, ProxyPW.Text);
            }
            var client = new HttpClient();
            string response = await client.GetStringAsync(URL.Text);
            HTTP_Results.Text = response;

        }
    }
}

実行結果

web_get2

 

C programming (d) break & continue

break文

switch文のところでbreakというのが何回も登場しました。
switch文での意味は「switch文から抜け出す」という意味でしたね。
breakはswitch文以外にもfor文やwhile文のループの中でも使うことが出来ます。
この時もbreakは「for文やwhile文のループから抜け出す」という意味を持っています。

break文を使って抜けられるのはループひとつだけです。ですから、二重、三重のループを抜けるには、その度にbreak文を使うようになります。

continue文

continueはfor文やwhile文などのループ処理をスキップさせるに用います。
breakとは違い、continueはスキップした後は、ループの先頭に戻ります

#include	<stdio.h>

int main(void)
{
  int i = 1, n, sum;
 
  sum = 0;
  while (i <= 5) {
    printf("正の整数を入力 : ");
    scanf("%d", &n);
    if (n < 0)
      continue;
    sum = sum + n;
    i++;
  }
  printf("sum = %d\n", sum);
  
  return 0;
}

 

無限ループ

while(1)とすると、基本的に処理は無限に繰り返されます。これは、条件式が偽の場合は、0、真の場合はそれ以外の値をとることを利用した方法で、無限に繰り返されます。 ただ、こういった無限ループでも、break(ブレイク)があると、ループから出ることができます。

電卓のプログラムで無限ループで、繰り返し計算を行います。

#include <stdio.h>
main()
{
    double  a, b, ans;
    char    op;

    printf( "加減乗除(+,-,*,/)ができます。指定例:2+5、終了時はq\n" );
    while( 1 ) {
        printf( "ready : " );
        if( scanf( "%lf %c %lf", &a, &op, &b ) != 3 ) break;
        switch( op ) {
        case '+': ans = a + b; break;
        case '-': ans = a - b; break;
        case '*': ans = a * b; break;
        case '/': if( b == 0.0 ) {
                     printf( "Error!(ゼロでの割算はできません)\n" );
                     continue;
                  }
                  ans = a / b; break;
        default:  printf( "Error!(演算記号の指定が誤りです)\n" );
                  continue;
        }
        printf( "--> %g\n", ans );
    }
    printf( ".... Power OFF\n" );
}

 

多重ループ

九九の計算結果を表示するプログラム

#include <stdio.h>

int main(void)
{
  int i, j;
  
  for (i = 1; i <= 9; i++) {
    for (j = 1; j <= 9; j++) {
      printf(" %2d", i * j);
    }
    printf("\n");
  }
  return 0;
}

forループの2重ループを使っています。
最初のループでiが1の時はその下のforループで、
jが1から9まで増加させながら、その1の値と掛け合わせた結果を表示しています。
つまり九九の計算結果となるわけです。
二つ目のforループが終わると、printfで改行コードを出力してるので、
ちょうど9個結果を横に表示した後に次のループに入ることになり、
綺麗に九九の表が表示されるというわけです。

計算結果の間にスペースがあるのは一つ目のprintfで%2dの前にスペースが入っているからです。

ミニテスト

http://lmspress.net/courses/c-programming-i/

演習(p101)

  1.  演習4-24 (A, B クラス)
    — List(4-18)、List(4-19)p99 を参考してください。
  2. 演習4-25 (C, D クラス)

C exercises(d) Scope and Storage class

変数の通用範囲

自動変数のことを局所変数、外部変数のことをグローバル変数(大域変数)ともいいます。

変数のスコープの範囲を図で表してみます。

c_09_03

赤色で囲った部分がグローバル変数の有効範囲です。
青色で囲った部分がローカル変数の有効範囲です。

この図ではローカル変数の寿命を関数内と説明しましたが、正確にはブロック内です。
ブロックとは、{}で囲まれている範囲のことを指しています。

記憶クラス

Cで扱う記憶領域は一般に、プログラム領域、静的領域、スタック領域、ヒープ領域の 4つに大別されます。

記憶クラスには、4つあり、自動、静的、外部、レジスタがあります。

記憶クラス 記憶領域 スコープ 記憶クラス指定子
自動変数 スタック { } の内側 auto( 不要 )
静的変数 静的領域 { } の内側* static
外部変数 静的領域 全域 extern**
レジスタ変数 レジスタまたはスタック { } の内側 register
  • * { }の外側で宣言された時は、その行以降
  • ** 他のファイルにある時、externを付け、その変数を宣言(メモリを確保)しているファイルでは何も付けない。

自動変数は使う前に何らかの値を代入します。このことを、初期化するといいます。

静的変数は初期化の式がなくても、コンパイル時に0に初期化されます。

変数の名前

変数は名前を付けなければ、使えません。C言語では、名前(識別子)は、英字または’_’(アンダースコア)で始まり、英数字または’_’が0個以上続くという決まりになっています。’_’一つまたは二つで始まる変数は、システムに密着したデータに使います。例えば、コンパイラのプログラム等で使われます。

変数に名前を付ける時、外部変数は定義されている所から遠い所でも使われるので、その変数の用途を想像できるような名にすることが推奨されています。

    例:timetable, itemindex, thisyear

自動変数は通用範囲が狭いので、何の変数かがすぐわかるので、タイピングの手間を省く意味でも、短くて良いとされています。

    例:i, j, m, x, c

その場合でも、その変数がなんであるかを、瞬時に連想できるものが良いとされています。例えば、整数ならば、i、j、k、n、浮動小数点数ならば、x、y、z、文字ならば、cなどです。

#include <stdio.h>

void Func(void);        /* プロトタイプ宣言 */
void main(void);

/* 静的変数 i と自動変数 j の値を表示する */
void Func(void)
{                       /* i の値を読み書きできるのはこの関数の中でだけ */
                        /* i はずっと存在し続け、 */
        static int i;   /* func(  ) が呼ばれる度に1増える */

        auto int j;     /* 自動変数は初期化しないと */
                        /* ゴミの値が入っている */
                        /* j はゴミの値が表示される */
                        /* 幾つになるかはわからない */
                        /* auto は付けなくてもよい */
                        /* というより、普通は付けない */

        printf("i = %d  j = %d\n", i, j);        /* i, j の値を表示 */
        i++;        /* 値を1増やす */
        j++;        /* 値を1増やす */
}                   /* 関数を抜けたこの時点で、j は破壊される */

void main(void)
{

        Func(  );        /* 呼び出す度に i の値は 1 増える */
        Func(  );
        Func(  );
}

 演習

渡された引数の最大値を返す関数を作成してください。(教科書p299)

ヒント: