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

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

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

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

Q&A

解決済

3回答

1160閲覧

C言語 for文の条件式

hogeee

総合スコア27

C

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

0グッド

0クリップ

投稿2020/09/30 16:38

c

1#include <stdio.h> 2 3int print_array(const int a[], int n) { 4 int i; 5 6 printf("{"); 7 if (n >= 2) 8 for (i = 0; i < n - 1; i++) 9 printf("%d, ", a[i]); 10 if (n >= 1) 11 printf("%d", a[n - 1]); 12 printf("}"); 13} 14 15int sum(const int a[], int n) { 16 int i; 17 int sum = 0; 18 19 for (i = 0; i < n; i++) 20 sum += a[i]; 21 return sum; 22} 23 24int main(void) 25{ 26 int i, j; 27 int x[] = {1, 3, 5, 7}; 28 int y[][5] = { {1, 2, 3, 4, 5}, 29 {1, 1, 1, 1, 1}, 30 {1, 3, 5, 7, 9}, 31 }; 32 33 int x_size = sizeof(x) / sizeof(x[0]); 34 int y_height = sizeof(y) / sizeof(y[0]); 35 int y_width = sizeof(y[0]) / sizeof(y[0][0]); 36 37 printf("配列x..."); 38 print_array(x, x_size); 39 printf(" 合計=%d\n", sum(x, x_size)); 40 41 for (i = 0; i < y_height; i++) { 42 print_array(y[i], y_width); 43 printf(" 合計=%d\n", sum(y[i], y_width)); 44 } 45 46 return 0; 47} 48

このコードは多次元配列内の部分配列の受け渡しを表す、サンプルプログラムなのですが、下の関数内の・・・

c

1int print_array(const int a[], int n) { 2 int i; 3 4 printf("{"); 5 if (n >= 2) 6 for (i = 0; i < n - 1; i++) 7 printf("%d, ", a[i]); 8 if (n >= 1) 9 printf("%d", a[n - 1]); 10 printf("}"); 11} 12

下のfor文の条件式がわかりません。

c

1 2 for (i = 0; i < n - 1; i++) 3 printf("%d, ", a[i]);

「n」要素数を表すのですが、要素数の数だけprintfで表示するはずなのになぜ「n - 1」なのでしょうか?
例えば要素数が5の配列をこの関数に渡して配列内の値をすべてprintfするには

c

1 for (i = 0; i < n; i++) 2 printf("%d ", a[i]);

だと思ったのですが、これを実行すると表示される要素が一つ足りません。

しかし、別の関数だと

c

1int sum(const int a[], int n) { 2 int i; 3 int sum = 0; 4 5 for (i = 0; i < n; i++) 6 sum += a[i]; 7 return sum; 8} 9

for文の判定式が for (i = 0; i < n; i++) になっています。
なぜ関数print_arrayと関数sumでは条件式が違うのでしょうか?
2つの関数は両方とも配列のすべての要素数が条件式に必要だと思うのですが・・・

私はどこを勘違いしているのかわからないのでお尋ねしました。

初心者な質問ですみません。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

もっと簡単に書けるねー

C

1void print_array(const int a[], int n) { 2 int i; 3 4 printf("{"); 5 for (i = 0; i < n; i++) { 6 if ( i != 0 ) printf(", "); // 最初を除き、", " を書く 7 printf("%d", a[i]); 8 } 9 printf("}"); 10}

あるいは:

C

1void print_array(const int a[], int n) { 2 int i; 3 4 printf("{"); 5 for (i = 0; i < n; i++) { 6 printf( i == 0 ? "%d":", %d", a[i]); 7 } 8 printf("}"); 9}

投稿2020/09/30 23:33

編集2020/09/30 23:36
episteme

総合スコア16612

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

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

hogeee

2020/10/01 02:44

すごい!教科書より読みやすいです! 、を先に配置する分岐は逆転の発送ですね! 三項演算子もそんな感じで表現できるなんて!! ありがとうございます。
guest

0

ベストアンサー

「n」要素数を表すのですが、要素数の数だけprintfで表示するはずなのになぜ「n - 1」なのでしょうか?

その後にprintf("%d", a[n - 1]);があるため。
カンマ区切りで表示し、最後の要素の後にはカンマを付けないために分けられています。

C

1int print_array(const int a[], int n) { 2 int i; 3 4 printf("{"); 5 if (n >= 2) 6 for (i = 0; i < n - 1; i++) 7 printf("%d, ", a[i]); // 1~n-1要素目を表示 8 if (n >= 1) 9 printf("%d", a[n - 1]); // n要素目を表示 10 printf("}"); 11}

投稿2020/09/30 17:02

編集2020/09/30 17:06
SHOMI

総合スコア4079

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

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

hogeee

2020/09/30 17:05

あ、、、 ありがとうございます! 絶対にfor文の条件式にのみ囚われていました。 これでぐっすり寝られますwww
guest

0

もっと簡単に書けます。

C

1int print_array(const int a[], int n) 2{ 3 printf("{%d", a[0]); 4 for (int i = 1; i < n; i++) printf(", %d", a[i]); 5 printf("}"); 6}

if文や参考演算子が不要。

投稿2020/10/01 03:26

kazuma-s

総合スコア8224

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

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

SHOMI

2020/10/01 03:33

nが0のときの結果が異なりますよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問