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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

4回答

654閲覧

C言語です。採点お願いします。

tyaaaaaaaaaaras

総合スコア134

C

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

3クリップ

投稿2020/12/07 01:39

編集2020/12/07 13:06

C言語で2から1000の中の素数を求めるプログラムを作ってみました。流石にわからなすぎてインターネットからヒントだけもらって作りました!!
採点お願いします。
もっと読みやすくカッコ良く書く方法があれば是非教えてほしいです!
問題は独習Cの練習問題3.6の大問2です。

C言語

1#include<stdio.h> 2int main(void) 3{ 4    int suuji,waru,df = 0,watta = 0; 5    for (suuji = 2; suuji < 1001; suuji++) { 6        df = 0; 7        for(waru = 1; waru <= suuji; waru++) { 8            watta = suuji% waru; 9            if (watta == 0) { 10                df++; 11            } 12        } 13        if(df == 2) { 14            printf("%d",suuji); 15        } 16        printf(" "); 17    } 18    return 0; 19} 20

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

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

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

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

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

Zuishin

2020/12/07 01:41

インデントが酷すぎてそれ以上読む気になりません。
Zuishin

2020/12/07 01:46

あと画像は論外です。普通コードを読むときには目で読むのではなくツールを使いますが、画像ではそれができません。
tyaaaaaaaaaaras

2020/12/07 01:53

わかりました。 ごめんなさい。言い訳に思えてしまうでしょうが本当に初心者でわかりませんでした。修正します
Zuishin

2020/12/07 01:57

質問文はマークダウンを用いて書くようになっています。 ```C int main(void) { } ``` このように、```C と ``` を単独行にして、その間にコードを書いてください。
Zuishin

2020/12/07 01:58

確認しました。修正お疲れ様でした。
tyaaaaaaaaaaras

2020/12/07 01:58

ありがとうございます。修正してみました!よろしくおねがいします。
miyabi_takatsuk

2020/12/07 04:11

スパゲティコードの意味を勉強した方がいいかと思いますよ。 この、一ファイルで完結する一処理である以上は、スパゲティコードになりようがないかと。
SaitoAtsushi

2020/12/07 06:45

この質問は事実上のコードレビュー依頼です。 その手の漠然とした質問は Teratail の主旨に反しています。 (ただちに規約違反というわけではありませんが。) https://teratail.com/help/avoid-asking また、プログラムが仕様に沿うかどうかならともかく、作法に適うかというのはそのプログラムがどのような運用を意図しているかによっても左右されるため、運用が存在しない演習の類について指摘しようとすると回答も漠然としたものにならざるを得ません。 想定する運用を仮にでも設定するなど、質問をより具体的にしてください。
guest

回答4

0

ベストアンサー

個人的に見づらい・わかりづらい表現だなと思うところのみ指摘します。

■1行に詰め込まない

今回のコードでは変数宣言のみですが、1行には詰め込まないほうが見やすいと思います。
(関連性のある変数を意図的にまとめた方が見やすい場合もあるので絶対ではありません)

diff

1- int suuji,waru,df = 0,watta = 0; 2+ int suuji; 3+ int waru; 4+ int df = 0; 5+ int watta = 0;

■for文のループ条件

仕様で「2から1000の中の素数」と書かれているので、1001と書くのではなく1000と書いた方がわかりやすいです。

diff

1- for (suuji = 2; suuji < 1001; suuji++) { 2+ for (suuji = 2; suuji <= 1000; suuji++) {

■文字間・行間などメリハリをつける

変数宣言と処理の間に空行を入れる。

diff

1 int suuji,waru,df = 0,watta = 0; 2+ 3 for (suuji = 2; suuji < 1001; suuji++) { 4

打ちミスかもしれませんが、詰めると見づらいです。

diff

1- watta = suuji% waru; 2+ watta = suuji % waru;

同様。

diff

1- printf("%d",suuji); 2+ printf("%d", suuji);

■余りを変数に受け取る必要なし

wattaをあとで他の用途で使うなら別ですが、今回の処理では不要です。

diff

1- watta = suuji% waru; 2- if (watta == 0) { 3+ if (suuji% waru == 0) { 4 df++; 5 }

■不要な初期化

dfはループ内先頭で初期化している、wattaは計算結果を受け取るのみなので初期化は不要です。

diff

1- int suuji,waru,df = 0,watta = 0; 2+ int suuji,waru,df,watta;

■4タブにする

8タブになっているのはこの質問上だけでしょうか?
ネストが深くなるにつれ見づらくなるので、4タブにしたほうがよいでしょう。

色々指摘しようかと思いましたが、1関数しかない数行のコードでは大して指摘もありませんでした。
何かを参考にしたようですので、取り立てて無駄なところもないように見えます。
素数のアルゴリズム自体については賛否両論あるでしょうけど、本質問とは関係ないと思うので割愛します。

以下、修正後ソース。

c

1#include<stdio.h> 2 3int main(void) 4{ 5 int suuji; 6 int waru; 7 int df; 8 9 for (suuji = 2; suuji <= 1000; suuji++) { 10 df = 0; 11 for (waru = 1; waru <= suuji; waru++) { 12 if (suuji % waru == 0) { 13 df++; 14 } 15 } 16 if (df == 2) { 17 printf("%d", suuji); 18 } 19 printf(" "); 20 } 21 return 0; 22} 23

投稿2020/12/07 05:06

ttyp03

総合スコア16998

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

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

0

スパゲティコードではないと思います(というか、単純なコードなのでスパゲティにならない)
わかりやすいか?と聞かれたら微妙かなぁと思います。

2から1000の中の素数を表示する

これをそのままコードとして表現したほうが、わかりやすいです。
fanaさんの回答の通り関数化すると、コードの詳細をみなくても何をしてるかすぐイメージできます。
※C言語なれてないので、おかしいかもしれないです

c

1// 2~1000の中の素数を表示 2for (int number = 2; number <= 1000; number++) { 3 if (is_prime(number)) { 4 printf("%d ", number); 5 } 6}

関数を使わないなら変数の命名で代用する

C

1for (int number = 2; number <= 1000; number++) { 2 int isPrime = 1; 3 for (int i = 2; i < number; i++) { // 1と自身以外で以下判定 4 if (number % i == 0) { // 割り切れる数字があれば素数でない 5 isPrime = 0; 6 break; 7 } 8 } 9 if (isPrime == 1) { 10 printf("%d ", number); 11 } 12} 13

投稿2020/12/07 05:16

momon-ga

総合スコア4820

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

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

退会済みユーザー

退会済みユーザー

2020/12/07 05:28

変数の宣言もこの書き方が好みですね。昔のC言語はブロックの先頭で変数宣言する必要があったのですが、今時のコンパイラはそういう制限は無いので、まとめて変数を宣言するより、変数を使用する箇所でその都度宣言し、変数の有効なスコープを可能な限り短くしたい所です。(コンパイラが対応してない場合は仕方ないのですが)
guest

0

カッコ良く

とは何か? 主観的で不明瞭な話だが……
少なくとも私が「かっこ悪い」と思う点があるので挙げてみる.
(i.e. それを正せば少しはカッコ良くなる?)

  • インデントがぐちゃぐちゃ.
  • 日本語的な変数名が個人的にダサいと思う.あと,dfはどういう意味で付けたのかもわからない.
  • ある値を「1とその値自身とで割り切れること」は計算するまでもなく自明である.それをわざわざ計算してカウントしているのがダサい

読みやすく

に関しては,「ある値が素数であるか否かを判定する処理」を(そういう処理だとわかる名前の)関数にでもしてやればどうでしょう.

投稿2020/12/07 01:57

編集2020/12/07 02:16
fana

総合スコア11663

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

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

0

素数の定義:
「素数(そすう、英: prime number)とは、1 より大きい自然数で、正の約数が 1 と自分自身のみであるもののことである。」
に従えば、あなたのプログラムは、全くその通りで、100点満点です。

実際に実行したときには、いくつかの改善すべき点が見られます。

1.出力結果について
イメージ説明
上記のようになり、みにくくなっています。
(1)各素数間の空白が一定でない。
(2)どこかで改行があれば見やすい。

2.fanaさんも言ってますが、1で割ると割り切れるのは自明なので、それは不要です。
処理速度等を考慮すると、
(1)1で割るのは、やめて、2から開始する。
(2)割り切れた回数を数えるのではなく、割り切れたとき、waruの値とsuujiを比較し、
それが、同じでないなら、自分自身で割ったのではないので、素数ではない、と判断すべき。

上記を考慮して修正した結果です。

C

1#include<stdio.h> 2int main(void) 3{ 4 int suuji,waru,df = 0,watta = 0; 5 int flag,counter = 0; 6 for (suuji = 2; suuji < 1001; suuji++) { 7 flag = 0; 8 for(waru = 2; waru <= suuji; waru++) { 9 watta = suuji% waru; 10 if (watta == 0) { 11 if (waru == suuji){ 12 flag = 1; 13 counter++; 14 } 15 break; 16 } 17 } 18 if(flag == 1) { 19 printf("%5d",suuji); 20 if (counter % 10 == 0){ 21 printf("\n"); 22 } 23 } 24 } 25 return 0; 26} 27

実行結果
イメージ説明

投稿2020/12/07 03:28

tatsu99

総合スコア5458

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問