C/C++ の簡単なプログラム例
C/C++ 簡単なプログラム例
既存 C(又は C言語準拠) のソースを出来るだけ手を加えずに移植するために必要な最低限の知識を得るのが目的。
プログラム例から C/C++ を知るための参考ページ。
C のコード C++ のコード比較も行いたい。また、C では面倒な文字列操作や配列操作、ポインタなど便利な機能は、知ってて損はないと思う。
- 内容非保証
- ここでの記述はメモなので勘違い、気違いの類がある可能性を否定しません。
- 自己責任
- 殆どのソースコードは実動作確認をしているが、暴走しない保証はありません。
特に、while文は command line 入力 を伴わない無限ループは、簡単に PC フリーズに陥るので要注意。
アプリケーションの作成
文字の入力とプログラムの終了
文字、文字列入力とプログラム終了判断。
#include <iostream> // getchar() //#include <stdio.h> // setchar() #include <conio.h> // getch() using namespace std; void main() { std::cout << "----------------------------------" << std::endl; std::cout << "Please input the character string." << std::endl; std::cout << " ... It ends by z input ... " << std::endl; std::cout << "----------------------------------" << std::endl; if (char c=getchar()) { if (c=='z') { cout << " 1:終了文字 " << c << " が入力されました" << endl; cout << " プログラムを終了します。" << endl; return; } else if (c=='\n') { cout << " 1:入力文字列終了。現在文字列バッファは空です。" << endl; } else { cout << " 1:getchar() に " << c << " が入力されました" << endl; } } if (char c=getch()) { if (c=='z') { cout << " 2:終了文字 " << c << " が入力されました" << endl; cout << " プログラムを終了します。" << endl; return; } else { cout << " 2:getch() に " << c << " が入力されました" << endl; } } main(); // あくまでテストプログラム。 }※参考程度の覚書。
C++ の文字列処理
C言語の文字列処理は、char Array[] 等の文字配列とポインタを使用した面倒な物であるが、C++では string ライブラリ が追加され文字列処理を行う上で、かなり使いやすくなっているようである。
sample:C++ basic_string class を利用した文字列処理
#include <iostream> #include <string> using namespace std; void main(void) { std::string str1 = "bow bow"; std::string str2 = "niya-go"; cout << "犬は " << Str1 << "、猫は " << str2 << "。" << endl; }※全く普通に文字列処理が出来る。(・・・ように見えている・・・)
- 要件
- #include <string> を追加する。
std 名前空間を使って string 型指定。
※string str = "bow bow"; と std:: 名前空間省略でも VC++2005 では動く様である。(複数名前空間併用時の不具合発生を考慮→省略しないが吉。)
訂正:using namespace std; が有るので、std:: 指定不要!
※#include <string> は追加しないとエラー。
※std::string での、日本語、半角カタカナ、ANK など適当に混在させても取り合えず問題発生はしなかった。
string は、 C++ の標準クラスに含まれるライブラリで実現とのことで、ほぼ他言語同様な感覚で文字列を扱うことが出来るようになっているらしい。(実際の動作は以前と変わらず、文字列配列操作で、こねくり回したブラックボックス内であれこれ巧く動くように工夫されているらしい。他言語同様の使い勝手の提供程度と理解すればよいと思われる。・・・深入りすると底なしのようなので・・・)
理屈は、basic_string を利用して 宣言された string型 変数の実態作成(コンストラクタ呼出→オブジェクト作成、初期化)・・・といった、オブジェクト指向言語の説明に良くある手順を取っているようである。
文字列処理は、非常に根が深いので別途、C/C++ 文字列処理 項を作成。(内容まだ無い)
今更ながら「C言語とC++の違いって何?」と考えると「オブジェクト指向言語への転換だったのか!」と目から鱗が1個落ちた・・・かも・・・(そういえば、VB2005 の時も、コンストラクタとかオブジェクト何とか、インスタンスの作成、クラスがどうのこうのとやった覚えがある。・・・全く内容覚えてないが・・・)
???オブジェクト指向って何??? ・・・ よく解からん! ・・・
■関連無いが、C/C++(Win32)、C++/CLI 、C# はどう違うのか?
- C/C++(Win32)
- ネイティブコードを直接コンパイルする、ネイティブコンパイラである。※ネイティブなオブジェクトコードを出力するコンパイラ。
- 当然実行速度が速い。
- メモリ管理は、作成者が管理。放置すると一般的にメモリ効率がどんどん落ちると思われる。
- C++/CLI
- .NET Framework を利用することを前提としたプログラム作成。
- 標準化団体あり。(Ecma International)
- 作成されるオブジェクトコードは、一般的に安全な物が出来るが、ネイティブでは無く .Net Framework の CLI と呼ばれる 部分で実行時に再コンパイルされてから実行される仕組みとなる。
- メモリ管理は、自動で行うため作成者が意識する必要が無い。(C# 最大メリットを併せ持つことになる)
※訂正:C++ の「クラス名*(アスタリスク)」に代わり「クラス名^(ハット)」とし呼称もハンドルと改めている。このハンドルを使用する場合 .NET Framework による GC(ガベージコレクション)の対象とする。(意識しなくて良いというのは誤りとなる。) - 実行速度は、中間コード実行時再コンパイルとなる''ため、ネイティブコンパイラと比較すれば当然遅くなる。(・・・と思う・・・)
- C++/CLI は、.NET Flamework 上で動作する標準規格なので、出力されるオブジェクトコードは、ネイティブであることは無い。ネイティブコードを作成したい場合、当然 C/C++(win32) を使うと言った使い分けが必要となる。
- 極論すると、VC++ プロジェクト作成時、 CLR を選ぶことが C/CLI の第一歩となると思われる。
- C#
- C#の書籍を見ると文法がスッキリしている。VB2005 などよりスッキリしているのではないか?イコール解かりやすい。
- 新しい言語体系としており、負の遺産継承がない。(逆に言えば過去の言語(c/c++など)の上位互換になって無いらしい。)
- C#の成り立ちから、.NET Flamework 上で動作するオブジェクトコードを出力する構成と思われる。上位バージョンは知らないが、多分ネイティブコードを出力するといった利用は基本的に無いと思われる。
- C#は、メモリ管理を自動でするのが最大のメリットとされる。(= .NET Flamework 利用前提を示唆)
- プログラム作成の効率的管理が特徴。(過去のしがらみから切り離し、新しい言語体系を取っている。)
※VB,C++/CLI,C# は、.NET Framework を使用する構成となり、違いは開発効率と保守性、言語の難解性などとなると思われる。何れも オブジェクトコード -> CLI 経由 -> ネイティブコード -> 実行 となる。「どれがいいっ?」と聞かれれば、「これから始めるなら、C# じゃないですかねっ?」って感じ。
■また、関係ないが、Java と .NET Framework はどう違う?
- Java
- マルチプラットフォーム(Windows,Unix系,MacOsなど)あらゆる OS で、同一ソースで動作させることが出来る汎用プログラム言語として登場した。(・・・と記憶している・・・)
- JavaScript,JavaApplet,Java ・・・?全部異なる。Java は Java。
- JavaScript は、似てアラザルモノ。確か Java を参考に ネットスケープが作ったと記憶している。
- JavaApplet は、基本的にインターネットを経由した PC へオブジェクトコードを送り実行するという、基本的にはインタプリタと記憶している。実行環境に JavaAplet の実行環境が無いと動作しないはず。
- Java は、純然たる開発環境。判を重ねる毎に機能向上してきたようで、当初 インタプリタ的な動作だったような気がする・・・よく解からない・・・が、いつのまにかコンパイル(中間コード?ネイティブコード?)とか物の本に出てくるようになり、その後主要な業務用ソフトが作られる様になり始めたら、何時の間にか業界主要開発環境にまで上り詰めていた・・・っと言ったような気がする。基本的にマルチプラットホームが最大の売りと思うので、多分 Java 実行環境が有って動く物と思う。ネイティブコードをそのまま出すこと出来るかは調べてないので知らない。
- .NET Framework
- Java に奪われた開発環境市場へ MS が投入した対抗馬。・・・と思うが・・・
- C# の登場で更に洗練されてきていると思うが ・・・ Linux ・・・ でも動かないと Java と同列にはならないのでは?と密かに思ってたりするが・・・
※以上、開発環境雑感メモ
▲上へ
関数の戻り値を取得する
■アドレス渡し:配列要素の先頭アドレス渡す
sample4:別プロシージャの処理結果を、親プロシージャへ複数戻す例
#include <iostream> using namespace std; void calculation(int *p); void main(void) { int i, data[] = { 20, 30, 40, 50, 60, 70, 80, 90, -1 }; // 処理前の配列要素の値を表示 cout << "処理前:"; i=0; while (data[i]!=-1) { printf("%d ", data[i++]); // データ誤入力による無限ループ回避 if (i>20) { break; } } cout << endl; // 配列要素の先頭アドレスを渡して処理する calculation(data); // 処理後の配列要素の値を表示 cout << "処理後:"; i=0; while (data[i]!=-1) { printf("%d ", data[i++]); if (i>20) { break; } } cout << endl; } void calculation(int *p) { while(*p!=-1) { // ポインタで示された変数を適当に処理 *p = *p / 2; ++p; } }
▲上へ
■アドレス渡し:変数のアドレスを渡す
sample3:別プロシージャの処理結果を、親プロシージャへ複数戻す例
#include <iostream> using namespace std; void swap(int *x, int *y); void main(void) { int a=10, b=90; printf("処理前: a=%d b=%d\n",a,b); // 変数のアドレスを渡して、a と b の値を直接入れ替える // 関数、又は、サブルーチンへ処理を引き継ぐ swap(&a,&b); // 戻り値は無くても、処理結果が期待値を得る。 printf("処理後: a=%d b=%d\n",a,b); } void swap(int *a, int *b) { int temp; temp = *a; // a の値を temp へ退避 *a = *b; // a へ b の値を代入 *b = temp; // b へ 本来の a の値を代入 // 全ての処理結果が、アドレス渡しの変数に直接行われる。 // return で値を戻す必要がない。 // int swap() { 〜 ; return temp; } 等とするのも問題は無い。 // bool swap() { 〜 ; return true; } 等を返す場合もある。 }※上記例では、無理に関数形態として値を返す意味が全く無い。複雑な計算の結果、入力値に問題がある場合など結果の正否、エラー番号を返すようなロジックを含める場合など重宝する。
※サブルーチンと関数の違いの境界線は、ある程度明確にするのが良いと思われる。関数は数値を渡して結果の値を得る物、サブルーチンは共通する処理を1つのプロシージャへ纏めるもの・・・混同した使い方をすると、後で訳が解からなくなってしまい保守性が低下する可能性が高い。
関数(function)を使用したプログラムでは、通常戻値を1つ返すことが出来ます。これは標準的プログラムで何ら問題なく行える。
しかし関数に引数を渡して複数の計算結果や情報を受け取りたい場合が、実際には非常に多く発生する。
こうした場合以下のように処理を工夫してプログラムを作成するのが一般的である。
- 複数変数のポインタ渡し、配列のポインタ渡し
- 変数のアドレスを複数渡し、呼び出された関数でそのアドレスにある変数の中身を直接加工する方法
- 配列のアドレスを渡し、呼び出された関数でそのアドレスにある配列変数の中身を直接加工する方法
要するにグローバル変数を使うような形態となるが、C言語にはグローバル変数という仕様が無かったと思う。グローバルに値を渡せる(置き換えるだけのプリプロセスなのでグローバルというのは誤り、また、C言語には定数という概念すら無いのではと現状思われる)のは、・・・
#define MAX_VAL 65536 #define MAX_STRING "最大値"・・・のような定数定義のみとなる。当然値の変更など出来るはずも無い。
※文字列変数(string max_string = "最大値";)なども不可。C# から利用可能なようである。
※値の継承や文字列処理が高級言語として機能欠落する分を、ポインタを駆使して何とかすることとなる。
※元来 C言語は技術計算言語の fortrun が元となり作成されていると思うので、文字列処理など苦手で当たり前と思ったほうが良いのであろう。
sample1:戻り値を1個返す function 例
#include <iostream> using namespace std; int function_sum(int x, int y); void main() { int a, b, sum; a = 10; b = 20; sum = function_sum(a,b); printf("%d + %d = %d\n",a,b,sum); } int function_sum(int x, int y) { int retValue; retValue = x + y; return retValue; }sample2:冗長を簡略化した、戻値を1個返す function 例
#include <iostream> using namespace std; int function_sum(int x, int y); void main() { printf("関数の戻り値 = %d\n",function_sum(10,20)); } int function_sum(int a, int b) { return (a+b); }・・・この方が解かり易い・・・
▲上へ
コマンドライン引数をプログラムに渡す
sample:int argc, char *argv[]
// ファイル名 test_c.exe 保存先 c:\ #include <iostream> using namespace std; int main(int argc, char *argv[]) { // int argc は、引数の総個数を持つ // 引数無しでコマンド実行 argc = 1 となる。 printf("argc = %d\n", argc); cout << "----------------------" << endl; for (int i=0; i<argc; i++) { // *argv[i] は、引数の文字列のポインタ配列となる // *argv[i] は、各文字列のアドレスを保持 printf("argv[%d] = %s\n", i, argv[i]); } cout << "----------------------" << endl; }
・・・上記プログラムを コマンドラインから以下のように実行すると・・・
C:\>test_c abcdefg hijklmn opqrstu vwxyz 123456 7890 argc = 7 ---------------------- argv[0] = c:\ argv[1] = abcdefg argv[2] = hijklmn argv[3] = opqrstu argv[4] = vwxyz argv[5] = 123456 argv[6] = 7890 ---------------------- 続行するには何かキーを押してください...
・・・と表示されるはず・・・
▲上へ
配列処理と文字列処理
C/C++ 文字列処理、C/C++ 配列処理 項別途準備済み。(内容はまだ無い)
※この辺りは、可也C特有の特徴が出てくる。これまで(下に行くほど以前の文章である)の内容は、他言語と殆ど変わりない内容(再確認のためのメモ)である。
C言語らしい特徴として、配列の取扱(ポインタ p[],*p,&p,p)と、文字列処理を char 配列で行うことが上げられる。他の言語と比較すると、完全に欠落した文字列処理、および、配列やメモリを直接操作するようなポインタは、とにかく厄介で、C言語を習得する上で一番ネックとなるところでもある。
ちなみに C#では、しっかり string型や object型変数が標準で使えるので、C/C++を今更覚える位なら、最新のC#、VBなどを学んだほうが明かに懸命と言える。マルチプラットフォームで移植性を考慮するならJavaが良い。
※現在の高級言語と呼ばれる物は、一様にオブジェクト指向とかの考えがついて回る。VBでさえそうであるが、中でもJavaが仕様上一番厳格と思われる。多分その点VBが一番甘い・・・(参考まで)
sample:文字列処理
sample:数値配列
#include <iostream> using namespace std; void main() { int array[10]; for(int i=0; i<10; i++) { array[i] = i*10; } for(int i=0; i<10; i++) { printf("array[%d] = %d \n",i,array[i]); } }※数値配列は、他言語と特に変わりなし。
▲上へ
関数/サブルーチンを利用する
sample:ファンクションとサブルーチン
#include <iostream> using namespace std; int function_a(int a, int b); void subroutine_a(int a, int b); void main() { // function call printf("function_a = %d \n",function_a(10,20)); // call subroutine subroutine_a(100,20); } int function_a(int x, int y) { return (x*y); } void subroutine_a(int x, int y) { printf("subroutine_a = %d \n", (x*y)); }※サブルーチンコール、ファンクションコールの例。
※後述(新規書込が上のため・・・)で main() 以前にプロシージャを書かないと、main() からプロシージャが見つけられないことを書いたが、事前に各プロシージャ宣言で main() 以降へ配置しても問題なくなる。
※#include <iostream.h> とするとコンパイルエラー および using namespace std; を書かない場合もコンパイルエラーが発生するのが、標準 C言語らしからぬ所であるが、取り合えず原因不明。何かあると思うが・・・
※ここでは、引数を a,b(又は、x,y) の2つとしているが、1個以上複数指定しても問題ない。多分自分の勘違いだと思うが、main(int argc, char *argv[]) ・・・ 、argc は、コマンド引数の数、argv は、コマンドライン文字列というような意識と何か混同している・・・コマンドライン・・・だから、コンソール入力のコマンドラインを引数とする場合のみ引用する main() 引数に限定される制限だと思う。(要確認)
▲上へ
繰り返し処理(for文,while文)
Sample:while文2
#include <iostream> using namespace std; void main() { int i=500; cout << "Loop Start" << endl; while(i>0) { // for文と類似の利用。 printf("i= %d \n",i--); // i の値を表示後 減算される(…筈…)。 // i--; <------------- 通常この位置でカウンタ変数を回す。 } cout << "Loop End" << endl; }※動作未チェック。無限ループしないと思うが保証できません。勘違い気違いは付物なので・・・
Sample:while文1
#include <iostream> using namespace std; void main() { int itemStock, numberOfTargetsDuringDay, daysCount = 1; cout << "在庫数量を入力 :"; cin >> itemStock; cout << "1日の販売目標数:"; cin >> numberOfTargetsDuringDay; if(itemStock <= numberOfTargetsDuringDay) { cout << "目標達成できる在庫がありません。" << endl; return; // この辺に無限ループ回避 filter があっても良い } while(itemStock > numberOfTargetsDuringDay) { daysCount++; itemStock -= numberOfTargetsDuringDay; if(daysCount>20) { // 目標期間に在庫処分出来ない場合。 cout << "設定目標数を増やして下さい。" << endl; break; // 無限ループ対策にもなる:return での終了も有 } } cout << daysCount << " 日で在庫切れになります。" << endl; }※条件が一致するまでループする例:この例で無限ループに鳴子とはないが、ループ判定条件により無限ループとなり、PCフリーズなどが簡単に起こるので注意。
Sample:for文
#include <iostream> using namespace std; void main() { cout << "start" << endl; for(int i=0; i<65536; i++) { printf("i= %d \n",i); // cout より体感的に早い //cout << "i= " << i << endl; } cout << "end" << endl; }※ループ内では、printf を使用。cout で表示するより実行速度が速いような気がする。
Sample:loop制御の加減算と短縮記述
i++; // i=i+1;と同等。処理後に加減算する。減算の場合 i--; ++i; // i=i+1;と同等。処理前に加減算する。減算の場合 --i; i+=2; // i=i+2;と同等。減算 i-=2; 乗算 i*=2; 除算 i/=2;
・・・作成中・・・(do~while文は対象外とする)
▲上へ
条件分岐(if文,switch文)
Sample:switch文
#include <iostream> using namespace std; void main() { char inKey = 'Z'; cout << "*** 処理選択メニュー ***" << endl; cout << "a:登 録" << endl; cout << "b:変 更" << endl; cout << "c:削 除" << endl; cout << "x:終 了" << endl; cout << "-----------------------" << endl; while (inKey != 'x') { // <--- menu while loop start cout << " 処理選択:"; cin >> inKey; switch(inKey) { case 'a': cout << "新規登録を開始します。"; break; case 'b': cout << "編集作業を開始します。"; break; case 'c': cout << "注意!登録内容を削除します。"; break; case 'x': cout << "--- 処理終了 ---"; break; default : cout << "処理対象メニューを選んでください。"; break; } } // <--- menu while loop return; // menu end }※なんと言うか…古典的メニュー…!DOS じゃあるまいし…判定が1文字というのも…
※if ~ else if でも可能。もうちょっとまともな物が出来ると思う。個人的には switch文を積極的に使ったことが無い。(制限が多い?汎用性が希薄?が理由?:普通 for文,if文で済ましている)
Sample:数値を使った条件分岐
#include <iostream> #include <string.h> using namespace std; void main() { int inAge; char message[20]; cout << "あなたの年齢は? "; cin >> inAge; if(inAge < 20) { strcpy(message, "未成年です。"); } else { strcpy(message, "成人です。"); } cout << message << endl; }※C は元より、C++ も文字列処理が面倒。message = "未成年です。"; などとやってもエラーしか返さないので注意。
※文字列比較の条件分岐など、気が遠くなりそうであるが strcomp() で何とかなるか?
▲上へ
コンソールからの入力
Sample:文字列を処理(文字配列)
※このまま実行する場合、入力時にスペースなどは入力できない。"07:"行で異常終了や不具合が発生する。左詰空白無しの処理のみ許容するのが仕様となるので注意。
01:#include <iostream> 02:using namespace std; 03:void main() { 04: char studentName[25]; 05: int studentAge; 06: cout << "生徒名 :"; 07: cin >> studentName; 08: cout << "年齢 :"; 09: cin >> studentAge; 10: cout << "*** 入力確認 *************************" << endl; 11: cout << studentName << "(" << studentAge << ")" << endl; 12: cout << "**************************************" << endl; 13:}※この辺が C の大きな特徴?文字列変数が無かった気がする。そのためポインタやこのような文字配列を使用したような・・・。
※このプログラムはあくまで文字配列例で、実用性皆無である。
※C/C++ の配列は、結構危ない仕様なのでコマンドの組み合わせに注意が必要。
Sample:KeyBord から入力された最初の1文字
#include <iostream> using namespace std; void main() { char inChr; cout << "半角英数字を入力:"; cin >> inChr; cout << "入力された文字の最初の1文字は " << inChr << " です。" << endl; }
Sample:数値/文字列の入力
#include <iostream> using namespace std; void main() { double moneyDeposited, commodityPrice, amountRepayment; cout << "お預かり額:"; cin >> moneyDeposited; cout << "商品代金 :"; cin >> commodityPrice; amountRepayment = moneyDeposited - commodityPrice; cout << "お釣りは、" << amountRepayment << " 円のお返しとなります。"; cout << endl; }※数値計算上のデバッグ時に知ってないと困る。cin は、console input の略か?わかりやすくて良い。
▲上へ
変数/定数宣言
char aChr; // -128 〜 127 1Byte short itemNo; // -32768 〜 32767 2Byte long price; // 約±21億の範囲の整数 4Byte int i; // 通常 long と同じ 以前は処理系 PC ハードに依存していた。 float tax; // 浮動小数型数値 有効桁 6~7 4Byte double sumPrice // 浮動少数型数値 有効桁15~16 8Byte※数値の大きさは、処理系により昔(大昔)は異なっていたが、最近ではある程度統一されているようである。
※char は数値としての利用も可能であるが、1byte 文字を処理するために使われることの方が覆い様に思われる。
int i,j,k; double sumPrice = 45000 * 3 + 23000 * 2;
定数定義
#include <iostream> using namespace std; #define MAX_VAL 65536 // 数値定数。 void main() { int max = MAX_VAL; ・・・ }・・・のように定数定義する。
※たぶん文字列定数も定義可能と思われる(確認はしてないが常識的に可能と思っているだけ・・・)。文字列変数の概念が C/C++ では無いが、文字配列やポインタでカバーすることになる。文字列配列の代入も strcpy(array,"文字配列"); とか、とにかく厄介。C++ と C の上位互換でこの辺が拡張されてるかと期待したが・・・そうではないらしい。
※更に、文字列配列の比較では、strcomp(); を使うらしい。
数学系の関数を使う場合・・・
#include <math.h>・・・を必要とする場合があるので覚えておこう。
▲上へ
Hello! C/C++ World!!
cpp でソースファイルを作成し C/C++ 混在で動作確認。1行目、2行目が無いとエラーとなるので注意。1:#include <iostream> 2:using namespace std; 3:int main() { 4: cout << "Hello ! C++ Language World !!" << endl; 5: printf( "Hello ! C Language World !!\n"); 6: return 0; 7:}
"4:" が、C++ Console Output 記述。指定文字列を改行指定で cout へ送るって言うような記述と思われる。endl は、end line の意か? ' << endl ' を使わず、 ' world !! \n" ' でも同様に動作した。
"5:" は、C の print format 。このまま動く。
"1:","2:" は、お約束のように思っていれば良いと思われる。
C++ での表示フォーマット指定
Sample:
int age = 19; // ・・・多分・・・いいと思うが? cout << "I am "; cout << age; cout << " years old."; cout << endl;・・・でも構わないし1行に纏めても良いようである。また、表示文中へ 1+3 などの計算式を置いてもOK。
▲上へ
Win32 Console App の作成手順
- 手順の再説明
- プロジェクト作成
- ロジェクト作成から、Win32 Console Application
- プロジェクト名を適当に入力
- ソリューションのディレクトリチェック無し(有っても良いと思うが不要なファイルが多数作られるかも・・・)
- Win32 Application Wizard から、console application, Empty project
- ソリューション エクスプローラから、Source Files フォルダへソースファイル追加
- Source Files 右クリックで Add ・・・> 新しい項目
- Code ・・・> C++ File(cpp) ・・・ファイル名入力:拡張子指定無しは cpp(C++) となり、****.c と明示的に指定すると C言語用ソースファイルとなる。
- プログラム入力 ・・・> デバッグ ・・・> 実行 となる。
- プロジェクト作成
▲上へ
リンク
内部リンク
- C/C++ C++/CLI C# 関連
- VC++ 2005 Express のインストール
- C/C++ の簡単なプログラム例
- 変数・定数
- プログラムの分割/ダイナミックリンクライブラリ など
- その他
- C/C++ その他::書式文字/ESC code など
- VB2005リファレンス(覚え書き)
- SQL文:SQLステートメント
- VBA(VisualBasic for Applications)
外部リンク
- 現在ありません
▲上へ
2008年05月26日(月) 21:15:08 Modified by cafeboy1