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

回答編集履歴

10

関数名逆?

2022/01/03 09:31

投稿

jimbe
jimbe

スコア13357

answer CHANGED
@@ -72,7 +72,8 @@
72
72
  ```c
73
73
  #include <stdarg.h>
74
74
 
75
+ //b が false ならメッセージを表示して exit
75
- void assertTrue(int lineno, int b, char *format, ...) {
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); assertTrue(__LINE__, i==3 && j==5, "iは%d, jは%d", i, j);
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

マークダウン間違い

2022/01/03 09:31

投稿

jimbe
jimbe

スコア13357

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
- ```c
92
+ ```plain
93
93
  assert 行番号 30: iは3, jは4
94
94
  ```

8

assertTrue 追加

2022/01/03 09:25

投稿

jimbe
jimbe

スコア13357

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

修正

2022/01/03 09:20

投稿

jimbe
jimbe

スコア13357

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

追加

2022/01/03 06:23

投稿

jimbe
jimbe

スコア13357

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

コード修正

2022/01/03 06:03

投稿

jimbe
jimbe

スコア13357

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

コード修正

2022/01/03 05:56

投稿

jimbe
jimbe

スコア13357

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

コード修正

2022/01/03 05:54

投稿

jimbe
jimbe

スコア13357

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

追加

2022/01/03 05:52

投稿

jimbe
jimbe

スコア13357

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

前置き追加

2022/01/03 05:44

投稿

jimbe
jimbe

スコア13357

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