ぼんさい塾

ぼんさいノートと補遺に関する素材や注釈です.ミスが多いので初稿から1週間を経た重要な修正のみ最終更新日を残しています.

Cから見たC++ (5)

2010-10-19 18:24:41 | 暮らし
記事一覧(Cの文法(1)~(17),他)
まず覚えるCの文法(progC.pdf)

Ex1-1.cpp: 解答例
//-------------------------------------
#include <iostream.h>
double pi=3.141592653589793;
int main(void){
  double r;
  cout << "r="; cin >> r;
  cout << "S=" << pi*r*r << "\n";
  return 0;
}
//-------------------------------------

P25.cpp: 宣言文
//-------------------------------------
#include <iostream.h>
int main(void){
  int k=1;
  for(int i=1; i<10; i++){k=k*i;}
  cout << "k=" << k;
  return 0;
}
//-------------------------------------

P41.cpp: 関数の定義と呼び出し
//-------------------------------------
#include <iostream.h>
int sum(int i, int k){
  return i+k;
}
void add(int &i, int k){
  i=i+k; return;
}
int main(void){
  int k=3;
  cout << "sum(k, 2)==" 
       << sum(k, 2) << "\n";
  k=sum(3, k+4);
  cout << "k==" << k << "\n";
  add(k, 5);
  cout << "k==" << k << "\n";
  return 0;
}
//-------------------------------------

=================================================
4. その他

クラスと多重定義以外のCとC++の主な違いを「Cの
文法」を参照しながら説明します.

・「Cの文法」で単に「P41:」のように表わしてした
  プログラムを「P41.c」で参照します.
・「//」から行末までをコメントにするのは C++ の
  記法で,Cではエラーになります.

C++では画面への出力は ostream 型のオブジェクト
cout へのストリームとして,キーボードからの入力
は istream 型のオブジェクト cin へのストリーム
として扱います.これらを使うには iostream.h を
include する必要があります.

・「cout << "k=" << k;」は
    (cout.operator<<("k=")).operator<<(k);
  を意味します.演算子オーバーロードはCの演算子
  の優先度と結合規則は変わらないので,「<<」よ
  り優先度が低い演算子を含む式には注意しましょう.

宣言文の前に実行文を書いてはいけないというのはC
のときで,C++では P25.cpp もエラーになりません.

・宣言文が有効になるのは宣言以降の部分です.

C++では関数の引数を「参照渡し」にして,変数の値
を直接変更できます.参照渡しを指定するには,仮引
数の先頭にアドレス演算子「&」を付けます.

・P41.cpp の「add(k, 5);」は「k=k+5;」と同じです.
・「int m[2];」で宣言して「add(*(m+7), 5);」を実
  行してもエラーになりません.

[4-1] 第29章 入出力ストリーム①
[4-2] 第30章 入出力ストリーム②
[4-3] 第15章 参照
[4-4] 引数 - Wikipedia

イベント駆動

2010-10-15 16:32:33 | 暮らし
記事一覧

「Cから見たC++」で予定していた「4.イベント駆動」(とこれを想定していた「5.テンプレート」)は適当なサンプルを作れなかったので「4.その他」に入れます.イベント駆動は数値計算や「アルゴリズムとデータ構造」流のプログラムとはプログラミング・パラダイムが異なりますが,不自然な例で力んで説明する必要はないような気がしてきました --- 多態性も 「おまけ(無視してよい)」 としたレベルでのバランスです.

これに関連した「イベント駆動 C++」等の Google 検索では

[1] イベント駆動型プログラミング - Wikipedia
    http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E9%A7%86%E5%8B%95%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0  
[2] 高速なイベント駆動IOライブラリ mpio - 古橋貞之の日記
    http://d.hatena.ne.jp/viver/20080205/p1
[3] イベント・ドリブンな組み込み系 ソフトウェアの設計とプログラミング
    http://www.cqpub.co.jp/hanbai/books/37/37371/37371_7syo.pdf
[4] もう一度基礎からC言語 第38回 プログラミングの周辺事項(1)~Cで書い ...
    http://www.grapecity.com/japan/powernews/column/clang/038/page02.htm
[5] Visual C++ の初歩(No.2)
    http://sakura.bb-west.ne.jp/spr/damayan/vc/visualc2.htm

等が見つかりました.上図は

[6] Borland Delphi for Windows,コンポーネント開発者ガイド (ソフトウェア付属資料)

の目次の一部です.年配の先生が指導者である学生諸君は研究室にボーランド社のC/C++,Delphi に関する資料があるかもしれません.1980年代後半から1990年代にかけて発行されたボーランド社の資料はプログラマのバイブルといえるほど充実しています.「Turbo Vision for C++, User's Guide」は MS-DOS 用のソフトの付属資料ですがその内容は今でも参考になります.例えば,第1部 第5章に「イベント駆動型プログラミング」.

[7] ボーランド - Wikipedia
    http://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89

補足: (ユーザから見た素朴な意味での)イベント駆動自体は構造化やオブジェクト指向とは関係ありません.電話機ごとの独立した要求を実時間で処理する電子交換機の呼処理プログラムは(広義の?)イベント駆動の典型ですが,1960年代はアセンブリ言語で書かれています.
蛇足: 1970年代に電話機の加入者回路LSI化の方式設計に従事し,「i8080A」のプログラムを「i1702A」に書き込んで「Intellec 8」を“私設交換機もどき”として使いました. --- 「」の説明はGoogle 検索で見つかります.Intellec 8 の youtube 画像も見ました.内外とも懐古趣味の暇な方が多いようで,各位に感謝しています.


Cから見たC++ (4)

2010-10-13 21:01:49 | 暮らし
記事一覧(Cの文法(1)~(17),他)
まず覚えるCの文法(progC.pdf)

P3.h: 複素数のクラス
//-------------------------------------
#include <stdio.h>
class complex{
private:
  double re, im;
public:
  complex(double x){re=x; im=0;}
  complex(double, double);
  void show(void);
  void load(complex);
  complex add(complex);
  complex mult(complex);
  void operator=(complex);
  complex operator+(complex);
  complex operator*(complex);
};
complex::complex(double x, double y){
  re=x; im=y;
}
void complex::show(void){
  printf("re=%f, im=%f\n", re, im);
}
void complex::load(complex z){
  re=z.re; im=z.im;
}
complex complex::add(complex z){
  return complex(re+z.re, im+z.im);
}
complex complex::mult(complex z){
  return complex(re*z.re-im*z.im,
                 re*z.im+im*z.re);
}
void complex::operator=(complex z){
  load(z);
}
complex complex::operator+(complex z){
  return add(z);
}
complex complex::operator*(complex z){
  return mult(z);
}
//-------------------------------------

=================================================
3. 多重定義

C++ では引数の数や型が異なれば異なる関数に同じ名
前を使う(多重に定義する)ことができます[3-1].さ
らに 予約語の operator を使って,演算子の記号も多
重定義できるのです[3-2].P3.h では コンストラクタ
complex() を多重定義し,演算子「=」「+」「*」の意
味も複素数の演算用に定義しなおしています.

・文法の理解が目的なので,減算・除算は省略します.
・加算,乗算は処理中の複素数と引数の複素数の演算で
  す.一般に処理中のオブジェクトはポインタ this で
  参照でき,「re+z.re」は「this->re+z.re」を意味し
  ています.
・C++ では struct もクラスのように使えます[3-3].

P3.cpp: 使用例
//-------------------------------------
#include "P3.h"
int main(void){
  complex z1(1, 2), z2(3, -4), z(0);
  z.load(z1.add(z2)); z.show();
  z.load(z1.mult(z2)); z.show();
  z=z1+z2; z.show();
  z=z1*z2; z.show();
  return 0;
}
//-------------------------------------

P3.cpp の「z.load(z1.add(z2));」は「z=z1+z2;」と
同じです.後者の方がずいぶん見やすいですね.

・演算子の優先順位は本来のものと同じです.このこ
  とを「z=z1*z1+z2*z2;」で確かめてください.
    z.re==-10 //(1-4)+(9-16)
    z.im==-20 //(2+2)+(-12-12)
  になっているはずです.

[3-1] オーバーロードとオーバーライド
[3-2] オペレータ(演算子)のオーバーロード
[3-3] C++構造体