穴埋め問題についてアドバイスをお願いします

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

穴埋め問題についてアドバイスをお願いします

#1

投稿記事 by ぽん » 17年前

久しぶりに顔を出させてもらいます。
前回の質問ではいろいろな方に教えてもらって、なんとか完成できました。
お礼の返事を書いていなかったので、失礼ではありますがこちらで御礼申し上げます。

今回の質問ですが、穴埋め問題についてアドバイスをいただきたいんです。
ドット演算子やアロー演算子を使用するところやtypedefを使っているので、自分ではよくわかりませんでした;
演算子の使い方がいまいちわからず、困っています。
ただ、答えを教えてもらうのでは自分にとってよくないと思いますので、アドバイスというか考え方とかを教えていただけたらと思います。
よろしくお願いします。
#include<stdio.h>

#define INPUT_MAX  3		/*情報入力件数*/
#define NAME_LENGTH 19		/*最大名前文字数*/

typedef struct data		/*情報構造体*/
{
	int number;		/*番号*/
	char name[NAME_LENGTH+1];	/*名前*/
}PERSON;

void input_data(/* 1 */);		/*1件分の情報を入力する関数*/
void sort_data(/* 2 */, int);	/*情報を番号の昇順に並べ替える関数*/

int main (void)
{
	PERSON member[INPUT_MAX];
	int cnt;

	for(cnt = 0 ; cnt < INPUT_MAX ; cnt++)
	{
		input_data(/* 3 */);		/*1件分の情報を入力*/
	}
	sort_data(/* 4 */, INPUT_MAX);		/*情報の番号を昇順に並べ替え*/

	printf("\n***** MEMBERS LIST *****\n");
	for(cnt = 0 ; cnt < INPUT_MAX ; cnt++)
	{				/*情報出力(ドット演算子使用)*/
		printf("%04d	%-*s\n", /* 5 */ ,NAME_LENGTH, /* 6 */);
	}
	return 0;
}

void input_data(/* 7 */ pmem)
{
	printf("\nInput Number : ");
	scanf("%d", /* 8 */ );	/*番号入力(直接メンバに代入・アロー演算子使用)*/

	printf("Input Name   : ");
	scanf("%s", /* 9 */);	/*名前入力(直接メンバに代入・アロー演算子使用)*/

}

void sort_data(/* 10 */ pmem, int max_cnt)
{
	int cnt1;
	int cnt2;
	/* 11 */ temp;		/*一時格納領域*/

	for(cnt1=0 ; cnt1 < max_cnt-1 ; cnt1++);
	{
		for(cnt2 = cnt1+1 ; cnt2 < max_cnt ; cnt2++)
		{			/*番号を昇順に並替え(アロー演算子使用)*/
			if( /* 12 */ > /* 13 */)	
			{		/*情報を入れ替え([/url]は使用しない)*/
				temp = /* 14 */;
				/* 15 */ = /* 16 */;
				/* 17 */ = temp;
			}
		}
	}
}
/*番号*/のところに答えを入れるようになっています。

管理人

Re:穴埋め問題についてアドバイスをお願いします

#2

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

こちらの問題、解らない書き方があるならそれさえ調べてしまえばとても簡単なので、力を抜いてチャレンジしてみてください。

void sort_data関数についてはこちらを
http://www.google.co.jp/search?hl=ja&q= ... %83%88&lr=

input_dataについてはscanfの使い方がわかっているという前提でこちらを
http://www.google.co.jp/search?hl=ja&q= ... %AD%90&lr=

調べて穴埋めして下さい。

main関数については、「このプログラムで何をしようとしているのか」を考えたら簡単にわかると思います。
例えば
input_data(/* 3 */);
の3に何を入れたらいいか・・。
現在何の変数にデータを入れようとしてるのでしょうか?
main関数で用意している変数は2つしかないですよね。どちらにデータを入れようとしているのか簡単にわかると思います。

と言うことは当然
sort_data(/* 4 */, INPUT_MAX);
もそのデータのわけですし、むしろINPUT_MAX個配列要素を用意している変数はひとつしか無いわけですから
他に大量に変数が用意してあろうとも、プログラムのアルゴリズムがわからなくとも、
どの変数か予測は出来ますよね。

バブルソートについては、もう決まった書き方があるので、それに準じて書き写せばいいだけですし、
後は構造体をポインタで扱うにはどのように書けばいいか、調べたらいいだけです。
がんばってください。

管理人

Re:穴埋め問題についてアドバイスをお願いします

#3

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

typedefの使い方がわからなければ、typedefでググって下さい。
構造体の渡し方など、わからなければ以下のサンプルコードを参考にしてください。
#include <stdio.h>
typedef struct{
	int number;
	char name[64];
}id_t;

void input_id(id_t *obj){
	obj->number=10;
}

int main(){
	id_t id[1];
	input_id(&id[0]);
	printf("%d\n",id[0].number);
	return 0;
}

実行結果

10

Re:穴埋め問題についてアドバイスをお願いします

#4

投稿記事 by » 17年前

>void input_data(/* 1 */); /*1件分の情報を入力する関数*/
>void sort_data(/* 2 */, int); /*情報を番号の昇順に並べ替える関数*/
これはプロトタイプ宣言についてですね~
「;」の位置に注目ですね!

>input_data(/* 3 */); /*1件分の情報を入力*/
>sort_data(/* 4 */, INPUT_MAX); /*情報の番号を昇順に並べ替え*/
これは引数が何か!って質問です。
考え方は…何もないと関係がなくなってしまう???

>printf("%04d %-*s\n", /* 5 */ ,NAME_LENGTH, /* 6 */);
表示したいものの設定ですね~
問題にする意図が分からんw
というか、答えも分からんw
%-*s これってなんだろ?(ぉぃ
「""」の中のものから判断しよう・・・できなかったけど。。

>void input_data(/* 7 */ pmem)
>void sort_data(/* 10 */ pmem, int max_cnt)
・・・忘れる可能性があるからかな???
型の宣言について・・・かな?

>scanf("%d", /* 8 */ ); /*番号入力(直接メンバに代入・アロー演算子使用)*/
>scanf("%s", /* 9 */); /*名前入力(直接メンバに代入・アロー演算子使用)*/
ポインタの使用の仕方について
大事ですね~(多分w

>/* 11 */ temp; /*一時格納領域*/
型宣言(←だからどうした

if( /* 12 */ > /* 13 */)
{ /*情報を入れ替え([/url]は使用しない)*/
temp = /* 14 */;
/* 15 */ = /* 16 */;
/* 17 */ = temp;
}
これがプログラミングですね~
考え方の復習かな?

まぁコンパイルして実行すればあってるかどうか分かるから、頑張ってね^^
若干愚痴は入ってるけど気にしないでね^^;A

管理人

Re:穴埋め問題についてアドバイスをお願いします

#5

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

>printf("%04d %-*s\n", /* 5 */ ,NAME_LENGTH, /* 6 */);
これについての書き方のうち

%-*sについてですが、これは表示の仕方を決めています。
表示フォーマットについては色々沢山の書き方があります。
まず、「マイナス」と書けば左寄せです。

%5dと書けば5つのスペースを使って右寄せですが
%-5dと書けば5つのスペースを使って左寄せです。

ここで、この「5」の部分がいつも変わるからプログラムで指定したいと言うとき、

「*」を使います。*には引数で値を渡します。

printf("%-*s",10,"12345");

これを実行してみたらわかるとおり、
「左寄せで10個のスペースを使って"12345"を表示」と言う意味になります。
わからない関数については、ググれば大抵解決します。
http://www.google.co.jp/search?hl=ja&q=printf&lr=

ぽん

Re:穴埋め問題についてアドバイスをお願いします

#6

投稿記事 by ぽん » 17年前

うあああ~~、ありがとうございます!
すごく助かりますv
まだちゃんと実行できてませんが・・・;
まずは・・・ググってしっかり熟読するところからやっています。
どうかな~と思って一応埋めてはみたものの、やはり違うようですので。

ちょっと見てやってくださいませ。(埋めたところのみですが)
1:PERSON *
2:PERSON *
3:&member[cnt]
4:&member[0]
5:&PERSON.number
6:&PERSON.name[0]
7:PERSON
8:&pmem->number  
9:&pmem->name[0]
10:PERSON*
11:int
12:cnt2-1(cnt2-1ではなくてmax_cnt-1なのかとも思うんですがどうでしょうか)
13:max_cnt
14:cnt2-1
15:cnt2-1
16:max_cnt
17:max_cnt

この内容で実行すると、8,9のところで「左のオペランドが'struct'型です。'.'を使用して下さい」
というエラーが出ました。アロー演算子で答える所なのでどうなっているのかさっぱりです;
他にもエラーが出まくりでしたが・・・。
まずはやっぱり熟読熟読・・・。

管理人

Re:穴埋め問題についてアドバイスをお願いします

#7

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

ちょっと今日は朝から頭痛がしてまともに考えられないのですが、埋めてみました。
コンパイルしてないので違うかもしれませんが、ちょっと試してみてください・・・。
まんま答えを書いてしまうことになってしまいましたが、がんばっていらっしゃるようですので、答え合わせ程度にご覧下さい。

あと、最初のコードに大きなミスがひとつあります。

ソート関数の中の1つのfor文の最初にコロンがつけてあるのでループしません。
括弧がある前にコロンをつけるとfor文はfor文の閉じ括弧からコロンまでをループ部だと考えます。
そして閉じ括弧からコロンまでに何もないので、何もしないループ文となっています。
私のコードと見比べてどこが違うか確認してください。

>>(cnt2-1ではなくてmax_cnt-1なのかとも思うんですがどうでしょうか)

について、アルゴリズムをまず理解されたらこのような疑問はなくなると思います。
あと、すみません、バブルソートでなく、単純ソートでしたね。
単純ソート でググって下さい。全く同じソートが出てきます。

答えを見て少しでもわからないところがあれば徹底的に調べてください
「答えがあったからいいや」では次に必ず困ります。

わからないところがあれば遠慮なくどうぞ。
#include<stdio.h>

#define INPUT_MAX 3		/*情報入力件数*/
#define NAME_LENGTH 19		/*最大名前文字数*/

typedef struct data		/*情報構造体*/
{
	int number;		/*番号*/
	char name[NAME_LENGTH+1];	/*名前*/
}PERSON;

void input_data(PERSON *);		/*1件分の情報を入力する関数*/
void sort_data(PERSON *, int);	/*情報を番号の昇順に並べ替える関数*/

int main (void)
{
	PERSON member[INPUT_MAX];
	int cnt;

	for(cnt = 0 ; cnt < INPUT_MAX ; cnt++)
	{
		input_data(&member[cnt]);		/*1件分の情報を入力*/
	}
	sort_data(member, INPUT_MAX);		/*情報の番号を昇順に並べ替え*/

	printf("\n***** MEMBERS LIST *****\n");
	for(cnt = 0 ; cnt < INPUT_MAX ; cnt++)
	{				/*情報出力(ドット演算子使用)*/
		printf("%04d	%-*s\n", member[cnt].number ,NAME_LENGTH, member[cnt].name);
	}
	return 0;
}

void input_data(PERSON *pmem)
{
	printf("\nInput Number : ");
	scanf("%d", &pmem->number );	/*番号入力(直接メンバに代入・アロー演算子使用)*/

	printf("Input Name   : ");
	scanf("%s", &pmem->name);	/*名前入力(直接メンバに代入・アロー演算子使用)*/

}

void sort_data(PERSON *pmem, int max_cnt)
{
	int cnt1;
	int cnt2;
	PERSON temp;		/*一時格納領域*/

	for(cnt1=0 ; cnt1 < max_cnt-1 ; cnt1++){
		for(cnt2 = cnt1+1 ; cnt2 < max_cnt ; cnt2++)
		{			/*番号を昇順に並替え(アロー演算子使用)*/
			if( pmem[cnt1].number > pmem[cnt2].number)	
			{		/*情報を入れ替え([/url]は使用しない)*/
				temp = pmem[cnt1];
				pmem[cnt1] = pmem[cnt2];
				pmem[cnt2] = temp;
			}
		}
	}
}

ぽん

Re:穴埋め問題についてアドバイスをお願いします

#8

投稿記事 by ぽん » 17年前

お世話になっております!
管理人さんに直接アドバイスがいただけて嬉しい限りです。
少しずつではありますが、C言語に対して理解が進んでいるかなと思います。
ソートに関してもだいぶ理解が深まりました。
まだまだ勉強不足ではありますが、ちょびちょびと前進しております。
未熟な自分にとって、出される課題の1つ1つが難解でパンクしそうですが;

また質問させてもらいに来ると思いますが、そのときはよろしくお願いします!

閉鎖

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