こんにちは。
私は現在、cで組み合わせ最適化問題を扱う仕事をしているのですが、
どうも手詰まりで、Javaだったら楽にコーディングできるかと思い、
Javaについて勉強しましたが、あれは別の産物用だと思うのです。
そのため、この言語はこの目的で使うという指標を教えてください。
(c,java,php,vba...などです)

このQ&Aに関連する最新のQ&A

A 回答 (4件)

こんにちは。



言語によって得意・不得意とする分野はありますが、C言語は汎用性に優れているのでそれほど困らないと思います。

組み合わせ最適化に使われる言語というと、PrologやLISPなどが思いつきますが…C言語よりリスト処理に向いているだけで、C言語でリスト処理を実装すれば、やることは同じです。

Javaは仮想マシン(VM)を使うことで、他のプラットフォームでも(Windows,Linux,MacOSといったOSの垣根を越えて)同じコードを実行可能という利点があります。
またオブジェクト指向なので、さまざまな事象をオブジェクトとして捉えることができ、理解しやすいと思います。
ただ、中間コードをVMが実行するのが遅いので、いろんな環境で実行することを想定したソフトでない限り、Javaを選択する意味はそんなにないように思います。

C言語は手続き指向(C++やC#はオブジェクト指向の概念を取り入れていますが)なので、多少理解に時間がかかるかもしれませんが、汎用性に優れているのでほとんどどんなプログラムも同じようにコーディングできます。構文から勉強するのだとしたら、お勧めなんですが。

PHPやVBAは厳密に言うとプログラミング言語じゃありませんが…。目的を達成できるのならなんでもいいですけどね。
PHPはサーバサイドのスクリプト言語です。主に動的に変化するWebページなどを生成するために使用します。
perlも同様ですが、リストの処理にはそこそこ適しています。
ただそんなに実行速度は速くないので、スピードを期待しても無理です。

VBAはVisual Basic for Applicationsのことで、これもスクリプト言語です。Microsoft Officeなどの製品上で動作します。動作させるアプリケーション(Excel、PowerPointなど)の違いによってコードが多少変わります。また同じExcelであってもXP/2003などの違いでコードに影響が出ます。
リストはExcel上で処理すれば扱えないこともありませんが、Excelの制約がいろいろとありますので、本格的にやろうと思うと性能が不足すると思います。また速度は非常に遅いです。

参考になりますでしょうか?
    • good
    • 0
この回答へのお礼

ご回答いただきまして誠にありがとうございます。
Cは汎用性に優れているのですね。私もそのメリット1つにこだわりがありました。
しかし、javaでオブジェクト指向を学んでから再挑戦してみたいと思います。
まさに井の中の蛙でした。他の解説も大変参考になりました。どうもありがとうございました。

お礼日時:2009/05/16 19:44

> 10の30乗までの大きな数は扱いません。



そうでしたか。それなら私なら多分C++ですね。
問題のルールをなるべく沢山集めて(自分で発見
しないといけないかもしれませんが)、場合の数
を極力少なくして、全てのケースを計算して比較
する方法をとってみたいです。

それで計算時間が許される範囲かそうでないかで
また考え直すことになるでしょう。

データをList構造にするのは、データの構造に柔
軟性を与えるので、修正に有利だと思います。
    • good
    • 0
この回答へのお礼

ご回答追加していただき、誠にありがとうございます。
言語はC++ですね。今後の参考にさせていただきます。
また、データをリスト構造にするのは若干難しいですが、
ポインタを使っていた時にリスト構造は便利だと思いました。

お礼日時:2009/05/17 00:31

組合せの最適を求めるなら、組合せの場合の数によって


使う言語が変わるように思います。

私が思うに場合の数が10の30乗を越えたあたりから「最適」
という言葉が使えない世界ではないかと思っています。

結論から書きますと、10の30乗以下ではC++でリスト処理を
クラス化にして処理を行えば良いと思います。
シミュレーション的に解くならFortranも可能性はあるでし
ょう。

10の30乗を越えるあたりからはLispがいいと思います。
Lisp言語に慣れる必要はあります。Lispを使えば解ける、と
いう問題ではありません。
10の30乗を越えるあたりから、答えを求めるためにプログラ
ム修正が凄く多くなると思います。
また、組合せの世界の理解に対する概念の変化まで生じてし
まい、C++などの言語では、プログラムの作り直しが多発し
効率的に思えません。

その点、Lispは言語自体もList構造になっていますので、
データ構造を上手く表現できたら、それを処理する構造が
データなのかプロセスなのか混沌とし、コンパイラ言語の開
発とは異次元の開発世界を感じます。
組合せ世界の理解に伴う概念の変化に強いプログラムになる
と思います。

また、Lispを使う場合、フレーム構造などの定義を行うため
のマクロなどが用意されているツールの利用もいいと思いま
す。名前にshellという部分があるのではないか、と思います。
ま、別に無くても自分で作ればいいことですが。

なお、10の30乗という閾値はあくまでも私個人の意見です。
ここからはプログラムの処理的効率ではなくて、開発の効率
重視でなければ、ベターの答えも得難いと考えています。
    • good
    • 0
この回答へのお礼

ご回答いただきまして誠にありがとうございます。
残念ながらさすがに10の30乗までの大きな数は扱いません。
しかし、Lipsというのはどこかで聞いたことのある言語です。
少し参考にしながら、今後大きな数に対応できるよう覚えておきます。
どうもありがとうございました。

お礼日時:2009/05/16 20:00

実行時間とのトレードオフで考えるのが普通だと思いますが。


JavaがCに比べて遅いといっても10秒が15秒になるのと20時間が30時間になるのでは意味合いが違います。
実用上支障が無い範囲であれば実行速度が落ちるデメリットよりもコーディングが柔軟になるメリットの方が大きくなります。
Cで手詰まりになっている原因がテンプレートやクラスを使えば解決可能であるならC++に変えれば良いのでは?

開発ツールに懸けられる予算でも事情は変わります。
PurifyやPGReliefなどの(高価な)ツールが使えるならC/C++でも開発効率はさほど変わりませんが、この手のツールが使えないとメモリリーク問題に悩まされることになるかもしれません。

C言語は構造化言語です。
手続き型、構造化、オブジェクト指向は違う技術ではなく進歩の過程でしかありません。
オブジェクト思考は構造化の上になりたち、構造化は手続き型の上になりたっています。
    • good
    • 0
この回答へのお礼

ご回答いただきまして誠にありがとうございます。
構造化言語、手続き型言語、オブジェクト指向の意味合いが、
よくわかってきました。オブジェクト指向を目指して頑張ります。
どうもありがとうございました。

お礼日時:2009/05/16 19:52

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語 コンパイラ

C言語のコンパイラを無料でインストールしたいのですが
気に入ったのが見つかりませんでしたぁ
いいコンパイラがあったら教えてください
よろしく御願いします

Aベストアンサー

その前に対象OSやプラットフォームなどの環境を書かないと何とも
いえないと思います。

クロスコンパイラならみなさんのいうようにGCCが一番でしょうし、
Winに限定するならBCCかVC++ Express Editionがいいでしょう。
MS-DOSならLSI C-86試食版なんてのもありますけど。

なんか、上手く動作しないけどWatcom Cなんて手もあるかも。

Cだけでいいのか、C++が使えた方がいいのかによっても異なります。

参考URL:http://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E

Q2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&(1<<(i-1))&&(intval&(i+j-1))&&(intval&(1<<(i+2*j-1)))) print("%3d %3d %3d (%3d)\n",i,i+j,i+2*j,j);
}/*三つ子の素数を調べ出力

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&...続きを読む

Aベストアンサー

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

第iビットを1にするときは
intval[i>>5]|=1<<(i&31);

とすれば良いでしょう。
関数やマクロを用意することをお勧めします。
例えば
int get(int intval[],int i)
{
return (intval[i>>5]>>(i&31))&1;/*0か1が返って来る。*/
}

void on(int intval[],int i)
{
intval[i>>5]|=1<<(i&31);
}

という感じです。

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

...続きを読む

QC言語のコンパイラについて

私は、高校でC言語を使った授業をしています。
学校のPCではMinGWのコンパイラを使っています。
家のPCでもC言語をしたいのですがコンパイラの入手法がわかりません。
どなたか教えてください。

Aベストアンサー

あなたの自宅のPCがwindowsであるならば、Cygwinを使われたらどうでしょう?
mingwのCコンパイラも存在します。

参考URL:http://cygwin.com/

Qc++ , template , ファイル分割 , 助けてください...

//-----------------coord.h-------------
template <class type>
class coord
{
type v[3];
public:
coord(void);
void Show(void);
};
//-----------------main.cpp------------
#include<iostream>
#include"coord.h"
using namespace std;

int main(void)
{
coord<double> ob;

ob.Show();

return 0;
}
//----------------------coord.cpp-----------
#include<iostream>
#include"coord.h"
using namespace std;

template <class type>
coord<type>::coord(void)
{
v[0]=v[1]=v[2]=0;
}

template <class type>
void coord<type>::Show(void)
{
cout << "hello" << endl;
}

同一フォルダ内に上記のファイルが 3 つあります.
つまり上の 3 つのファイルを分割してコンパイルさせたいです.
この状態で...MS-DOSプロンプトからコンパイルします.

C:\test>bcc32 -c coord.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
coord.cpp:

C:\test>bcc32 -c main.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
main.cpp:

C:\test>bcc32 -emain main.obj coord.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'coord<double>::coord<double>()' が未解決(C:\USERS\TAITO\PR
OG\CPP\TEST\MAIN.OBJ が参照)
Error: 外部シンボル 'coord<double>::Show()' が未解決(C:\USERS\TAITO\PROG\CPP\TE
ST\MAIN.OBJ が参照)


すると, このようなエラー文が出てしまい
実行可能ファイルができません.

コンパイラはbccです.

原因が全く分かりません.

助けてください...





ちなみに,
分割せずにコンパイルすると通ります.

自分は c 言語での分割コンパイル経験はあるので
それをそのまま c++ 言語でも用いているのですが,
何か変えなければならないのでしょうか?

//-----------------coord.h-------------
template <class type>
class coord
{
type v[3];
public:
coord(void);
void Show(void);
};
//-----------------main.cpp------------
#include<iostream>
#include"coord.h"
using namespace std;

int main(void)
{
coord<double> ob;

ob.Show();

return 0;
}
//----------------------coord.cpp-----------
#include<iostream>
#include"coord.h"
using namespace std;

template <class type>
coord<type>::coord(void)
{
v[0]=v[...続きを読む

Aベストアンサー

> クラスの宣言はヘッダファイル上で全て行なわないといけないのですか?

違います。テンプレートだからです。
本来であれば、exportを使って移出を行えば、ほぼ最初のようにソース分割できるのですが、Borland C++ Compilerでは(Visual C++でもGCCでも)exportをサポートしていないので使えません。

QC言語でのコンパイラの作成方法

C言語初心者のため、稚拙な文章になる可能性があることを最初にお詫びします。

現在Microsoft社のMicrosoft Visual C++ 6.0を用いてCドライブのルートにある「temp.c」というソースファイルをコンパイルするアプリケーションを作ろうと思っているのですが、ネット上で「C言語 コンパイラ 作成」等と検索しても、既にコンパイラがあることを前提としたホームページしか見つけることができず、肝心のコンパイラをどのように作ったらよいのかということが載ったホームページが見つかりません。

というわけで、今回はコンパイラをどのように作ったらよいのかというヒントだけでもいいので教えて頂けないかと思い投稿させて頂きました。
ちなみに「temp.c」はそこまで複雑なソースではなく、DOS上のアプリで、リソースやアイコンなどは用いないものです。


そもそも「コンパイラを作る」ということ自体が愚かな行為なのかと思ったりもします。
私が所持しているBcpadやMicrosoft Visual C++ 6.0に付属している既存のコンパイラを利用するということも考えたのですが、BcpadやMicrosoft Visual C++ 6.0の本体以外からコンパイラをどのように利用していいのかもわかりません。

どうぞ忌憚の無い意見をよろしくお願いします。
ちなみにOSはXPのSP3です。

C言語初心者のため、稚拙な文章になる可能性があることを最初にお詫びします。

現在Microsoft社のMicrosoft Visual C++ 6.0を用いてCドライブのルートにある「temp.c」というソースファイルをコンパイルするアプリケーションを作ろうと思っているのですが、ネット上で「C言語 コンパイラ 作成」等と検索しても、既にコンパイラがあることを前提としたホームページしか見つけることができず、肝心のコンパイラをどのように作ったらよいのかということが載ったホームページが見つかりません。

というわけで、...続きを読む

Aベストアンサー

あの・・・水を差すようで恐縮しますが

それって「コンパイラを作る」ではなくて
「コンパイラを呼び出す」だけでは?

ボタンを押したら
外部プログラムとして cc コマンドを実行するだけ…。
最近 C++ やってないんで忘れましたが WinExecとか CreateProcess とか使って…。もちろん環境変数や実行パラメータはきちんとセットした上でですけど…。Microsoft Visual C++ 6.0でもコマンドプロンプトだけでコンパイルできますから。

Q【C++ TR1】tr1::tupleのコンストラクタについて

 こんばんは。今回初めて此方のカテゴリに質問させて頂きます。
 今暇つぶしにtr1::tuple<T1, T2, ..., TN>の中を書いています。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

--------------------------------------------------------------
pdfの[6.1.3]より(少し省略しています)
--------------------------------------------------------------
template<T1, T2, ..., TN>
class tuple
{
public:

↓このコンストラクタのP1~PNが、どの様な型に成るのかが不明瞭です。
explicit tuple(P1, P2, ..., PN);

--------------------------------------------------------------

pdfの[6.1.3.1]辺りにP1~PNの事について、書いてはあるのですが・・・今一掴めません。

例えば、

tr1::tuple<char, int, const char(&)[3]>

と書いた場合、コンストラクタのP1, P2, P3はどう言う型になるのでしょうか。
テンプレートメタプログラムが解る方、ご教示お願いします。

 こんばんは。今回初めて此方のカテゴリに質問させて頂きます。
 今暇つぶしにtr1::tuple<T1, T2, ..., TN>の中を書いています。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

--------------------------------------------------------------
pdfの[6.1.3]より(少し省略しています)
--------------------------------------------------------------
template<T1, T2, ..., TN>
class tuple
{
public:

↓このコンストラクタのP1~PNが、どの様な型に成るのかが不明瞭...続きを読む

Aベストアンサー

> where Pi is Ti if Ti is a reference type, or const Ti& otherwise.

なので、

tr1::tuple<char, int, const char(&)[3]>

の仮引数の型は、

const char&, const int&, const char(&)[3]

ではないでしょうか?

QC言語のコンパイラ

C言語の勉強がしたいと思っているのですが、コンパイラっていうんですかね、それについて少し調べてみたら
無料なら"Borland C++ Compiler"で、有料ならなんかかなり高いっぽいけど"Visual C++"っていうのがあることが解りました。

よくプログラミング系のサイトの人で"Borland C++"のコンパイラを利用してとてもプログラミングがしやすくなったということが書いてあるのですが、"Visual C++"と比べたらどっちの方がいいんですか?(やっぱり有料の方?)
もし人それぞれなら、みなさんは両方あったらどっちを使いますか?

初心者なら無料ので十分すぎるのだとは思いますが、プログラマーみたいな人から見るとどうなのかな~と思ったので教えていただけますか。
お願いします。
ついでに"Visual C++"って言語があるんですかね?何かそんな風に書いてあるところもあったもんで。
かさねがさねお願いします。

Aベストアンサー

Borland C++ Compilerは元々は有料ですよ。(パッケージ販売していた。)

統合環境など(IDE)を省いて無料として公開したものなのでなんら、無料だからといって劣る部分はありません。
(コンパイル速度もBC++の方が速いし。)

VC++がいいと言われている利点はMS社製なのでOSと同じ会社と言うことで親和性が高い、サンプルソースコード等の資料がボーランド用に比べて極端に多いという利点があります。

勿論、VC++用のソースコードでもBC++とVC++の違いを理解していれば、コンパイル可能です。(ライブラリ関係の呼び出し方が違うのでDLLをBC++用にインポートするなど)

個人的な意見ですが、純粋にプログラムを学びたいというのであればBC++で十分です。(もったいないくらい、昔は5,6万位だして買った記憶が、、、。)

本格的にWindowsのプログラムを学びたいのならVC++の購入を検討してみるべきです。(逆に、それくらいの金額を自分に投資できないならたとえVC++が無料であっても使いこなさないと思います。)

Borland C++ Compilerは元々は有料ですよ。(パッケージ販売していた。)

統合環境など(IDE)を省いて無料として公開したものなのでなんら、無料だからといって劣る部分はありません。
(コンパイル速度もBC++の方が速いし。)

VC++がいいと言われている利点はMS社製なのでOSと同じ会社と言うことで親和性が高い、サンプルソースコード等の資料がボーランド用に比べて極端に多いという利点があります。

勿論、VC++用のソースコードでもBC++とVC++の違いを理解していれば、コンパイル可能です。(ライブ...続きを読む

QCのコーディング,コンパイラ,デバックができるいいフリーソフト探しています。

こんにちわ,
現在Cの開発をしたいなーと思っているyu393939です。
今フリーソフトでCのコーディング,コンパイラ,デバックができるいいフリーソフトがあればいいなと思っています。
 Visual C(これはフリーではありませんが)などのような関数などの自動補完機能などがあればうれしいです。なくてもいいのでいいフリーソフトを知っていたらよろしくお願いします。
 

Aベストアンサー

Borland C++ Compilerを統合環境にするソフトを紹介します。
私はどれも使用したことがないので使用感についてはお答えできません。(他の方フォロー願います)

■BCC Developer
http://www.vector.co.jp/soft/win95/prog/se180695.html

■CBar
http://www.vector.co.jp/soft/win95/prog/se143207.html

■CPad for Borland C++Compiler
http://www.vector.co.jp/soft/win95/prog/se141451.html

QMacで使えるC言語のコンパイラを教えてください

最近C言語の勉強を始めました。
私はMacユーザなのですがMacでCを使えるコンパイラはあるのでしょうか。ネットで探しても見つかりませんでした。もしご存じでしたら教えてください。

Aベストアンサー

MacでC言語の勉強をフリーの処理系で楽しむならMacintosh Programer's Workshopが良いと思います。
PowerPC用のC/C++コンパイラ、MC68K用のC/C++コンパイラ、MC68Kのデバイスドライバ開発などに使えるアセンブラとMacプログラミング(Toolboxプログラミング)に必要なResEditなどのツールが全てそろっています。
http://developer.apple.com/tools/mpw-tools/

hohihohiさんご紹介のCodeWarriorも良いのですが、いかんせん高価なのでDiscover Programming for Macintosh日本語版リリース5(¥2、8000)程度で始められても良いかもしれません。
勉強に必要な入門書などがセットになっています。
ただし、2次生産物(作成したソフトウェア)の配布権などに制限がありますので実力がついたらCodeWarriorにアップグレード(¥4、1000)すると良いでしょう。
http://www.metrowerks.co.jp/Products/Discover/Discover_Mac5.htm

日本語による1年間のテクニカルサポートに¥2、8000をかけると思えば安いと思います。

MacでC言語の勉強をフリーの処理系で楽しむならMacintosh Programer's Workshopが良いと思います。
PowerPC用のC/C++コンパイラ、MC68K用のC/C++コンパイラ、MC68Kのデバイスドライバ開発などに使えるアセンブラとMacプログラミング(Toolboxプログラミング)に必要なResEditなどのツールが全てそろっています。
http://developer.apple.com/tools/mpw-tools/

hohihohiさんご紹介のCodeWarriorも良いのですが、いかんせん高価なのでDiscover Programming for Macintosh日本語版リリース5(¥2、8000)程...続きを読む

QC,C++未経験でcocos2d-xをやってみたのですがどうもコードの意味を理解できません、そこで

C,C++未経験でcocos2d-xをやってみたのですがどうもコードの意味を理解できません、
そこでcの絵本を買ってみました、その後c++の書籍を買って勉強したいのですがc++の絵本のような簡単なものではなく独習c++程の知識が必要なのでしょうか?
また独習c++を読むのにcの絵本の知識で足りるのでしょうか?
Javaもやってます、
文法はほぼわかります

Aベストアンサー

絵本シリーズ、独習シリーズは、中級者向けの本です。
「やさしいC++」などの入門書をしっかり読み直しましょう。
単にコードの意味が分からないのなら、インターネットで検索しましょう。
アマゾンには読者の書評も載っているので読んでみましょう。


人気Q&Aランキング