回答編集履歴
10
関数名逆?
test
CHANGED
@@ -146,7 +146,9 @@
|
|
146
146
|
|
147
147
|
|
148
148
|
|
149
|
+
//b が false ならメッセージを表示して exit
|
150
|
+
|
149
|
-
void assert
|
151
|
+
void assertFalse(int lineno, int b, char *format, ...) {
|
150
152
|
|
151
153
|
if(b) return;
|
152
154
|
|
@@ -176,7 +178,7 @@
|
|
176
178
|
|
177
179
|
```c
|
178
180
|
|
179
|
-
nexthen(v,&i,&j,1); assert
|
181
|
+
nexthen(v,&i,&j,1); assertFalse(__LINE__, i==3 && j==5, "iは%d, jは%d", i, j);
|
180
182
|
|
181
183
|
```
|
182
184
|
|
9
マークダウン間違い
test
CHANGED
@@ -180,7 +180,7 @@
|
|
180
180
|
|
181
181
|
```
|
182
182
|
|
183
|
-
```
|
183
|
+
```plain
|
184
184
|
|
185
185
|
assert 行番号 30: iは3, jは4
|
186
186
|
|
8
assertTrue 追加
test
CHANGED
@@ -135,3 +135,53 @@
|
|
135
135
|
このようにしておくと、結果が想定した値で無い場合に "iは~ jは~" と表示されますので、逆にそれが一切表示されず最後の "end" だけ表示されたら、全て想定内だったと言えます。
|
136
136
|
|
137
137
|
こうすることで、本件のようにコードを書き替えた結果が書き換える前と同じかどうかの確認が、回答側で「 print 結果がご提示のものと同じかどうか」を一つずつ見る必要が無くなり、かつ確実になります。
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
こんなメソッドを作っておくのも良いかもしれません。
|
142
|
+
|
143
|
+
```c
|
144
|
+
|
145
|
+
#include <stdarg.h>
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
void assertTrue(int lineno, int b, char *format, ...) {
|
150
|
+
|
151
|
+
if(b) return;
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
printf("assert 行番号 %d: ", lineno);
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
va_list ap;
|
160
|
+
|
161
|
+
va_start(ap, format);
|
162
|
+
|
163
|
+
vprintf(format, ap);
|
164
|
+
|
165
|
+
va_end(ap);
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
printf("\n");
|
170
|
+
|
171
|
+
exit(1);
|
172
|
+
|
173
|
+
}
|
174
|
+
|
175
|
+
```
|
176
|
+
|
177
|
+
```c
|
178
|
+
|
179
|
+
nexthen(v,&i,&j,1); assertTrue(__LINE__, i==3 && j==5, "iは%d, jは%d", i, j);
|
180
|
+
|
181
|
+
```
|
182
|
+
|
183
|
+
```c
|
184
|
+
|
185
|
+
assert 行番号 30: iは3, jは4
|
186
|
+
|
187
|
+
```
|
7
修正
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
仕様から見ると、まずグローバル変数は使わないほうが良いですのでパラメータに加えておきます。
|
8
8
|
|
9
|
-
そして、要は j の変化をさせる関数ですので、真っ先に j を plus で変化させ、その結果
|
9
|
+
そして、要は j の変化をさせる関数ですので、真っ先に j を plus で変化させ、その結果を補正するようにします。
|
10
10
|
|
11
11
|
```c
|
12
12
|
|
@@ -60,7 +60,7 @@
|
|
60
60
|
|
61
61
|
----
|
62
62
|
|
63
|
-
ついでに
|
63
|
+
ついでに。
|
64
64
|
|
65
65
|
テストする場合は、print して結果を目で確認するのではなく、確認自体もコード化したほうが良いです。
|
66
66
|
|
6
追加
test
CHANGED
@@ -55,3 +55,83 @@
|
|
55
55
|
```
|
56
56
|
|
57
57
|
大体、これはやりすぎです。
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
----
|
62
|
+
|
63
|
+
ついでに
|
64
|
+
|
65
|
+
テストする場合は、print して結果を目で確認するのではなく、確認自体もコード化したほうが良いです。
|
66
|
+
|
67
|
+
```c
|
68
|
+
|
69
|
+
int main(){
|
70
|
+
|
71
|
+
int v=6;
|
72
|
+
|
73
|
+
int i=3;
|
74
|
+
|
75
|
+
int j=4;
|
76
|
+
|
77
|
+
nexthen(v,&i,&j,1);if(i!=3||j!=5)printf("iは%d, jは%d\n",i,j);
|
78
|
+
|
79
|
+
nexthen(v,&i,&j,1);if(i!=4||j!=5)printf("iは%d, jは%d\n",i,j);
|
80
|
+
|
81
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=6)printf("iは%d, jは%d\n",i,j);
|
82
|
+
|
83
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=7)printf("iは%d, jは%d\n",i,j);
|
84
|
+
|
85
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=8)printf("iは%d, jは%d\n",i,j);
|
86
|
+
|
87
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=9)printf("iは%d, jは%d\n",i,j);
|
88
|
+
|
89
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=10)printf("iは%d, jは%d\n",i,j);
|
90
|
+
|
91
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=11)printf("iは%d, jは%d\n",i,j);
|
92
|
+
|
93
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=12)printf("iは%d, jは%d\n",i,j);
|
94
|
+
|
95
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=13)printf("iは%d, jは%d\n",i,j);
|
96
|
+
|
97
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=14)printf("iは%d, jは%d\n",i,j);
|
98
|
+
|
99
|
+
printf("\n");
|
100
|
+
|
101
|
+
i=2;
|
102
|
+
|
103
|
+
j=3;
|
104
|
+
|
105
|
+
nexthen(v,&i,&j,-1);if(i!=1||j!=5)printf("iは%d, jは%d\n",i,j);
|
106
|
+
|
107
|
+
nexthen(v,&i,&j,-1);if(i!=1||j!=4)printf("iは%d, jは%d\n",i,j);
|
108
|
+
|
109
|
+
nexthen(v,&i,&j,-1);if(i!=1||j!=3)printf("iは%d, jは%d\n",i,j);
|
110
|
+
|
111
|
+
nexthen(v,&i,&j,-1);if(i!=1||j!=2)printf("iは%d, jは%d\n",i,j);
|
112
|
+
|
113
|
+
nexthen(v,&i,&j,-1);if(i!=0||j!=5)printf("iは%d, jは%d\n",i,j);
|
114
|
+
|
115
|
+
nexthen(v,&i,&j,-1);if(i!=0||j!=4)printf("iは%d, jは%d\n",i,j);
|
116
|
+
|
117
|
+
nexthen(v,&i,&j,-1);if(i!=0||j!=3)printf("iは%d, jは%d\n",i,j);
|
118
|
+
|
119
|
+
nexthen(v,&i,&j,-1);if(i!=0||j!=2)printf("iは%d, jは%d\n",i,j);
|
120
|
+
|
121
|
+
nexthen(v,&i,&j,-1);if(i!=0||j!=1)printf("iは%d, jは%d\n",i,j);
|
122
|
+
|
123
|
+
nexthen(v,&i,&j,-1);if(i!=-1||j!=5)printf("iは%d, jは%d\n",i,j);
|
124
|
+
|
125
|
+
nexthen(v,&i,&j,-1);if(i!=-1||j!=4)printf("iは%d, jは%d\n",i,j);
|
126
|
+
|
127
|
+
nexthen(v,&i,&j,-1);if(i!=-1||j!=3)printf("iは%d, jは%d\n",i,j);
|
128
|
+
|
129
|
+
printf("end\n");
|
130
|
+
|
131
|
+
}
|
132
|
+
|
133
|
+
```
|
134
|
+
|
135
|
+
このようにしておくと、結果が想定した値で無い場合に "iは~ jは~" と表示されますので、逆にそれが一切表示されず最後の "end" だけ表示されたら、全て想定内だったと言えます。
|
136
|
+
|
137
|
+
こうすることで、本件のようにコードを書き替えた結果が書き換える前と同じかどうかの確認が、回答側で「 print 結果がご提示のものと同じかどうか」を一つずつ見る必要が無くなり、かつ確実になります。
|
5
コード修正
test
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
|
21
21
|
*j=v-1;
|
22
22
|
|
23
|
-
}if(*j==v){
|
23
|
+
}else if(*j==v){
|
24
24
|
|
25
25
|
(*i)++;
|
26
26
|
|
4
コード修正
test
CHANGED
@@ -40,11 +40,11 @@
|
|
40
40
|
|
41
41
|
void nexthen(int v,int* i,int* j,int plus){
|
42
42
|
|
43
|
-
*j+=plus;
|
43
|
+
(*j)+=plus;
|
44
44
|
|
45
45
|
if(*j<=*i||*j==v){
|
46
46
|
|
47
|
-
*i+=plus;
|
47
|
+
(*i)+=plus;
|
48
48
|
|
49
49
|
*j=(*j==v?*i:v)+plus;
|
50
50
|
|
3
コード修正
test
CHANGED
@@ -12,17 +12,17 @@
|
|
12
12
|
|
13
13
|
void nexthen(int v,int* i,int* j,int plus){
|
14
14
|
|
15
|
-
*j+=plus;
|
15
|
+
(*j)+=plus;
|
16
16
|
|
17
17
|
if(*j<=*i){
|
18
18
|
|
19
|
-
*i--;
|
19
|
+
(*i)--;
|
20
20
|
|
21
21
|
*j=v-1;
|
22
22
|
|
23
23
|
}if(*j==v){
|
24
24
|
|
25
|
-
*i++;
|
25
|
+
(*i)++;
|
26
26
|
|
27
27
|
*j=*i+1;
|
28
28
|
|
2
追加
test
CHANGED
@@ -1 +1,57 @@
|
|
1
1
|
仕様では無くコードだけを見てということであれば、例えば if 文の中の式で plus を使えないか…と考えてみては如何でしょうか。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
----
|
6
|
+
|
7
|
+
仕様から見ると、まずグローバル変数は使わないほうが良いですのでパラメータに加えておきます。
|
8
|
+
|
9
|
+
そして、要は j の変化をさせる関数ですので、真っ先に j を plus で変化させ、その結果で補正するようにします。
|
10
|
+
|
11
|
+
```c
|
12
|
+
|
13
|
+
void nexthen(int v,int* i,int* j,int plus){
|
14
|
+
|
15
|
+
*j+=plus;
|
16
|
+
|
17
|
+
if(*j<=*i){
|
18
|
+
|
19
|
+
*i--;
|
20
|
+
|
21
|
+
*j=v-1;
|
22
|
+
|
23
|
+
}if(*j==v){
|
24
|
+
|
25
|
+
*i++;
|
26
|
+
|
27
|
+
*j=*i+1;
|
28
|
+
|
29
|
+
}
|
30
|
+
|
31
|
+
}
|
32
|
+
|
33
|
+
```
|
34
|
+
|
35
|
+
これだけでも大分違うと思いますが・・・不十分であればここからさらにコードで見ます。
|
36
|
+
|
37
|
+
+1 や -1 している部分で plus を使い、後は式の中で条件で切り替えます。
|
38
|
+
|
39
|
+
```c
|
40
|
+
|
41
|
+
void nexthen(int v,int* i,int* j,int plus){
|
42
|
+
|
43
|
+
*j+=plus;
|
44
|
+
|
45
|
+
if(*j<=*i||*j==v){
|
46
|
+
|
47
|
+
*i+=plus;
|
48
|
+
|
49
|
+
*j=(*j==v?*i:v)+plus;
|
50
|
+
|
51
|
+
}
|
52
|
+
|
53
|
+
}
|
54
|
+
|
55
|
+
```
|
56
|
+
|
57
|
+
大体、これはやりすぎです。
|
1
前置き追加
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
例えば if 文の中の式で plus を使えないか…と考えてみては如何でしょうか。
|
1
|
+
仕様では無くコードだけを見てということであれば、例えば if 文の中の式で plus を使えないか…と考えてみては如何でしょうか。
|