回答編集履歴

1

インデント

2020/11/16 00:46

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -8,4 +8,146 @@
8
8
 
9
9
  ```
10
10
 
11
+
12
+
11
13
  これで期待通りの結果かどうかお知らせください。
14
+
15
+
16
+
17
+ **追記**
18
+
19
+ コードを見やすくしてほしいというのは、次のように書いてほしかったのです。
20
+
21
+ ```C
22
+
23
+ #include <stdio.h>
24
+
25
+ #include <stdlib.h>
26
+
27
+
28
+
29
+ int main(int argc, char *argv[])
30
+
31
+ {
32
+
33
+ char *a, *b, *c;
34
+
35
+ int i, n, na, nb, nc, r;
36
+
37
+
38
+
39
+ if (argc != 2) {
40
+
41
+ printf("usage: %s number_of_digits\n", argv[0]);
42
+
43
+ return 1;
44
+
45
+ }
46
+
47
+ n = atoi(argv[1]);
48
+
49
+ if (n < 1) {
50
+
51
+ puts("number of digits should be greater than 1");
52
+
53
+ return 1;
54
+
55
+ }
56
+
57
+
58
+
59
+ a = calloc(n + 1, sizeof(char));
60
+
61
+ b = calloc(n + 1, sizeof(char));
62
+
63
+ c = calloc(n + 1, sizeof(char));
64
+
65
+ if ((a == NULL) || (b == NULL) || (c == NULL)) {
66
+
67
+ printf("cannot allocate memory.\n");
68
+
69
+ exit(1);
70
+
71
+ }
72
+
73
+
74
+
75
+ a[0] = 0;
76
+
77
+ b[0] = 1;
78
+
79
+ na = nb = 1;
80
+
81
+
82
+
83
+ for (; nb <= n;) {
84
+
85
+ r = 0;
86
+
87
+ for (i = 0; i != nb; i++) {
88
+
89
+ r = a[i] + b[i] + r;
90
+
91
+ c[i] = r % 10;
92
+
93
+ r = r / 10;
94
+
95
+ }
96
+
97
+ if (r == 1) {
98
+
99
+ c[i] = 1;
100
+
101
+ nc = nb + 1;
102
+
103
+ } else {
104
+
105
+ nc = nb;
106
+
107
+ }
108
+
109
+ for (i = 0; i != nb; i++) a[i] = b[i];
110
+
111
+ for (i = 0; i != nc; i++) b[i] = c[i];
112
+
113
+ na = nb;
114
+
115
+ nb = nc;
116
+
117
+ }
118
+
119
+
120
+
121
+ for (i = na - 1; i >= 0; i--) printf("%d", a[i]);
122
+
123
+ printf("\n");
124
+
125
+
126
+
127
+ free(a);
128
+
129
+ free(b);
130
+
131
+ free(c);
132
+
133
+
134
+
135
+ return 0;
136
+
137
+ }
138
+
139
+ ```
140
+
141
+ main関数の始まりと終わりが明確です。
142
+
143
+ if文の始まりと終わり、for文の始まりと終わりが明確で
144
+
145
+ 二重のfor文のネストも分かります。
146
+
147
+
148
+
149
+ 質問のコードのように左詰めで書くと、for文のネストが分かりません。
150
+
151
+ たくさんある行頭の } を見て、これはなんの終わりかが分かりません。
152
+
153
+ プログラムの構造が理解しづらいものとなります。