Преобразовать массив, увеличив его первую серию наибольшей длины на один элемент - C (СИ)
Формулировка задачи:
Привет ребят! Есть рабочая программа на паскале:
Помогите, пожалуйста, перевести данный код в СИ. Заранее спасибо!
У самого получилось вот такое( не работает ):
// Дан целочисленный массив размера N. // Преобразовать массив, // увеличив его первую серию наибольшей длины // на один элемент // (определение серии дано в задании Array116). program Array128; var a: array [1..40] of integer; B: array [1..20] of integer; C: array [1..20] of integer; temp,M,N,i,j:integer; begin writeln('Введите N (N<=20)'); readln(N); writeln('Значения массива А'); for i:=1 to n do begin write('a[',i,']=');readln(A[i]); B[i]:=i; end; // решение temp:=0; m:=0; // формируем из исходного массива A[] два с длиной серий B[] и значением серий C[] for i:=2 to n do begin inc(temp); if a[i]<>a[i-1] then begin inc(M); B[M]:=temp; C[M]:=a[i-1]; temp:=0; end; end; inc(temp); inc(M); b[M]:=temp; C[M]:=a[i]; // складываем массив A[] согласно задания. temp:=1; for i:=1 to m do begin if b[i]>b[temp] then begin temp:=i; end; end; inc(b[temp]); temp:=0; for i:=1 to m do begin for j:=1 to b[i] do begin inc(temp); a[temp]:=c[i]; end; end; Writeln; Writeln('Ответ'); Write(' A[]: '); for i:=1 to temp do Write(A[i],' '); end.
#include <cstdio> #include <stdlib.h> #include <locale> int main() { setlocale(LC_ALL,"Russian"); int a[50], B[30], C[30], temp, M,N,i,j; printf("Введите N \n"); scanf("%d", &N); printf("Значения массива А"); for(i=1;i<=N;i++) { printf("a[%d]=", i); scanf("%d", &a[i]); B[i]=i; } //решение temp=0; M=0; // формируем из исходного массива A[] два с длиной серий B[] и значением серий C[] for(i=2;i<=N;i++) { temp++; if(a[i]!=a[i-1]) { M++; B[M]=temp; C[M]=a[i-1]; temp=0; } } temp++; M++; B[M]=temp; C[M]=a[i]; // складываем массив A[] согласно заданию temp=1; for(i=1;i<=N;i++) { if(B[i]>B[temp]) { temp=i; } } B[temp]++; temp=0; for(i=1;i<=M;i++) { for(j=0;j<B[i];j++) { temp++; a[temp]=C[i]; } } printf("\n"); printf("Ответ "); printf(" A[]: "); for (i=1;i<=temp;i++) printf("%d ", a[i]); system("pause"); return 0; }
Решение задачи: «Преобразовать массив, увеличив его первую серию наибольшей длины на один элемент»
textual
Листинг программы
#include <stdio.h> int main(void) { int N, i; puts("Введите N (N<=20)"); scanf("%i", &N); int A[N+1]; puts("Значения массива А"); for(i=0; i<N; i++) { printf("A[%02i] = ", i+1); scanf("%i", &A[i]); } int *ptr; int *ptrR = NULL; int temp = 0; int temp2; int max = 0; /* Поиск последнего элемента * самой длинной серии. ****************************/ for( ptr = A, i=0; i<N-1; ptr++, i++) { if (*ptr == *(ptr+1)) temp++; else temp = 0; if (temp > max) { max = temp; ptrR = ptr+1; } } /* Если таковой есть, * начиная с него и все * последующие, перенести на * один адрес дальше. **********************/ if (ptrR) { for (i=0, ptr=A; i<N; i++, ptr++) if (ptrR==ptr) break; i = N-i; temp = *ptr; while(i--) { ++ptr; temp2 = *ptr; *ptr = temp; temp = temp2; } N++; } printf("\nОтвет\n"); for (i=0; i<N; i++) printf("A[%02i] = %i\n", i+1, A[i]); return 0; }
Объяснение кода листинга программы
- Ввод значения N (N<=20) с клавиатуры
- Инициализация массива A[N+1]
- Ввод значений массива A
- Инициализация переменных ptr, i, temp, temp2, max, ptrR
- Поиск последнего элемента самой длинной серии (цикл for) а) Если элементы равны, увеличиваем значение temp б) Если элементы не равны, сбрасываем значение temp в 0 в) Если значение temp больше max, обновляем max и ptrR
- Если ptrR не равно NULL (т.е. найдена серия), а) Перемещение элементов серии на один адрес дальше (цикл for) б) Обновление значения N
- Вывод значений массива A
- Возврат 0 (конец работы программы)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д