第一章 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した場合とか。
CtrlとCapsの入れ替えが上手くいかない
ホストOSがWindows、仮想化ソフトがVmware Player2.5.1、ゲストOSがUbuntu 8.04 Japaneseで、Ubuntu上でCtrlとCapsを入れ替えようと思ったけど、上手くいかなかった。
試したこと
[システム]→[設定]→[キーボード]→[レイアウト]→[レイアウトのオプション]→[Ctrlキーの位置]で変更 → ×
どの選択肢を選んでも、CapsがControlの動作をしてくれない。
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がLinuxやMacの時はVmwarePlayer上でキーを変更できるようだけど、ホストOSがWindowsの時はどうすればいいのかよく分からない。
とりあえず、上手いこといかないのであきらめる。
久々にプログラム:環境準備
昔学校でやって以来。友達の話を聞いていたらまたちょっとやりたくなった。
メインで使っているWindowsにプログラミング環境を構築するのも面倒な気がしたので、Vmware playerをインストールしてみる。UbuntuのVmware用イメージを http://www.ubuntulinux.jp/products/JA-Localized/vmware からUbuntu 8.04 LTSをダウンロードして解凍したらすぐ使えた。死ぬほど簡単だった。Vmware toolsも最初から入っているし、楽ちん楽ちん。
UbuntuのOpera
とりあえず、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)
でいいんだ。自分アホす。
何しよう
わざわざはてなにアカウント作った割には、既に力尽きている感もない気もしないでもない。
プログラムを学習し直すのってどこから手を付ければいいかなあ。
漠然とやりたいこととしては、
- アルゴリズムとデータ構造の復習
- Linuxプログラミング
- 2Dで物理演算風味
- Ruby on Railsいじってみたい
まともな勉強というものから離れすぎてどう手をつけたものか。