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

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

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

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

Q&A

解決済

2回答

488閲覧

数字を並び替えるプログラムを作りたい

seika

総合スコア6

C++

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

1グッド

0クリップ

投稿2023/05/03 01:31

実現したいこと

・ユーザーに10個の数字を入力してもらい、それを小さい数字から大きい数字に並び替えて出力をするプログラムを作りたいです
・別のfunctionも足していく予定です
・outputがうまくいかないのでその理由を教えて頂きたいです

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

error: implicit declaration of function 'smallestToBiggest' is invalid in C99 [-Werror,-Wimplicit-function-declaration]

該当のソースコード

C++

1#include <stdio.h> 2 3int main() { 4 5 int num[10], output; 6 7 printf("Please insert 10 numbers:\n"); 8 for(int i = 0; i < 10; i++) { 9 scanf("%d", &num[i]); 10 } 11 12 output = smallestToBiggest(num[10]); 13 14 return 0; 15 16} 17 18int smallestToBiggest(int num[10]) { 19 for (int i = 0; i < 9; i++) { 20 for (int j = i + 1; j < 10; j++) { 21 if (num[j] < num[i]) { 22 int temp = num[i]; 23 num[i] = num[j]; 24 num[j] = temp; 25 } 26 } 27 } 28 printf("Sorted numbers smallest to biggest:\n"); 29 for(int i = 0; i < 10; i++) { 30 printf("%d", num[i]); 31 } 32 printf("\n\n"); 33 return num[10]; 34} 35
KenRoda👍を押しています

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

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

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

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

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

meg_

2023/05/03 02:35

確認ですが課題でしょうか?
seika

2023/05/03 03:21

学校の課題です
episteme

2023/05/03 06:29

C++なら std::sort() でイッパツなんだが、課題ならそうはいかんか...
seika

2023/05/03 13:59

多分習ってる範囲でやらなくちゃいけないんですよね、、、 ChatGPTはそれでやるように指示してきますが笑
guest

回答2

0

  1. 関数(smallestToBiggest)を呼び出す前にその関数を定義する必要があります。
  2. 関数に渡す変数も見直す必要があるかと思います。

投稿2023/05/03 02:45

meg_

総合スコア10620

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

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

seika

2023/05/03 03:19

なるほど、、、 順番が関係あると思ってなかったです。 ありがとうございます!
guest

0

ベストアンサー

このコードで問題が発生しているのは、「smallestToBiggest」関数が「main」関数の前に宣言されていないためです。C99では、関数を使用する前に宣言されている必要があります。また、関数smallestToBiggestは、整数の配列を返すことができないため、戻り値の型を変更する必要があります。以下の修正を行ってください。

  1. 番号リスト関数smallestToBiggestのプロトタイプをmain関数の前に追加します。
  2. 番号リスト関数smallestToBiggestの戻り値をvoidに変更します。
  3. 番号リスト関数smallestToBiggestで引数として渡される配列をポインタとして受け取ります。

修正後のコードは次のようになります。

cpp

1#include <stdio.h> 2 3void smallestToBiggest(int *num, int size); 4 5int main() { 6 7 int num[10]; 8 9 printf("Please insert 10 numbers:\n"); 10 for(int i = 0; i < 10; i++) { 11 scanf("%d", &num[i]); 12 } 13 14 smallestToBiggest(num, 10); 15 16 return 0; 17 18} 19 20void smallestToBiggest(int *num, int size) { 21 for (int i = 0; i < size-1; i++) { 22 for (int j = i + 1; j < size; j++) { 23 if (num[j] < num[i]) { 24 int temp = num[i]; 25 num[i] = num[j]; 26 num[j] = temp; 27 } 28 } 29 } 30 printf("Sorted numbers smallest to biggest:\n"); 31 for(int i = 0; i < size; i++) { 32 printf("%d ", num[i]); 33 } 34 printf("\n\n"); 35}

これで、エラーが解消され、プログラムが正常に動作するはずです。

投稿2023/05/03 02:52

KenRoda

総合スコア30

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

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

seika

2023/05/03 03:22 編集

すごくわかりやすく訂正して頂いてありがとうございます! 正常に作動してます。
seika

2023/05/03 03:29

度々すみません。 ポインタ型の変数にした理由を教えていただけますか?
KenRoda

2023/05/03 03:32

ポインタ型の変数にした理由は、関数間で配列を効率的かつ正確に共有するためです。関数に配列を渡すとき、C言語では配列名が実際にはその配列の先頭要素のアドレス(つまりポインタ)を示しているため、ポインタを使用します。 以下の理由から、ポインタを使って配列を関数に渡すことが一般的です。 1. 効率: 配列をポインタとして渡すと、実際のデータのコピーが作成されず、元の配列のメモリアドレスが渡されます。これにより、関数は元の配列のデータを直接操作でき、メモリ使用量や処理時間が節約できます。 2. 反映される変更: ポインタを使用することで、関数内で行われた配列の変更が元の配列にも反映されます。この場合、smallestToBiggest関数でソートされた配列が、main関数内の元の配列にも反映されます。 3. 可変サイズ: 関数にポインタとサイズを渡すことで、配列のサイズが可変になります。これにより、同じ関数を異なるサイズの配列に対して再利用することができます。 このプログラムでは、配列のアドレスをsmallestToBiggest関数に渡すことで、関数内で配列を並べ替え、その変更がmain関数内の元の配列にも反映されるようにしています。これにより、効率的かつ簡潔なコードが実現できます。
seika

2023/05/03 05:24

なるほどmain関数内の元の配列にも反映されるのであれば別の関数でも少ないコードで利用できますね! まさにそうしたかったので、助かります。 教えて頂きありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問