在Pascal中实现不同尺寸多维数组相加的问题求助
解决Pascal中不同尺寸二维数组相加的问题
嘿,我看到你在尝试实现不同大小的二维数组相加,补0的逻辑确实出了点小问题,咱们来一步步把它修正过来!
原代码的核心问题
你的补0逻辑只处理了**行(横轴)**的情况,而且没有遍历所有列,同时也没考虑列(纵轴)尺寸不匹配的情况;另外当数组B的尺寸比A大时,你的相加循环会超出A的范围,导致运行错误。
修正思路
要实现不同尺寸数组相加,正确的做法是:
- 先确定结果数组的尺寸:行取两个数组的最大行数,列取两个数组的最大列数
- 对每个数组,在超出自身尺寸但在结果尺寸内的位置用0代替(无需提前修改原数组,直接在相加时判断即可)
- 最后遍历结果尺寸的所有位置,将两个数组对应位置的值(超出范围则用0)相加
修正后的完整代码
Program NOTA_ALUNO; Var A,B,C: Array[1..100,1..100] Of Integer; contadorHorizontal,contadorVertical: Integer; valoresVertical_A,valoresHorizontal_A: Integer; valoresVertical_B,valoresHorizontal_B: Integer; maxLinhas, maxColunas, ValorA, ValorB: Integer; // 新增变量存储临时值和结果尺寸 Begin // 输入数组A的尺寸和元素 Writeln('digite as dimensões da matriz A:'); Readln(valoresHorizontal_A, valoresVertical_A); Writeln('digite os elementos da matriz A:'); For contadorHorizontal := 1 To valoresHorizontal_A Do Begin For contadorVertical := 1 To valoresVertical_A Do Begin Read(A[contadorHorizontal,contadorVertical]); End; Readln; End; // 输入数组B的尺寸和元素 Writeln('digite as dimensões da matriz B:'); Readln(valoresHorizontal_B, valoresVertical_B); Writeln('digite os elementos da matriz B:'); For contadorHorizontal := 1 To valoresHorizontal_B Do Begin For contadorVertical := 1 To valoresVertical_B Do Begin Read(B[contadorHorizontal,contadorVertical]); End; Readln; End; // 确定结果数组的最大行和列 maxLinhas := valoresHorizontal_A; If valoresHorizontal_B > maxLinhas Then maxLinhas := valoresHorizontal_B; maxColunas := valoresVertical_A; If valoresVertical_B > maxColunas Then maxColunas := valoresVertical_B; // 计算数组相加:动态判断是否超出原数组范围,超出则用0 For contadorHorizontal := 1 To maxLinhas Do Begin For contadorVertical := 1 To maxColunas Do Begin // 处理A的当前位置:如果在A的尺寸内则取原值,否则用0 ValorA := 0; If (contadorHorizontal <= valoresHorizontal_A) And (contadorVertical <= valoresVertical_A) Then ValorA := A[contadorHorizontal, contadorVertical]; // 处理B的当前位置:同理 ValorB := 0; If (contadorHorizontal <= valoresHorizontal_B) And (contadorVertical <= valoresVertical_B) Then ValorB := B[contadorHorizontal, contadorVertical]; // 赋值给结果数组C C[contadorHorizontal, contadorVertical] := ValorA + ValorB; End; End; // 打印结果 Writeln('O resultado da soma de A+B:'); For contadorHorizontal := 1 To maxLinhas Do Begin For contadorVertical := 1 To maxColunas Do Begin Write(C[contadorHorizontal,contadorVertical],' '); End; Writeln; End; Readln; End.
关键部分解释
- 确定结果尺寸:通过比较两个数组的行和列,取最大值作为结果数组的尺寸,这样不管哪个数组更大,都能覆盖所有元素。
- 动态补0:在相加时直接判断当前位置是否在原数组的范围内,不在就用0,这样不需要提前修改原数组的内容,逻辑更清晰,也避免了循环补0时的错误。
- 避免越界:遍历的范围是结果数组的最大行和列,不会超出任何一个数组的定义范围(因为我们的数组定义是
1..100,足够覆盖输入的常规尺寸)。
内容的提问来源于stack exchange,提问作者Marcio Quiteque
相关产品推荐
相关产品推荐

