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