C言語課題について

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

C言語課題について

#1

投稿記事 by せいじ » 17年前

まだ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);
}

array

Re:C言語課題について

#2

投稿記事 by array » 17年前

確認してないので、勘違いしてたらすみません

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

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

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

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

あっちゃん

Re:C言語課題について

#3

投稿記事 by あっちゃん » 17年前

投稿者による削除

管理人

Re:C言語課題について

#4

投稿記事 by 管理人 » 17年前

せいじさん、すみませんが、こちらに一度ご連絡下さい。
dixqhp@gmail.com

せいじ

管理人様へ

#5

投稿記事 by せいじ » 17年前

メールを送らせていただいたのですが、確認していただけましたでしょうか?

管理人

Re:管理人様へ

#6

投稿記事 by 管理人 » 17年前

確認させていただきました。ご協力ありがとうございました。

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

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

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

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

フリオ

Re:管理人様へ

#7

投稿記事 by フリオ » 17年前

 
 タイトルは、内容がわかるものにしてほしい。
ソートが、どう上手くできないのか書いてほしい。

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

せいじ

自宅からです

#8

投稿記事 by せいじ » 17年前

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

box

Re:自宅からです

#9

投稿記事 by box » 17年前

> 入力しつつソートすると言う方法

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

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

管理人

Re:自宅からです

#10

投稿記事 by 管理人 » 17年前

>やはり入力しつつソートすると言う方法はよくないのでしょうか?

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

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

「入力しつつソートする方法」が完成したら、このソートの方法を変えてみるといいでしょう。
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:自宅からです

#11

投稿記事 by たかぎ » 17年前

scanfの危険性については、少し調べたぐらいでは真相にたどり着けません。
下手をすると、「scanfをやめてfgetsとsscanfを使うべし」という的外れな結論に達してしまいます。

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

せいじ

解決しました。

#12

投稿記事 by せいじ » 17年前

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

閉鎖

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