バブルソートを使った問題です

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

バブルソートを使った問題です

#1

投稿記事 by 羽流布 » 18年前

有名人の姓をローマ字でn人分(n≧10)入力し,これをバブルソートで辞書式に昇順で整列し,結果を表示するプログラムを作れ.最初にnの値を入力すること.バブルソートはvoid bubble(char name[/url], int n)として実現させる.ここで,配列nameは姓を収納した文字列とし,文字列の比較などにはライブラリ関数を用いてよい.

 という問題なのですが、ネットで調べてもポインタを使用したものばかりで参考になりません。
 現在、ここまで出来てます。

#include <stdio.h>

void bubble(char name[/url], int n);

// メイン関数が未完成です
int main(void) {
char data[10][20], name[20];
int i, j, n;

printf("何人分?:n = "); scanf("%d", &n);
printf("有名人の姓を入力してください。\n");
for (i = 0; i < n; i++) {
scanf("%s", data[/url]);
}
return (0);
}

// バブルソート関数
void bubble(char name[/url], int n) {
int j, k, tmp;

for (j = 0; j < n; j++) {
for (k = n - 1; k > j; k--) {
if (name[k] < name[k-1]) {
tmp = name[k];
name[k] = name[k-1];
name[k-1] = tmp;
}
}
}
return;
}

 期限が明日までなので、とても焦っています。
 よろしくお願いします。

Hermit

Re:バブルソートを使った問題です

#2

投稿記事 by Hermit » 18年前

>void bubble(char name[/url], int n)として実現させる
問題は、本当にそうなってますか?
普通に考えると、それではできないはずなので、
void bubble(char *name[/url],int) とかではないでしょうか。
それだったら、ネットで調べたポインタを使用した物が使えるはずです。

管理人

Re:バブルソートを使った問題です

#3

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

こんにちは。
羽流布さん。このお名前はなんと読むのでしょうか??

期限が明日までと言う事で、急いでいる事理解します。
今回はちまちま説明しても、焦る気持ちが先に出て落ち着いて考えられないでしょうから、
今回だけ答えを先にお伝えします。
答えを教えてしまう事はこの掲示板の規約違反ですが、今回はその規約をやぶってお答えします。

しかし、一つだけ条件があります。
この以下のプログラムを改善して出来る3つのプログラムを作成してください。
3つ私から宿題を出しますので、それをやってくださいね。
答えをお伝えする代わりにこれだけはやってください、お願いします。
3つといっても以下のサンプルを改良したらいいだけでそんなに大変なものではありません。

一度私の書いたサンプルをじっくりみてください。
#include <stdio.h> 
#include <string.h>

void bubble(char name[10][20], int n) { 
	int j, k;
	char tmp[20];

	for (j = 0; j < n; j++) { 
		for (k = n - 1; k > j; k--) { 
			if (name[k][0] < name[k-1][0]) { 
				strcpy(tmp,name[k]); 
				strcpy(name[k],name[k-1]); 
				strcpy(name[k-1],tmp); 
			}
		}
	}
	return; 
}

int main(void) { 
	char data[10][20], name[20]; 
	int i,n; 

	printf("何人分?:n = "); scanf("%d", &n); 
	printf("有名人の姓を入力してください。\n"); 

	for (i = 0; i < n; i++)
		scanf(" %s", data); 

	bubble(data,n);

	printf("\n");

	for (i = 0; i < n; i++)
		printf("%s\n", data); 

	return (0); 
}

実行結果

何人分?:n = 4
有名人の姓を入力してください。
bleave
ain
ziv
fish

ain
bleave
fish
ziv
 
 
 
課題1
バブルソートではなく、単純ソートを用いた並び替えをするプログラムに改良してください。

課題2
scanfでは問題があるため、getchar関数を用いて1文字ずつ配列に格納するようにしましょう。また様々な行うべきエラー処理を必要な箇所に追加してください。例えば数値が入力されなければならないところに文字を入力するとエラーメッセージを出して終了するなど。

課題3
大文字と小文字が混ざっていても、ABC順にソートされるように改良してください。


以上3つです。もちろんわからなければ聞いてください。
明日の提出はサンプルを出せばいいはずです。
課題頑張ってください。

Hermit

Re:バブルソートを使った問題です

#4

投稿記事 by Hermit » 18年前

void bubble(char name[/url], int n)
に反しているので、
うるふさんに問題をもう一回確認してもらってからの方が良くないですか?>管理人さん

管理人

Re:バブルソートを使った問題です

#5

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

あら・・仕様を確認せず、単に示されているプログラムを自己流に改良しただけになってしまっていました。
書き直しますね(_ _||)
Hermitさんご指摘ありがとうございます。

しかも名前2文字目以降もチェックする必要がありましたね。

管理人

Re:バブルソートを使った問題です

#6

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

>バブルソートはvoid bubble(char name[/url], int n)として実現させる.ここで,配列nameは姓を収納した文字列とし,

という仕様の条件がわかりません・・。
文字列のそれぞれのアドレスの集合ならわかるんですが・・。
しかもポインタ利用してはいけないんですよね、、。

文字列の先頭アドレスの集合ということでないと私にはわかりません・・。
受け取る値は
void bubble(char *name[10], int n) {
私のやりかたでは、こうでなくてはなりません・・・。
つまり私の考えでは
void bubble(char name[10], int n) {
コレでは無理だということです。

d配列を用意するとするといかにようにかけると思うのですがコレではダメなんですよね。
考えて見ますけど、他の方の回答を待った方が早いかもしれません・・(_ _|||)
(((サンプルではまだ辞書順にはなってないです





#include <stdio.h> 
#include <string.h>

void bubble(char *name[10], int n) { 
	int j, k;
	char *tmp;

	for (j = 0; j < n; j++) { 
		for (k = n - 1; k > j; k--) { 
			if (*name[k] < *name[k-1]) { 
				tmp=name[k]; 
				name[k]=name[k-1]; 
				name[k-1]=tmp; 
			}
		}
	}
	return; 
}

int main(void) { 
	char data[10][20], name[20];
	char *d[10];
	int i,n; 

	printf("何人分?:n = "); scanf("%d", &n); 
	printf("有名人の姓を入力してください。\n"); 

	for (i = 0; i < n; i++){
		scanf(" %s", data);
		d=&data[0];
	}
	
	bubble(d,n);

	printf("\n");

	for (i = 0; i < n; i++)//
		printf("%s\n", d);

	return (0); 
}

 
 

羽流布

Re:バブルソートを使った問題です

#7

投稿記事 by 羽流布 » 18年前

 すいません、説明不足でした。問題は、

バブルソートは以下のアルゴリズムを組み込んだ関数 void bubble(char name[/url], int n) として実現せよ.
for (j = 0; j < n; j++) {
  for (k = n - 1; k > j; k--) {
    if (name[k-1]がname[k]より大) {
      name[k-1]とname[k]を交換する
    }
  }
}

ということになってます。

ポインタは習っていないので、使用してはマズいんですよ。
宿題なので使わなくても出来るようにはなってると思うんですけど……。

管理人

Re:バブルソートを使った問題です

#8

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

私の知識の中では

void bubble(char name[/url], int n) {
int j, k, tmp;
for (j = 0; j < n; j++) {
for (k = n - 1; k > j; k--) {
if (name[k] < name[k-1]) {
tmp = name[k];
name[k] = name[k-1];
name[k-1] = tmp;
}
}
}
return;
}

この関数を使っただけでソートする事は出来ません。
出来る事は出来るんですが、処理の面倒な形になってしまいます。
この関数は少しも変更してはいけないということなんでしょうか?

羽流布

Re:バブルソートを使った問題です

#9

投稿記事 by 羽流布 » 18年前

はい、問題に示されているバブルソートの関数を使ってやらないとマズいです。

Hermit

Re:バブルソートを使った問題です

#10

投稿記事 by Hermit » 18年前

先生の設問の仕方のミスか、羽流布さんの問題の転記ミスだと思われるので、
勝手に変えた方がいいですね。
以下、管理人さんの最初のサンプルをちょっと変更しただけの物です。
バブルソートはあまり考えてませんが・・・
出題通りでソートできてるから多分いいんじゃないかな(^^;
ポインタはいっぱい使ってはいますが、
#include <stdio.h> 
#include <string.h>
void bubble(char name[/url][20], int n) { 
	int j, k;
	for (j = 0; j < n; j++) {
		for (k = n-1; k > j; k--) {
			if (strcmp(name[k],name[k-1])<0) {
				char tmp[20];
				strcpy(tmp,name[k]); 
				strcpy(name[k],name[k-1]); 
				strcpy(name[k-1],tmp); 
			}
		}
	}
	return; 
}
int main(void) { 
	char data[10][20]; 
	int i,n; 
	printf("何人分?:n = "); scanf("%d", &n); 
	printf("有名人の姓を入力してください。\n"); 
	for (i = 0; i < n; i++)
		scanf(" %s", data); 
	bubble(data,n);
	printf("\n");
	for (i = 0; i < n; i++)
		printf("%s\n", data); 
	return (0); 
}

羽流布

Re:バブルソートを使った問題です

#11

投稿記事 by 羽流布 » 18年前

ありがとうございます!

とりあえず、これで提出することにします。

管理人さんが出題された問題は後日考えてみることにします。

管理人

Re:バブルソートを使った問題です

#12

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

>Hermitさん、

私には日本語が通じないのではないかと自分で思うくらい人の書き込みを見ていませんね・・。
Hermitさんの最初の書き込み
>>void bubble(char name[/url], int n)として実現させる
>問題は、本当にそうなってますか?
全然見ていませんでした・・。
何故これで出来るのか本当に悩んでましたが、先に答えだしていらっしゃいましたね(汗

2文字目以降の比較変更ありがとうございます。

羽流布さん、きっとその関数を参考に、または改良して使えということではないでしょうか?

よく考えてみてください。

「文字型」の変数には0~255までの数値しか入りません。
にもかかわらず、アドレスは255以上の値になります。
ですので、「文字列の場所」を表す事も出来ません。
また、1次元配列では文字列自体をいれることもできません。
つまり
「データの場所もあらわせず、本体自体も表せない」
という論理的に不可能だと言う事になります。

名前の最初の1文字だけを比較する事のみで来ます。
しかしそれでは辞書順になりません。

ですので、先生の出題ミスか、羽流布さんの把握ミスかどちらかだと思います。

私にもっと力があれば、みただけで不可能とか、可能とかわかるのでしょうが、力不足で回答があれこれなってすみませんでした(_ _|||)

閉鎖

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