前提・実現したいこと
void nexthen(int* i,int* j,int plus);はペア(i,j)の次のペアが何か計算しi,jに代入する、というプログラムです
ただし、引数のi,jは常に0<=i<j<vです。
イメージとしては
(0,1),(0,2),(0,3),...,(0,v-1),(1,2),...,(v-2,v-1)
という列があってその(i,j)の1つ手前や1つ奥のを知りたい、みたいな感じです。
ここで、nexthen(int* i,int* j,int plus);内の
c
1if(plus==1){ 2 if(*j+1==v){ 3 *i+=1; 4 *j=*i+1; 5 }else{ 6 (*j)++; 7 } 8} 9
と
C
1if(plus==-1){ 2 if(*j-1<=*i){ 3 *i-=1; 4 *j=v-1; 5 }else{ 6 (*j)--; 7 } 8}
がほぼ同じ内容なので、1つにまとめたいです。
何かうまいやり方があれば教えたください。
よろしくお願いします。
該当のソースコード
C
1#include <stdio.h> 2int v=6; 3void nexthen(int* i,int* j,int plus){ 4 //if(0<=*i&&*i<*j&&*j<v){ 5 if(plus==1){ 6 if(*j+1==v){ 7 *i+=1; 8 *j=*i+1; 9 }else{ 10 (*j)++; 11 } 12 } 13 if(plus==-1){ 14 if(*j-1<=*i){ 15 *i-=1; 16 *j=v-1; 17 }else{ 18 (*j)--; 19 } 20 } 21 //} 22} 23int main(){ 24 int i=3; 25 int j=4; 26 nexthen(&i,&j,1);printf("iは%d, jは%d\n",i,j); 27 nexthen(&i,&j,1);printf("iは%d, jは%d\n",i,j); 28 nexthen(&i,&j,1);printf("iは%d, jは%d\n",i,j); 29 nexthen(&i,&j,1);printf("iは%d, jは%d\n",i,j); 30 nexthen(&i,&j,1);printf("iは%d, jは%d\n",i,j); 31 nexthen(&i,&j,1);printf("iは%d, jは%d\n",i,j); 32 nexthen(&i,&j,1);printf("iは%d, jは%d\n",i,j); 33 nexthen(&i,&j,1);printf("iは%d, jは%d\n",i,j); 34 nexthen(&i,&j,1);printf("iは%d, jは%d\n",i,j); 35 nexthen(&i,&j,1);printf("iは%d, jは%d\n",i,j); 36 nexthen(&i,&j,1);printf("iは%d, jは%d\n",i,j); 37 printf("\n",i,j); 38 i=2; 39 j=3; 40 nexthen(&i,&j,-1);printf("iは%d, jは%d\n",i,j); 41 nexthen(&i,&j,-1);printf("iは%d, jは%d\n",i,j); 42 nexthen(&i,&j,-1);printf("iは%d, jは%d\n",i,j); 43 nexthen(&i,&j,-1);printf("iは%d, jは%d\n",i,j); 44 nexthen(&i,&j,-1);printf("iは%d, jは%d\n",i,j); 45 nexthen(&i,&j,-1);printf("iは%d, jは%d\n",i,j); 46 nexthen(&i,&j,-1);printf("iは%d, jは%d\n",i,j); 47 nexthen(&i,&j,-1);printf("iは%d, jは%d\n",i,j); 48 nexthen(&i,&j,-1);printf("iは%d, jは%d\n",i,j); 49 nexthen(&i,&j,-1);printf("iは%d, jは%d\n",i,j); 50 nexthen(&i,&j,-1);printf("iは%d, jは%d\n",i,j); 51 nexthen(&i,&j,-1);printf("iは%d, jは%d\n",i,j); 52} 53 54
実行結果
iは3, jは5 iは4, jは5 iは5, jは6 iは5, jは7 iは5, jは8 iは5, jは9 iは5, jは10 iは5, jは11 iは5, jは12 iは5, jは13 iは5, jは14 iは1, jは5 iは1, jは4 iは1, jは3 iは1, jは2 iは0, jは5 iは0, jは4 iは0, jは3 iは0, jは2 iは0, jは1 iは-1, jは5 iは-1, jは4 iは-1, jは3
補足情報(FW/ツールのバージョンなど)
実行結果について
入力がi=5, j=6
や
i=-1, j=5
になることは想定されていないので途中から一見するとおかしな値が出力されていますが、それは仕様でありプログラムは正常に動作しています。
暫定的な解決策
回答してくれた方々を参考に、自分なりにコードを書いてみました。条件分岐の代わりに膨大な四則演算を用いていてかっこ悪いですが......
C
1#include <stdio.h> 2void nexthen(int v,int* i,int* j,int plus){ 3 int k=(*j+plus==((v+*i)+(v-*i)*plus)/2); 4 *i+=plus*k; 5 *j=*j*(1-k)+((v+*i)-(v-*i)*plus)/2*k+plus; 6} 7int main(){ 8 int v=6; 9 int i=3; 10 int j=4; 11 nexthen(v,&i,&j,1);if(i!=3||j!=5)printf("iは%d, jは%d\n",i,j); 12 nexthen(v,&i,&j,1);if(i!=4||j!=5)printf("iは%d, jは%d\n",i,j); 13 nexthen(v,&i,&j,1);if(i!=5||j!=6)printf("iは%d, jは%d\n",i,j); 14 nexthen(v,&i,&j,1);if(i!=5||j!=7)printf("iは%d, jは%d\n",i,j); 15 nexthen(v,&i,&j,1);if(i!=5||j!=8)printf("iは%d, jは%d\n",i,j); 16 nexthen(v,&i,&j,1);if(i!=5||j!=9)printf("iは%d, jは%d\n",i,j); 17 nexthen(v,&i,&j,1);if(i!=5||j!=10)printf("iは%d, jは%d\n",i,j); 18 nexthen(v,&i,&j,1);if(i!=5||j!=11)printf("iは%d, jは%d\n",i,j); 19 nexthen(v,&i,&j,1);if(i!=5||j!=12)printf("iは%d, jは%d\n",i,j); 20 nexthen(v,&i,&j,1);if(i!=5||j!=13)printf("iは%d, jは%d\n",i,j); 21 nexthen(v,&i,&j,1);if(i!=5||j!=14)printf("iは%d, jは%d\n",i,j); 22 printf("\n"); 23 i=2; 24 j=3; 25 nexthen(v,&i,&j,-1);if(i!=1||j!=5)printf("iは%d, jは%d\n",i,j); 26 nexthen(v,&i,&j,-1);if(i!=1||j!=4)printf("iは%d, jは%d\n",i,j); 27 nexthen(v,&i,&j,-1);if(i!=1||j!=3)printf("iは%d, jは%d\n",i,j); 28 nexthen(v,&i,&j,-1);if(i!=1||j!=2)printf("iは%d, jは%d\n",i,j); 29 nexthen(v,&i,&j,-1);if(i!=0||j!=5)printf("iは%d, jは%d\n",i,j); 30 nexthen(v,&i,&j,-1);if(i!=0||j!=4)printf("iは%d, jは%d\n",i,j); 31 nexthen(v,&i,&j,-1);if(i!=0||j!=3)printf("iは%d, jは%d\n",i,j); 32 nexthen(v,&i,&j,-1);if(i!=0||j!=2)printf("iは%d, jは%d\n",i,j); 33 nexthen(v,&i,&j,-1);if(i!=0||j!=1)printf("iは%d, jは%d\n",i,j); 34 nexthen(v,&i,&j,-1);if(i!=-1||j!=5)printf("iは%d, jは%d\n",i,j); 35 nexthen(v,&i,&j,-1);if(i!=-1||j!=4)printf("iは%d, jは%d\n",i,j); 36 nexthen(v,&i,&j,-1);if(i!=-1||j!=3)printf("iは%d, jは%d\n",i,j); 37 printf("end\n"); 38}
実行結果
end
回答4件
あなたの回答
tips
プレビュー