You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Pascal中实现不同尺寸多维数组相加的问题求助

解决Pascal中不同尺寸二维数组相加的问题

嘿,我看到你在尝试实现不同大小的二维数组相加,补0的逻辑确实出了点小问题,咱们来一步步把它修正过来!

原代码的核心问题

你的补0逻辑只处理了**行(横轴)**的情况,而且没有遍历所有列,同时也没考虑列(纵轴)尺寸不匹配的情况;另外当数组B的尺寸比A大时,你的相加循环会超出A的范围,导致运行错误。

修正思路

要实现不同尺寸数组相加,正确的做法是:

  1. 先确定结果数组的尺寸:行取两个数组的最大行数,列取两个数组的最大列数
  2. 对每个数组,在超出自身尺寸但在结果尺寸内的位置用0代替(无需提前修改原数组,直接在相加时判断即可)
  3. 最后遍历结果尺寸的所有位置,将两个数组对应位置的值(超出范围则用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.

关键部分解释

  1. 确定结果尺寸:通过比较两个数组的行和列,取最大值作为结果数组的尺寸,这样不管哪个数组更大,都能覆盖所有元素。
  2. 动态补0:在相加时直接判断当前位置是否在原数组的范围内,不在就用0,这样不需要提前修改原数组的内容,逻辑更清晰,也避免了循环补0时的错误。
  3. 避免越界:遍历的范围是结果数组的最大行和列,不会超出任何一个数组的定义范围(因为我们的数组定义是1..100,足够覆盖输入的常规尺寸)。

内容的提问来源于stack exchange,提问作者Marcio Quiteque

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:25:22