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

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

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

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Vagrant

Vagrantは、VirtualBox上の仮想マシンを コマンドラインから作成してくれるソフトウェアです。 ビルド環境など容易に構築が可能です。

Q&A

解決済

2回答

1535閲覧

C言語で標準入力から完全数を判別する

L4mbda

総合スコア1

C

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Vagrant

Vagrantは、VirtualBox上の仮想マシンを コマンドラインから作成してくれるソフトウェアです。 ビルド環境など容易に構築が可能です。

0グッド

0クリップ

投稿2020/04/25 05:49

編集2020/04/25 05:53

前提・実現したいこと

標準入力から与えられた数が、"完全数" "ほぼ完全数" "そのほか"のどれか判別するコードを書きたいと
思っています。
①判別する数がいくつあるのかをまず受け取り
②その後に判別する数を打ち込み
③それを判別する。
という流れです。

そのうえで、コード内で問題のある行に特に配列の定義などに問題が生じているようで手詰まりとなりました。

この場合配列(number)をどのように定義すべきでしょうか。

初心者で至らない点も多いとは思いますがよろしくお願いします。

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

C99のエラー
再定義エラー(ローカル変数ではないのか)
おそらく20行目の配列定義がまずいかもしれない

エラーメッセージ [vagrant@localhost C.lesson]$ gcc kanzensu.c -o kanzensu kanzensu.c: In function ‘main’: kanzensu.c:18: error: ‘for’ loop initial declarations are only allowed in C99 mode kanzensu.c:18: note: use option -std=c99 or -std=gnu99 to compile your code kanzensu.c:24: error: ‘for’ loop initial declarations are only allowed in C99 mode kanzensu.c:26: error: invalid operands to binary % (have ‘int *’ and ‘int’) kanzensu.c:35: error: redefinition of ‘i’ kanzensu.c:18: note: previous definition of ‘i’ was here kanzensu.c:35: error: ‘for’ loop initial declarations are only allowed in C99 mode kanzensu.c:39: 警告: ポインタと整数との比較を行なっています kanzensu.c:43: 警告: ポインタと整数との比較を行なっています kanzensu.c:43: 警告: ポインタと整数との比較を行なっています

該当のソースコード

C言語 include <stdio.h> int main(void) { char str[1000]; int k;//`回数` int sum; int number[100]; //`要素の数` fgets(str, sizeof(str), stdin); sscanf(str, "%d" , &k); //`13行` for(int i = 0; i < k; i++) //`17行` { fgets(str, sizeof(str), stdin); sscanf(str,"%d", number[i]); //`20行` for(int j = 0; j < k; j++) //`23行` { if(number % j == 0) { sum = sum + j; } } } for(int i = 0; i < k; i++) //`再定義エラー?` { if(sum == number) { printf("perfect"); //`完全数` } else if(sum == number - 1 || sum == number + 1) { printf("nearly"); //`ほぼ完全数` } else { printf("neither"); //`どちらでもない` } } return 0; }

試したこと

scanfを使ってみたが結果が同じでした

一つの要素入力ではできましたが、
いくつ要素を比較するかは
入力者に依存するため
配列定義の仕方がわかりませんでした。

補足情報(FW/ツールのバージョンなど)

Atom1.45.0

Windows10

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

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

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

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

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

jimbe

2020/04/25 05:54

> note: use option -std=c99 or -std=gnu99 to compile your code と言われていますが, お試しになられましたでしょうか.
guest

回答2

0

ベストアンサー

C99のエラー

kanzensu.c:18: error: ‘for’ loop initial declarations are only allowed in C99 mode kanzensu.c:18: note: use option -std=c99 or -std=gnu99 to compile your code

メッセージの通り、for()で変数宣言したいのであれば、オプションに-std=c99-std=gnu99をつけてください。

・問題点1

C

1if(number % j == 0) 2if(sum == number) 3else if(sum == number - 1 || sum == number + 1)

コンパイラも指摘していますがポインタと整数の比較になっています。
numbernumber[i]ですね。

・問題点2
sum0初期化されていません。
また、2つ目以降の数値の約数も加算されています。

・問題点3
sscanf(str, "%d", number[i]);

sscanf(str, "%d", &number[i]);
ポインタを渡すべきところに整数を渡しています。

・問題点4

C

1 for(int j = 0; j < k; j++) //`23行` 2 { 3 if(number % j == 0)

0除算が行われています。
また、入力した数値の約数を調べたいはずなのに、判定したい数値の数でループを回してしまっています。

・問題点5

C

1for(int i = 0; i < k; i++) //`再定義エラー?` 2()

sumと比較していますが、これではすべての入力数値の約数の和との比較になります。
あとでループするのではなく、

C

1for(int i = 0; i < k; i++) //`17行`

に入れるべきでは?
もしくはsumも配列にして入力値ごとに持ちましょう。

投稿2020/04/25 05:57

編集2020/04/25 06:35
SHOMI

総合スコア4079

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

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

L4mbda

2020/04/26 22:54

詳しい回答を本当にありがとうございます。 おかげで解決しました。 感謝します。
guest

0

for(int i = 0; i < k; i++) //17行

for文の中で変数定義できるのはC99以降となります。
GCCのオプションで、C99を指定する必要があります

if(number % j == 0)

numberは配列です。この条件式は意味不明になってます

投稿2020/04/25 05:54

編集2020/04/25 05:57
y_waiwai

総合スコア87749

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

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

L4mbda

2020/04/26 22:55

回答を本当にありがとうございます。 解決しました。 感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問