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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

20427閲覧

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

ISARIA

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/06/07 11:09

入力した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;

}


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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

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

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

lang

1#define N 5 2 3void input(str) { 4 int i; 5 for (i = 0; i < N; i++) { 6 printf("単語を入力:"); 7 scanf("%s",str[i]); 8 } 9} 10 11int sortsub(const void *d1, const void *d2) { 12 const char *s1 = (const char *)d1; 13 const char *s2 = (const char *)d2; 14 return strcmp(s1, s2); 15} 16 17int main(void) { 18 char str[5][100]; 19 20 input(str); 21 printf("%s, %s, %s, %s, %s\n",str[0],str[1],str[2],str[3],str[4]); 22 23 printf("辞書順に並べ替え\n"); 24 qsort(str, N, 100, sortsub); 25 printf("%s, %s, %s, %s, %s\n",str[0],str[1],str[2],str[3],str[4]); 26 27 return 0; 28}

課題とのことなので、qsort, strcmpも使ってはいけないようなら、相当の機能の関数を自作することで解決できます。

投稿2015/06/07 14:20

yossie

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISARIA

2015/06/07 14:35

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

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

}

こんな感じですかね

投稿2015/06/07 14:01

MasaakiIrie

総合スコア1021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

投稿2015/06/07 12:02

編集2015/06/07 12:03
otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISARIA

2015/06/07 13:59

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

0

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

投稿2015/06/07 11:33

frogman

総合スコア129

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISARIA

2015/06/07 13:59

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問