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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

5889閲覧

C言語 一周期のsin関数の表示

Tosshi

総合スコア21

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/09/06 13:41

編集2018/09/06 13:53

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
C言語でsin関数y=sin(x)をプロットするプログラムができません。

該当のソースコードボールドテキスト

C言語 ソースコード #include<stdio.h> #include<math.h> void plot(double y){ double i=-1.0,Y; int I=-20,f=0,F=0; Y=sin(y); while(I<=20){ if(Y<i && f==0){ printf("*"); //printf("%.2f %.2f",Y,i); f=1; if(i==0 && f==1) F=1; } else if(0<=I && F==0){ printf("|"); F=1; } else{ printf(" "); } i+=0.05; I++; } puts(""); } int main(void){ double j; for(j=-M_PI;j<=M_PI;j+=0.1*M_PI) plot(j); return 0; } //f,Fの判定は1回しか*|を表示しないため

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

コード> 引用テキスト *| * | * | * | * | * | * | * | * | * | *| | * | * | * | * | * | * | * | * | * *|

ここの山の部分が平らになってしまう。
「|」の位置と「*」の位置が被った時*だけを表示するようにしたいです。

はじめ絵の質問です。わかりにくくてすみません。
回答お願いします

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

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

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

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

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

guest

回答3

0

ベストアンサー

一文字ずつ put するのでなく、
一行分の文字列を用意して、plot する位置を '*' で置き直してから、 printf するようにしてみました。
また、細かいところをいろいろ変更しています。

son.c

c

1#include<stdio.h> 2#include<math.h> 3 4#define N (20) // plot 時の [0..1] の分解能 5 6void plot(double y) { 7 char line[(N + 1) * 2]; 8 for (int i = 0; i < 2 * N + 1; i++) { 9 line[i] = ' '; 10 } 11 line[N * 2 + 1] = '\0'; 12 line[N] = '|'; 13 14 int p = N + (int)(N * y); 15 line[p] = '*'; 16 printf("%s %2d %f\n", line, p, y); 17} 18 19 20int main(void) { 21 for (int i = -10; i <= 10; i++) { 22 plot(sin(M_PI * 0.1 * i)); 23 } 24 return 0; 25} 26

実行結果
イメージ説明

追記
変更内容のポイントは次の点です。
for で 不動小数の足し算を繰り返ししているのをやめる。 --> 計算誤差が蓄積していくのを避けるため。
plot() の中で sin 計算をするのをやめる --> plot() と他の式(cosin や tan とか) の場合に利用できないから。

投稿2018/09/06 21:48

編集2018/09/07 15:57
katoy

総合スコア22324

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

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

0

コードとか、スペースが入っているテキストは、<code>ボタンを押して’’’の枠の中に貼り付けるときちんと表示できます
質問は編集できるので、やってみてください

投稿2018/09/06 13:43

y_waiwai

総合スコア87719

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

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

Tosshi

2018/09/06 13:55

ご指摘頂き有難うございます
guest

0

この条件式ですが、

  • else if(0<=I && F==0){

実際には I が 0 のときだけ見ればいいので、

  • else if(0==I && F==0){
  • else if(0==I){

とかにすると想定どおりになります。
後者のFなしバージョンの方がシンプルで良いと思います。
(Fで制御しなくても、 else のおかげで I == 0 の位置に * が入ったときはここは実行されない。)


質問者様のコードも一見動きそうですが、よく見ると if(I==0 && f==1) F=1; と書くべきところを if(i==0 && f==1) F=1; とタイポしてます(Iの大文字小文字)。

投稿2018/09/06 13:50

編集2018/09/06 14:00
set0gut1

総合スコア2413

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

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

Tosshi

2018/09/06 13:55

「|」、「*」に関して解決しました。有難うございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問