回答編集履歴

10

関数名逆?

2022/01/03 09:31

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -146,7 +146,9 @@
146
146
 
147
147
 
148
148
 
149
+ //b が false ならメッセージを表示して exit
150
+
149
- void assertTrue(int lineno, int b, char *format, ...) {
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); assertTrue(__LINE__, i==3 && j==5, "iは%d, jは%d", i, j);
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

マークダウン間違い

2022/01/03 09:31

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -180,7 +180,7 @@
180
180
 
181
181
  ```
182
182
 
183
- ```c
183
+ ```plain
184
184
 
185
185
  assert 行番号 30: iは3, jは4
186
186
 

8

assertTrue 追加

2022/01/03 09:25

投稿

jimbe
jimbe

スコア12744

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

修正

2022/01/03 09:20

投稿

jimbe
jimbe

スコア12744

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

追加

2022/01/03 06:23

投稿

jimbe
jimbe

スコア12744

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

コード修正

2022/01/03 06:03

投稿

jimbe
jimbe

スコア12744

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

コード修正

2022/01/03 05:56

投稿

jimbe
jimbe

スコア12744

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

コード修正

2022/01/03 05:54

投稿

jimbe
jimbe

スコア12744

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

追加

2022/01/03 05:52

投稿

jimbe
jimbe

スコア12744

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

前置き追加

2022/01/03 05:44

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -1 +1 @@
1
- 例えば if 文の中の式で plus を使えないか…と考えてみては如何でしょうか。
1
+ 仕様では無くコードだけを見てということであれば、例えば if 文の中の式で plus を使えないか…と考えてみては如何でしょうか。