課題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kk

課題

#1

投稿記事 by kk » 10ヶ月前

角度が0度からスタートし、5度ずつ増やしながら360までのsin値、cos値を求め、sinカーブとcosカーブを一緒に描くプログラムを作成するという課題です。
表示の仕様は
(1)表示の1行目には「角度」、「サイン値」「cos値」の文字と横線のために「-」を51個連ねて表示する。左端が-1、右端が1に相当する。
(2)
2行目以降は、角度、サインの値、cosの値、およびグラフの縦線もじ「|」、サイン、cosのプロット文字を表示してカーブを描いて行く。なお、サインは「*」、cosは「#」でプロットする。
(3)角度の表示式は、%3d、サイン値とcos値の表示は%6.3fを指定する。値が負になると負号がつくので桁数が勝手に1つ増える。このため、何もしないと各行の|がずれてしまうのでcos値の表示式の後に¥tを入れる。
char pbuf[60]を用意して、そこに*、#や|を入れていくのですがどうやっていいかわかりません。教えてください

コード:

#include<stdio.h>
#include<math.h>
int main (void)
{
  int i,j,x,k,y,t,genbun=5;
  double rad,cosvalue,sinvalue,pai=3.14;
   printf("==sin cos curve plot==");
 char pbuf[60] ;
 pbuf[51]='\0';
  printf("\n角度\tsin値\tcos値\t");
  for (i=0;i<=50;i++){
  printf("-",pbuf[i]);
  }
  for (j=0;j<=360;j+=genbun){ 
    rad=(pai*j)/180.0;
    sinvalue=sin(rad);
    cosvalue=cos(rad);
    printf("\n%3d\t%6.3f" "\t%6.3f\t",j,sinvalue,cosvalue);
    printf("|",pbuf[0]);
    x=(int)(sin(rad)*25+25);
   for(k=0;k<x;k++)
     printf(" ");
   printf("*");
     y=(int)(cos(rad)*25+25);
    for(t=0;t<=y;t++)
     printf(" ");
     printf("#");
  }
  printf("\n");
  return(0);
}

keito
記事: 33
登録日時: 3年前

Re: 課題

#2

投稿記事 by keito » 10ヶ月前

1. C言語では定数は#define、あるいはconstで定義した方がよいです。
また、math.hをインクルードしている場合は、M_PIでより精度の良い円周率を使うことができます。

コード:

#define GENBUN
2. printfでは文字列に変換指定子(%dとか%sとか)が無い場合には2個目の実引数をつける必要はありません(評価はされますが結果的に無視されます)。

コード:

  printf("-");
3. *と#の表示がずれているのはsinを一度printfでプロットした後、cosをまたprintfでプロットしようとしているからです。一度pbufを書き換えた後に一回だけprintfすると良いでしょう。

その他もろもろ書き換えると、こんな感じになります。適当に作ったので少し雑なところもありますが…。
もっとコードを見やすく~とか、こんな機能を~…とかがあれば返信するか自力で挑戦してみてください。

コード:

#include<stdio.h>
#include<math.h>
#include<assert.h>
#define GENBUN 5
#define Y_PLOT_LENGTH 50 //Y座標を描画する長さ
#define Y_MAX 1.0 //プロットするY座標の最大値
#define Y_MIN -1.0 //プロットするY座標の最小値

int main (void)
{
  int i,j,plotX,plotY;
  double rad,cosValue,sinValue;
  //pbuf[0]~pbuf[Y_PLOT_LENGTH]を描画に使う。
  //pbuf[Y_PLOT_LENGTH+1]は'\0'
  char pbuf[Y_PLOT_LENGTH+2] = {} ; 

  printf("==sin cos curve plot==\n");  //Ln.1
  printf("角度\tsin値\tcos値\t"); //Ln.2
  for (i=0;i<Y_PLOT_LENGTH+1;i++){
  printf("-");
  }
  printf("%s\n", pbuf);

  for (i=0;i<=360;i+=GENBUN){ //Ln.3~
    rad= i / 180.0 * M_PI;
    sinValue=sin(rad);
    cosValue=cos(rad);    
    printf("%3d\t%6.3f\t%6.3f\t",i,sinValue,cosValue);
    printf("|");
 
    for(j=0;j<sizeof(pbuf);j++){
      if(j!=sizeof(pbuf)-1){pbuf[j] = ' ';}
      else {pbuf[j] = '\0';}
    }

    plotX=(int)round((sinValue-Y_MIN)/(Y_MAX-Y_MIN)*Y_PLOT_LENGTH);
    plotY=(int)round((cosValue-Y_MIN)/(Y_MAX-Y_MIN)*Y_PLOT_LENGTH);

    assert(plotX >= 0 && plotX <= Y_PLOT_LENGTH);//プロットできなければエラー
    assert(plotY >= 0 && plotY <= Y_PLOT_LENGTH);

    pbuf[plotX] = '*';
    pbuf[plotY] = '#';
    pbuf[sizeof(pbuf) -1 ] = '\0';
    printf("%s\n", pbuf);
  }
  printf("\n");

  return(0);
}

keito
記事: 33
登録日時: 3年前

Re: 課題

#3

投稿記事 by keito » 10ヶ月前

keito さんが書きました:
10ヶ月前
すみません、

コード:

#define GENBUN
じゃなくて

コード:

#define GENBUN 5
でしたね…

kk

Re: 課題

#4

投稿記事 by kk » 10ヶ月前

返信ありがとうございます。またわからなければお願いします。

アバター
usao
記事: 1564
登録日時: 6年前

Re: 課題

#5

投稿記事 by usao » 10ヶ月前


返信

“C言語何でも質問掲示板” へ戻る