質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1990閲覧

チェーンコード探索について

yezyez

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/07/20 16:25

編集2018/07/20 16:57

前提・実現したいこと

フリーマンのチェーンコードを実装しています
8方向は
567
4 0
123
です。
配列を探索し[1]の場合にSwsw関数に渡し再帰関数で求めようとしています。
height,widthに位置情報を記録し双方が0になった時に探索終了です。

発生している問題・エラーメッセージ

問題1:Swsw関数内のif(sw != 1)にあたる部分の文が機能していない。
問題2:height,widthの値に0を入れて回したのですがSwsw内のswitchを抜けない。

該当のソースコード

c言語

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <math.h> 5 6//チェーンコード探索プログラム 7void Swsw(int sw,int i,int j,int gg[][16]){ 8 static int width; 9 static int height; 10 11 switch(sw){ 12 case 0: 13 if(gg[i][j+1] == 1){ 14 j ++; 15 width ++; 16 printf("(%d,%d)",i,j); 17 printf("(width%d height%d)",width,height); 18 puts("0"); 19 for(sw = 0;sw < 8;sw++){ 20 if(sw != 4){ 21 if(width == 0 && height == 0){ 22 break; 23 } 24 Swsw(sw,i,j,gg); 25 } 26 } 27 } 28 29 case 1: 30 if(gg[i+1][j+1] == 1){ 31 i ++; 32 j ++; 33 width ++; 34 height ++; 35 printf("(%d,%d)",i,j); 36 printf("(width%d height%d)",width,height); 37 puts("1"); 38 for(sw = 0;sw < 8;sw++){ 39 if(sw != 5){ 40 if(width == 0 && height == 0){ 41 break; 42 } 43 Swsw(sw,i,j,gg); 44 } 45 } 46 } 47 48 case 2: 49 if(gg[i+1][j] == 1){ 50 i ++; 51 height ++; 52 printf("(%d,%d)",i,j); 53 printf("(width%d height%d)",width,height); 54 puts("2"); 55 for(sw = 0;sw < 8;sw++){ 56 if(sw != 6){ 57 if(width == 0 && height == 0){ 58 break; 59 } 60 Swsw(sw,i,j,gg); 61 } 62 } 63 } 64 65 case 3: 66 if(gg[i+1][j-1] == 1){ 67 i ++; 68 j --; 69 width--; 70 height ++; 71 printf("(%d,%d)",i,j); 72 printf("(width%d height%d)",width,height); 73 puts("3"); 74 for(sw = 0;sw < 8;sw++){ 75 if(sw != 7){ 76 if(width == 0 && height == 0){ 77 break; 78 } 79 Swsw(sw,i,j,gg); 80 } 81 } 82 } 83 84 case 4: 85 if(gg[i][j-1] == 1){ 86 j --; 87 width --; 88 printf("(%d,%d)",i,j); 89 printf("(width%d height%d)",width,height); 90 puts("4"); 91 for(sw = 0;sw < 8;sw++){ 92 if(sw != 0){ 93 if(width == 0 && height == 0){ 94 break; 95 } 96 Swsw(sw,i,j,gg); 97 } 98 } 99 } 100 101 case 5: 102 if(gg[i-1][j-1] == 1){ 103 i --; 104 j --; 105 height --; 106 width --; 107 printf("(%d,%d)",i,j); 108 printf("(width%d height%d)",width,height); 109 puts("5"); 110 for(sw = 0;sw < 8;sw++){ 111 if(sw != 1){ 112 if(width == 0 && height == 0){ 113 break; 114 } 115 Swsw(sw,i,j,gg); 116 } 117 } 118 } 119 120 case 6: 121 if(gg[i-1][j] == 1){ 122 i --; 123 height --; 124 printf("(%d,%d)",i,j); 125 printf("(width%d height%d)",width,height); 126 puts("6"); 127 for(sw = 0;sw < 8;sw++){ 128 if(sw != 1 || sw != 2){ 129 if(width == 0 && height == 0){ 130 break; 131 } 132 Swsw(sw,i,j,gg); 133 } 134 } 135 } 136 137 case 7: 138 if(gg[i-1][j+1] == 1){ 139 i ++; 140 j --; 141 width ++; 142 height --; 143 printf("(%d,%d)",i,j); 144 printf("(width%d height%d)",width,height); 145 puts("7"); 146 for(sw = 0;sw < 8;sw++){ 147 if(sw != 3){ 148 if(width == 0 && height == 0){ 149 break; 150 } 151 Swsw(sw,i,j,gg); 152 } 153 } 154 } 155 } 156} 157 158int main(void) { 159 int a = 0; 160 int sw = 0; 161 static int l; 162 int ss[16][16] ={ 163 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 164 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 165 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 166 {0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0}, 167 {0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0}, 168 {0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0}, 169 {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, 170 {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, 171 {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, 172 {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, 173 {0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0}, 174 {0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0}, 175 {0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0}, 176 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 177 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 178 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; 179 int sq[16][16] ={ 180 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 181 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 182 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 183 {0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0}, 184 {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, 185 {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, 186 {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, 187 {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, 188 {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, 189 {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, 190 {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, 191 {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, 192 {0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0}, 193 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 194 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 195 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; 196 197 printf("数字を入力してください。1,円 2,正方形\n"); 198 scanf("%d",&a); 199 if(a == 1){ 200 for(int i = 0; i < 17; i++){ 201 for(int j = 0; j < 17; j++){ 202 if(ss[i][j] == 1){ 203 if(l == 0){ 204 l++; 205 printf("チェーンコード開始位置は(%d,%d)です。\n",i,j); 206 for(sw = 0;sw < 4;sw++){ 207 Swsw(sw, i, j, ss); 208 } 209 } 210 } 211 } 212 } 213 } 214 else if(a == 2){ 215 for(int i = 0; i < 17; i++){ 216 for(int j = 0; j < 17; j++){ 217 if(sq[i][j] == 1){ 218 if(l == 0){ 219 l++; 220 printf("チェーンコード開始位置は%d %dです。\n",i,j); 221 for(sw = 0;sw < 4;sw++){ 222 Swsw(sw, i, j,sq); 223 } 224 } 225 } 226 } 227 } 228 } 229 else{ 230 printf("1か2を入力してください。"); 231 } 232} 233

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

switch 文のcase 文の終端には break; が必要です
これがないとそのまま次の case に突入します

C

1 switch(sw){ 2 case 0: 3 if(gg[i][j+1] == 1){ 4 j ++; 5 width ++; 6 printf("(%d,%d)",i,j); 7 printf("(width%d height%d)",width,height); 8 puts("0"); 9 for(sw = 0;sw < 8;sw++){ 10 if(sw != 4){ 11 if(width == 0 && height == 0){ 12 break; 13 } 14 Swsw(sw,i,j,gg); 15 } 16 } 17 } 18 19 break; // << これがないと、そのまま次の case 1: も実行してしまう 20 21 case 1: 22 if(gg[i+1][j+1] == 1){ 23

すべてのcase文の終端に break; いれましょう。

#意図してbreak 入れないというテもあるけど。


それと、
このように、インデントをちゃんとしたほうが見やすくありませんか。

C

1 switch(sw){ 2 case 0: 3 if(gg[i][j+1] == 1){ 4 j ++; 5 width ++; 6 printf("(%d,%d)",i,j); 7 printf("(width%d height%d)",width,height); 8 puts("0"); 9 for(sw = 0;sw < 8;sw++){ 10 if(sw != 4){ 11 if(width == 0 && height == 0){ 12 break; 13 } 14 Swsw(sw,i,j,gg); 15 } 16 } 17 } 18 break; 19 case 1: 20 if(gg[i+1][j+1] == 1){

#コードのロジックは見てないのであしからず

投稿2018/07/20 23:54

編集2018/07/21 00:02
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問