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

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

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

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

C++

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

Q&A

解決済

5回答

1876閲覧

ソートのプログラムについて

JohnTakahashi

総合スコア4

C

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

C++

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

0グッド

0クリップ

投稿2020/05/14 03:43

前提・実現したいこと

半年近く前大学の課題でこれを説明するものが出されました
当時は全く分からなかったので単位を落としましたが
最近ようやく理解が進んできました。

このプログラムは入力した数値を降順にソートするものだと思われますが

変数iMaxが-9に初期化されている点。これは多分教授のミスかと思います

大学指定の参考書ではソートの問題をなんとなく解いていたので当時はこの問題を見たとき
全然わからなくて心が折れました
しっかり文法を理解した今ではより拡張性があって優れているプログラムだと思いますが
皆様はこのプログラムをどう思われますか?

該当のソースコード

#include <stdio.h> int main(void) { int D[100]; int i,n,Max,iMax = -9,N,w; N = sizeof D/sizeof D[0]; printf("\nInteger Number or End Of Data(^D)\n<Please Input>\n"); for(i=0;i<N;i++){ if(scanf("%d",&D[i]) != 1) { break; } } N = i; for(i=0;i<N;i++) { printf("D[%d]=%d",i,D[i]); printf("\n"); } for(n=0;n<N;n++) { Max = D[n]; for(i=n;i<N;i++) { Max = (Max > D[i]) ? Max : D[iMax = i]; } w = D[n]; D[n] = D[iMax]; D[iMax] = w; } for(i=0;i<N;i++) { printf("D[%d]=%d",i,D[i]); } printf("\n"); return 0; }

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

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

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

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

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

fana

2020/05/14 04:26

> 変数iMaxが-9に初期化されている点 説明させる課題ということで,わざとiMax周りだけ微妙に読みにくくしているとかじゃないですかね.
Zuishin

2020/05/16 02:14

どのような答えを待っていますか? 見ての通り、 > 複数のユーザーから「問題・課題が含まれていない質問」という意見がありました と低評価が入っているためにこの質問は公開状態が限定的になり、埋もれています。 これ以上回答がつくことは期待薄だと思いますが。
guest

回答5

0

ベストアンサー

皆様はこのプログラムをどう思われますか?

これがこの質問の趣旨で間違いありませんか?
気になるところはいくつかあります。

  • コードがすべて main 関数の中にある
  • 変数の寿命が無駄に長く、再利用までされている。
  • 大文字・小文字の使い分けが不明瞭(N は定数のように見えるが変数)
  • 出力がソート前とソート後で二種類あるのが意味不明
  • インデントが不揃いで気持ち悪い
  • カウンタがその時の気分によって i だったり n だったりする
  • iMax を -9 で初期化する意味がわからない

全般的に「読みにくく保守しにくい」と感じました。「拡張性があって優れている」ということは無く、その逆だと思います。

次のように構造化すると読みやすくなるのではないかと思います。

C

1#include <stdio.h> 2 3#define N 100 4 5int input(int buffer[], int length) { 6 printf("\nInteger Number or End Of Data(^D)\n<Please Input>\n"); 7 for (int i = 0; i < length; i++) { 8 if (scanf("%d", &buffer[i]) != 1) return i; 9 } 10 return length; 11} 12 13void dump(int buffer[], int length) { 14 for (int i = 0; i < length; i++) { 15 printf("[%d]=%d\n", i, buffer[i]); 16 } 17 printf("\n"); 18} 19 20inline void swap(int *a, int *b) { 21 int t = *a; 22 *a = *b; 23 *b = t; 24} 25 26void selection_sort(int buffer[], int length) { 27 for (int i = 0; i < length - 1; i++) { 28 int max_index = i; 29 for (int j = i + 1; j < length; j++) { 30 if (buffer[max_index] < buffer[j]) { 31 max_index = j; 32 } 33 } 34 swap(&buffer[i], &buffer[max_index]); 35 } 36} 37 38int main(void) { 39 int buffer[N]; 40 41 int length = input(buffer, N); 42 dump(buffer, length); 43 selection_sort(buffer, length); 44 dump(buffer, length); 45 46 return 0; 47}

投稿2020/05/14 06:11

編集2020/05/15 04:24
Zuishin

総合スコア28669

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

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

0

どう思われますか

学生向けの課題のコードと言われれば仕方ないと諦める品質です.

投稿2020/05/14 10:04

編集2020/05/14 10:05
jimbe

総合スコア13209

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

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

0

面倒なことしてますけど、
普通の選択ソートですかね。

投稿2020/05/14 04:19

PingHermit

総合スコア478

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

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

0

皆様はこのプログラムをどう思われますか?

ココ↓で,D[n]同士の比較をするところがダサい.

Max = D[n];
for(i=n;i<N;i++)
{
Max = (Max > D[i]) ? Max : D[iMax = i];
}

投稿2020/05/14 04:17

fana

総合スコア11996

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

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

0

別になんとも思いません。フツーのC-codeです。
C++なら std::sort 使えばいいのに...と思います。

しっかり文法を理解した今ではより拡張性があって優れているプログラムだと思いますが

これのドコに拡張性があるのでしょうか?

投稿2020/05/14 03:45

編集2020/05/14 03:47
episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問