質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

[C言語]入力した5つの英単語を,辞書順に並べ替える

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 15K+

score 26

入力した5つの英単語を,辞書順に並べ替えるプログラムを作成せよ
というプログラムの課題が出ました。

一応の完成まで迎えたのですが、プログラムが長すぎて、分かりにくくなってしまいました。
どなたか、綺麗な書いたものを教えてください!
よろしくお願いします。

以下が作ってみたプログラムです。
------------------
#include<stdio.h>
#include<string.h>

void input(char str1[],char str2[],char str3[],char str4[],char str5[])
{
    printf("単語を入力:");
    scanf("%s",str1);
    printf("単語を入力:");
    scanf("%s",str2);
    printf("単語を入力:");
    scanf("%s",str3);
    printf("単語を入力:");
    scanf("%s",str4);
    printf("単語を入力:");
    scanf("%s",str5);
}


void swap(char s1[],char s2[])        //2つの文字列の交換
{
    char p[100];
    strncpy(p,s1,100);
    strncpy(s1,s2,100);
    strncpy(s2,p,100);
}

void bigtomini(char str[])
{
    for(int i=0;i<100;i++){
        if('A'<=str[i],str[i]<='Z'){
            str[i]+0x20;
        }
        if(str[i]==0){
            break;
        }
    }
}

void exchange(char s1[],char s2[],char s1mini[],char s2mini[])
{
    swap(s1mini,s2mini);
    swap(s1,s2);
}

void order(char str1[],char str2[],char str3[],char str4[],char str5[])
{
    char str1mini[100];
    char str2mini[100];
    char str3mini[100];
    char str4mini[100];
    char str5mini[100];
    
    strcpy(str1mini,str1);
    strcpy(str2mini,str2);
    strcpy(str3mini,str3);
    strcpy(str4mini,str4);
    strcpy(str5mini,str5);
    
    bigtomini(str1mini);
    bigtomini(str2mini);
    bigtomini(str3mini);
    bigtomini(str4mini);
    bigtomini(str5mini);
    
    if(strcmp(str1mini,str2mini)>0){
        exchange(str1,str2,str1mini,str2mini);        //1-2
    }
    if(strcmp(str2mini,str3mini)>0){
        exchange(str2,str3,str2mini,str3mini);        //2-3
    }
    if(strcmp(str3mini,str4mini)>0){
        exchange(str3,str4,str3mini,str4mini);        //3-4
    }
    if(strcmp(str4mini,str5mini)>0){
        exchange(str4,str5,str4mini,str5mini);        //4-5
    }
    if(strcmp(str1mini,str2mini)>0){
        exchange(str1,str2,str1mini,str2mini);        //戻って1-2
    }
    if(strcmp(str2mini,str3mini)>0){
        exchange(str2,str3,str2mini,str3mini);
    }
    if(strcmp(str3mini,str4mini)>0){
        exchange(str3,str4,str3mini,str4mini);
    }
    if(strcmp(str1mini,str2mini)>0){
        exchange(str1,str2,str1mini,str2mini);        //戻って1-2
    }
    if(strcmp(str2mini,str3mini)>0){
        exchange(str2,str3,str2mini,str3mini);
    }
    if(strcmp(str1mini,str2mini)>0){
        exchange(str1,str2,str1mini,str2mini);        //戻って1-2
    }
}

int main(void)
{
    char str1[100];
    char str2[100];
    char str3[100];
    char str4[100];
    char str5[100];
    
    input(str1,str2,str3,str4,str5);
    printf("%s, %s, %s, %s, %s\n",str1,str2,str3,str4,str5);
    
    printf("辞書順に並べ替え\n");
    order(str1,str2,str3,str4,str5);
    printf("%s, %s, %s, %s, %s\n",str1,str2,str3,str4,str5);
    
    return 0;
}

---------------
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

0

そのプログラムは、対象が5個ということに依存しているので、良くないプログラムですね。
プログラムに#define N 5のような語の数を定義する部分があって、それを#define N 10に書き換えるだけで、10語のソートプログラムになるようにします。
こういう課題が出ると言うことは、ソートのアルゴリズムについていくつか学習したはずです。
そのうちの1つを使って、プログラムを書いてください。

ソートアルゴリズムの学習をやっていない場合は、ソートを実装するのが目的の課題じゃ無い可能性もありますので、その場合は、frogmanさんの挙げられているqsort関数を使うと楽です。qsortを使う場合は、それで本当に課題の意図に合ってるのか確認した方が良いでしょうね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/07 22:59

    ありがとうございます!
    ソートアルゴリズムの学習をやっていないので、qsortについて調べていきたいと思います。

    キャンセル

0

qsort関数を使用すれば、もっと簡潔に書けると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/07 22:59

    ありがとうございます!

    キャンセル

0

for文と多次元配列を使うとすっきりしますね。

#define MAX 5
#define EQ_MAX 7

void input(char str[][]) 
{
    int i;
    for( i = 0; i < MAX; i++ ){ 
        printf("単語を入力:"); 
        scanf("%s",str[i]);
    } 


int main(void) 

    char str[MAX][100]; 
    input(str); 
}

void order(char str[][]) 

    char strmini[MAX][100]; 
    
    for( i = 0; i < MAX; i++ )
    { 
       strcpy(strmini[i],str[i]); 
    }

    for( i = 0; i < MAX; i++ )
    { 
       bigtomini(str1mini); 
    }

    // ここからどのような比較か良くわからないので、配列にしてみました。
    int eq[][] = {
    {1,2}, // 1と2を比較
    {2,3},
    {4,5},
    {1,2},
    {2,3},
    {1,2},
    };
    for( i = 0; i < EQ_MAX; i++ )
    { 
      if(strcmp(strmini[eq[i][0]],str[eq[i][1]]mini)>0){ 
        exchange(str[eq[i][0]],str[eq[i][1]],strmini[eq[i][0]],strmini[eq[i][1]]);        
    } 
}

こんな感じですかね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

配列の使い方を理解されていないです。
str1~5を、配列にすることで綺麗になります。その上で、otnさんのおっしゃるように配列要素数を#defineで定義します。Cの文字列の実態は、文字型の配列でしかないので、各文字列を表す配列と、全文字列をまとめた配列の2重配列になります。

サブルーチンinputなどへの引数の渡し方も変わります。

ご質問のソースに、以上を適用すると、以下のように変わります。動作確認はしていませんので、ご自分で。
#define N 5

void input(str) {
    int i;
    for (i = 0; i < N; i++) {
        printf("単語を入力:"); 
        scanf("%s",str[i]);
    }
}

int sortsub(const void *d1, const void *d2) {
    const char *s1 = (const char *)d1;
    const char *s2 = (const char *)d2;
    return strcmp(s1, s2);
}

int main(void) {
    char str[5][100];

    input(str);
    printf("%s, %s, %s, %s, %s\n",str[0],str[1],str[2],str[3],str[4]); 
     
    printf("辞書順に並べ替え\n"); 
    qsort(str, N, 100, sortsub); 
    printf("%s, %s, %s, %s, %s\n",str[0],str[1],str[2],str[3],str[4]); 
     
    return 0; 
}
課題とのことなので、qsort, strcmpも使ってはいけないようなら、相当の機能の関数を自作することで解決できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/07 23:35

    ありがとうございます。まだ、ポインタについてはやっておらんのです。
    再来週の授業だそうなので、理解したあと、試させてもらいます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る