Здравствуйте, у меня имеется код на паскале и мне его нужно перевести в с++, но паскаль я знаю плохо в отличие от с++, ну точнее мои знания в паскале заканчиваются на массивах.
Это основная часть программы.
Код:
{
Дано k > 0 и набор ai(i=1,..,k). Сумма по всем a = 0.
Числа записаны по кругу.
Вычислить максимальное значение суммы стоящих подря
д чисел.
Программу составить с использованием списков.
}
Uses Crt, RingList;
{ нахождение максимальной суммы стоящих подряд чисел
с учетом "закольцованности" }
procedure find_max_sum( pRingList: PTRingList );
var p: PRLItem;
max, sum, i1, i2, count: integer;
iStart, iEnd: integer;
begin
if pRingList = nil then begin
writeln( 'Нет данных' );
exit;
end;
max := 0; { текущая максимальная сумма }
count := pRingList^.getSize -
1;
{ внутри программы индексы от 0 }
for i1:=0 to count do begin
{ поочередно берем каждый элемент в качестве
первого элемента подпоследовательности }
sum := 0; { текущая сумма }
{ вычисляем сумму стоящих подряд чисел с учетом закольцованности }
for i2 := i1 to count+i1 do begin
p := pRingList^.getr( i2 );
sum := sum + p^.value;
if sum > max then begin
max := sum; { новый максимум }
iStart := i1;
iEnd := i2;
end
else if sum < 0 then
{ если в какой-то момент сумма стала отрицательной,
то максимума уже не достичь }
break;
end;
end;
writeln('Максимальная сумма подпоследовательности = ', max );
{ при выводе индексы отсчитываем от 1 }
writeln('a[', iStart+1, '] .. a[', (iEnd mod (count+1))+1, '] :' );
pRingList^.printSeq( iStart, iEnd-iStart+1 );
end;
{ ручной ввод массива }
function manual_input:
PTRingList;
var sum, value, code, count: integer;
s: string;
pList: PTRingList;
begin
new( pList, init ); { создаем список }
writeln( 'Введите значения элементов массива.'#13#10'Для окончания введите пустую строку.' );
count := 0;
sum := 0;
while true do begin
while true do begin
write( 'a[', count+1, '] = ' );
readln(s);
if s = '' then break;
val( s, value, code )
;
if code = 0 then break;
writeln( 'Недопустимый ввод. Повторите.' );
end;
if s = '' then break;
inc(count);
pList^.add( value );
sum := sum + value;
end;
if sum <> 0 then begin
inc( count );
pList^.add( -sum ); { коррекция для получения нулевой суммы }
end;
if count = 0 then begin
dispose( pList, done );
pList := nil;
end;
manual_input := pList;
end;
{ генерация псевдослучайного массива }
function
gen_random: PTRingList;
var sum, value, n: integer;
pList: PTRingList;
begin
pList := nil;
writeln( 'Введите кол-во элементов: ' );
readln( n );
if n < 2 then
writeln( 'Слишком мало элементов. ' )
else begin
new( pList, init ); { создаем список }
sum := 0;
randomize; { инициализаци генератора псевдослучайных чисел }
while n > 1 do begin
value := integer(random( 100 )) - 50; { чис
ло в диапазоне -50..49 }
inc( sum, value );
pList^.add( value );
dec( n );
end;
pList^.add( -sum ); { коррекци
я суммы }
end;
gen_random := pList;
end;
{ вывод массива на экран }
procedure print_list( pRingList: PTRingList );
begin
if pRingList <> nil then
pRingList^.print
else
writeln( 'Нет данных' );
end;
Var pRingList: PTRingList; { указатель на закольцованный массив }
ch: char;
begin
pRingList := nil;
repeat
writeln(
'-------------------------------'#13#10+
'1. Ручной ввод'#13#10+
'2. Генерация
случайного массива'#13#10+
'3. Вывод массива'#13#10+
'4. Поиск максимальной суммы'#13#10+
'-------------------------------'#13#10+
'0. Выход'#13#10+
'-------------------------------'
);
{ этот цикл позволяет исключить повторный вывод меню при
нажатии неверной клавиши }
repeat ch := readkey; until (ch >= '0') and (ch <= '4');
case ch of '1':
begin
if pRingList <> nil then dispose( pRingList, done );
pRingList := manual_input;
end;
'2':
begin
if pRingList <> nil then dispose( pRingList, done );
pRingList := gen_random;
end;
'3': print_list( pRingList );
'4': find_max_sum( pRingList );
end;
until ch = '0';
if pRingList <> nil then
dispose( pRingList, done );
end.
И еще есть библиотека как я понял, её я выложу ниже т.к. ограничен в символах.
Заранее спасибо.