__vector__ 2021-04-13 21:25 采纳率: 100%
浏览 131
已采纳

使用C++输出螺旋方阵

使用C++实现输出螺旋方阵,已运行就出错,求解答!

#include <iostream>
#include <string.h>
#include <iomanip>
using namespace std;

int number[1000][1000] = {0}, start = 1, turn_right = 0, turn_down = 0;

void run(int num) { //此参数作为螺旋方阵边长
	int temp_long = num;
//	memset(number, 0, sizeof(number));
	for (int icircle = 0; icircle < num / 2; icircle++) {
		for (; turn_right < temp_long - 1; turn_right++) { //从左到右
			number[turn_down][turn_right] = start++;
			cout << number[turn_down][turn_right] << endl;
		}
		for (; turn_down < temp_long - 1; turn_down++) { //从上到下
			number[turn_down][turn_right] = start++;
		}
		for (turn_right = temp_long - 1; turn_right > icircle;
		        turn_right--) { //turn_right定位到本圈本行末尾,icircle的值为本圈第一个元素的下标
			number[turn_down][turn_right] = start++;
		}
		for (turn_down = temp_long - 1; turn_down > icircle; turn_down--) {
			number[turn_down][turn_right] = start++;
		}
		turn_down--;
		temp_long--;
		start--;
	}
	if (num % 2 == 1) {
		number[turn_down][turn_right + 1] = start++;
	}
	for (int i = 0; i < num; i++) {
		for (int i2 = 0; i2 < num; i2++) {
			cout << setw(2) << number[i][i2];
		}
		cout << endl;
	}
}

int main() {
	int size;
	cout << "请输入螺旋方阵边长:";
	cin >> size;
	run(size);
	return 0;
}
  • 写回答

4条回答 默认 最新

  • CSDN专家-cpp_learner 2021-04-14 08:16
    关注

    问题找到了。如果解决,点个采纳吧!

    问题一:

    当最后执行完这条语句时,

    for (turn_down = temp_long - 1; turn_down > icircle; turn_down--) {
           number[turn_down][turn_right] = start++;
    }

    此时turn_down已经是0了;然后下面你在对他进行turn_down--;操作,索引就变成负数了,导致数组越界报错。

    解决办法:turn_down++;改成++操作。

     

    问题二:

    这个//start--;需要注释掉。不然无法达到螺旋效果。

     

    void run(int num) { //此参数作为螺旋方阵边长
    	int temp_long = num;
    	//	memset(number, 0, sizeof(number));
    	for (int icircle = 0; icircle < num / 2; icircle++) {
    		for (; turn_right < temp_long - 1; turn_right++) { //从左到右
    			number[turn_down][turn_right] = start++;
    			cout << number[turn_down][turn_right] << endl;
    		}
    		for (; turn_down < temp_long - 1; turn_down++) { //从上到下
    			number[turn_down][turn_right] = start++;
    		}
    		for (turn_right = temp_long - 1; turn_right > icircle; turn_right--) { //turn_right定位到本圈本行末尾,icircle的值为本圈第一个元素的下标
    			number[turn_down][turn_right] = start++;
    		}
    		for (turn_down = temp_long - 1; turn_down > icircle; turn_down--) {
    			number[turn_down][turn_right] = start++;
    		}
    
    		turn_down++;        // 改成++操作
    		temp_long--;
    		//start--;            // 注释掉
    	}
    	if (num % 2 == 1) {
    		number[turn_down][turn_right + 1] = start++;
    	}
    	for (int i = 0; i < num; i++) {
    		for (int i2 = 0; i2 < num; i2++) {
    			cout << setw(2) << number[i][i2] << "\t";
    		}
    		cout << endl;
    	}
    }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?