第一章 C++の概要

第一章で従来のC++と標準C++の違いが書いてあった。昔Hello, world!が動かなかったのって、古いコンパイラで標準C++の描き方していたんじゃないかという疑いが出てきた。あるいはcstdio.hを呼び出しつつcoutで出力しようとしていたとか。
メモ

標準ライブラリの名前空間

using namespace std

標準入出力

cout << expression << expression ... 
cin >> expression >> expression ...

<<や>>でいくらでもつなげられる。でも << も >>もめんどい。 末尾に自動で改行を入れてくれる関数が欲しい……。

int a,b;
cin >> a >> b;

は入力が

10 15

でも

10
15

でもa = 10,b = 15になる。あと入力は行バッファが使われているので、標準入力から一文字ずつ読み込むプログラムでも、[Enter]が入力されてはじめて処理される。

クラス

class class-name{
//非公開関数、変数
public:
//公開関数、変数
}

type class-name::func-name(param-list){
//関数の本体
}

関数の本体をクラスの宣言と別に書くのが変な感じがする。でも第二章よむと、宣言と一緒に本体を書くと自動インライン関数になるらしい。::はスコープ解決子だって。
練習問題1.5.3の循環キューを作ってみた。

#include <iostream>
#define SIZE 10

using namespace std;

class cyclic_que{
    int que[SIZE];
    int head;
    int tail;
    int length;
public:
    cyclic_que();
    void push(int i);
    int pop();
};

cyclic_que::cyclic_que(){
    length = 0;
    head = 0;
    tail = 0;
}

void cyclic_que::push(int i){
    if (length == SIZE) {
        cout << "キューが一杯です\n";
        return ;
    }
    que[head] = i;
    if (head == SIZE - 1){
        head = 0;
    } else {
        head++;
    }
    length++;
    return;
}

int cyclic_que::pop() {
    int r;
    if (length == 0) {
        cout << "キューは空です\n";
        return 0;
    }
    r = que[tail];
    if (tail == SIZE - 1){
        tail = 0;
    } else {
        tail++;
    }
    length--;
    return r;
}

SIZEが定数で宣言されているのが、いかにも気持ち悪いです。あと適切な変数名を付けるのがやっぱり苦手。

Cとの違い

  • プロトタイプ宣言が必須
  • 関数の仮引数にvoidを入れる必要がない
  • 戻り値の方を宣言している場合は、絶対返さないとダメ。

Intを返す関数だけど、場合によっては返せるIntが無い場合はどうするんだろう。空のStackをpopした場合とか。

C++に手を付けてみる。

何の言語勉強しようと思ったけど、色々考えた結果、C++にしようときめた。「独習C++」購入。
C++は昔ちょっと勉強してみようと本を買ってみたけど、本の通りにHello, world!プログラムを入力したら何故か動かず、ふてくされて以来一度も手を付けなかった。
せっかくの機会なので雪辱をはらしたい。

javac言語は昔少しやったことがあるから、少しは楽ではないかとも思ってる。やったことあるの勉強し直せという話もあるけど、せっかくなので新しいのに手を付けたい。

CtrlとCapsの入れ替えが上手くいかない

ホストOSがWindows、仮想化ソフトがVmware Player2.5.1、ゲストOSがUbuntu 8.04 Japaneseで、Ubuntu上でCtrlとCapsを入れ替えようと思ったけど、上手くいかなかった。
試したこと

[システム]→[設定]→[キーボード]→[レイアウト]→[レイアウトのオプション]→[Ctrlキーの位置]で変更 → ×

どの選択肢を選んでも、CapsがControlの動作をしてくれない。

/etc/X11/xorg.confに「XkbOptions "ctrl:swapcaps」を追加 → ×

特に反応無し

xmodmapで変更 →  ×

ネットを参照したのをそのまま使っても上手くいかないので、色々弄った結果xmodmapの出力が

xmodmap:  up to 3 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x25)
control     Control_L (0x42),  Control_R (0x6d)
mod1        Alt_L (0x40),  Alt_R (0x71),  Meta_L (0x9c)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x7f),  Hyper_L (0x80)
mod5        Mode_switch (0x5d),  ISO_Level3_Shift (0x7c)

で、xevでCapsキーをおしたときの出力が

KeyRelease event, serial 30, synthetic NO, window 0x3600001,
    root 0x40, subw 0x0, time 2693717, (362,-281), root:(419,217),
    state 0x14, keycode 66 (keysym 0xffe3, Control_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

となったので、いけるかと思ったんだけど、やっぱりCtrlキーの動作をしてくれない。逆にCtrlキーはCapsの動作をするので、左側にCtrlキーがなくなるという悪夢のような状況になる。
ちなみにxmodmapで実行した設定は

remove lock = Eisu_toggle
remove control = Control_L
keycode 37 = Caps_Lock
keycode 66 = Control_L
add lock = Caps_Lock

Vmware関係の問題かなあとも思ったけど、探してそれらしい情報が見あたらない。ホストOSがLinuxMacの時はVmwarePlayer上でキーを変更できるようだけど、ホストOSがWindowsの時はどうすればいいのかよく分からない。

とりあえず、上手いこといかないのであきらめる。

久々にプログラム:環境準備

昔学校でやって以来。友達の話を聞いていたらまたちょっとやりたくなった。

メインで使っているWindowsにプログラミング環境を構築するのも面倒な気がしたので、Vmware playerをインストールしてみる。UbuntuVmware用イメージを http://www.ubuntulinux.jp/products/JA-Localized/vmware からUbuntu 8.04 LTSをダウンロードして解凍したらすぐ使えた。死ぬほど簡単だった。Vmware toolsも最初から入っているし、楽ちん楽ちん。

UbuntuOpera

とりあえず、Operaをインストールしようと思って、Ubuntu 8.10用のOperaをダウンロードしてインストールしようとしたら、失敗。よく分からないので、アップデート・マネージャで必要なアップデートを全部やってから再度試したら上手くいった。
インストールの場所が勝手に決められるのが、何となく慣れないなあ。どこから起動するのかと思ったけど、「アプリケーション」の「インターネット」に登録されていた。うーんOSの知識を得ないとキツイかも。

Operaを起動したらフォントが化けまくっていたので、友達に聞いてフォントを設定する。その際
Enable Core X Fonts
Enable Xft Fonts
を両方Disableにしたら、Operaが起動しなくなった!! コンソールから起動するとSegmentation faultとしかでなくて、全く原因が分からない。とりあえず、~/.operaを削除したら、また起動するようになったので、上記の設定が不味いらしい。
よく分からないけど、Vmwareで動かしていることをさっ引いてもOperaが死ぬほど遅いので、使うことはなさそう。Windows上でブラウジングすればいいし。

Ubuntuのフォルダ名

デスクトップとか、ダウンロードとかhomeフォルダ直下のフォルダ名が何故か日本語だったので、
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/a077changelang.html
を参照して英語に変更。そしたらダウンロードとデスクトップが両方Desktopになろうとして、正常終了しなかった。先にダウンロードフォルダがDesktopになったみたいだったのでmvコマンドで修正。うーん...

IDEすごいなあ

あとjava-sdkを入れてNetbeans6.5をいれて、Hello,world!を動かしてみた。あと入力した数字が閏年かどうかと、FizzBuzzを作って、コード補完とかエラーチェックとか色々IDEに感動。ただ入力している途中でも間違っています! みたいなのが出るのが鬱陶しいけど。

閏年か判定するプログラム、前やったときif文を三つネストさせてた気がするけど、

 if((year % 4 == 0 && year % 100 != 0 )|| year % 400 == 0)

でいいんだ。自分アホす。

何しよう

わざわざはてなにアカウント作った割には、既に力尽きている感もない気もしないでもない。
プログラムを学習し直すのってどこから手を付ければいいかなあ。
漠然とやりたいこととしては、

まともな勉強というものから離れすぎてどう手をつけたものか。

はてな記法

ほぼ初めてなのではてな記法が難しい。
なれれば楽そうだとは思うんだけど……。