鬱屈、妄言過去のもの。いわゆる普通に価値あります

ブログやるならHatenaブログ.今を真摯に向き合って生きていく。

10個の任意の文字列を入力して(20文字以内)辞書順に並べるプログラムを作成せよ

タイトルのプログラムを編集しました.
タイトルのプログラムソースを作ってみました.
もっと短く書ける場合のご指南をいただけると幸い..

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

#define NUM_OF_WORDS 5
#define NUM_OF_LETTERS 20

void init_val(char (*x)[NUM_OF_LETTERS]);
//10個の文字列を入力引数にして,初期化する関数
void sort(char (*x)[NUM_OF_LETTERS]);
//入力した文字列を並び替える関数
void sort_only2(char (*check1), char (*check2));
//2つのみの文字列の比較を行う関数


int main(void)
{
	int i,j;
	char words[NUM_OF_WORDS][NUM_OF_LETTERS];
	init_val(words);
	//配列を初期化する
	sort(words);
	//並び替える

	//以下に結果を表示する
	printf("----------------------¥n");
	printf("After sort: ¥n",i+1);
	for(i=0;i<NUM_OF_WORDS;i++)
	{
		for(j=0;j<NUM_OF_LETTERS;j++)
		{
			if(words[i][j] == '¥0')
			{
				break;
			}
			else
			{
				printf("%c",words[i][j]);
			}
		}
		printf("¥n");
	}
}


void init_val(char (*x)[NUM_OF_LETTERS])
{
	int i, j;
	printf("Type %d words¥n",NUM_OF_WORDS);
	for(i =0;i < NUM_OF_WORDS;i++)
	{
		//for(j=0;j< NUM_OF_LETTERS;j++)
		//{
			scanf("%s",*(x+i) );
			//fgets((), NUM_OF_LETTERS, stdin);
		//}
	}

}

//文字列をバブルソートする
void sort(char (*x)[NUM_OF_LETTERS])
{
	int i,j;

	for(i=0; i<NUM_OF_WORDS; i++)
	{
		for(j=NUM_OF_WORDS-1;j > i; j--)
		{
			sort_only2(x[i],x[j]);//要説明
		}
	}

}

//2つのみの文字列の比較を行う
//機能として,check1のほうが辞書順で先にくるように入れ替える
void sort_only2(char *check1, char *check2)
{
	int i,j;
	char dummy;
	char dummy1;
	char dummy2;
	//交換の際に利用する変数
	int faster;
	//辞書順で先に来る文字列を記憶する変数
	for(i=0; ; i++ )
	{
		if(*(check1+i) == '¥0' && *(check2+i) == '¥0')
		{
			break;
		}
		//どちらも両方文字列の末端だったら終了する----------------------------

		if(*(check1+i) >='a' && *(check1+i) <='z')
		{
			dummy1 = *(check1+i) + ('A'-'a');
		}
		else
		{
			dummy1 = *(check1+i);
		}

		if(*(check2+i) >='a' && *(check2+i) <='z')
		{
			dummy2 = *(check2+i) + ('A'-'a');
		}
		else
		{
			dummy2 = *(check2+i);
		}
		//入力した文字が小文字の場合は大文字に変換したダミーの変数を

		if(dummy1 < dummy2)
		{
			faster = 1;
			break;
			//辞書順でcheck1が先に来ていた時終了
		}
		else
		{
			faster = 2;
			break;
			//辞書順でcheck2が先に来ていた時終了
		}

	}
//printf("BEFORE '%s' and '%s'¥n",check1,check2);

	//以下文字列の交換を行う
	if(faster == 2)
	{
		for(i=0; ; i++ )
		{
			if(*(check1+i) == '¥0' && *(check2+i) == '¥0')
			{
				break;
			}
			dummy = *(check1+i);
			*(check1+i) = *(check2+i);
			*(check2+i) = dummy;
			//文字の交換
		}
	}
//printf("AFTER '%s' and '%s'¥n",check1,check2);
}