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

Узнай цену своей работы

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

Задача: найти в массиве наидлиннейшую цепочку отрицательных элементов, вырезать её и вставить в конец массива. Нашел тут такой код на паскале, он работает как и требуется:
Листинг программы
  1. uses crt;
  2. const nmax=100;
  3. var a:array[1..nmax] of integer;
  4. n,i,j,k,p1,p2,max,x: integer;
  5. begin
  6. clrscr;
  7. repeat
  8. write('Размер массива до ',nmax,' n=');
  9. readln (n);
  10. until n in [1..nmax];
  11. writeln('Введите ',n,' элементов массива, целых чисел');
  12. for i:=1 to n do
  13. readln (a[i]);
  14. {Поиск позиции и длины максимальной цепи}
  15. k:=0; max:=0; {Первоначальные значения}
  16. for i:=1 to n do
  17. if a[i]<0 then inc (k) {Если положительное - наращиваем счётчик}
  18. else {Иначе}
  19. begin {Если счётчик перерос максимальный - перезапоминаем его и позицию}
  20. if k>max then
  21. begin
  22. max:= k;
  23. p2:=i-1;
  24. p1:=p2-k+1;
  25. k:=0; {Снова включаем счётчик}
  26. end;
  27. end;
  28. writeln; {Выводим результат}
  29. writeln('Максимальное число положительных подряд=',max);
  30. writeln('Последовательность');
  31. for i:=p1 to p2 do
  32. write (a[i],' ');
  33. writeln;
  34. for i:=1 to max do
  35. begin
  36. x:=a[p1];
  37. for j:=p1 to n-1 do
  38. a[j]:=a[j+1];
  39. a[n]:=x;
  40. end;
  41. writeln('Перестановка последовательности в конец массива:');
  42. for i:=1 to n do
  43. write(a[i],' ');
  44. readln
  45. end.
Листинг программы
  1. // ConsoleApplication4.cpp: определяет точку входа для консольного приложения.
  2. //
  3. #include "stdafx.h"
  4. #include <conio.h>
  5. #include <windows.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #define nmax 100;
  9. int a[100];
  10. int n, i, j, k, p1, p2, max, x;
  11.  
  12. int main()
  13. {
  14. scanf_s("%d", &n);
  15. for (i = 0; i < n; i++)
  16. {
  17. scanf_s("%d", &a[i]);
  18. }
  19. // for (i = sizeof(a) / sizeof(a[0]) - 1; i >= 0; i--) a[i] = a[i - 1];
  20. k = 0;
  21. max = 0;
  22. for (i = 1; i < n; i++)
  23. {
  24. if (a[i] < 0) {
  25. k++;
  26. }
  27. else
  28. {
  29. if (k > max) {
  30. max = k;
  31. p2 = i - 1;
  32. p1 = p2 - k + 1;
  33. k = 0;
  34. }
  35. }
  36. }
  37. printf("\n %d \n", max);
  38. for (i = p1; i < p2; i++) {
  39. printf("%d", a[i]);
  40. }
  41. for (i = 1; i < max; i++)
  42. {
  43. x = a[p1];
  44. for (j = p1; j < n - 1; j++) {
  45. a[j] = a[j + 1];
  46. a[n] = x;
  47. }
  48. }
  49. for (i = 0; i < n; i++) {
  50. printf("%d ", a[i]);
  51. }
  52. _getch();
  53. return 0;
  54. }
а получается фигня: Подозреваю, что это связано с тем, что в Си нумерация массива идёт с нулевого элемента, а не с первого. Прошу отредачить код так, чтобы он работал так же, как на паскале. Там буквально пару строчек!

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

textual
Листинг программы
  1. #include  <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.     const int nmax = 100;
  6.     int a[nmax];
  7.    
  8.     int n;
  9.     scanf("%d", &n);
  10.    
  11.     for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  12.    
  13.     printf("Array before:\n");
  14.     for (int i = 0; i < n; i++) printf("%d ", a[i]);
  15.     printf("\n");
  16.    
  17.     int k = 0, max = 0;
  18.     int p1, p2;
  19.    
  20.     for (int i = 0; i < n; i++)
  21.     {
  22.         if (a[i] < 0) k++;
  23.         else
  24.         {
  25.             if (k > max)
  26.             {
  27.                 max = k;
  28.                 p2 = i - 1;
  29.                 p1 = p2 - k + 1;
  30.                 k = 0;
  31.             }
  32.         }
  33.     }
  34.    
  35.     printf("Maximal negative sequence length = %d\n", max);
  36.    
  37.     printf("Sequence:\n");
  38.     for (int i = p1; i < p2 + 1; i++) printf("%d ", a[i]);
  39.     printf("\n");
  40.    
  41.     for (int i = 0; i < max; i++)
  42.     {
  43.         int x = a[p1];
  44.        
  45.         for (int j = p1; j < n - 1; j++) a[j] = a[j + 1];
  46.        
  47.         a[n - 1] = x;
  48.     }
  49.    
  50.     printf("Array after:\n");
  51.     for (int i = 0; i < n; i++) printf("%d ", a[i]);
  52.     printf("\n");
  53.    
  54.     return 0;
  55. }

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

  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

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

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

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы