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); }