回答編集履歴
10
関数名逆?
answer
CHANGED
@@ -72,7 +72,8 @@
|
|
72
72
|
```c
|
73
73
|
#include <stdarg.h>
|
74
74
|
|
75
|
+
//b が false ならメッセージを表示して exit
|
75
|
-
void
|
76
|
+
void assertFalse(int lineno, int b, char *format, ...) {
|
76
77
|
if(b) return;
|
77
78
|
|
78
79
|
printf("assert 行番号 %d: ", lineno);
|
@@ -87,7 +88,7 @@
|
|
87
88
|
}
|
88
89
|
```
|
89
90
|
```c
|
90
|
-
nexthen(v,&i,&j,1);
|
91
|
+
nexthen(v,&i,&j,1); assertFalse(__LINE__, i==3 && j==5, "iは%d, jは%d", i, j);
|
91
92
|
```
|
92
93
|
```plain
|
93
94
|
assert 行番号 30: iは3, jは4
|
9
マークダウン間違い
answer
CHANGED
@@ -89,6 +89,6 @@
|
|
89
89
|
```c
|
90
90
|
nexthen(v,&i,&j,1); assertTrue(__LINE__, i==3 && j==5, "iは%d, jは%d", i, j);
|
91
91
|
```
|
92
|
-
```
|
92
|
+
```plain
|
93
93
|
assert 行番号 30: iは3, jは4
|
94
94
|
```
|
8
assertTrue 追加
answer
CHANGED
@@ -66,4 +66,29 @@
|
|
66
66
|
}
|
67
67
|
```
|
68
68
|
このようにしておくと、結果が想定した値で無い場合に "iは~ jは~" と表示されますので、逆にそれが一切表示されず最後の "end" だけ表示されたら、全て想定内だったと言えます。
|
69
|
-
こうすることで、本件のようにコードを書き替えた結果が書き換える前と同じかどうかの確認が、回答側で「 print 結果がご提示のものと同じかどうか」を一つずつ見る必要が無くなり、かつ確実になります。
|
69
|
+
こうすることで、本件のようにコードを書き替えた結果が書き換える前と同じかどうかの確認が、回答側で「 print 結果がご提示のものと同じかどうか」を一つずつ見る必要が無くなり、かつ確実になります。
|
70
|
+
|
71
|
+
こんなメソッドを作っておくのも良いかもしれません。
|
72
|
+
```c
|
73
|
+
#include <stdarg.h>
|
74
|
+
|
75
|
+
void assertTrue(int lineno, int b, char *format, ...) {
|
76
|
+
if(b) return;
|
77
|
+
|
78
|
+
printf("assert 行番号 %d: ", lineno);
|
79
|
+
|
80
|
+
va_list ap;
|
81
|
+
va_start(ap, format);
|
82
|
+
vprintf(format, ap);
|
83
|
+
va_end(ap);
|
84
|
+
|
85
|
+
printf("\n");
|
86
|
+
exit(1);
|
87
|
+
}
|
88
|
+
```
|
89
|
+
```c
|
90
|
+
nexthen(v,&i,&j,1); assertTrue(__LINE__, i==3 && j==5, "iは%d, jは%d", i, j);
|
91
|
+
```
|
92
|
+
```c
|
93
|
+
assert 行番号 30: iは3, jは4
|
94
|
+
```
|
7
修正
answer
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
----
|
4
4
|
仕様から見ると、まずグローバル変数は使わないほうが良いですのでパラメータに加えておきます。
|
5
|
-
そして、要は j の変化をさせる関数ですので、真っ先に j を plus で変化させ、その結果
|
5
|
+
そして、要は j の変化をさせる関数ですので、真っ先に j を plus で変化させ、その結果を補正するようにします。
|
6
6
|
```c
|
7
7
|
void nexthen(int v,int* i,int* j,int plus){
|
8
8
|
(*j)+=plus;
|
@@ -29,7 +29,7 @@
|
|
29
29
|
大体、これはやりすぎです。
|
30
30
|
|
31
31
|
----
|
32
|
-
ついでに
|
32
|
+
ついでに。
|
33
33
|
テストする場合は、print して結果を目で確認するのではなく、確認自体もコード化したほうが良いです。
|
34
34
|
```c
|
35
35
|
int main(){
|
6
追加
answer
CHANGED
@@ -26,4 +26,44 @@
|
|
26
26
|
}
|
27
27
|
}
|
28
28
|
```
|
29
|
-
大体、これはやりすぎです。
|
29
|
+
大体、これはやりすぎです。
|
30
|
+
|
31
|
+
----
|
32
|
+
ついでに
|
33
|
+
テストする場合は、print して結果を目で確認するのではなく、確認自体もコード化したほうが良いです。
|
34
|
+
```c
|
35
|
+
int main(){
|
36
|
+
int v=6;
|
37
|
+
int i=3;
|
38
|
+
int j=4;
|
39
|
+
nexthen(v,&i,&j,1);if(i!=3||j!=5)printf("iは%d, jは%d\n",i,j);
|
40
|
+
nexthen(v,&i,&j,1);if(i!=4||j!=5)printf("iは%d, jは%d\n",i,j);
|
41
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=6)printf("iは%d, jは%d\n",i,j);
|
42
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=7)printf("iは%d, jは%d\n",i,j);
|
43
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=8)printf("iは%d, jは%d\n",i,j);
|
44
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=9)printf("iは%d, jは%d\n",i,j);
|
45
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=10)printf("iは%d, jは%d\n",i,j);
|
46
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=11)printf("iは%d, jは%d\n",i,j);
|
47
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=12)printf("iは%d, jは%d\n",i,j);
|
48
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=13)printf("iは%d, jは%d\n",i,j);
|
49
|
+
nexthen(v,&i,&j,1);if(i!=5||j!=14)printf("iは%d, jは%d\n",i,j);
|
50
|
+
printf("\n");
|
51
|
+
i=2;
|
52
|
+
j=3;
|
53
|
+
nexthen(v,&i,&j,-1);if(i!=1||j!=5)printf("iは%d, jは%d\n",i,j);
|
54
|
+
nexthen(v,&i,&j,-1);if(i!=1||j!=4)printf("iは%d, jは%d\n",i,j);
|
55
|
+
nexthen(v,&i,&j,-1);if(i!=1||j!=3)printf("iは%d, jは%d\n",i,j);
|
56
|
+
nexthen(v,&i,&j,-1);if(i!=1||j!=2)printf("iは%d, jは%d\n",i,j);
|
57
|
+
nexthen(v,&i,&j,-1);if(i!=0||j!=5)printf("iは%d, jは%d\n",i,j);
|
58
|
+
nexthen(v,&i,&j,-1);if(i!=0||j!=4)printf("iは%d, jは%d\n",i,j);
|
59
|
+
nexthen(v,&i,&j,-1);if(i!=0||j!=3)printf("iは%d, jは%d\n",i,j);
|
60
|
+
nexthen(v,&i,&j,-1);if(i!=0||j!=2)printf("iは%d, jは%d\n",i,j);
|
61
|
+
nexthen(v,&i,&j,-1);if(i!=0||j!=1)printf("iは%d, jは%d\n",i,j);
|
62
|
+
nexthen(v,&i,&j,-1);if(i!=-1||j!=5)printf("iは%d, jは%d\n",i,j);
|
63
|
+
nexthen(v,&i,&j,-1);if(i!=-1||j!=4)printf("iは%d, jは%d\n",i,j);
|
64
|
+
nexthen(v,&i,&j,-1);if(i!=-1||j!=3)printf("iは%d, jは%d\n",i,j);
|
65
|
+
printf("end\n");
|
66
|
+
}
|
67
|
+
```
|
68
|
+
このようにしておくと、結果が想定した値で無い場合に "iは~ jは~" と表示されますので、逆にそれが一切表示されず最後の "end" だけ表示されたら、全て想定内だったと言えます。
|
69
|
+
こうすることで、本件のようにコードを書き替えた結果が書き換える前と同じかどうかの確認が、回答側で「 print 結果がご提示のものと同じかどうか」を一つずつ見る必要が無くなり、かつ確実になります。
|
5
コード修正
answer
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
if(*j<=*i){
|
10
10
|
(*i)--;
|
11
11
|
*j=v-1;
|
12
|
-
}if(*j==v){
|
12
|
+
}else if(*j==v){
|
13
13
|
(*i)++;
|
14
14
|
*j=*i+1;
|
15
15
|
}
|
4
コード修正
answer
CHANGED
@@ -19,9 +19,9 @@
|
|
19
19
|
+1 や -1 している部分で plus を使い、後は式の中で条件で切り替えます。
|
20
20
|
```c
|
21
21
|
void nexthen(int v,int* i,int* j,int plus){
|
22
|
-
*j+=plus;
|
22
|
+
(*j)+=plus;
|
23
23
|
if(*j<=*i||*j==v){
|
24
|
-
*i+=plus;
|
24
|
+
(*i)+=plus;
|
25
25
|
*j=(*j==v?*i:v)+plus;
|
26
26
|
}
|
27
27
|
}
|
3
コード修正
answer
CHANGED
@@ -5,12 +5,12 @@
|
|
5
5
|
そして、要は j の変化をさせる関数ですので、真っ先に j を plus で変化させ、その結果で補正するようにします。
|
6
6
|
```c
|
7
7
|
void nexthen(int v,int* i,int* j,int plus){
|
8
|
-
*j+=plus;
|
8
|
+
(*j)+=plus;
|
9
9
|
if(*j<=*i){
|
10
|
-
*i--;
|
10
|
+
(*i)--;
|
11
11
|
*j=v-1;
|
12
12
|
}if(*j==v){
|
13
|
-
*i++;
|
13
|
+
(*i)++;
|
14
14
|
*j=*i+1;
|
15
15
|
}
|
16
16
|
}
|
2
追加
answer
CHANGED
@@ -1,1 +1,29 @@
|
|
1
|
-
仕様では無くコードだけを見てということであれば、例えば if 文の中の式で plus を使えないか…と考えてみては如何でしょうか。
|
1
|
+
仕様では無くコードだけを見てということであれば、例えば if 文の中の式で plus を使えないか…と考えてみては如何でしょうか。
|
2
|
+
|
3
|
+
----
|
4
|
+
仕様から見ると、まずグローバル変数は使わないほうが良いですのでパラメータに加えておきます。
|
5
|
+
そして、要は j の変化をさせる関数ですので、真っ先に j を plus で変化させ、その結果で補正するようにします。
|
6
|
+
```c
|
7
|
+
void nexthen(int v,int* i,int* j,int plus){
|
8
|
+
*j+=plus;
|
9
|
+
if(*j<=*i){
|
10
|
+
*i--;
|
11
|
+
*j=v-1;
|
12
|
+
}if(*j==v){
|
13
|
+
*i++;
|
14
|
+
*j=*i+1;
|
15
|
+
}
|
16
|
+
}
|
17
|
+
```
|
18
|
+
これだけでも大分違うと思いますが・・・不十分であればここからさらにコードで見ます。
|
19
|
+
+1 や -1 している部分で plus を使い、後は式の中で条件で切り替えます。
|
20
|
+
```c
|
21
|
+
void nexthen(int v,int* i,int* j,int plus){
|
22
|
+
*j+=plus;
|
23
|
+
if(*j<=*i||*j==v){
|
24
|
+
*i+=plus;
|
25
|
+
*j=(*j==v?*i:v)+plus;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
```
|
29
|
+
大体、これはやりすぎです。
|
1
前置き追加
answer
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
例えば if 文の中の式で plus を使えないか…と考えてみては如何でしょうか。
|
1
|
+
仕様では無くコードだけを見てということであれば、例えば if 文の中の式で plus を使えないか…と考えてみては如何でしょうか。
|