Один и тот же код на Си и Паскале работает по-разному! - 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;
- }
Объяснение кода листинга программы
- Включаем заголовочный файл
для использования функций ввода-вывода. - Объявляем функцию main(), которая ничего не возвращает и не принимает аргументов.
- Объявляем константу nmax, которая равна 100.
- Объявляем массив a типа int размером nmax.
- Вводим число n, которое будет определять количество элементов в массиве a.
- Используем цикл for для заполнения массива a значениями, которые считываем с помощью функции scanf().
- Выводим на экран содержимое массива a с помощью цикла for и функции printf().
- Объявляем переменные k, max, p1, p2, которые будут использоваться в дальнейшем в коде.
- Используем цикл for для поиска максимальной длины отрицательного подмассива.
- Если элемент массива a отрицательный, увеличиваем значение переменной k.
- Если элемент массива a положительный, проверяем, является ли текущая длина подмассива максимальной.
- Если текущая длина подмассива больше максимальной, обновляем значения переменных max, p2, p1 и k.
- Выводим на экран длину максимального отрицательного подмассива.
- Выводим на экран сам максимальный отрицательный подмассив.
- Используем цикл for для удаления отрицательных подмассивов из исходного массива a.
- Выводим на экран обновленный массив a.
- Возвращаем 0, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д