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

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

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

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

2回答

10425閲覧

バブルソートを用いて文字列配列を辞書順に並び替える関数を作成

nsd24

総合スコア9

C

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2018/05/23 11:00

編集2018/05/23 11:01

前提・実現したいこと

①2つの文字列(char *a,char *b)に対して、辞書順を判定する関数int hantei(char *a,char *b)を作成せよ。この関数の戻り値として、aがbより前(辞書順で)にくる場合は1、aとbが同じ文字列の場合は0、それ以外の場合は-1とする。
②バブルソートを用いて文字列配列(char **argv)を辞書順に並び替える関数void sort(char **argv,int n)を作成せよ。また、引数nは文字列の個数を表し、①のhantei関数を用いること。
バブルソートの参考として以下のコードが書いてありました。

C

1void bubble(int list[],int n) 2{ 3 int i,t; 4 5 for(n=n-1;n>=0;n--){ 6 for(i=0;i<n;i++){ 7 if(list[i]>list[i+1]){ 8 t=list[i]; 9 list[i]=list[i+1]; 10 list[i+1]=t; 11 } 12 } 13 } 14} 15

発生している問題・エラーメッセージ

①については自力でコードをかけました。(一度間違えましたが)

C

1#include<stdio.h> 2 3#define N 100 4 5int hantei(char *a,char *b); 6 7int main(void) 8{ 9 int ans; 10 char a[N],b[N]; 11 12 printf("辞書順を判定するぞ!\n"); 13 printf("文字列aを入力してくれ。"); 14 gets(a); 15 printf("文字列bを入力してくれ。"); 16 gets(b); 17 18 ans=comp_d(a,b); 19 if(ans==1){ 20 printf("aの文字列の方が前だぞ。\n"); 21 } 22 else if(ans==0){ 23 printf("aとbは同じ文字列だぞ。\n"); 24 } 25 else if(ans==-1){ 26 printf("bの方が前だぞ。\n"); 27 } 28 29 return 0; 30} 31 32int hantei(char *a,char *b) 33{ 34 int i; 35 for ( i = 0; *(a+i) != '\0' && *(b+i) != '\0'; i++ ) { 36 if(*(a+i)<*(b+i)){ 37 return 1; 38 } 39 if(*(a+i)>*(b+i)){ 40 return -1; 41 } 42 } 43 if(*(a+i)!='\0'){ 44 return 1; 45 } 46 if(*(b+i)!='\0'){ 47 return -1; 48 } 49 return 0; 50} 51 52

②についてが、コードを書いてみましたがいくつかエラーが出てしまいました。
ポインタのポインタ(アドレス)を使った具体的な書き方がつかめておらず、何点か不明な点があります。

〇わからないこと

 ・//str=(char *)malloc(sizeof(char)*n);では、エラーがでなかったがその直下にあるようにfor文でループさせるとエラーがでます。なぜでしょうか?また、このnは文字列の個数(何個の文字列を入力するか)なのですが、本来は1つ1つの文字列の長さ(文字が何個あるか)を入れるべきなのですが、文字列の長さを計算するにはまず文字列を入力しなければならないわけで、??となっております。
・sort関数内で、tはint型で宣言されています。ここに代入するには文字列の先頭アドレスを代入すればいい、という認識であっているのでしょうか?(問題には参考としてバブルソートが書かれているだけなので無理して合わせる必要はない、とは思いますが)

〇わかったこと
・//str=(char *)malloc(sizeof(char)*n);の意味
char型のサイズ(1バイト)×n(ここでは文字列の個数(何個の文字列を入力するか)ですが)分のメモリをmalloc関数で確保し、それを(char *)に明示的に変換している。(左辺のポインタ変数strにあわせている?)
・関数sortの引数にポインタのポインタ(アドレス)があるが、そこにはポインタ変数のアドレスを渡せばよい。
・参考として↑にあるバブルソートには文字列がint型に入っているが、そこにはポインタのアドレスを渡せばよい。

C

1#include<stdio.h> 2#include<stdlib.h> 3 4int hantei(char *a, char *b); 5void sort(char **argv,int n); 6 7int main(void) 8{ 9 char *str; 10 char enter; 11 int i,n; 12 13 printf("複数の文字列配列を辞書順に並び替えるぞ\n"); 14 printf("文字列の個数入力して→"); 15 scanf("%d",&n); 16 17 enter=getchar(); 18 19 //str=(char *)malloc(sizeof(char)*n); //下記にて説明有り 20 for(i=0;i<n;i++){ 21 (str+i)=(char *)malloc(sizeof(char)*n); //「左辺値が必要」とエラーがでます 22 } 23 24 for(i=0;i<n;i++){ 25 printf("%dつ目の文字列を入力しよ> ",i+1); 26 scanf("%s",str+i); 27 } 28 29 sort(&str,n); 30 31 for(i=0;i<n;i++){ 32 printf("辞書順に文字列を出力します。\n"); 33 printf("%s\n",str+i); 34 } 35 36 return 0; 37} 38 39void sort(char **argv,int n) 40{ 41 int i,j,t; 42 43 if(n==1){ 44 printf("データ1個しかないですよ\n"); 45 } 46 else{ 47 for(i=n-1;i>=0;i--){ //「char *型はint型に変換できない」とエラーが出ます。 48 for(j=0;j<n;j++){ 49 if(hantei(*(argv+j),*(argv+j+1))==-1){ 50 t=*(argv+j); 51 *(argv+j)=*(argv+j+1); 52 *(argv+j+1)=t; 53 } 54 } 55 } 56 } 57} 58 59int hantei(char *a,char *b) 60{ 61 int i; 62 63 for(i=0;*(a+i)!='\0' && *(b+i)!='\0';i++){ 64 if(*(a+i)<*(b+i)){ 65 return 1; 66 } 67 else if(*(a+i)>*(b+i)){ 68 return -1; 69 } 70 } 71 if(*(a+i)!='\0'){ 72 return -1; 73 } 74 else if(*(b+i)!='\0'){ 75 return 1; 76 } 77 return 0; 78}

未熟者ですがどうかご指導よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

使用しているツールは、BCC Developerで、コンパイラはBorland C++ Compilerを使用しています。

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

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

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

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

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

guest

回答2

0

まず、C言語の場合、文字列 str とすると、str の型は以下のどちらか。

char *str;
char str[];

従って、文字列の配列は、

char *str[];
char str[][]; // これは、固定の文字列の配列以外はあまり使わない。
char **str;

ですね。従って、

str=(char *)malloc(sizeof(char)*n);

は、文字列の個数でなく、n文字の文字列が入る領域を "一つ" 確保しています。
従って、文字列のバブルソートに渡す引数は、文字列の配列 char ** (ポインタのポインタ) となります。

実際のコードは、char * が文字列を表す事を元にもう少し考えましょう。

投稿2018/05/23 12:16

pepperleaf

総合スコア6383

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

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

nsd24

2018/05/30 11:05

ご回答ありがとうございます! もう少し考えて見ます
guest

0

ベストアンサー

hantei()が辞書式ではなく文字コード順比較になってますよ。
英数字だけ扱えばいいのなら、大文字と小文字の処理をしないといけません。
コード順→A<B<a<b
辞書式→A<a<B<b(またはa<A<b<B)

後、たとえば、abcdE、ABCDe、ABCDfの辞書式大小関係がちゃんと処理できるかどうか考えてみてください。

日本語も処理するなら発音拗音長音の処理も要りますが、多分そこまでは要求されてない課題ですよね。

投稿2018/05/28 02:11

a_saitoh

総合スコア702

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

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

nsd24

2018/05/30 11:08

ご回答ありがとうございます! 完全に誤解していました。辞書順だと文字の大小についても考えないといけませんね。 コードを書き直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問