ページ 11

C言語課題について

Posted: 2008年9月06日(土) 13:08
by せいじ
まだC言語を習い始めて半年ほどの初心者です。

テ ー マ  : 整数配列の計算

プログラム説明: 配列Xに整数をキーボードより入力し、0が入力されたときそ
         れまでに入力されたデータを降順にソートし、データ数、総和、
         平均を出力する。

補   足  : データ数、総和、平均の桁位置を揃える。ただし、平均は小数点
         以下4桁出力する。

出 力 例  :

データ入力
入力 X[0] ? 54
入力 X[1] ? 53
入力 X[2] ? 86
入力 X[3] ? 0

出力 X[0] = 86
出力 X[1] = 54
出力 X[2] = 53

データ数  = 3
総和    = 193
平均    = 64.3333

前回のナオユキさんと同じ課題なんですが、
ソートがうまくできません。
ほかの箇所は動くのですが、
入力した順番のまま表示してしまいます。

間違えている箇所の指摘をお願いします。
#include <stdio.h>

main()
{
	int    ia,ib,iw,ig,X[256];
	double hei;
	ia=ig=0;
	X[0]=0;
		printf("データ入力\n");
	while(1){
		printf("X[%d] ?",ia);
		scanf("%d",&iw);
		if(iw==0){
			break;
		}
        ib=ia;
		do{
			if(iw>=X[ib]){
				X[ib+1]=X[ib];
                ib--;
			}
		}while(ib<0&&iw<=X[ib]);
		X[ib+1]=iw;
        ia++;
	}
	for(ib=0;X[ib]!=0;ib++){
		printf("出力 X[%d] =%d\n",ib,X[ib]);
		ig+=X[ib];
	}
	hei=(double)ig/ia;
	printf("データ数 =%5d\n",ia);
	printf("総和     =%5d\n",ig);
	printf("平均     =%10.4f\n",hei);
}

Re:C言語課題について

Posted: 2008年9月06日(土) 13:38
by array
確認してないので、勘違いしてたらすみません

while(ib<0&&iw<=X[ib]);

ibが0未満なら実行になってるので、do-while完全無視してるような気がします。ibが0以上にしてあげればいいんじゃないですか?

while(ib>=0&&iw<=X[ib]);

また言いますが勘違いしてたらすみません~

Re:C言語課題について

Posted: 2008年9月06日(土) 13:38
by あっちゃん
投稿者による削除

Re:C言語課題について

Posted: 2008年9月06日(土) 13:46
by 管理人
せいじさん、すみませんが、こちらに一度ご連絡下さい。
dixqhp@gmail.com

管理人様へ

Posted: 2008年9月06日(土) 16:26
by せいじ
メールを送らせていただいたのですが、確認していただけましたでしょうか?

Re:管理人様へ

Posted: 2008年9月06日(土) 20:52
by 管理人
確認させていただきました。ご協力ありがとうございました。

上のプログラムでは入力するごとにソートを試みているのだと思いますが、
入力を全て終えてから、ソートする方法でも良いと思います。

まず、単純ソートのアルゴリズムを参考に、ソートを考えてみてはいかがでしょうか。

http://www.google.co.jp/search?hl=ja&q= ... %83%88&lr=

ソートの部分をこちらのアルゴリズムを参考に書き換える事は出来そうですか?

Re:管理人様へ

Posted: 2008年9月06日(土) 21:09
by フリオ
 
 タイトルは、内容がわかるものにしてほしい。
ソートが、どう上手くできないのか書いてほしい。

 とりあえず気づいたことだけ、
"while(...){***}"も"do{***}while(...)"も"(...)"の中に書くのは、終了条件ではなく、継続条件です。
 

自宅からです

Posted: 2008年9月07日(日) 15:14
by せいじ
管理人様をはじめ、多くの方から助言を頂きありがとうございます。
始めにフローチャートを書いた際に継続条件ではなく終了条件を書いてしまいそのまま記述してしまいました。
単純なことですが、終了条件を書くことに慣れてしまっていて気がつきませんでした。
さて、管理人様のご指摘ですが、入力→入力終了→ソート→出力というプログラムはできました。
あえて今回は面倒な方法をとったわけですが、やはり入力しつつソートすると言う方法はよくないのでしょうか?
私の中のイメージでは入力された整数を配列の一番最後の要素から比べていけばと思ったのですが。
最後に管理人様にご迷惑をおかけしたことを改めてお詫びいたします。

Re:自宅からです

Posted: 2008年9月07日(日) 19:14
by box
> 入力しつつソートすると言う方法

データ構造によるのではないでしょうか。
リスト構造であれば、その方法でよいかもしれません。
配列の場合、入れる場所を見つける手間はリスト構造の場合と
ほぼ同じだと思いますが、見つけた場所より後ろの要素を
一つずつ移動させねばなりません。その分だけ手間がかかります。

ところで、
自宅からのアクセスかどうかは、どうでもいい話です。
書いている「内容」にふさわしいタイトルを付けてほしいです。

Re:自宅からです

Posted: 2008年9月07日(日) 19:44
by 管理人
>やはり入力しつつソートすると言う方法はよくないのでしょうか?

今回別の方法をご紹介したのは、この方法がわかりにくそうだったのと、
入力は入力、ソートはソートで別々にしたほうが、
参考になるサイトなどのプログラムを引用したりして完成させることが
やり易いだろうと思った為です。

色んな方法でプログラムを作ることは大変勉強になりますから、
今回課題を完成されたら、違う色んな方法で同じ課題に取り組んでみて下さい。

「入力しつつソートする方法」が完成したら、このソートの方法を変えてみるといいでしょう。
http://www.ics.kagoshima-u.ac.jp/~fuchi ... algorithm/

ソートの方法には色んな方法があります。
単純ソートとクイックソートだけは最低限覚えておくと良いでしょう。
(クイックソートは概念が少し難しいですが、うちのサイトで解説アプリ配布しているのでよければ参考にして下さい。http://dixq.net/sort.html)

また、余力があればscanfはなるべく避けるべき関数だといわれていますから、
危険性の無い入力方法への改善を試みてみるのも良いでしょう。

何がよくないのか調べてみて下さい。
http://www.google.co.jp/search?hl=ja&q= ... =&aq=f&oq=

自分で意欲的に勉強していけば学校の宿題なんて問題じゃなくなると思いますし、
授業もより楽しくなると思いますb

Re:自宅からです

Posted: 2008年9月07日(日) 20:41
by たかぎ
scanfの危険性については、少し調べたぐらいでは真相にたどり着けません。
下手をすると、「scanfをやめてfgetsとsscanfを使うべし」という的外れな結論に達してしまいます。

念のため(手前味噌ながら)参考URLを貼っておきますので、ご自身でよく考えてみてください。
http://www.kijineko.co.jp/tech/supersti ... scanf.html

解決しました。

Posted: 2008年9月07日(日) 22:48
by せいじ
ソートの部分に関しては初心者の私には非常に難しく理解するのに時間がかかりました。
しかし多くの方の力添えによりなんとか課題を提出する事ができそうです。
私の理解が足りない部分が多くご迷惑をおかけしましたが、無事解決しました。
本当にありがとうございました。
少し背伸びしすぎたかもしれませんが良い勉強になったと思います。
本当に本当にありがとうございました。