アプリ版:「スタンプのみでお礼する」機能のリリースについて

c言語のfor文の問題が理解できなくなってしまったので至急教えて欲しいです。
例えばですが、左上を直角とする三角形を表示させる時は下記のようなプログラムを書きます。この時の2つ目のfor文は横の行の*の数を表してると思うのですが、なぜ初期設定にj=0という風に書いているのでしょうか。一行目は*が10個表示されるならj=10と書いてはいけないんですか?
もう一つ質問したいことがあるのですが、この2つのfor文を for (i=1; i<=10; i++)for (j=1; j<=10-i; j++)のように1繰り上げて書くのはダメなんでしょうか。i=0のように0始まりだと個人的に違和感がありうまく理解できません。できるだけ詳しく教えて欲しいです。お願いします。
#include <stdio.h>

int main(void) {

int i, j;

for (i=0; i<10; i++){
for (j=0; j<10-i; j++){
printf("*");
}
printf("\n");
}

return (0);
}

質問者からの補足コメント

  • 「もう一つ」の方は理解できました。ありがとうございます。
    初期設定の方ですが、j=10にしたいとは言ったものの結果として正しく動かないので困っているところです。for(j=10;j>0;j--)にすればいいのかなとは思ったのですがこれだと正しく動かないのでどうすればいいのか分からない状態です。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/05/17 00:46

A 回答 (6件)

「もう一つ」の方を先に書いてしまうと


一般に C では「0 からはじめる」のがふつうなのでこの先 C を続けていくつもりなら慣れるべし
だな. もちろん「個人で」やるだけならどう書こうと勝手だが, 「他人」がからむ場合には「一般」を無視するわけにはいかない.

で戻ると「初期設定」も「結果として正しく動く」ように書けばいい... んだが, 具体的には全体としてどう書くつもり?
この回答への補足あり
    • good
    • 0

「正しく動かない」って, どういうこと? 具体的にはどのような動作をするの? 逆に「正しく動く」ときには, どのように動いてほしいの?



何をどう考えて「for(j=10;j>0;j--)にすればいいのかなとは思った」のですか?

ということを*具体的に*説明してほしい.
    • good
    • 0

どう書いてもかまいません。


結局、想定通り表示されるのであれば。
考えにくいやり方にする必要はありません。
ただデバッグなど、ほかの人のわかりやすいやり方が
あなたのやり方と同じだとは限らないので、
読めるようにしておかなければいけませんが。

#include <stdio.h>
int main(void) {
     int i, j;
     for (i=10; i; --i) {
          for (j=i; j; --j) {
               printf("*");
          }
          printf("\n");
     }
     for (i=0; i<10; i++){
          for (j=i; j<10; j++){
               printf("*");
          }
          printf("\n");
     }
     return 0;
}
    • good
    • 0

>正しく動かないのでどうすればいいのか分からない状態です。


あ、これは論外ですね。正しく動くように考えてください。
正しく動かないということは、わかってないからです。
だからわかりやすいと思うのはあなたの妄想です。
    • good
    • 0

> for(j=10;j>0;j--)にすればいいのかなとは思ったのですが



for(j=10 - i;j>0;j--) でしょ。
    • good
    • 0

>この2つのfor文を


>for (i=1; i<=10; i++)
> for (j=1; j<=10-i; j++)
>のように1繰り上げて書くのはダメなんでしょうか

j<=10-i は j<=10-(i-1)

かな。それはおいといて

別に1から始めても良いのだけど
0 から始めるのに慣れた方がいいです。

① Cでは配列のインデックスは先頭からの
オフセットという意味なのでゼロから始まります。
② 他の 言語でも、javaの文字列中の文字の位置とか
pythonのスライスによる位置も ゼロから始まります。

それから、プログラミングでは、範囲を指定するのに
inclusive-exclusive(最初を含め、最後を含めない)
を使うのが定跡になってます。

C の

for (i = 0; i < 10; i++) {

というような書き方がそれ。

for (i = a; i < b; i++) {

と書くとループ回数が b - a
になりわかりやすいとか、

n = 3
for (i = 3; i < n; i++) {

でループを一度も回さないようにできるとか
#n=2
#for (i = 3; i <= n; i++) {
#は気色悪い


いろいろメリットがあるので
広く使われてます。

こういうイディオムに逆らう書き方をすると、
他の人がソースを読むとき負担になるので、
とっても嫌がられます(^^;
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!