🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

解決済

4回答

2207閲覧

scanf()で入力された数値を、別の関数内のfor文内で使用したい

ujinchu

総合スコア19

C

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

0グッド

0クリップ

投稿2021/01/20 00:04

初めまして、C言語を学習しています。
以下の点についてわかる方がいらっしゃったら教えてください。

やりたいこと

  1. scanf(main関数内)に入力した数値を自作関数count()の引数numberとする
  2. 引数numberをcountの引数numとして受け取り、for文の条件式に使用する
  3. for文の1回転ごとに引数numの数値から1を引き、変数iに1を足す
  4. for文の1回転ごとに「i回目」という文をprintf()で出力する

問題

自作関数count()のfor文に、変数num(scanfで変数numberとして受け取ったもの)を受け取ることができない。

コード

C

1#include <stdio.h> 2 3int count(int); 4 5int main(void) 6{ 7 int number; 8 scanf("%d", &number); 9 count(number); 10 return 0; 11} 12 13int count(int num) { 14 15 int i; 16 for(i=1;num<=0;i++) { 17 num--; 18 printf("%d回目\n", i); 19 } 20 21 return 0; 22}

上記のコードの結果

terminal

1ec2-user:~/environment $ ./hello 210 //scanfで入力した数値

想定上の結果

terminal

1ec2-user:~/environment $ ./hello 210 //scanfで入力した数値 31回目 42回目 53回目 64回目 75回目 86回目 97回目 108回目 119回目 1210回目

やってみたこと

自作関数countに、scanfで入力された変数numberが受け取れているか確認するため、
関数count内にいくつかprintf文を記述しました。

c

1int count(int num) { 2 3 printf("for前:%d\n", num); 4 5 int i; 6 for(i=1;num<=0;i++) { 7 num--; 8 printf("%d回目\n", i); 9 printf("for中:%d\n", num); 10 } 11 12 printf("for後:%d\n", num); 13 14 return 0; 15}

結果は以下です。

terminal

1ec2-user:~/environment $ ./hello 210 //scanfで入力した数値 3for前:10 4for後:10

長い時間コードを睨み続けているのですが、もしかすると何か見落としがあるかもしれません。お分かりの方教えてください。

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

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

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

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

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

kaina

2021/01/20 00:12

if文の条件式部分は何を意味するのか調べ直してみましょう。
ujinchu

2021/01/20 00:40

回答ありがとうございました。完全に私の勉強不足でした。 他の方の回答も読み、for文の条件式部分の意味を理解することができました。
kaina

2021/01/20 00:45

勉強不足は勿論ですが、デバッグのやり方でしょうね。 dodox86さんも書かれている通り、デバッガーを導入してデバッグすることを 検討してみることをお勧めします。
guest

回答4

0

あなたの書いているコードの通りの動作をしてますが、これをどうしたいんでしょうか。

for(i=1;num<=0;i++) {

このfor文は、numが0以下の場合にループを実行されますが、numはあなたの提示しているとおり、10なので、ループは実行されません。
全くそのとおりの結果となっています

投稿2021/01/20 00:15

y_waiwai

総合スコア88040

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

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

0

numに10を入れたのであれば、num<=0はもとから成立しませんので、ループは1回も実行されません

投稿2021/01/20 00:14

maisumakun

総合スコア145977

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

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

0

長い時間コードを睨み続けているのですが、もしかすると何か見落としがあるかも

...

for(i=1;num<=0;i++)

num<=0 
#num<=0

投稿2021/01/20 00:13

dodox86

総合スコア9256

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

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

dodox86

2021/01/20 00:22 編集

コードをにらみ続けて分からない場合は、Visual Studioやgdbのようなデバッガーを使ってステップ実行して確認しましょう。デバッガーが無ければ準備しましょう。頭の中で思い込んだことと実機での動作を比べることで、思い込みの部分が訂正され、ご自身の経験値が上がっていきます。
ujinchu

2021/01/20 00:43

>デバッガーを使ってステップ実行して確認しましょう。 助言感謝です。これまで「やってみたこと」の項にあるような確認作業をしていました。 デバッガーを導入してみたいと思います。
dodox86

2021/01/20 00:49

printfのようなもので要所要所の結果確認の習慣自体は良いことだと思います。変数のウォッチをしていることですし、それで済めば何よりです。既に世にある得物は有効に使いましょう、と言う助言でした。使えれば強力な武器です。
guest

0

ベストアンサー

for(i=1;num<=0;i++)num<=0に注目してください。
ここは「この条件が満たされる場合にループの中身を実行する」という項ですね。
num=10の場合は10<=0で条件が満たされないので、一度もループの中身が実行されることなく処理が終了しています。
ここを例えばfor(i=1;i<=num;i++)のように記述すると、質問者様の望む挙動が得られると思います。

投稿2021/01/20 00:17

tmsah

総合スコア101

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

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

ujinchu

2021/01/20 00:41

ご丁寧に解説をいただき、ありがとうございました。 for文の条件式部分をきちんと理解できていませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問