Один и тот же код на Си и Паскале работает по-разному! - 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;
}
а получается фигня: Подозреваю, что это связано с тем, что в Си нумерация массива идёт с нулевого элемента, а не с первого. Прошу отредачить код так, чтобы он работал так же, как на паскале. Там буквально пару строчек!

Решение задачи: «Один и тот же код на Си и Паскале работает по-разному!»

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;
}

Объяснение кода листинга программы

  1. Включаем заголовочный файл для использования функций ввода-вывода.
  2. Объявляем функцию main(), которая ничего не возвращает и не принимает аргументов.
  3. Объявляем константу nmax, которая равна 100.
  4. Объявляем массив a типа int размером nmax.
  5. Вводим число n, которое будет определять количество элементов в массиве a.
  6. Используем цикл for для заполнения массива a значениями, которые считываем с помощью функции scanf().
  7. Выводим на экран содержимое массива a с помощью цикла for и функции printf().
  8. Объявляем переменные k, max, p1, p2, которые будут использоваться в дальнейшем в коде.
  9. Используем цикл for для поиска максимальной длины отрицательного подмассива.
  10. Если элемент массива a отрицательный, увеличиваем значение переменной k.
  11. Если элемент массива a положительный, проверяем, является ли текущая длина подмассива максимальной.
  12. Если текущая длина подмассива больше максимальной, обновляем значения переменных max, p2, p1 и k.
  13. Выводим на экран длину максимального отрицательного подмассива.
  14. Выводим на экран сам максимальный отрицательный подмассив.
  15. Используем цикл for для удаления отрицательных подмассивов из исходного массива a.
  16. Выводим на экран обновленный массив a.
  17. Возвращаем 0, чтобы указать, что программа успешно завершилась.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5
Похожие ответы