ページ 11

はじめまして

Posted: 2008年4月28日(月) 11:35
by uniuni
自分で作った問題なんですけど、用意された配列の文字数を数えて、文字数の多い順に並べるPGを作ってるんですけど、なかなかうまくいきません。どうすればいいでしょうか?

いまは、こんな感じです。

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

int main(void)
{
//変数の宣言と初期化
char name[5][10] = {"arita", "simojo", "chatani", "saitou", "otaku"};
char array[10];
int ii, jj, len;

for(ii=0; ii<5; ii++){
len = strlen(name[ii]);

if(len[ii+1] > len[ii]){
array[0] = len[ii];
len[ii] = len[ii+1];
len[ii+1] = array[0];
}
printf("%s %d文字\n", name, len);
}


return 0;
}

Re:はじめまして

Posted: 2008年4月28日(月) 15:55
by toyo
char* name[5] = {"arita", "simojo", "chatani", "saitou", "otaku"};
ソート後
name[0] = "chatani";
name[1] = "simojo";
name[2] = "saitou";
name[3] = "arita";
name[4] = "otaku";
としてname[ ] をソートするか
char name[5][10] = {"arita", "simojo", "chatani", "saitou", "otaku"};
int name_len[5];
int i;
for (i = 0; i < 5; i++) {
    name_len = i;
}
ソート後
name_len[0] = 2;
name_len[1] = 1;
name_len[2] = 3;
name_len[3] = 0;
name_len[4] = 5;

としてname_len[ ]をソートするようにしたらいいと思います。
ソートはバブルソートっぽいですが普通は2重ループになります。

Re:はじめまして

Posted: 2008年4月28日(月) 16:07
by バグ
こんな感じでしょうか?
#include <stdio.h>
#include <string.h>

int main(void)
{
	// 変数の宣言と初期化
	char name[5][10] = {"arita", "simojo", "chatani", "saitou", "otaku"};
	char array[10];
	int i, j, len;

	// ソート用ループ
	for (i = 0; i < 5; i++)
	{
		len = strlen(name); 

		for (j = 0; j < 5; j++)
		{
			if (len > (int)strlen(name[j]))
			{
				strcpy(array, name[j]);
				strcpy(name[j], name);
				strcpy(name, array);
			}
		}
	}

	// ソート結果表示用ループ
	for (i = 0; i < 5; i++)
	{
		printf("%s %d文字\n", name, (int)strlen(name)); 
	}

	return 0;
}

Re:はじめまして

Posted: 2008年4月28日(月) 16:22
by uniuni
ありがとうございました。

Re:はじめまして

Posted: 2008年4月28日(月) 16:24
by toyo
連続で失礼します
なぜarray[10]と配列を10個も用意してarray[0]しか使ってないのかと考えてたらひょっとして
#include <stdio.h>
#include <string.h>

int main(void)
{
	//変数の宣言と初期化
	char name[5][10] = {"arita", "simojo", "chatani", "saitou", "otaku"};
	char array[10];
	int ii, jj, len;
	for(ii=0; ii<4; ii++){
		for(jj=ii; jj<5; jj++){
		    if(strlen(name[jj]) > strlen(name[ii])){
		        strcpy(array, name[ii]);
		        strcpy(name[ii], name[jj]);
		       	strcpy(name[jj], array);
		    }
		}
	}
	for(ii=0; ii<5; ii++){
    	 printf("%s %d文字\n", name[ii], strlen(name[ii])); 
	}
	return 0;
}
というようなことがしたかったのでしょうか。
文字列の代入にはstrcpy( )を使います。

Re:はじめまして

Posted: 2008年4月28日(月) 17:10
by uniuni
これを文字数が同じなら名前順に並び替えるときはどうすればいいのでしょうか?

Re:はじめまして

Posted: 2008年4月28日(月) 17:53
by バグ
strcmp関数を調べてみましょう。

Re:はじめまして

Posted: 2008年4月28日(月) 18:03
by toyo
文字列の比較はstrcmp( )を使います
#include <stdio.h>
#include <string.h>

int main(void)
{
	//変数の宣言と初期化
	char name[5][10] = {"arita", "simojo", "chatani", "saitou", "otaku"};
	char array[10];
	int ii, jj;
	for(ii=0; ii<4; ii++){
		for(jj=ii; jj<5; jj++){
			if(strlen(name[jj]) > strlen(name[ii])){
				strcpy(array, name[ii]);
				strcpy(name[ii], name[jj]);
				strcpy(name[jj], array);
			}
			else if(strlen(name[jj]) == strlen(name[ii]) && strcmp(name[ii], name[jj]) > 0){
				strcpy(array, name[ii]);
				strcpy(name[ii], name[jj]);
				strcpy(name[jj], array);
			}
		}
	}
	for(ii=0; ii<5; ii++){
		printf("%s %d文字\n", name[ii], strlen(name[ii])); 
	}
	return 0;
}