助けてください。

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

助けてください。

#1

投稿記事 by ももにー » 16年前

入力された10個の整数を小さい順に並べ替えて出力する。
1,学生番号が偶数の人は小さい順(昇順)に並べ替える。
2,学生番号が奇数の人は大きい順(降順)に並べ替える。

という課題が出されました。
ある一部分を各自作成しなくてはならないのですが、
C言語にはまったく自信がありません。
以下のプログラムが何をやっているのかさえ理解できません。
かなりの問題児ですが、よろしくお願いします。
/************
sort 10 data
*************/
#include<stdio.h>
#define MAX 10

void inputnum(int num[/url]);
void sortnum(int num[/url]);
void outputnum(int num[/url]);

main(){
	int num[MAX];
	
	inputnum(num);
	sortnum(num);
	outputnum(num);
	return(0);
}
/***********************
input 10 numbers to arry
***********************/
void inputnum(int num[/url]){
	int i;
	for(i=0;i<MAX;i++){
		printf("数値%d"=",i+1);
		scanf("%d",&num);
	}
	printf("数値入力完了\n");
}
/*************
sort 10 number
*************/
#define FON 1
#define FOFF 0
void sortnum(int num[/url]){
	int i;
	int sflg;/*sort flag*/
	int work;/*work area for sorting*/
	sflg=FON;/* sort flag on */

while(sflg){
	sflg=FOFF;/*sort sflg off */
for(i=0;i<MAX-1;i++){
	if(num>num[i+1]){

以下からが各自考えるところです。
自分なりに作ってみましたが、さっぱりです。
手直ししていただけると嬉しいです。
		work=num[n];
		num[n]=num[n+1];
		num[n+1]=work;
	}
}

printf("並べ替え完了\n");
}
/*************************
output 10 number from arry
*************************/
void outputnum(int num[/url]){
	int i;
	
	for(i=0;<MAX;i++){
		printf("数値%d=%d\n",i+1,num);
	}
	printf("数値出力完了\n");
}

non

Re:助けてください。

#2

投稿記事 by non » 16年前

>以下からが各自考えるところです。
>自分なりに作ってみましたが、さっぱりです。
>手直ししていただけると嬉しいです。

とりあえず、この部分に
sflag=FON;
と書いて、プログラムをコンパイルし、エラーをなくしてください。
その後、わからないことを質問して下さい。

box

Re:助けてください。

#3

投稿記事 by box » 16年前

> 入力された10個の整数を小さい順に並べ替えて出力する。
> 1,学生番号が偶数の人は小さい順(昇順)に並べ替える。
> 2,学生番号が奇数の人は大きい順(降順)に並べ替える。

問題文が、仮に

入力された10個の整数を並べ替えて出力する。
1,学生番号が偶数の人は小さい順(昇順)に並べ替える。
2,学生番号が奇数の人は大きい順(降順)に並べ替える。

だったら理解できるのですが、原文だと
学生番号が奇数の人はどうすればいいかわからなくて
苦労するのではないでしょうか。

s-rush

Re:助けてください。

#4

投稿記事 by s-rush » 16年前

パッと見た感じですが、文法的にも間違いがあるようですよ。

質問前にちゃんとコンパイルしましたか?


>main(){
int main(void){

>printf("数値%d"=",i+1);
 printf("数値%d=",i+1);


>work = num[n];
>num[n] = num[n+1];
>num[n+1] = work;
 変数nが定義されていません。

>for(i=0; <MAX; i++){
for(i=0; i<MAX; i++){

期待している結果が得られるかどうかは別ですが、(このプログラムではちゃんとソートされませんが^^;)
これでエラーは外れるはずです。

boxさんのおっしゃるように原文の問題だと矛盾があるような気がします。
なので、昇順にソートするということで話を進めさせていただきます。

sortnum関数内のwhile文がありますよね??
ももにーさんの書き方だと、while文の中身は1度しか実行されません。
たとえば入力された値が
 3 2 5 4
とします。(面倒なので4入力とさせてください)

それでこのプログラムを実行させると
 2 3 5 4
となり、ちゃんとソートされていません。
while内のどこかで、
 sflag=FON;
とする必要があります。

それともう1つ。
これも実行例を示した方がいいですかね。
たとえば入力された値が
 3 4 1 5 6
とします。
同様にこのプログラムを実行させると、(上記の修正をしたとします)
3 1 4 5 6
となり、ソート不十分です。

>for(i=0;i<MAX-1;i++){
この後にもう1行for文である処理を加える必要があります。

ソートの手法としては様々なアルゴリズムがありますが、一度
“バブルソート”
でググってみてください。
調べるとおそらく何を追加しなければいけないか見えてくると思います。

non

Re:助けてください。

#5

投稿記事 by non » 16年前

>>for(i=0;i<MAX-1;i++){
>この後にもう1行for文である処理を加える必要があります。

whileがその代わりをしています。
バブルソートに似ていますが、ちょっと違います。
名前はなんと呼ぶか知りません。

s-rush

Re:助けてください。

#6

投稿記事 by s-rush » 16年前

すいません。
大きな勘違いをしてました。
while文の条件で
>sflg = FON;
は関係ないですね^^;

ここに訂正してお詫びしますm(_ _)m

ソートのアルゴリズムが分かれば、あとは入力された値が
奇数なのか偶数なのかを判断し、それぞれに対応した処理を行うように
すればいいのではないでしょうか?

s-rush

Re:助けてください。

#7

投稿記事 by s-rush » 16年前

nonさん、ご指摘ありがとうございます。
よく考えてみれば、while文の意味がないですね^^;

sflgを切り替えるのであれば、おっしゃる通りバブルソートではないです。
すいませんでした。

lbfuvab

Re:助けてください。

#8

投稿記事 by lbfuvab » 16年前

qsortって使ったら駄目ですか?

ももにー

無題

#9

投稿記事 by ももにー » 16年前

みなさんこの課題に真剣に取り組んでくださって、
本当にありがとうございます。

みなさんの回答をじっくり読ませていただきましたが、
何から始めたらよいか、また、何を入力したらよいか、
わかりません(´;ω;`)

理解力が乏しいですが、根気強く教えていただけると嬉しいです。

array

Re:助けてください。

#10

投稿記事 by array » 16年前

> 1,学生番号が偶数の人は小さい順(昇順)に並べ替える。
> 2,学生番号が奇数の人は大きい順(降順)に並べ替える。

ちなみに、この文は直接問題には関係なく、ももにーさんの学籍番号に関係するのでしょうか?
もし、そうだった場合、ももにーさんの学籍番号が奇数か偶数か示していた方が、良い気がします。


問題についていまいち理解してませんが、単純に10個の入力した数値をソートするプログラムにしてみました。

最近C言語に触れてなかったので自身は無なく、元のソートとは多分違う形式のソート方式を使ってると思います。(昇順)でソートしてます。
元のソート、プログラムではwhile文を使っていますが
今回の場合、配列要素は
#define MAX 10
で10個と定義されているのでfor文を使った形の方が良いのでは?って事でforを使って考えました。

※あまり関係ない部分は文字を小さくしています。
/************
sort 10 data
*************/
#include<stdio.h>
#define MAX 10

void inputnum(int num[/url]);
void sortnum(int num[/url]);
void outputnum(int num[/url]);

main(){
	int num[MAX];
	
	inputnum(num);
	sortnum(num);
	outputnum(num);
	return(0);
}
/***********************
input 10 numbers to arry
***********************/
void inputnum(int num[/url]){
	int i;
	for(i=0;i<MAX;i++){
		printf("数値%d=",i+1);
		scanf("%d",&num);
	}
	printf("数値入力完了\n");
}

/*************
sort 10 number  ソート部分
*************/
void sortnum(int num[/url])
{
	int i,j;
	int work;/*work area for sorting*/

	for(i=0;i<MAX;i++)			//配列[0]から比較する
	{
		for(j=i;j<MAX;j++)			//
		{
			if(num > num[j])	//小さければ
			{
				work = num[j];	//小さい値を別保存
				num[j] = num;	//大きい値を入れ替え
				num = work;	//小さい値を入れ変える
			}
		}
	}
	printf("並べ替え完了\n");
}
/*************************
output 10 number from arry
*************************/
void outputnum(int num[/url]){
	int i;
	
	for(i=0;i<MAX;i++){
		printf("数値%d=%d\n",i+1,num);
	}
	printf("数値出力完了\n");
}

------------------------------------------------

#####入力情報#####
数値1=5
数値2=6
数値3=4
数値4=2
数値5=2
数値6=3
数値7=9
数値8=1
数値9=8
数値10=7

#####実行結果#####
数値1=1
数値2=2
数値3=2
数値4=3
数値5=4
数値6=5
数値7=6
数値8=7
数値9=8
数値10=9

ももにー

Re:助けてください。

#11

投稿記事 by ももにー » 16年前

>>arrayさん
ありがとうございます。
私の学生番号は偶数です。

arrayさんの回答を参考に入力してみましたが、
コンパイルに失敗します。
というか、みなさんに助けていただく前から、
コンパイルに失敗しています。

やっぱりコンパイルって正確に入力されないと成功しないものですよね?

array

Re:助けてください。

#12

投稿記事 by array » 16年前

赤文字のみの修正だけではなく
プログラム全体をコピーして貼り付けてコンパイルしてみて下さい。(白文字の小文字部分)
printfに数か所ミスがあったので修正しておきました。

もしくは、赤文字の//以降を削除してから再度コンパイルしてみて下さい。
//以降はコメントです。
コンパイラ(コンパイルソフト)によって、「//」スラッシュを2個を用いるコメントが使えないものがあるみたいです。(C言語では普通は使えないみたいですけどC++コンパイラなら大丈夫だと思います)

ももにー

Re:助けてください。

#13

投稿記事 by ももにー » 16年前

>>arrayさん
たびたびありがとうございます。

arrayさんのをコピーさせていただいて、このようになりました。
/************
 sort 10 data
 *************/
 #include<stdio.h>
 #define MAX 10
 
 void inputnum(int num[/url]);
 void sortnum(int num[/url]);
 void outputnum(int num[/url]);
 
 main(){
 	int num[MAX];
 	
 	inputnum(num);
 	sortnum(num);
 	outputnum(num);
 return(0);
 }
 /***********************
 input 10 numbers to arry
 ***********************/
 void inputnum(int num[/url]){
 	int i;
 	for(i=0;i<MAX;i++){
 		printf("数値%d=",i+1);
 		scanf("%d",&num);
 	}
 	printf("数値入力完了\n");
 }
 
/*************
 sort 10 number
 *************/
 void sortnum(int num[/url])
 {
 	int i,j;
 	int work;/*work area for sorting*/
 
 	for(i=0;i<MAX;i++)
 	{
 		for(j=i;j<MAX;j++)
 		{
 			if(num > num[j])			
 			{
 				work = num[j];
 				num[j] = num;
 				num = work;
 			}
 		}
 	}
 	printf("並べ替え完了\n");
	
/*************************
 output 10 number from arry
 *************************/
 void outputnum(int num[/url]){
 	int i;
 	
 	for(i=0;i<MAX;i++){
 		printf("数値%d=%d\n",i+1,num);
 	}
 	printf("数値出力完了\n");
 }


ソート部分のエラーは無くなったようなのですが、
まだ出力部分にエラーがあるようでコンパイルに失敗します。

どのようにしたらよいのでしょう?

ももにー

Re:助けてください。

#14

投稿記事 by ももにー » 16年前

>>arrayさん!!
今見なおしたらちょっと抜けてて、直したらできました(感動)!!

arrayさん
s-rushさん
lbfuvabさん
nonさん
boxさん

ご協力本当にありがとうございました。
またの機会がありましたらぜひよろしくお願いします(´;ω;`)

box

Re:助けてください。

#15

投稿記事 by box » 16年前

sortnum関数がきちんと閉じていないことが原因です。

ももにー

Re:助けてください。

#16

投稿記事 by ももにー » 16年前

解決です。

array

Re:助けてください。

#17

投稿記事 by array » 16年前

コンパイル時のエラーはどんなものでしょうか?
一応こちらで確認してみたところ以下の様になっていました。

test.c(56) : error C2143: 構文エラー : ';' が '型' の前にありません。

()の中は行数を示しているので、その56行目付近が怪しいです。
エラーは自分で解決して慣れるのが一番いいと思いますが・・・・




調べてみたところ「}」が抜けてるみたいです。

/* ~省略~ */
 	}
 	printf("並べ替え完了\n");
}
/*************************
 output 10 number from arry
 *************************/
 void outputnum(int num[/url]){
/* ~省略~ */




----追記----
解決してましたか♪
C言語は興味持てれば、独学でも理解できるので、ぜひこれからもC言語取得頑張って下さい^^
C言語が分かるようになれば、管理人さんが公開している、ゲームプログラミングの館を参考に
自作のゲームなどが作れて楽しいですよ^^

non

Re:助けてください。

#18

投稿記事 by non » 16年前

ちょっとみないうちに解決した事になってますが、
課題は while(sflg)を使って解かなければいけないのでしょ!!
forの2重ループにして、選択法(だったかな?)にしてしまったらまずいでは?
一番最初に私が、言ったように、下の1行を加えて、エラーを直せばいいって言ったのに。
while(sflg){
	sflg=FOFF;/*sort sflg off */
	for(i=0;i<MAX-1;i++){
		if(num>num[i+1]){
			sflg=FON;
			work=num;
			num=num[i+1];
			num[i+1]=work;
		}
	}
}


この方法は、呼び方は知らないけどアリですよ。
sflagは並び替えが行われないときはFOFFのままなので、最初から並び替えられているときは
すぐに終わる特徴があります。
通常はforの2重ループとsflagを組み合わせて、両方使いますけど。

ももにー

Re:助けてください。

#19

投稿記事 by ももにー » 16年前

>>nonさん
わざわざありがとうございます。

折角ですので参考にさせていただきます。
本当に本当にありがとうございます。

閉鎖

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