文字列を昇順で出力する

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

文字列を昇順で出力する

#1

投稿記事 by るるる » 11年前

入力した3人の名前を昇順(名簿順)に出力したいのですが、うまく表示できなくて困っています。
ご教授お願いいたします。これが私のつくったプログラムです。

コード:

#include	<stdio.h>

struct person{
	char	name[11];
};

struct person shoujun(struct person, struct person);

main()
{
	struct person	tbl[4],min=tbl[0];
	int		i;
	
	for(i=0 ; i<=3 ; i++){
		printf("名前?");
		scanf("%10s",&tbl[i].name[0]);
	}
	for(i=1 ; i<=3 ; i++)
		min = shoujun(min,tbl[i]);
	printf("%s\n",&min.name[0]);
}

struct person shoujun(struct person x, struct person y)
{
	if(x.name < y.name)
		return x;
	else
		return y;
}

超絶右留斗羅天才プログラマー
記事: 44
登録日時: 11年前

Re: 文字列を昇順で出力する

#2

投稿記事 by 超絶右留斗羅天才プログラマー » 11年前

名簿の一番先頭の方の名前が出力したくて試行錯誤されたみたいですね。
では、まずは名簿の一番先頭の方の名前を出してあげましょう。

①関数内のif文でやりたいことは分かりますが、書き方が違います。

コード:

    if(x.name < y.name)
        return x;
    else
        return y;
やりたいことはわかります。
プログラミング初心者はおろか、中級者でさえ同じ間違いをされます。
ひとまずここでは名前の先頭の文字で比較するために

コード:

    if(x.name[0] < y.name[0])
        return x;
    else
        return y;
とします。
もちろん、ここから先も改良が必要ですが、まずは名前の先頭の文字だけで比較するようにしてみましょう。

②min宣言時に値を入れるとエラー。
私のPCだけかも知れませんが、エラーが出ました。

③3人のデータを入れる場合は配列の要素数は3でよい。

コード:

    struct person   tbl[4],min;
とされていますが、3人分のデータのみ扱う場合は、

コード:

    struct person   tbl[3],min;
とします。あまり大きな問題ではないので直す必要はありません。

④それに伴ってfor文の真ん中の条件式も<=ではなく<を使う。

コード:

    for(i=0 ; i<=3 ; i++){
        printf("名前?");
        scanf("%10s",&tbl[i].name[0]);
    }
    for(i=1 ; i<=3 ; i++)
        min = shoujun(min,tbl[i]);
for文では、iの値が0,1,2,3と4つの値が使われます。
すなわち、4人分の処理を行おうとしています。
ですので、条件式を

コード:

    for(i=0 ; i<3 ; i++){
        printf("名前?");
        scanf("%10s",&tbl[i].name[0]);
    }
    for(i=1 ; i<3 ; i++)
        min = shoujun(min,tbl[i]);
こうするとiの値が0,1,2,となり、3人分の処理で済みます。

⑤minに値を入れるのは入力が終わった後。
名前の入力が全て終わった後に、

コード:

min = tbl[0];
とすると、minに最初の方の名前が入ります。
宣言時の代入では、最初の方の名前が入りません。

⑥main()
エラーが出ましたので、私のほうではvoid main()と書き換えました。

以上の6点を直すと、名簿の一番先頭の方の名前のみが出力されるプログラムになります。
また分からない点が出てきましたら、お気軽にご質問ください(*´▽`*)
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%

るるる

Re: 文字列を昇順で出力する

#3

投稿記事 by るるる » 11年前

超絶右留斗羅天才プログラマーさん、ありがとうございます。無事解決することができました!
質問文にタイプミスがありました。指摘及び丁寧な回答、感謝いたします。訂正させていただきます。
3人→× 4人→○

修正後のプログラムは以下のとおりになりました。

コード:

#include	<stdio.h>

struct person{
	char	name[11];
};

struct person shoujun(struct person, struct person);

main()
{
	struct person	tbl[4],min;
	int		i;
	
	for(i=0 ; i<=3 ; i++){
		printf("名前 年齢?");
		scanf("%10s",&tbl[i].name[0]);
	}
	min = tbl[0];
	for(i=1 ; i<=3 ; i++)
		min = shoujun(min,tbl[i]);
	printf("%s\n",&min.name[0]);
}

struct person shoujun(struct person x, struct person y)
{
	int		i;
	
	for(i=0 ; i<11 ; i++){
		if(x.name[i] != y.name[i]){
			if(x.name[i] < y.name[i])
				return x;
			else
				return y;
		}
	}
}


non
記事: 1097
登録日時: 13年前

Re: 文字列を昇順で出力する

#4

投稿記事 by non » 11年前

最初の一人だけでよかったのですか?昇順にしなくても?
strcmpは使ってはいけないという課題ですか?
non

box
記事: 2002
登録日時: 13年前

Re: 文字列を昇順で出力する

#5

投稿記事 by box » 11年前

るるる さんが書きました:名前を昇順(名簿順)に出力したい
この仕様を本当に満たしているのでしょうか。
私も、大いに疑問があります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

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