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

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

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

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

ソート

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

888閲覧

数値のソート、半角区切り

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

ソート

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/08/28 04:15

数値を辞書式ソートする問題についてです。
はじめに行数Nが与えられ、その次の行から数値2つが半角スペースで区切られて与えられます。
N
number1_1 number2_1
number1_2 number2_2
...
number1_N number2_N

number1_Nでソートして、もしnumber1_Nの数が同じであればnumber2_Nでソートせよ、という問題です。

私は以下のように記述しましたが、number2_Nのソートが機能していないようである事と、そもそもnumber1_Nとnumber2_Nの値がこれではバラバラになってしまうのにその解決法がなかなか分からないです。

#include <stdio.h>
#include <string.h>
int main(void){
char buf[1000];
int n;
int x;
int y;
int hidari[100];
int migi[100];
int t;
int t2;

fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d\n", &n);

for(int i = 0; i < n; i++) {
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d %d", &x, &y);
hidari[i] = x;
migi[i] = y;
}

for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
if(hidari[i] > hidari[j]) {
t = hidari[i];
hidari[i] = hidari[j];
hidari[j] = t;
}
else {
if(migi[i] > migi[j]) {
t2 = migi[i];
migi[i] = migi[j];
migi[j] = t2;
}
}
}
printf("%d %d\n", hidari[i], migi[i]);
}
}
左側の数字を右側と結びつけつつソートするにはどうしたら良いでしょうか…?
ご教示頂けますと幸いです。

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

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

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

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

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

otn

2020/08/28 04:29

数値を辞書式ソートとお書きですが、数値でソートしようとしているように見えます。 「辞書式」が間違い?
guest

回答1

0

ベストアンサー

if(migi[i] > migi[j]) {

もしnumber1_Nの数が同じであればnumber2_Nでソートせよ の条件が抜けてる。

if ( hidari[i] == hidari[j] && migi[i] > migi[j] ) { ではいかが?

バラバラになってしまうのにその解決法がなかなか分からないです。

条件が満たされたとき、migi/hidariの両方とも交換する。

[追記] おためし

C

1#include <stdio.h> 2#include <string.h> 3 4int main(void){ 5 char buf[1000]; 6 int n; 7 int hidari[100]; 8 int migi[100]; 9 10 n = 27; 11 12 for(int i = 0; i < n; i++) { 13 hidari[i] = i%3; 14 migi[i] = i/3; 15 printf("%d %d\n", hidari[i], migi[i]); 16 } 17 printf("\nafter ---\n"); 18 for(int i = 0; i < n; i++) { 19 for(int j = i + 1; j < n; j++) { 20 if ( hidari[i] > hidari[j] || (hidari[i] == hidari[j] && migi[i] > migi[j]) ) { 21 int t = hidari[i]; 22 hidari[i] = hidari[j]; 23 hidari[j] = t; 24 t = migi[i]; 25 migi[i] = migi[j]; 26 migi[j] = t; 27 } 28 } 29 } 30 31 for(int i = 0; i < n; i++) { 32 printf("%d %d\n", hidari[i], migi[i]); 33 } 34 return 0; 35}

投稿2020/08/28 04:20

編集2020/08/28 06:55
episteme

総合スコア16612

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

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

退会済みユーザー

退会済みユーザー

2020/08/28 06:41

ありがとうございます。何度もすみません、私なりに修正を試みたものの上手くいきません…、お時間ありましたら見て頂く事できますでしょうか…?for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { if(hidari[i] > hidari[j]) { t = hidari[i]; hidari[i] = hidari[j]; hidari[j] = t; t2 = migi[i]; migi[i] = migi[j]; migi[j] = t2; } else if(hidari[i] == hidari[j] && migi[i] > migi[j]) { t2 = migi[i]; migi[i] = migi[j]; migi[j] = t2; } printf("%d %d\n", hidari[i], migi[i]); } }
退会済みユーザー

退会済みユーザー

2020/08/28 06:42

(↑修正したソート部分です)
episteme

2020/08/28 06:55

追記しました
退会済みユーザー

退会済みユーザー

2020/08/29 03:05

詳しく回答して頂き本当に助かりました。お陰様で完成しました。 よく見直して学ばせて頂きます、ありがとうございました!
episteme

2020/08/29 04:00

んじゃ解決しといて。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問