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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

510閲覧

文字に対応する数を割り当て、数の大きい順に並べ替え

KeiD

総合スコア26

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/31 05:15

編集2020/07/31 05:38

文字に対応する数を割り当て、数の大きい順に並べ替えるプログラムを
作りたいのですが、以下のプログラムを実行すると

#include <stdio.h> #include <math.h> #include <ctype.h> int main() { size_t size = pow(2, 8); int a[size]; char c; int i; a[65] =3; a[66] =8; a[67] =5; a[68] =10; a[69] =2; for(i=65; i<=69; i++) { printf("%c %d\n", (char)i, a[i]); } return 1; }

A 3
B 8
C 5
D 10
E 2

と出力されます。これを
D 10
B 8
C 5
A 3
E 2

と大きい順に並べ替えて表示させようと以下のようにプログラムを変更し、
実行しましたが、

#include <stdio.h> #include <math.h> #include <ctype.h> int main() { size_t size = pow(2, 8); int a[size],b[size]; char c; int i,j,k,d; a[65] =3; a[66] =8; a[67] =5; a[68] =10; a[69] =2; for(i=65; i<=69; i++) { printf("%c %d\n", (char)i, a[i]); } for(j=65;j<=69;j++){ for(k=j+1;k<=69;k--){ if(a[k-1]<a[k]){ b[k-1]=a[k]; b[k]=a[k-1];} } printf("%d\n",b[j]); } return 1; }

Segmentation fault (core dumped) となります。

D 10
B 8
C 5
A 3
E 2
と出力させるにはどう直せばよいか、ご存じの方よろしくお願い致します

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

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

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

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

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

cateye

2020/07/31 05:28 編集

配列の範囲外を使っているので、いつクラッシュしてもおかしくないです。 int a[10];の範囲は、a[0]からa[9]までです。 -------------- t3.c:12:5: warning: array index 65 is past the end of the array (which contains 10 elements) [-Warray-bounds] a[65] =3; ^ ~~ t3.c:8:3: note: array 'a' declared here int a[10]; ^ --------------------
KeiD

2020/07/31 05:40 編集

ありがとうございます。 size_t size = pow(2, 8); int a[size],b[size]; と変更しましたが、 A 3 B 8 C 5 D 10 E 2 Segmentation fault (core dumped) となり D 10 B 8 C 5 A 3 E 2 とは表示されませんでした。
guest

回答1

0

ベストアンサー

[ご参考] 並べ替えを行わないソート

C

1#include <stdio.h> 2#include <ctype.h> 3 4 5int main() { 6 const int N = 5; // 要素数 7 int key[] = { 3, 8 , 5 , 10, 2 }; 8 char val[] = { 'A', 'B', 'C', 'D', 'E' }; 9 char inx[] = { 0, 1, 2, 3, 4 }; 10 11 int i, j; 12 printf("before:\n"); 13 for ( i = 0; i < N; ++i ) { 14 printf("%c %2d\n", val[inx[i]], key[inx[i]]); 15 } 16 17 // keyの降順にinxをソートする 18 // ※key,val の交換を行わない。 19 for ( i = N-1; i > 0; --i ) { 20 for ( j = 1; j < i; ++j ) { 21 if ( key[inx[j-1]] < key[inx[j]] ) { 22 int tmp = inx[j-1]; 23 inx[j-1] = inx[j]; 24 inx[j] = tmp; 25 } 26 } 27 } 28 29 printf("\n------------\nafter:\n"); 30 for ( i = 0; i < N; ++i ) { 31 printf("%c %2d\n", val[inx[i]], key[inx[i]]); 32 } 33 34 return 0; 35}

※ これが唯一の解ではない。鵜呑みにするべからず。

投稿2020/07/31 06:01

episteme

総合スコア16612

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

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

KeiD

2020/07/31 07:21

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問