• 締切済み

プログラミングの質問です

下のプログラムは入力した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: /* プログラム終わり */ 

みんなの回答

  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.1

開発環境や実行環境くらい書きませんか? 「HgwBoxFill関数」などいわれても、どの環境にもあるような関数ではありませんので知らない人にとっては何の事かわかりません。 私は「HgwBoxFill関数」のある環境は存じませんが、円で角度でパーセンテージを表してたのを棒で高さであらわせるようにすればよいだけではないですか?

関連するQ&A

  • 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端末がデスクトップ環境です

  • 関数の引数と実引数の取り扱いについて

    C言語初心者です. 関数の引数と実引数の取り扱いについて,教えていただきたいことがあります. 例えば,2変数の和を求める関数を考えると,以下のようになると思います. #include <stdio.h> double sum(double x, double y); int main(void) { double a, b, wa; a=2.0; b=3.0; wa=sum(a,b); return 0; } double sum(double x, double y) { double total; total=x+y; return total; } このとき,mainプログラムでは,a,bふたつの変数を定義しておいて,関数sumに入れて計算させているわけですが,mainプログラムで変数x,yを定義しておいて,以下のようなプログラムにするのはありでしょうか? 参考書などをみると,前者のように取り扱っているようなのですが,試しに後者で実行させてみても同じ結果となりました. #include <stdio.h> double sum(double x, double y); int main(void) { double a, b, wa; a=2.0; b=3.0; wa=sum(a,b); return 0; } double sum(double x, double y) { double total; total=x+y; return total; }

  • プログラミングについて

    目標 1.偏差値が一番良い学生の番号,科目A,B,C の得点,平均点,偏差値の表示. 2.合計点が181 点~210 点,211 点~240 点,241 点~270 点,271 点~300点 の学生の人数を数え,その度数分布の表示。 手順 1.クラスの標準偏差を求め,各学生の偏差値を求めよ. その結果を画面に出力する。 2.成績優秀者(偏差値が一番良い学生)を見つけよ. 一番が複数いる場合は全員表示せよ. 3.度数分布と2.ををResults.txt ファイルに出力せよ。 要素数4 のint 型配列を作成して0 で初期化し,一人ひとり数える. 最後に度数分布を作れ(度数分布を作る際にはif文を使わない). クラスのデータは与えられており、50人の2教科分の点数が与えられています。 これは構造配列を使い、Studentsに格納。もう1教科分の点数を整数の一様乱数により格納。 合計50人×3教科のテストデータの集計をするプログラムです。 というプログラミングを作りたいです。 途中まで作りましたが長くなりすぎてわからなくなりました。 どなたか教えてくださいお願いします。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define SIZE 50 struct students{ int No; int A; int B; int C; int Sum; double Avee; double hensa; }; double Average(int a){ double b; b=(double)a/3.0; return b; } double Hensachi(double a,double b,double c){ double d; d=(double)50+10*(a-b)/c; return d; } int main(void){ struct students Std[SIZE]; srand(1000); int i; double Ave,Sum=0,H,stand; FILE *file=fopen("Data.txt","r"); for(i=0;i<SIZE;i++){ fscanf(file,"%d",&Std[i].No); fscanf(file,"%d",&Std[i].A); fscanf(file,"%d",&Std[i].B); Std[i].C=(int)(rand()/(RAND_MAX +1.0)*31)+70; Std[i].Sum=Std[i].A+Std[i].B+Std[i].C; Std[i].Avee=Average(Std[i].Sum); Sum+=Std[i].Avee; } fclose(file); Ave=(double)Sum/(SIZE); for(i=0;i<SIZE;i++){ H+=(double)pow(Std[i].Avee-Ave,2); } stand=sqrt(H/50); for(i=0;i<SIZE;i++){ Std[i].hensa=Hensachi(Std[i].Avee,Ave, stand); printf("%4d,%3.1lf,%3.1lf\n",Std[i].Sum,Std[i].Avee,Std[i].hensa); } return 0; } 自分が作ったのはここまででです。

  • プログラミング 返り値

    #include <stdio.h> int sumn(double a); int main(void) { double b, answer; while(1){ printf("Input a number:"); scanf("%lf",&b); answer = sumn(b); printf("(4*3.14*a*a*a)/3=%f\n",answer); } return 0; } int sumn(double a){ double sum; sum=(4*3.14*a*a*a)/3; return sum; } これを実行してもwarning C4244: 'return' : conversion from 'double ' to 'int ', possible loss of dataと出てしまい小数点を切り捨てて表示されてしまいます。 どこが間違っているのでしょうか? 教えてくださいm(_ _ )m

  • 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]); } }

  • プログラミング(argcとargv)

    入力された数の合計とその計算式を表示するプログラムをつくっています。惜しい(?)ところまでいったのですがその先がなかなか進みません。以下のプログラムのどこを修正したらよいでしょうか?教えてください。 #include <stdio.h> #include <stdlib.h> #define nMAX 10 int main(int argc, char **argv){ int sum = 0; if(argc < 2){ printf("Too few option!\n"); return 1; } int i, n; for(i = 1; i < argc; i++){ n = atoi(argv[i]); sum = sum + n; } printf("%d\n", sum); }

  • このプログラミングって正しい?

    与えられた実行列X,Y,Z(配列名x、y、z)から、X-YZを計算して、行列W(配列名w)に格納するメソッドを完成する。 Public static void XminusXY( double[][] x,double[][] y,double[][] z, double[][] w){ double wij; int el=z[0].length, m=y.length, n=z.length; for(int i = 0; i<m; i++){ for(int j = 0; j<n-1; j++){ wij=xij for(int k=0; k<el; k++) wij += -y[i][k]*z[k][j]; w[i][j]=wij; } } }

  • 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); } } 上のプログラムに対し、増加率の代わりに標準偏差を計算し出力するように改造せよ。という課題が出たのですが、標準偏差の計算の仕方が分かりません。教えてください。 よろしくお願いします。

  • Arduino プログラミングのエラーについて

    現在、Arduino、4桁7セグメントLED(カソードコモン)、タクトスイッチ3つで、3人クイズ対決で利用する得点加算機を作成しています。 プログラムで、下記のようなエラーが出てしまいます。 invalid types 'int[int]' for array subscript このエラーに対して、何か解決策があればご教授お願い致します。 下記にプログラムを載せます。 const int first_BUTTON = 0; //プレイヤー1の得点ボタン const int second_BUTTON = 1; //プレイヤー2の得点ボタン const int third_BUTTON = 4; //プレイヤー3の得点ボタン const int anode_a = 12; //アノードに接続するArduinoのピン const int anode_b = 8; const int anode_c = 5; const int anode_d = 3; const int anode_e = 2; const int anode_f = 11; const int anode_g = 6; const int cathode_first = 7; // カソードに接続するArduinoのピン const int cathode_second = 9; const int cathode_third = 10; int val_1= 0; int val_2= 0; int val_3= 0; int old_val_1 = 0; int old_val_2 = 0; int old_val_3 = 0; // LEDの状態(0ならオフ、1ならオン) int state_first=0; int state_second=0; int state_third=0; int w; int N; // setup() は、最初に一度だけ実行される void setup () { // ピンを出力モードに設定する pinMode(first_BUTTON, INPUT); pinMode(second_BUTTON, INPUT); pinMode(third_BUTTON, INPUT); pinMode(anode_a, OUTPUT); pinMode(anode_b, OUTPUT); pinMode(anode_c, OUTPUT); pinMode(anode_d, OUTPUT); pinMode(anode_e, OUTPUT); pinMode(anode_f, OUTPUT); pinMode(anode_g, OUTPUT); pinMode(cathode_first, OUTPUT); pinMode(cathode_second, OUTPUT); pinMode(cathode_third, OUTPUT); } //LEDレイアウトを定義 boolean Num_Array[11][7]={ {1,1,1,1,1,1,0},//0 {0,1,1,0,0,0,0},//1 {1,1,0,1,1,0,1},//2 {1,1,1,1,0,0,1},//3 {0,1,1,0,0,1,1},//4 {1,0,1,1,0,1,1},//5 {1,0,1,1,1,1,1},//6 {1,1,1,0,0,1,0},//7 {1,1,1,1,1,1,1},//8 {1,1,1,1,0,1,1},//9 {0,0,0,0,0,0,0} //space }; //LED表示関数を定義 void NumPrint (int Number){ for (int w=0; w<=6; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } boolean Led_Array[3][3]={ {1,0,0,}, //LED1 {0,1,0}, //LED2 {0,0,1} //LED3 }; void Led_Active(int Number){ for(w=0;w<=2;w++){ digitalWrite(w+11,Led_Array[Number][w]); } } // loop() は、setup ()実行後、無限に実行される void loop(){ for(int i=0;i<=2;i++){ NumPrint(N[i]) } Led_Active(i); delay(5); } val_1 = digitalRead(first_BUTTON); NumPrint(state_first); //変化があるかどうかチェック if((val_1 == HIGH) && (old_val_1 == LOW)) { state_first = (state_first+1) % 10; NumPrint(state_first); delay(300); } delay(100); old_val_1 = val_1; val_2 = digitalRead(second_BUTTON); NumPrint(state_second); //変化があるかどうかチェック if((val_2 == HIGH) && (old_val_2 == LOW)) { state_second = (state_second+1) % 10; NumPrint(state_second); delay(300); } delay(100); old_val_2 = val_2; val_3 = digitalRead(third_BUTTON); NumPrint(state_third); //変化があるかどうかチェック if((val_3 == HIGH) && (old_val_3 == LOW)) { state_third = (state_third+1) % 10; NumPrint(state_third); delay(300); } delay(100); old_val_3 = val_3; }

  • 下記のプログラムを実行したところ、不正な処理をしたので強制終了しましたとでました。何故でしょうか?

    #include <stdio.h> #include <stdlib.h> #include <float.h> int main( void ) { int val; int sum = 0; int max = -DBL_MAX; int cnt; char FileName[FILENAME_MAX]; FILE *fp; printf("入力ファイル名>>>"); scanf("%s", FileName ); if( (fp = fopen( FileName, "r" )) == NULL ) { printf("ファイルが見つかりません------%s\n",FileName ); exit( EXIT_FAILURE ); } for(cnt=0; ;cnt++) { fscanf(fp,"%d",&val); /*合計を求める*/ if(val == 0) { break; } sum += val; /*最大値を求める*/ if( max < val) { max = val; } } if( cnt > 0) { printf("平均は%g,最大値は%dです\n",(double)sum / cnt, max); } fclose( fp ); return EXIT_SUCCESS; } コンパイルはできるのですが実行すると このプログラムは不正な処理をしたので強制終了しますとでました 入力ファイル名>>>ってのも表示されません やはりこれは僕のパソコンがおかしいのでしょうか? 何か原因があるのなら教えてください