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

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

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

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

Q&A

解決済

2回答

296閲覧

バブルソートについて

thypocket

総合スコア7

C

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

0グッド

0クリップ

投稿2017/09/09 17:08

10個の整数を入力して、それを昇順に並べるプログラムを自分なりに作ってみたのですが、データを入力してもソートされず入力したデータそのものが返ってきてしまい、うまく機能しません。どの点が間違っていてどのように変更すればよいか教えていただけませんか?以下、作成したプログラム。
#include <stdio.h>

int sort(int dat);

int main(void)
{
int i,j,temp;
int dat[10];
printf("10個の実数を入力\n");
for(i=0;i<10;i++)
scanf("%d",&dat[i]);
sort(dat[10]);
printf("\n並び替えた後\n");
for(i=0;i<10;i++)
printf("%d\n",dat[i]);
}

int sort(int dat)
{
int i,j,temp;
int dat[10];
temp=0;
for (i=0;i<10;i++){
for (j=i+1;j<10;j++) {
if (dat[i]>dat[j]){
temp = dat[i];
dat[i] = dat[j];
dat[j]= temp;
}
}
return dat[10];
}
}

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

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

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

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

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

unau

2017/09/09 21:05

プログラムのコード部分は、コードブロックに入れてください。他のかたの質問を見てもらうとわかりますが、コードブロックに入っていれば、シンタックスハイライトされて格段に見やすくなります。https://teratail.com/help/question-tips#questionTips3-5
A.Ichi

2017/09/10 00:44

sortルーチンでdatが2か所定義されていてコンパイルエラーになるのでは。
guest

回答2

0

修正が必要な個所を挙げてみました。

sort(dat[10]);

この意味はdat[10]の値を渡すと言う意味になりdat[10]全体の意味にはなりません。またdat[9]までですのでエラーです。

int sort(int dat)

上記の11番目の数字を受け取る事になります。(エラー)またsortの中のint dat[10];で新たに領域が取られていて値がセットされていない状況です。

return dat[10];

dat[10]の値を返す事になりますが、領域外です[9]が最後です。呼び側では、戻り値をなにもしていません。

c言語

1#include <stdio.h> 2 3int sort(int dat[10]); //配列の受け渡し(アドレス渡し) 4 5int main(void) 6{ 7 int i,j; 8 int dat[10]; 9 10 printf("10個の実数を入力\n"); 11 12 for(i=0;i<10;i++) 13 scanf("%d",&dat[i]); 14 15 sort(dat); //配列の先頭アドレスを渡す &dat[0] 16 17 printf("\n並び替えた後\n"); 18 19 for(i=0;i<10;i++) 20 printf("%d\n",dat[i]); 21} 22 23int sort(int dat[10]) //上位配列に以下で直接変更を加える 24{ 25 int i,j,temp; 26 for (i=0;i<10;i++){ 27 for (j=i+1;j<10;j++) { 28 if (dat[i]>dat[j]){ 29 temp = dat[i]; 30 dat[i] = dat[j]; 31 dat[j]= temp; 32 } 33 } 34 } 35}

投稿2017/09/10 03:58

A.Ichi

総合スコア4070

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

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

0

ベストアンサー

本質的な問題は、sort 関数に、dat という「int 型の配列」ではなく、dat[10] という「int」を渡そうとしているところにあります。つまり、入力データである「10 個の数字の列」ではなく、「10 個入力されたうちの最後の数字」を渡すだけになってしまっています。

int 型のポインタ」を渡すようにするのがよいと思います。その場合、次のようになります。

c

1#include <stdio.h> 2 3int sort(int *dat); 4 5int main(void) 6{ 7 int i,j,temp; 8 int dat[10]; 9 printf("10個の実数を入力\n"); 10 for(i=0;i<10;i++) 11 scanf("%d",&dat[i]); 12 sort(dat); 13 printf("\n並び替えた後\n"); 14 for(i=0;i<10;i++) 15 printf("%d\n",dat[i]); 16} 17 18int sort(int *dat) 19{ 20 int i,j,temp; 21 temp=0; 22 for (i=0;i<10;i++){ 23 for (j=i+1;j<10;j++) { 24 if (dat[i]>dat[j]){ 25 temp = dat[i]; 26 dat[i] = dat[j]; 27 dat[j]= temp; 28 } 29 } 30 } 31}

ちなみに、ソートするデータの個数は、呼び出し側から教えてあげることで、sort 関数を、さまざまな個数のデータをソートできる関数にすることができます。

c

1#include <stdio.h> 2 3int sort(int *dat, int len); 4 5int main(void) 6{ 7 int i,j,temp; 8 int dat[10]; 9 printf("10個の実数を入力\n"); 10 for(i=0;i<10;i++) 11 scanf("%d",&dat[i]); 12 sort(dat, 10); 13 printf("\n並び替えた後\n"); 14 for(i=0;i<10;i++) 15 printf("%d\n",dat[i]); 16} 17 18int sort(int *dat, int len) 19{ 20 int i,j,temp; 21 temp=0; 22 for (i=0;i<len;i++){ 23 for (j=i+1;j<len;j++) { 24 if (dat[i]>dat[j]){ 25 temp = dat[i]; 26 dat[i] = dat[j]; 27 dat[j]= temp; 28 } 29 } 30 } 31}

投稿2017/09/09 21:22

unau

総合スコア2468

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

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

thypocket

2017/09/10 01:53

自分の「ポインタ」の理解が浅かったことがわかりました。ご協力ありがとうございました。コードブロック等、今後気を付けていきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問