助けてください。。。

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

助けてください。。。

#1

投稿記事 by 鈴木萌々 » 16年前

18日までにやらなければならないレポートがあるのですが、
他のテスト勉強などなどに追われて頭の弱い私にはよくわかりません。。。
どなたか回答を教えてくださると助かります!

以下内容です。

【問題1】

3次方程式
x^3-0.5=0及び2x^3+7x^2+5x+3=0
の実数解を,以下のステップを踏むことにより,数値的に求めよ.

(1) 下のプログラムの,22行目から35行目を,そっくりそのまま,35行目の下に,5~10回コピーしたプログラムを実行してみよ.
プログラムを保存するディレクトリ及びファイル名は各自で適当に決めること.
(表は添付しておきます)


(2) (1)で作ったプログラムの出力をよく見て. 出力が下の行に進むにつれ,"Xc"列の値が"誤差"列の誤差の範囲内で
x^3-0.5=0の解に近づいていることを確認し,なぜそうなるのかを理解せよ(参考).

(3) (1)で作ったプログラムを,while あるいは for 文による繰り返し処理を使って,同じ文がなるべくプログラム中に重複して出てこないように修正し,
解を誤差 0.0001 以内で求めよ.
その際,同じ意味を持つ定数もなるべく重複して出てこないようにする等,わかり易く効率的なプログラムにする修正も含めるものとする.
出力の形式は自由で良いが,わかりやすくすること.さらに,プログラムにはある程度のコメントを入れること.
元から入っているコメントは削除して構わない.

(4) (3)で作ったプログラムを参考にし,
2x^3+7x^2+5x+3=0の実数解を,誤差 0.00005 以内で求めるプログラムを作れ(保存するディレクトリ及びファイル名は各自で適当に決めること).
(3) 同様,出力の形式は自由で良いが,見やすい出力とすること.プログラムにはある程度のコメントを入れること.

【問題2】

問題1(3),(4)で作成した2つのプログラムについて,
・ソースプログラムの表示
・コンパイル・リンク
・プログラムの実行
を,連続的に自動実行する機能を持ったシェルスクリプト report2 を ~/scripts というディレクトリに作れ.その際,以下の指示に従うこと.
・問題1(3),(4)のソースプログラムを保存するディレクトリ及びファイル名は,上述したように各自で適当に決めること.
・シェルスクリプトは,必ず,~/scripts/report2 に作成すること.
・report2は,起動ディレクトリに依存せずに動作するようにすること.
・プログラム及びシェルスクリプトreport2には,必ず,ある程度のコメントを入れること.
・echo コマンド等を使って,シェルスクリプトの出力が見やすくなるようにすること.
シェルスクリプトが完成したら,ターミナルで,
(cd ; date ; who ; cat scripts/report2 ; scripts/report2) > ~/report2.log
というコマンドを実行せよ(実行する前に,chmodコマンドによりreport2の保護モードを変更しておく必要があることに注意).
このコマンドにより,シェルスクリプトの内容と実行結果が,ホームディレクトリの"report2.log"というファイルに保存される.
情報処理センターの端末室では,UNIXのホームディレクトリを,WindowsのZドライブとして参照出来るので,
Windows上のメールソフトを使って,"report2.log"を添付ファイルとして,メールで提出せよ.アドレスは絶対に間違えないこと.
提出する前に,UNIX上で,"report2.log"の内容を参照し,シェルスクリプトが最後まできちんと動いていることを確認した方が良い.
 

なお,report2 と同様な機能を持ったシェルスクリプトの例をこのページの最後の部分に示す.例を参考にして考えてみよ.
下記の例を参考にするときは,このシェルスクリプトが
・ ~/programs の report2_0.c というファイルに保存されているCのソースプログラムを対象にしている.
・スクリプトは,起動するディレクトリに依存しないように,シェルスクリプトの中で,必要なディレクトリの移動を行っている.
・gcc コマンドの -o オプション を使って,実行プログラムの名前を,report2_0 としている.
・echo コマンドを使って,出力の中で,"Cプログラムの表示部分","プログラムの実行部分"が,多少でもわかりやすくなるようにしている.
のようなことをしていることに注意し,必要だと思われる部分を流用すると良い.

バグ

Re:助けてください。。。

#2

投稿記事 by バグ » 16年前

ここの掲示板の規約を読んでみてください。
課題の丸投げは禁止ですよ。

mnkr

Re:助けてください。。。

#3

投稿記事 by mnkr » 16年前

C言語を勉強中の者です。

解答にはなりませんが、
この問題に酷似した問題をC言語の
勉強サイトで見かけた記憶があります。
解説も載っていましたが、わたしには理解不能でしたorz

non

Re:助けてください。。。

#4

投稿記事 by non » 16年前

2分法で検索したら、詳しい解説があります。
少しだけお手伝いしましょう。
>2x^3+7x^2+5x+3=0の実数解を,誤差 0.00005 以内で求めるプログラムを作れ
#include <stdio.h>
#include <math.h>

#define eps 0.00005
	
double f(double x)
{
	return 2*x*x*x+7*x*x+5*x+3;
}
int main(void)
{
	float xa,xb,xc;
	float ya,yb,yc;
	float initial_delta,dx;
	
	printf(" Xa         Xc          Xb        誤差       Ya        Yc        Yb\n");
	
	initial_delta=10.0;
	xa=-10.0;
	xb=xa+initial_delta;
	dx=initial_delta;
	do{
		dx/=2.0;
		xc=xa+dx;
		ya=f(xa);
		yb=f(xb);
		yc=f(xc);
		printf("%10.7f%10.7f%10.7f%10.7f%10.7f%10.7f%10.7f\n",xa,xc,xb,dx,ya,yc,yb);
		if((ya*yc)<0){
			xb=xc;
		}else{
			xa=xc;
		}
	}while(!(fabs(xa-xb)<eps));
	return 0;
}

box

Re:助けてください。。。

#5

投稿記事 by box » 16年前

> double f(double x)
> {
> 	return 2*x*x*x+7*x*x+5*x+3;
> }
> int main(void)
> {
> 	float xa,xb,xc;
> 	float ya,yb,yc;
> 	float initial_delta,dx;

doubleとfloatが混在していると、初学者のかたは混乱するかもしれません。
いずれかに統一するほうがよいと思います。できればdoubleに。

non

Re:助けてください。。。

#6

投稿記事 by non » 16年前

boxさんへ
うっかりでした。てっきり、doubleだと思って関数の方を作ってしまいました。
それに見直してみますと、終了条件が
>}while(!(fabs(xa-xb)<eps));
ではありませんね。
dx>epsです。

Dixq (管理人)

Re:助けてください。。。

#7

投稿記事 by Dixq (管理人) » 16年前

>質問者さん

2箇所で同じ事を書くのもあれなので、こちらでは省略します。
後、プログラムは画像ではなく、タイプするようにして下さい。
回答者がコピペで確認したりという事が出来ないです。

鈴木萌々

Re:助けてください。。。

#8

投稿記事 by 鈴木萌々 » 16年前

反応遅れて本当にすみません!
皆さんありがとうございます、ご指摘等も本当にすみません。
焦ってアップしたらいろいろ規約違反だったようで…それでもお助けいただいた皆様に感謝します。
お手伝い頂いた内容から頑張って課題仕上げたいと思います!
ありがとうございました。

閉鎖

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