質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1283閲覧

外部.exeプログラムの実行

egpt

総合スコア25

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/11/16 09:06

VS C++についての質問です。
プログラム自体触り始めて数か月の初心者です。
VS C++で黄金分割探索を書きました。しかし、改良したい点が2点あり、質問させていただきました。

1.以下ソースコードのmに文字が入力されたとき、誤作動が起こります。これの回避方法を教えてください。

2.gnuplotを用いてf(x)のグラフを書きたいのですが、gnuplotの開き方がよくわかりません。
なお、gnuplotは、c:\Program File\gnuplot\bin\wgnuplot.exeにあります。

おそらく初歩的な部分で躓いていると思うのですが、どうぞよろしくお願いいたします。
(※プログラムの呼び出しもよくまだわかっていません。)

C++

1 2#include <iostream>; 3using namespace std; 4 5static const double GRATIO = (1 + sqrt(5)) / 2; //黄金比; 6static double a, b, c; //二次関数の係数; 7int m = 100; //極値を調べるxの範囲 8 9double f(); //f(x)=ax^2+bx+c; 10double GSS(double xl, double ux, int T);//GoudenSelectionSearch(黄金分割探索); 11 12int main() { 13 a = ' '; 14 cout << "二次関数の極値を求めます." << endl 15 << "二次関数f(x)=ax^2+bx+cで" << endl; 16// << "調べるxの範囲を入力してください.(-x~x)" << endl; 17// cin >> m; 18 cout << "aの値を入力してください." << endl; //aの値を入力; 19 cin >> a; 20 if (a == 0) { 21 cout << "aには0以外の値を入力してください.\n" << endl; 22 return main(); 23 } 24 cout << "bの値を入力してください." << endl; //bの値を入力; 25 cin >> b; 26 cout << "cの値を入力してください." << endl; //cの値を入力; 27 cin >> c; 28 if (a < 0) { 29 cout << "f(x)が極大値を取るxの値は" << (GSS(-m, m, 100)) << endl; 30 } 31 else { 32 cout << "f(x)が極小値を取るxの値は" << (GSS(-m, m, 100)) << endl; 33 } 34 35 return 0; 36} 37 38double f (double x) {//f(x)=ax^2+bx+c; 39 return a*x*x+b*x+c; 40} 41 42// f(x)が極値を取るときのxを求める. 43// lx:最小値; ux:最大値; T:試行回数; 44double GSS(double lx, double ux, int T) {//min_x 45 double x1 = lx + (ux - lx) / (GRATIO + 1); //lx~uxの内分点1; 46 double x2 = lx + (ux - lx) / GRATIO; //lx~uxの内分点2; 47 double f1 = f(x1); //内分点での値1; 48 double f2 = f(x2); //内分点での値2; 49 50 if (a > 0) { //下に凸の関数の場合; 51 for (int i = 0; i < T; i++) {//lx~uxの範囲でxの最小値を求める. 52 if (f1 > f2) { 53 lx = x1; 54 x1 = x2; 55 f1 = f2; 56 x2 = lx + (ux - lx) / GRATIO; 57 f2 = f(x2); 58 } else { 59 ux = x2; 60 x2 = x1; 61 f2 = f1; 62 x1 = lx + (ux - lx) / (GRATIO + 1); 63 f1 = f(x1); 64 } 65 } 66 return (lx + ux) / 2; 67 } else {//上に凸の関数の場合; 68 for (int i = 0; i < T; i++) {//lx~uxの範囲でxの最大値を求める. 69 if (f1 > f2) { 70 ux = x2; 71 x2 = x1; 72 f2 = f1; 73 x1 = lx + (ux - lx) / (GRATIO + 1); 74 f1 = f(x1); 75 } 76 else { 77 lx = x1; 78 x1 = x2; 79 f1 = f2; 80 x2 = lx + (ux - lx) / GRATIO; 81 f2 = f(x2); 82 83 } 84 } 85 return (lx + ux) / 2; 86 } 87}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2018/11/16 09:23 編集

>mに文字が入力されたとき・・・意味不明?・・・コメント部分ですか? また、文字とは?
guest

回答1

0

ベストアンサー

1.以下ソースコードのmに文字が入力されたとき、誤作動が起こります。これの回避方法を教えてください。

標準入力を文字として取得します。
それをstd::stoiで整数値に変換します。可否結果も判断できます。
他、doublea~も同様に変換できます。

C++

1#include <iostream> 2#include <string> 3int main() { 4 // 文字として入力 5 std::string s; 6 std::cin >> s; 7 8 // 文字列→整数値に変換 9 int m(-1); 10 bool cnv(false); 11 try{ 12 std::size_t i; 13 m = std::stoi(s,&i); 14 if( i >= s.length()){ // 変換不可能な文字は含まれていなかった 15 cnv = true; 16 } 17 } 18 catch(std::invalid_argument ex){ 19 // 変換できなかった 20 } 21 std::cout << m << std::endl; 22 if(!cnv) std::cout << "error" << std::endl; 23 24 return 0; 25}

2.gnuplotを用いてf(x)のグラフを書きたいのですが、gnuplotの開き方がよくわかりません。

なお、gnuplotは、c:\Program File\gnuplot\bin\wgnuplot.exeにあります。

system関数で指定のプログラムを呼び出せます。
system( "c:\Program Files\~")

投稿2018/11/16 10:42

can110

総合スコア38256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

egpt

2018/11/18 14:42 編集

ありがとうございました!何とか解決することができました。 しかし、system()でProgram Fileを呼び出すとき、この空白部分が終了文字判定されて空白以降の文字が反映されないエラーが発生しました。自分は、Program Fileの代わりにPROGRA~1を入力して解決しました。
can110

2018/11/18 14:04

なるほど。動作未検証ですが system( "\"c:\Program Files\~\"") のように前後を"で囲むとよいかもしれません。
egpt

2018/11/18 14:38

実行しましたが、うまくいきませんでした。ほかに何か良い考えはありますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問