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

使用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 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么