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

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

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

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

Q&A

2回答

777閲覧

プログラムの変更c言語

tjdwpadt

総合スコア0

C

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

0グッド

1クリップ

投稿2022/12/21 06:10

至急質問です
データを降順に並び替えた後、探索データをキーボード入力そ、データの何番手にあるかを出力するプログラムを作成しなさい。探索は二分探索法を使用すること。データ探索はmain()関数とは別の関数で処理、配列データはポインタを引数として受け渡す。
という問題があるのですが
#include<stdio.h>
int main(void) {
int score[10];
int i, j, tmp, num;

//データ数の入力
printf("データ数 :");
scanf("%d", &num);

for (i = 0; i < num; i++) {
printf("%dつ目の点数:", i + 1);
scanf("%d", &score[i]);
}
//基本選択法にとる並び替え
for (i = 0; i < num - 1; i++) {
for (j = i + 1; j < num; j++) {
//データ数交換
if (score[i] < score[j]) {
tmp = score[i];
score[i] = score[j];
score[j] = tmp;
}
}
}
printf("*** ソート済みデータ(降順) ***\n");
for (i = 0; i < num; i++) {
printf("%dつ目の点数:%d\n", i + 1, score[i]);
}
return 0;
}

プログラムのどこを変更しどこを修正すればいいのか全く分かりません。ヒントやプログラムなど教えて頂ける方いませんか?

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

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

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

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

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

y_waiwai

2022/12/21 06:13

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
fana

2022/12/21 06:23

> プログラムのどこを変更しどこを修正すればいいのか全く分かりません 現状のプログラムの動作を把握してください. その内容と求められている内容との差分があなたが対応すべき事柄です. > データ探索はmain()関数とは別の関数で処理、配列データはポインタを引数として受け渡す。 と指定されているわけですし,とりあえず「別の関数」なるものを用意してそいつに「ポインタを受け渡す」とかいう部分くらいは書いてみればどうですか. この指示の意味がそもそもわからないというのであれば,まずは復習から始めるべきです.
episteme

2022/12/21 06:37 編集

https://teratail.com/questions/j0fz1x1o2cekcd では「まずはあなたなりにコードを書いてみましょう。」にベストアンサーつけたんだから、 あなたなりのコードを書こうや。ヒントはあげるから。
jimbe

2022/12/21 10:00

こちらがヒントと思って出しても果たしてヒントとして分かるかどうかも分からないような…。
thkana

2022/12/21 12:46

本当に「全くわからない」のだったら、参考書の1ページ目からやり直してください、としか言いようがないじゃないですか。手を抜かないでちゃんと説明してください。
dodox86

2022/12/22 01:26

質問のぶん投げ具合、ユーザー名の捨て垢感。しばしば見られる形態の質問ですが、あらゆる指摘を無視し、完動品のコード付き回答を求めるスタイルですね。スルー推奨だと思います。
fana

2022/12/22 01:37

しまった! 「…いませんか?」なる問いなのだから,「いる or いない」を答えるべきだったのか…
tmp

2022/12/22 03:25

同じ課題をもらった人に聞いたほうが説明も省けるし早く回答を手にいれれるとおもうのですが、 なぜteratailなんですか?
guest

回答2

0

データを降順に並び替えた後、探索データをキーボード入力そ、データの何番手にあるかを出力する

なにやら誤字が目立つが,要はやることは3つだ.

  1. データを降順に並び替えること
  2. 探索データをキーボードから入力させること
  3. 関数で二分探索して何番目にあるかを出力すること

それ以外は特段求められていないから,質問内に提示されたコードに存在しているデータ入力処理やソート結果の表示は不要なので捨てて良いだろう.
データについては適当に定義してやれば済む.
ソートの部分はそのまま使える雰囲気があるので残す.

C

1int main(void) 2{ 3 //不要な入力処理は適当なデータ定義に置き換え 4 int score[] = { 3, 9, 0, 8, 3, 1 }; 5 const int num = 6; 6 7 //ソートの部分は残すことにする 8 for (int i = 0; i < num - 1; i++) { 9 for (int j = i + 1; j < num; j++) { 10 if (score[i] < score[j]) { 11 int tmp = score[i]; 12 score[i] = score[j]; 13 score[j] = tmp; 14 } 15 } 16 } 17 18 //不要な出力も除去した 19 return 0; 20}

これで,前記1.のみを満たすコードができた.
後は 2. と 3. を追加すればいい.

C

1//「別の関数」 2//二分探索で探索して「何番目」なのかを返す. 3//(ただし,見つからない場合は 0 を返すこととした) 4size_t OtherFunction( const int *Begin, const int *End, int SearchTgtVal ) 5{ 6 //ここの実装を仕様に従って埋めればおk. 7} 8 9int main(void) 10{ 11 //不要な入力処理は適当なデータ定義に置き換え 12 int score[] = { 3, 9, 0, 8, 3, 1 }; 13 const int num = 6; 14 15 //ソートの部分は残すことにする 16 for (int i = 0; i < num - 1; i++) { 17 for (int j = i + 1; j < num; j++) { 18 if (score[i] < score[j]) { 19 int tmp = score[i]; 20 score[i] = score[j]; 21 score[j] = tmp; 22 } 23 } 24 } 25 26 //探索データをキーボードから入力する処理を追加 27 int SearchTarget; 28 printf( "Specify search target value : " ); 29 scanf( "%d", &SearchTarget ); 30 31 //探索は「別の関数」で処理.配列データはポインタを引数として受け渡す 32 size_t Result = OtherFunction( score, score+num, SearchTarget ); 33 //結果(:何番目なのか)を表示 34 if( !Result ) 35 { printf( "無ぇよ" ); } 36 else 37 { printf( "%zu番目", Result ); } 38 39 return 0; 40}

配列データはポインタを引数として受け渡す

という指示がイマイチ謎.
ふつーは配列に関しては「先頭のポインタとサイズで」みたく指示されそうに思うのだが,「ポインタ」としか指定されていないから,↑のコードではポインタ2つを渡す形とした.

二分探索の具体実装については「C言語 二分探索」とかでググれば参考にできるコードとかも複数見つかると思うので,好きなのを移植すれば良いかと.


[追記]
「別の関数」の中身をなんとなく書いてみたけど,あまり自信ないっす.
(ダメそうなら 修正 or 無視 されたい)

C

1size_t OtherFunction( const int *Begin, const int *End, int SearchTgtVal ) 2{ 3 if( SearchTgtVal > *Begin || *(End-1) > SearchTgtVal )return 0; 4 5 const int *p[] = { Begin, End }; 6 while( p[0]<p[1] ) 7 { 8 const int *M = p[0] + ( (p[1]-p[0])>>1 ); 9 int d = SearchTgtVal - *M; 10 if( d==0 )return (M-Begin)+1; 11 if( d<0 )p[0] = M+1; 12 else p[1] = M; 13 } 14 return 0; //when not found 15}

投稿2022/12/21 07:53

編集2022/12/21 07:58
fana

総合スコア11656

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

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

fana

2022/12/21 08:49

念のため述べておくが, > …は不要なので捨てて良いだろう. というのは,別にふざけているわけではない. > プログラムのどこを変更しどこを修正すればいいのか全く分かりません とのことだから,それに対する 回答 あるいは ヒント としてあえてそうしている. must ではないものを全て削れば見通しが立てやすい,ということだ. 「やっぱりこれはあった方がいい」とか思う要素があるならば削らずに残すなり,mustな要素を完成させてから後で復活させるなりすればいい. (そうでなくとも,動作テストするのに毎回データ値をキー入力するのは だるい/効率悪い/etc だから,mustな要素を完成させるまでの間は,このように適当に定義するのが良いと思う.)
guest

0

ヒントやプログラムなど教えて頂ける方いませんか?

ではヒント。return 0; の直前に:

C

1//探索データの入力 2printf("探索データ :"); 3scanf("%d", &tmp); 4「score[] の中から二分検索法でtmpと一致するデータが何番目にあるかを返す」関数を呼び出し、 5結果を出力する。

投稿2022/12/21 06:31

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問