teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

インデント

2020/11/16 00:46

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -3,4 +3,75 @@
3
3
  - scanf("%d", &n);
4
4
  + if (argc != 2 || (n = atoi(argv[1])) < 1) return 1;
5
5
  ```
6
+
6
- これで期待通りの結果かどうかお知らせください。
7
+ これで期待通りの結果かどうかお知らせください。
8
+
9
+ **追記**
10
+ コードを見やすくしてほしいというのは、次のように書いてほしかったのです。
11
+ ```C
12
+ #include <stdio.h>
13
+ #include <stdlib.h>
14
+
15
+ int main(int argc, char *argv[])
16
+ {
17
+ char *a, *b, *c;
18
+ int i, n, na, nb, nc, r;
19
+
20
+ if (argc != 2) {
21
+ printf("usage: %s number_of_digits\n", argv[0]);
22
+ return 1;
23
+ }
24
+ n = atoi(argv[1]);
25
+ if (n < 1) {
26
+ puts("number of digits should be greater than 1");
27
+ return 1;
28
+ }
29
+
30
+ a = calloc(n + 1, sizeof(char));
31
+ b = calloc(n + 1, sizeof(char));
32
+ c = calloc(n + 1, sizeof(char));
33
+ if ((a == NULL) || (b == NULL) || (c == NULL)) {
34
+ printf("cannot allocate memory.\n");
35
+ exit(1);
36
+ }
37
+
38
+ a[0] = 0;
39
+ b[0] = 1;
40
+ na = nb = 1;
41
+
42
+ for (; nb <= n;) {
43
+ r = 0;
44
+ for (i = 0; i != nb; i++) {
45
+ r = a[i] + b[i] + r;
46
+ c[i] = r % 10;
47
+ r = r / 10;
48
+ }
49
+ if (r == 1) {
50
+ c[i] = 1;
51
+ nc = nb + 1;
52
+ } else {
53
+ nc = nb;
54
+ }
55
+ for (i = 0; i != nb; i++) a[i] = b[i];
56
+ for (i = 0; i != nc; i++) b[i] = c[i];
57
+ na = nb;
58
+ nb = nc;
59
+ }
60
+
61
+ for (i = na - 1; i >= 0; i--) printf("%d", a[i]);
62
+ printf("\n");
63
+
64
+ free(a);
65
+ free(b);
66
+ free(c);
67
+
68
+ return 0;
69
+ }
70
+ ```
71
+ main関数の始まりと終わりが明確です。
72
+ if文の始まりと終わり、for文の始まりと終わりが明確で
73
+ 二重のfor文のネストも分かります。
74
+
75
+ 質問のコードのように左詰めで書くと、for文のネストが分かりません。
76
+ たくさんある行頭の } を見て、これはなんの終わりかが分かりません。
77
+ プログラムの構造が理解しづらいものとなります。