- 締切済み
linuxでc言語でのプログラミングについて
下のプログラムは入力した4つ数字を円グラフで表示するものでこのプログラムをもとに棒グラフで表示するように変換しなくてはならないのですがHgwBoxFill関数を使うらしいのですがいろいろ試行錯誤してみてもできないのでどなたか教えてくれませんか? 1: /* プログラム始め */ 2: #include <stdio.h> 3: #include <math.h> 4: #include "handy.h" 5: 6: /* プロトタイプ宣言 */ 7: void draw_graph(int w, double start, double val, char *str); 8: 9: int main(void) 10: { 11: int w; /* ウィンドウID */ 12: int c; /* 文字入力用 */ 13: double XBASE = 100.0; /* ウィンドウ設定 */ 14: double YBASE = 100.0; 15: double WINSIZE = 500.0; 16: int in1, in2, in3, in4; /* グラフ表示する数値 */ 17: int total; /* グラフ表示する数値の総和 */ 18: double sum; /* グラフ表示する数値の累積 */ 19: double d1, d2, d3, d4; /* グラフ表示する数値の割合 */ 20: 21: /* グラフ表示する数値の読み込み */ 22: printf("四つの正整数を入力してください >> "); 23: scanf("%d %d %d %d", &in1, &in2, &in3, &in4); 24: 25: /* 各項がグラフ内で占める割合の計算 */ 26: total = in1 + in2 + in3 + in4; /* 総和の計算 */ 27: d1 = (double)in1 / (double)total; /* 割合の計算 */ 28: d2 = (double)in2 / (double)total; 29: d3 = (double)in3 / (double)total; 30: d4 = (double)in4 / (double)total; 31: 32: /* ウィンドウの生成 */ 33: w = HgWOpen(XBASE, YBASE, WINSIZE, WINSIZE); 34: 35: /* 線の幅指定 */ 36: HgWWidth(w, 3.0); 37: 38: /* グラフの表示 */ 39: sum = 0.0; /* 1項目めの表示 */ 40: HgWColor(w, HG_RED); 41: draw_graph(w, sum, d1, "A"); 42: 43: sum += d1; /* 2項目めの表示 */ 44: HgWColor(w, HG_BLUE); 45: draw_graph(w, sum, d2, "B"); 46: 47: sum += d2; /* 3項目めの表示 */ 48: HgWColor(w, HG_GREEN); 49: draw_graph(w, sum, d3, "C"); 50: 51: sum += d3; /* 4項目めの表示 */ 51: HgWColor(w, HG_ORANGE); 53: draw_graph(w, sum, d4, "D"); 54: 55: /* 最後に円表示 */ 56: HgWColor(w, HG_BLACK); 57: HgWCircle(w, 250.0, 250.0, 200.0); /* 外側の円 */ 58: 59: 60: printf("Push Any Key "); 61: c = getchar( ); 62: c = getchar( ); 63: 64: printf("Goodby!\n"); 65: 66: return 0; 67: } 68: 69: /* */ 70: /* グラフ表示する関数 */ 71: /* */ 72: void draw_graph(int w, double start, double val, char *str) 73: { 74: double x, y; /* 座標 */ 75: double rad; /* 角度 */ 76: 77: /* グラフの表示 */ 78: rad = 2.0 * M_PI * (start + val); /* 角度計算 */ 79: x = sin(rad) * 200.0 + 250.0; /* 座標計算 */ 80: y = cos(rad) * 200.0 + 250.0; 81: HgWLine(w, 250.0, 250.0, x, y); /* グラフ表示 */ 82: 83: /* 項目名の表示 */ 84: rad = 2.0 * M_PI * (start + val / 2.0); /* 角度計算 */ 85: x = sin(rad) * 120.0 + 250.0; /* 座標計算 */ 86: y = cos(rad) * 120.0 + 250.0; 87: HgWColor(w, HG_BLACK); 88: HgWText(w, x, y, str); /* 項目名表示 */ 89: 90: return; /* void型関数なので返り値なし */ 91: } 92: /* プログラム終わり */ gnome端末がデスクトップ環境です
- aabsnbndv
- お礼率0% (0/9)
- C・C++・C#
- 回答数1
- ありがとう数0
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Wr5
- ベストアンサー率53% (2177/4070)
>gnome端末がデスクトップ環境です もうちょっとまともに環境書きましょうや。 Linuxだっていうならディストリビューションはなんです? 少なくとも、CentOS6.xでは標準リポジトリにHandyGraphicsはないみたいですが……。 「HgWLine」で検索したら、 http://www.cse.kyoto-su.ac.jp/~oomoto/lecture/program2012/C/HandyGraphic.html こんなページを見つけた。 「HgWText」で検索したら、 http://sml.me.es.osaka-u.ac.jp/jse/kadai/sample05.c とか引っかかった。 大学関連でないとHandyGraphicsのライブラリとか入手できない…んじゃないですかね? であれば、関係する大学生以外には回答もできないワケで……。 # だいたいHgwBoxFill関数の仕様すら不明なんですよ。 # ヘッダファイル掲示されれば、もしかしたら予想くらいは出来るかも知れませんが。(私はする気ありませんが)
関連するQ&A
- プログラミングの質問です
下のプログラムは入力した4つ数字を円グラフで表示するものでこのプログラムをもとに棒グラフで表示するように変換しなくてはならないのですがHgwBoxFill関数を使うらしいのですがいろいろ試行錯誤してみてもできないのでどなたか教えてくれませんか? 1: /* プログラム始め */ 2: #include <stdio.h> 3: #include <math.h> 4: #include "handy.h" 5: 6: /* プロトタイプ宣言 */ 7: void draw_graph(int w, double start, double val, char *str); 8: 9: int main(void) 10: { 11: int w; /* ウィンドウID */ 12: int c; /* 文字入力用 */ 13: double XBASE = 100.0; /* ウィンドウ設定 */ 14: double YBASE = 100.0; 15: double WINSIZE = 500.0; 16: int in1, in2, in3, in4; /* グラフ表示する数値 */ 17: int total; /* グラフ表示する数値の総和 */ 18: double sum; /* グラフ表示する数値の累積 */ 19: double d1, d2, d3, d4; /* グラフ表示する数値の割合 */ 20: 21: /* グラフ表示する数値の読み込み */ 22: printf("四つの正整数を入力してください >> "); 23: scanf("%d %d %d %d", &in1, &in2, &in3, &in4); 24: 25: /* 各項がグラフ内で占める割合の計算 */ 26: total = in1 + in2 + in3 + in4; /* 総和の計算 */ 27: d1 = (double)in1 / (double)total; /* 割合の計算 */ 28: d2 = (double)in2 / (double)total; 29: d3 = (double)in3 / (double)total; 30: d4 = (double)in4 / (double)total; 31: 32: /* ウィンドウの生成 */ 33: w = HgWOpen(XBASE, YBASE, WINSIZE, WINSIZE); 34: 35: /* 線の幅指定 */ 36: HgWWidth(w, 3.0); 37: 38: /* グラフの表示 */ 39: sum = 0.0; /* 1項目めの表示 */ 40: HgWColor(w, HG_RED); 41: draw_graph(w, sum, d1, "A"); 42: 43: sum += d1; /* 2項目めの表示 */ 44: HgWColor(w, HG_BLUE); 45: draw_graph(w, sum, d2, "B"); 46: 47: sum += d2; /* 3項目めの表示 */ 48: HgWColor(w, HG_GREEN); 49: draw_graph(w, sum, d3, "C"); 50: 51: sum += d3; /* 4項目めの表示 */ 51: HgWColor(w, HG_ORANGE); 53: draw_graph(w, sum, d4, "D"); 54: 55: /* 最後に円表示 */ 56: HgWColor(w, HG_BLACK); 57: HgWCircle(w, 250.0, 250.0, 200.0); /* 外側の円 */ 58: 59: 60: printf("Push Any Key "); 61: c = getchar( ); 62: c = getchar( ); 63: 64: printf("Goodby!\n"); 65: 66: return 0; 67: } 68: 69: /* */ 70: /* グラフ表示する関数 */ 71: /* */ 72: void draw_graph(int w, double start, double val, char *str) 73: { 74: double x, y; /* 座標 */ 75: double rad; /* 角度 */ 76: 77: /* グラフの表示 */ 78: rad = 2.0 * M_PI * (start + val); /* 角度計算 */ 79: x = sin(rad) * 200.0 + 250.0; /* 座標計算 */ 80: y = cos(rad) * 200.0 + 250.0; 81: HgWLine(w, 250.0, 250.0, x, y); /* グラフ表示 */ 82: 83: /* 項目名の表示 */ 84: rad = 2.0 * M_PI * (start + val / 2.0); /* 角度計算 */ 85: x = sin(rad) * 120.0 + 250.0; /* 座標計算 */ 86: y = cos(rad) * 120.0 + 250.0; 87: HgWColor(w, HG_BLACK); 88: HgWText(w, x, y, str); /* 項目名表示 */ 89: 90: return; /* void型関数なので返り値なし */ 91: } 92: /* プログラム終わり */
- 締切済み
- C・C++・C#
- c言語超初心者です。2
#include <stdio.h> int main(void) { int na,nb, nc; int sum; double ave; puts("三つの整数を入力してください."); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("整数C:"); scanf("%d", &nc); sum=na+nb+nc; ave=(double)sum/3; printf("それらの合計は%5dです。\n", sum); printf("それらの平均は%5.1fです。\n",ave); return(0); } とういうのを作ったんですが、最後のそれらの合計は%5dとやりその5の意味は整数を10進法で少なくても5桁で表示とありますが、例えば1,2,3と入力しても合計は6とでて5桁ででないんですけど。そういう意味ではありませんか?あとave=(double)sum/3;のところをave=sum/3.0としても問題なくできるのですが、どっちでやったほうがいいとかはありますか?もしあったらその理由も教えてください。
- ベストアンサー
- C・C++・C#
- C言語のプログラミングについて質問です。
以下の文を出力して入力:に16進数を入れると10進数に変換した数値の小さい列順に並ぶプログラムを作りたいのですがうまく出来ません。 仕様は以下に記載します。 入力:__、__、__、__、__EnterKeyで結果を表示。 以下のバブルソートの文のどこをいじれば良いでしょうか? 返答宜しくお願いします。 #include <stdio.h> int main (void) { char data[256]; int val[100]; int i = 0; int work; int j; int k; printf("入力 = "); scanf("%s",data); for(i=0;i<100;i++){ val[i] = 0; } k=0; for(i = 0;i<100 ; i++){ if(data[i] == 0x00){ //data[i]がNULLだったら処理を抜ける k++; break; //enterキーでprintf出力 } else if(data[i] == ','){ //カンマだったら /*printf("%d\n",k);*/ k++; } else{ if(data[i] >= 'A' && data[i] <= 'Z'){ //data[i]にAからZが入ったら val[k] = val[k] *16 + data[i] -'A'+10; } else if(data[i] >= '0' && data[i] <= '9'){ //data[i]に0から9が入ったら val[k] = val[k] *16 + data[i] -'0'; } } } /* printf("k=%d\n",k); for(i=0;i<k;i++){ printf("出力 = %d\n",val[i]); } */ //バブルソート// for(i=0; i<k-1; i++) { if(val[i] < val[i+1]) { } else{ work = val[i]; val[i] = val[i+1]; val[i+1] = work; } } for(i=0;i<k;i++) { printf("出力 = %d\n",val[i]); } }
- ベストアンサー
- C・C++・C#
- c言語
#include<stdio.h> main(void) { int x; double y,sum; void p(double *); for(sum=0.0,x=1;x<10;x++){ sum+=1.0/p(&x); ここでエラーがでます。 } printf("%d\n",sum); } void p(double *y) { *y*=*y; } どうしてエラーがでるかわかりません。教えてください!
- 締切済み
- その他(学問・教育)
- C言語に詳しい方、教えていただけませんか?
n個の実数をキーボードから入力して総和を求めるプログラムを書いたのですが、結果が+NANとなってしまいます。 また、値をキーボードから入力する際、小数にするとすぐにプログラムが終了してしまいます。例えば、a[0]=1.0とすると、 a[1]=a[2]=a[3]=a[4]=合計は+NANと表示され終了してしまいます。 ちゃんと小数を入力でき、結果も正しく表示されるように間違いを指摘していただけませんか?よろしくお願いします。 (nは5としました) #include <stdio.h> #define n 5 double souwa(double a[n]); int main(void) { int i; double sum, a[n]; for(i=0; i<=n-1; i++){ printf("a[%d] = ",i); scanf("%d",&a[i]); } sum = souwa(a); printf("合計は%f\n",sum); return 0; } double souwa(double a[n]) { int i; double sum = 0.0; for(i=0; i<=n-1; i++){ sum += a[i]; } return sum; }
- ベストアンサー
- その他(学問・教育)
- プログラムについて(C言語)
#include<stdio.h> int main() { int i,n,total; for(;;){ /* 無限ループ*/ printf("整数n?"); /* nの値の表示 */ scanf("%d",&n); /* ifとbreakを使った終了判定 */ if(n<0)break; total=1; for(i=1;i<=n;i++){ printf("i=%d ",i); total*=i; /* total←total*i(階乗の計算) */ } printf("total=%d\n",total); /* totalの値(結果)の表示 */ } printf("Thanks\n"); /* 終了メッセージの表示 */ return(0); } これは階乗を求めるプログラムなのですが、i++ではなくi--をつかって求める場合 どのように変更すればよいでしょうか? for(i=1;i<=n;i++){ あたりをいろいろ弄ってみたのですが、求めてる結果は得られませんでした
- ベストアンサー
- C・C++・C#
- (C,C++言語)関数の引数は自動キャストされる?
プログラミング言語C,C++の数値計算に関する質問です. 整数データ変数同士のみの計算結果は小数点以下は切り捨てられますよね. もし実数型で計結果を得たいときは,int変数を(double)や(float)でキャストしてあげなければならないことは知っています. ここで,仮引数リストにdouble型変数が設定されている関数の引数にint型変数を与えた時,関数の呼び出し時にキャストしなくても自動でキャストされるのでしょうか. 以下のサンプルコードを作成し,実行してみた結果を次に示します. ---サンプル--- #include <iostream> using namespace std; void printDouble(double val, double val2) { cout << "(double)val = " << val / val2 << endl; } int main(void) { for (int i = 1; i < 5; i++) { cout << i / (i * 2) << endl; printDouble(i,i*2); } } -----実行結果---- 0 (double)val = 0.5 0 (double)val = 0.5 0 (double)val = 0.5 0 (double)val = 0.5 ------------------------- 関数の外での計算は整数に丸められてしまうので i / ( i * 2 ) 計算結果はゼロに,関数の中では与えられた i はdouble型として扱われるので小数点以下の値も残っているということですよね. この場合,printDouble関数へ整数を与えるときには printDouble( (double)i , (double)( i * 2 ) ); といったようにわざわざキャストしなくても自動で仮引数の型でキャストされて関数が呼び出されると理解してもよいのでしょうか. 実行結果から明らかだろ,思われてしまうかもしれませんが,何かの参考書に記述されているのを見たり,人からそう教わったわけではなく,また関数のオーバーロードのこともありますので,質問させて頂きました.よろしくお願いいたします.
- ベストアンサー
- C・C++・C#
- Cプログラミング
#include <stdio.h> main(){ int i; int n; double data[100]; double total; double average; printf ("# of data ="); scanf ("%d" , &n); for (i = 0; i < n; i++){ printf("data[%d] = ", i+1); scanf("%lf" , &data[i]); } total = 0; for (i = 0; i < n; i++){ total = total +data[i]; } average = total / n; printf("total = %g\n", average); for (i = 0; i < n; i++){ printf("data[%d] : %6.1f %%\n" , i+1, (data[i] - average) / average * 100.0); } } 上のプログラムに対し、増加率の代わりに標準偏差を計算し出力するように改造せよ。という課題が出たのですが、標準偏差の計算の仕方が分かりません。教えてください。 よろしくお願いします。
- 締切済み
- C・C++・C#
- C言語から質問です。
C言語から質問です。 /* main関数の中で初期化した配列 data[10]={60,30,70,25,20,9,92,55,20,10}; を関数 keisan() に引数として渡して、関数keisan()内で 平均値、最大値,最小値 を求め、その結果をmain関数に戻し、main関数内で 平均値、最大値,最小値を表示させるプログラムを作成せよ。 int keisan(const int data[], int data_kosuu, double answer[]) { return 0; } とする。 (注) プロトタイプ宣言を用いよ。 ヒント:平均値,最大値,最小値の3つの値を main関数に戻すやり方として、配列answer[]を使うとよい。 data_kosuu は、配列の要素数を与えるものです。 ヒント: (int型の変数)/(int型の変数)=int型の値です。 int型同士の割り算の答えANSWERをdoubleにしたい場合は、 ANSWER=(double)(int型の変数)/(int型の変数); と(double) キャストという操作をする必要がある */ #include <stdio.h> int keisan(const int data[], int data_kosuu, double answer[]); int main(void) { int i; int a[10]={60,30,70,25,20,9,92,55,20,10}; // この値を使ってください double ans[3]; keisan(a,10); /* keisan関数に配列と配列要素数を引数で与える */ for(i=0; i<10 ; i++) printf("a[%d]=%d\n",i,a[i]); printf("平均=%lf 最小値=%d 最大値=%d\n",ans[0],ans[1],ans[2]); return 0; } /* 合計・最大値・最小値を求める関数 */ int keisan(const int data[], int data_kosuu, double answer[]) { int i; int sum; int min,max; min=10; /* min の初期化 */ max=10; /* max の初期化 */ sum=0; /* 合計値の初期化 */ for (i=0; i<10 ; i++){ sum = sum+data[i]; if(data[i] > max) max=data[i]; if(data[i] < min) min=data[i]; } sum=sum/10; answer[0]=sum; answer[1]=min; answer[2]=max; } エラー error C2198: 'keisan' : 呼び出しに対する引数が少なすぎます。 とでて先に進めません。 教科書などを見ても間違いがわかりません; 虫食いになってるところを自分なりにやってみたため、 根本的に間違ってるかもしれませんが、 どうかアドバイスや指摘などをお願いします。
- ベストアンサー
- C・C++・C#
- C言語のプログラミングで困っています
C言語を勉強しています。まだまだ初心者で分からないことだらけなのですが、今回はファイル入出力の部分が分からず苦戦しています。 『100個の実数が入った2つのテキストファイルから数値を読み込み、 絶対値を求めるなどの計算をする』プログラムを作成しているのですが、 コンパイルし実行すると強制終了してしまいます。 プログラムは、 void main(void) { FILE *fp; double c[50000]; double d[50000]; double e[50000]; int n = 0; int m = 0; int i = 0; char fname[80]; char fname2[80]; printf("ファイル名 : "); gets(fname); if((fp = fopen(fname, "r")) == NULL){ printf("ファイルがオープンできません\n"); exit(1); } printf("\n"); while (fscanf(fp,"%lf",&c[i])!=EOF){ printf("%3d : %3lf",++n,c[i]); printf("\n"); i++; } printf("\n"); i=0; n=0; printf("ファイル名 : "); gets(fname2); if((fp = fopen(fname2, "r")) == NULL){ printf("ファイルがオープンできません\n"); exit(1); } printf("\n"); while (fscanf(fp,"%lf",&d[i])!=EOF){ printf("%3d : %3lf",++n,d[i]); printf("\n"); i++; } …(以下計算) のようになっています。 整数のデータで計算を行うと、正常に動くのですが…。 コンパイルしてもエラーが出ないので、どこが悪いのかわからず困っています。 どなたか教えていただけないでしょうか。お願いしますm(_ _)m
- 締切済み
- C・C++・C#