c语言现代方法第八章编程题9

 

为什么我的if(flag==4)break;放在下面这个位置不行?

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
	char ch[10][10], zimu[26] = { 'A' };
	int fang_xiang1, row=0, column=0,flag=0,n=0;
	bool fang_xiang2[4] = { false };

	srand((unsigned)time(NULL));

	for (int i = 0; i < 10; i++)
		for (int j = 0; j < 10; j++)
			ch[i][j] = '.';
	for (int i = 1; i < 26; i++)
		zimu[i] = zimu[i - 1] + 1;
	ch[0][0] = 'A';
	while (n!=25) {
		fang_xiang1 = rand() % 4;
		if (fang_xiang2[fang_xiang1] == true)
			continue;
		fang_xiang2[fang_xiang1] = true;
		switch (fang_xiang1) {
		case 0:
			row += 1; 
			break;
		case 1:
			row -= 1; 
			break;
		case 2:
			column += 1;
			break;
		case 3:
			column -= 1;
			break;
		}
        if (flag == 4)
			break;	
		if (row < 0 || row>9 || column < 0 || column>9 || ch[row][column] != '.') {
			switch (fang_xiang1) {
			case 0:
				row -= 1; 
				break;
			case 1:
				row += 1; 
				break;
			case 2:
				column -= 1;
				break;
			case 3:
				column += 1;
				break;
			}
			flag += 1;
			continue;
		}
		ch[row][column] =zimu[n]+ 1;
		n += 1;
		for (int i = 0; i < 4; i++)
			fang_xiang2[i] = false;
		flag = 0;
	}

	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			printf("%c ", ch[i][j]);
		}
		printf("\n");
	}

	return 0;
}

放在这个位置却可以起作用

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
	char ch[10][10], zimu[26] = { 'A' };
	int fang_xiang1, row=0, column=0,flag=0,n=0;
	bool fang_xiang2[4] = { false };

	srand((unsigned)time(NULL));

	for (int i = 0; i < 10; i++)
		for (int j = 0; j < 10; j++)
			ch[i][j] = '.';
	for (int i = 1; i < 26; i++)
		zimu[i] = zimu[i - 1] + 1;
	ch[0][0] = 'A';
	while (n!=25) {
		if (flag == 4)
			break;
		fang_xiang1 = rand() % 4;
		if (fang_xiang2[fang_xiang1] == true)
			continue;
		fang_xiang2[fang_xiang1] = true;
		switch (fang_xiang1) {
		case 0:
			row += 1; 
			break;
		case 1:
			row -= 1; 
			break;
		case 2:
			column += 1;
			break;
		case 3:
			column -= 1;
			break;
		}	
		if (row < 0 || row>9 || column < 0 || column>9 || ch[row][column] != '.') {
			switch (fang_xiang1) {
			case 0:
				row -= 1; 
				break;
			case 1:
				row += 1; 
				break;
			case 2:
				column -= 1;
				break;
			case 3:
				column += 1;
				break;
			}
			flag += 1;
			continue;
		}
		ch[row][column] =zimu[n]+ 1;
		n += 1;
		for (int i = 0; i < 4; i++)
			fang_xiang2[i] = false;
		flag = 0;
	}

	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			printf("%c ", ch[i][j]);
		}
		printf("\n");
	}

	return 0;
}

有什么不同吗?

while (n!=25) {
		fang_xiang1 = rand() % 4;
        //如果当前if满足条件,则结束当前循环,执行下一次循环。如果if不满足,则往下执行,执行到switch时,肯定会满足某一种情况,导致执行了break,结束了循环。
		if (fang_xiang2[fang_xiang1] == true)
			continue;
		fang_xiang2[fang_xiang1] = true;
		switch (fang_xiang1) {
		case 0:
			row += 1; 
			break;
		case 1:
			row -= 1; 
			break;
		case 2:
			column += 1;
			break;
		case 3:
			column -= 1;
			break;
		}
        if (flag == 4)
			break;	
		if (row < 0 || row>9 || column < 0 || column>9 || ch[row][column] != '.') {
			switch (fang_xiang1) {
			case 0:
				row -= 1; 
				break;
			case 1:
				row += 1; 
				break;
			case 2:
				column -= 1;
				break;
			case 3:
				column += 1;
				break;
			}
			flag += 1;
			continue;
		}
		ch[row][column] =zimu[n]+ 1;
		n += 1;
		for (int i = 0; i < 4; i++)
			fang_xiang2[i] = false;
		flag = 0;
	}

 //如果当前if满足条件,则结束当前循环,执行下一次循环。如果if不满足,则往下执行,执行到switch时,肯定会满足某一种情况,导致执行了break,结束了循环。

if (fang_xiang2[fang_xiang1] == true)

continue;

不起作用是因为,如果满足这个if条件的话,则执行下一次循环。(不会往下执行)

因为上面的flag=0,进入不了,无法改变值。

countinue的意思是继续这个循环,而不是继续下面的程序

区别就时当flag==4以后,第一种写法要多执行while到if(flag ==4)之间的代码才结束循环;第二种写法少执行这些大妈就结束循环。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632