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

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

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

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

Q&A

解決済

4回答

1502閲覧

入力されている文字列を、バブルソートを使って並び替えたい

mkm

総合スコア15

C

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

0グッド

0クリップ

投稿2020/04/22 14:11

下記コードで、{"LB","HF","EI","AM"}が入力されているのですが、結果をAM,EI,HF,LBの順番にしたいです。
はじめに格先頭の並び替えを行い、それから全体を表示させようとしたのですが上手く行きません。
結果はコード下のようになります。どうすれば文字列としての並び替えが出来ますでしょうか?

#include <stdio.h>

int main (void){

int i; int j; int k; int l; char temp; i=0; j=0; k=0; l=0; char ki[4][4]={"LB","HF","EI","AM"}; for(i=0;i<=3;i++){

printf("変更前先頭%c\n",ki[i][0]);
};
// printf("カウント回数%d\n",i);

for(j=0;j<=3;j++){ for(k=j;k<=3;k++){ if(ki[j][0]>ki[k][0]){ temp=ki[j][0]; ki[j][0]=ki[k][0]; ki[k][0]=temp; }; }; printf("変更後の先頭文字%c\n",ki[j][0]); printf("%s\n",ki[j]); };

}
結果---------------------------------------------------------------
変更前先頭L
変更前先頭H
変更前先頭E
変更前先頭A
変更後の先頭文字A
AB
変更後の先頭文字E
EF
変更後の先頭文字H
HI
変更後の先頭文字L
LM

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

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

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

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

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

episteme

2020/04/24 23:48

先頭文字「だけ」を比較すればいいんですね? "AB" "AA" を "AA" "AB" に並び替えなくてもいいんですね?
mkm

2020/04/25 23:47

{"LB","HF","EI","AM"}が入力されているのですが、結果をAM,EI,HF,LBの順番にしたいのです。 本当はローマ字で名前が入る→ソートして結果を表示させる。 上記の予定なのですが、検証として現在二文字で行っています。
episteme

2020/04/26 02:55

回答になっていない。 あなたが示したコードは先頭1文字だけを比較しているけど、 これがあなたのやりたかったことなのか、とりあえずまずは先頭だけなのかわからん。
mkm

2020/04/26 03:19

今度から質問を初めから読んでください
episteme

2020/04/26 03:24 編集

質問を読み返したが、わからん。 先頭文字だけの比較では文字列の比較になってないのでは? と言うてます。
mkm

2020/04/26 03:25

いえ、もういいです。他の方が説明してくださったので。
guest

回答4

0

ベストアンサー

} のあとに ; を付ける必要はありません。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int i, j, k, l; 6 char temp; 7 char ki[4][4] = { "LB", "HF", "EI", "AM" }; 8 9 for (i = 0; i < 4; i++) { 10 printf("変更前先頭%c\n", ki[i][0]); 11 } 12 for (j = 0; j < 4; j++) { 13 for (k = j; k < 4; k++) { 14 if (ki[k][0] > ki[k][0]) { 15 for (l = 0; l < 4; l++) { 16 temp = ki[j][l]; 17 ki[j][l] = ki[k][l]; 18 ki[k][l] = temp; 19 } 20 } 21 } 22 } 23 for (j = 0; j < 4; j++) { 24 printf("変更後の先頭文字%c\n", ki[j][0]); 25 printf("%s\n", ki[j]); 26 } 27}

でも、これはバブルソートではなく、選択ソートです。
バブルソートなら、

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int i, j, k, l; 6 char temp; 7 char ki[4][4] = { "LB", "HF", "EI", "AM" }; 8 9 for (i = 0; i < 4; i++) { 10 printf("変更前先頭%c\n", ki[i][0]); 11 } 12 for (j = 0; j < 4; j++) { 13 for (k = 4 - 1; k > 0; k--) { 14 if (ki[k-1][0] > ki[k][0]) { 15 for (l = 0; l < 4; l++) { 16 temp = ki[k-1][l]; 17 ki[k-1][l] = ki[k][l]; 18 ki[k][l] = temp; 19 } 20 } 21 } 22 } 23 for (j = 0; j < 4; j++) { 24 printf("変更後の先頭文字%c\n", ki[j][0]); 25 printf("%s\n", ki[j]); 26 } 27}

投稿2020/04/24 16:21

kazuma-s

総合スコア8224

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

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

mkm

2020/04/25 23:45

ありがとうございます。 二つのソートに関してなんですが、forが二回使われていることは理解できるのですが ifの後に三回目のforが入っている理由ってなんなんのでしょうか?
kazuma-s

2020/04/25 23:55

文字列の交換を、1文字ずつ行っているからです。 ”LB" と "HF" の交換を、'L' と 'H' の交換、'B' と 'F' の交換、'\0' と '\0' の交換、'\0' と '\0' の交換 と 4回交換を実行しています。全部2文字と分かっているのなら、その 2文字の交換だけでもよいでしょう。 それから、先頭文字の比較だけでソートしているので、先頭文字が同じ場合、2文字目が逆転している場合もあります。strcmp で文字列全体を比較するか、strcmp に相当する関数を自分で作って、その中で for文を使う必要があります。
guest

0

C

1#include <stdio.h> 2 3int my_strcmp(const char* a, const char* b) { 4 while ( (*a != '\0' || *b != '\0') && *a == *b ) { 5 ++a; 6 ++b; 7 } 8 return *a - *b; 9} 10 11char* my_strcpy(char* dst, const char* src) { 12 char* tmp = dst; 13 while ( *dst++ = *src++ ); 14 return tmp; 15} 16 17/* 18 * *dst に src をセットし、元(セット前)の*dstを返す。 19 */ 20const char* swap_str(const char** dst, const char* src) { 21 const char* old = *dst; 22 *dst = src; 23 return old; 24} 25 26int main(void) { 27 int i; 28 int j; 29 int k; 30 char ki[4][4] = { "LB","HF","EI","AM" }; 31 32 puts("before"); 33 for (i = 0; i < 4; i++) { 34 printf("[%s] ", ki[i]); 35 }; 36 puts(""); 37 38 for (j = 0; j <= 3; j++) { 39 for (k = j; k <= 3; k++) { 40 if ( my_strcmp(ki[j], ki[k]) > 0 ) { 41 char temp[4]; 42 my_strcpy(temp, ki[j]); 43 my_strcpy(ki[j], ki[k]); 44 my_strcpy(ki[k], temp); 45 } 46 } 47 } 48 49 puts("after"); 50 for (i = 0; i < 4; i++) { 51 printf("[%s] ", ki[i]); 52 }; 53 puts(""); 54 55 return 0; 56}

投稿2020/04/26 03:17

episteme

総合スコア16614

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

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

0

一時格納領域であるtempを「char temp;」から「char temp[2];」に
変更して、strncpyを使用し、文字の入れ替えになっている部分を
文字列の入れ替えに変更しましょう。
使い方は調べて下さい。

それだけだと入れ替える文字列が例えば{"LB","AN","EI","AM"}とか
1文字目が同じ文字列が存在する場合、正しくソートされません。
ですので、if(ki[j][0]>ki[k][0])の部分に1文字目が同一の場合に二文字目の
比較条件を加えるようにしましょう。

投稿2020/04/24 12:04

kaina

総合スコア418

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

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

mkm

2020/04/24 12:17

strncpyなどは使わずに、中身のデータを移して表示させたいです
maisumakun

2020/04/26 00:02

> strncpyなどは使わずに、中身のデータを移して表示させたいです 「中身のデータを移」すために「strncpyなど」が必要なのですが(それ相当のものを手で書くことはもちろん可能といえば可能です)。
mkm

2020/04/26 00:07

strncpyの機能は調べましたので、理解はしています。 現在行っているのは、これに該当する処理を書くことです。 データ移行の練習として、ローマ字の名前→ソートさせて表示。なのですが現状はソートの検証として二文字で行っているのです
guest

0

temp=ki[j][0];

ki[j][0]=ki[k][0];
ki[k][0]=temp;

これだと先頭の1文字しか入れ替えてませんよ

投稿2020/04/22 14:12

y_waiwai

総合スコア87800

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

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

mkm

2020/04/24 11:12

はい。なので、文字列として表示させたいです。 tempの宣言を二次元配列にしてみたのですが、うまく行きませんでした。
y_waiwai

2020/04/24 12:13

char temp[4]; としといて、 temp=ki[j]; ki[j]=ki[k]; ki[k]=temp; でいいんでは
mkm

2020/04/24 12:16

ならないですね…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問