Один и тот же код на Си и Паскале работает по-разному! - C (СИ)

Формулировка задачи:

Задача: найти в массиве наидлиннейшую цепочку отрицательных элементов, вырезать её и вставить в конец массива. Нашел тут такой код на паскале, он работает как и требуется:
uses crt;
const nmax=100;
var a:array[1..nmax] of integer;
      n,i,j,k,p1,p2,max,x: integer;
begin
clrscr;
repeat
write('Размер массива до ',nmax,' n=');
readln (n);
until n in [1..nmax];
writeln('Введите ',n,' элементов массива, целых чисел');
for i:=1 to n do
readln (a[i]);
{Поиск позиции и длины максимальной цепи}
k:=0; max:=0; {Первоначальные значения}
for i:=1 to n do
if a[i]<0 then inc (k) {Если положительное - наращиваем счётчик}
else {Иначе}
  begin {Если счётчик перерос максимальный - перезапоминаем его и позицию}
   if k>max then
      begin
        max:= k;
        p2:=i-1;
        p1:=p2-k+1;
        k:=0;  {Снова включаем счётчик}
      end;
  end;
writeln; {Выводим результат}
writeln('Максимальное число положительных подряд=',max);
writeln('Последовательность');
for i:=p1 to p2 do
write (a[i],' ');
writeln;
for i:=1 to max do
 begin
  x:=a[p1];
  for j:=p1 to n-1 do
  a[j]:=a[j+1];
  a[n]:=x;
 end;
writeln('Перестановка последовательности в конец массива:');
for i:=1 to n do
write(a[i],' ');
readln
end.
// ConsoleApplication4.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <conio.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define nmax 100;
int a[100];
int n, i, j, k, p1, p2, max, x;
 
 
 
int main()
{
    scanf_s("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf_s("%d", &a[i]);
    }
    // for (i = sizeof(a) / sizeof(a[0]) - 1; i >= 0; i--) a[i] = a[i - 1];
    
    k = 0;
    max = 0;
    for (i = 1; i < n; i++)
    {
        if (a[i] < 0) {
            k++;
        }
        else
        {
            if (k > max) {
                max = k;
                p2 = i - 1;
                p1 = p2 - k + 1;
                k = 0;
            }
        }
 
    }
    printf("\n %d \n", max);
    for (i = p1; i < p2; i++) {
        printf("%d", a[i]);
 
    }
    for (i = 1; i < max; i++)
    {
    x = a[p1];
        for (j = p1; j < n - 1; j++) {
            a[j] = a[j + 1];
 
            a[n] = x;
        }
 
    }
    for (i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }
    _getch();
    return 0;
}
а получается фигня: Подозреваю, что это связано с тем, что в Си нумерация массива идёт с нулевого элемента, а не с первого. Прошу отредачить код так, чтобы он работал так же, как на паскале. Там буквально пару строчек!

Код к задаче: «Один и тот же код на Си и Паскале работает по-разному! - C (СИ)»

textual
#include  <stdio.h>
 
int main(void)
{
    const int nmax = 100;
    int a[nmax];
    
    int n;
    scanf("%d", &n);
    
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    
    printf("Array before:\n");
    for (int i = 0; i < n; i++) printf("%d ", a[i]);
    printf("\n");
    
    int k = 0, max = 0;
    int p1, p2;
    
    for (int i = 0; i < n; i++)
    {
        if (a[i] < 0) k++;
        else
        {
            if (k > max)
            {
                max = k;
                p2 = i - 1;
                p1 = p2 - k + 1;
                k = 0;
            }
        }
    }
    
    printf("Maximal negative sequence length = %d\n", max);
    
    printf("Sequence:\n");
    for (int i = p1; i < p2 + 1; i++) printf("%d ", a[i]);
    printf("\n");
    
    for (int i = 0; i < max; i++)
    {
        int x = a[p1];
        
        for (int j = p1; j < n - 1; j++) a[j] = a[j + 1];
        
        a[n - 1] = x;
    }
    
    printf("Array after:\n");
    for (int i = 0; i < n; i++) printf("%d ", a[i]);
    printf("\n");
    
    return 0;
}

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

8   голосов, оценка 3.750 из 5


СОХРАНИТЬ ССЫЛКУ