Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проблема смещения в генерации треугольника Паскаля на C/Objective-C: поиск и устранение

Delphi , Синтаксис , Математика

Треугольник Паскаля — это числовая структура, где каждый элемент наряду с двумя числами выше него, является суммой этих чисел. Это классическая задача для программистов, которая позволяет улучшить навыки работы с массивами и понимание алгоритмов.

Оригинальный заголовок:

Проблема смещения в генерации треугольника Паскаля на C/Objective-C

Описание проблемы (вопрос):

Автор вопроса столкнулся с проблемами при генерации треугольника Паскаля в C/Objective-C. Начиная с четвертой строки, вывод стал неверным. Треугольник Паскаля начинается с единицы, и каждая последующая цифра в строке — это сумма двух чисел из предыдущей строки.

Ваш текущий вывод:

       1
      1 1
     1 2 1
    1 3 3 1
     4 6 3 1

Правильный вывод:

        1
       1 1
      1 2 1
     1 3 3 1
    1 4 6 4 1

Ваш исходный код:

// ... код ...
int iterations, i, b, mid, chars, temp;
NSLog(@"Please enter the number of itereations");
scanf("%i",&iterations); // прием ввода пользователя

// расчет позиции первого 1
if (iterations % 2 == 0) mid = (iterations)/2;
else mid = (iterations+1)/2;

chars = iterations*2;
int solutions[iterations][chars];

// сброс значений
for (i = 0; i<iterations; i++) {
    for (b = 0; b<chars; b++) {
        solutions[i][b] = 0;
    }
}
solutions[0][mid] = 1; // начальное 1 в первой строке

// основной алгоритм
for (int row = 1; row<iterations; row++) {
    for (int chi = 0; chi<chars; chi++) {
        temp = 0;
        if (chi > 0) temp += solutions[row-1][chi-1];
        if (chi < iterations) temp += solutions[row-1][chi+1];
        solutions[row][chi] = temp;
    }
}

// вывод
// ... код ...

Анализ проблемы и её решение:

Проанализировав ваш код, можно заметить, что проблема заключается в расчете позиции первого элемента в каждой строке и в условии второго цикла, где происходит добавление соседних элементов предыдущей строки. В частности, переменная mid должна быть рассчитана как iterations - 1, а условие во втором цикле должно быть chi < chars - 1, чтобы избежать выхода за пределы массива.

Исправленный код:

// расчет позиции первого 1
mid = iterations - 1;

// основной алгоритм
for (int row = 1; row<iterations; row++) {
    for (int chi = 0; chi<chars; chi++) {
        temp = 0;
        if (chi > 0) temp += solutions[row-1][chi-1];
        if (chi < chars - 1) temp += solutions[row-1][chi+1]; // исправленное условие
        solutions[row][chi] = temp;
    }
}

После внесения этих изменений, ваш код должен корректно генерировать треугольник Паскаля.

Примечание:

Автор вопроса также упомянул, что добавление NSLog() в циклы генерации и вывода может помочь отладить код и определить, где именно возникает проблема.


Теперь, когда мы рассмотрели проблему и её решение, давайте перейдем к примеру генерации треугольника Паскаля на языке Object Pascal (Delphi), который является более близким к тематике вашего сайта.

Пример на Object Pascal (Delphi):

program PascalTriangle;
{$APPTYPE CONSOLE}

uses
  System.SysUtils;

var
  Iterations: Integer;
  Solutions: array of array of Integer;
  Row, Column, Mid, Chars: Integer;
  Temp: Integer;

procedure Initialize(var Arr: TArray<Integer>; Value: Integer);
begin
  SetLength(Arr, Length(Arr), Value);
end;

procedure PrintRow(const RowData: TArray<Integer>);
var
  SpaceCount: Integer;
begin
  SpaceCount := Length(Solutions) div 2 - Length(RowData);
  WriteLn(SpaceCount * ' ', RowData);
end;

begin
  WriteLn('Please enter the number of iterations: ');
  ReadLn(Iterations);
  Mid := Iterations - 1;
  Chars := Iterations * 2;
  SetLength(Solutions, Iterations, TArray<Integer>.Create(Chars, 0));
  Initialize(Solutions[0], 1);
  Solutions[0][Mid] := 1;

  for Row := 1 to Iterations - 1 do
    for Column := 0 to Chars - 1 do
      if Column > 0 then
        Solutions[Row][Column] := Solutions[Row][Column] + Solutions[Row - 1][Column - 1];
      if Column < Chars - 1 then
        Solutions[Row][Column] := Solutions[Row][Column] + Solutions[Row - 1][Column + 1];

  for Row in Solutions do
    PrintRow(Row);
end.

Этот код на Object Pascal демонстрирует, как можно использовать встроенные возможности языка для работы с динамическими массивами и процедурами, что упрощает чтение и поддержку кода.

Создано по материалам из источника по ссылке.

Вопрос связан с исправлением кода на языке C/Objective-C для корректной генерации треугольника Паскаля, где наблюдается проблема смещения в выводе начиная с четвертой строки.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Математика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:10:40/0.0038518905639648/0