Ошибка в выводе массива - C (СИ)
Формулировка задачи:
Само задание: Данa последовательность a1,...,an (n<=100) действительныx чисeл. Выделить из нее знакочеpедующуюся подпоследовательность наибольшей длины и упоpядочить ее по возpастанию.
Код Результат:
N=10
A[0]=1
A[1]=2
A[2]=-3
A[3]=6
A[4]=-6
A[5]=4
A[6]=5
A[7]=-9
A[8]=6
A[9]=5
b[0]=1.00
b[1]=2.00
b[2]=-3.00
b[3]=6.00
b[4]=-6.00
b[5]=4.00
#include<stdio.h> #include<stdlib.h> #include<limits.h> int main() { int i, j, n, pr, max=INT_MIN; int LONG=1, T1, T2, pass=0, hold=0; float a[100], b[100]; printf("N="); scanf("%d",&n); for(i=0;i<n;i++) { printf("A[%d]=", i); scanf("%f", &a[i]); } for(i=1;i<n;i++) { pr=a[i]*a[i+1]; if(pr<0) { LONG++; } else if(LONG>max) { T1=i-LONG; T2=i; max=LONG; LONG=0; } } for(i=0,j=T1;i<max,j<=T2;i++,j++) { b[i]=a[j]; printf("b[%d]=%.2f\n",i, b[i]); } for(pass=0;pass<=n-1; pass++) for(i=1;i<=n-1;i++) if(b[i]>b[i+1]) { hold=b[i]; b[i]=b[i+1]; b[i+1]=hold; } printf("\n"); for(i=0;i<=max;i++) printf("b[%d]=%.2f\n",i, b[i]); return 0; }
b[0]=1.00
b[1]=-6.00
b[2]=-3.00
b[3]=2.00
b[4]=4.00
b[5]=6.00
Как видно, непонятный вывод массива: сначала захватывает ненужную единицу(A[0]), потом, естественно, выводит ее на экран да еще и не в отсортированном виде. Какая ошибка, подскажите, пожалуйста Решение задачи: «Ошибка в выводе массива»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 14 int main(void) { int A[N], i, count = 0, max = 0, last; srand(time(NULL)); for(i = 0; i < N; i++) printf("%3d", A[i] = rand() % 10 - 5); for(i = 1; i < N; i++){ if(A[i] > 0){ if(A[i - 1] < 0){ count++; } else{ if(count > max){ max = count; last = i - 1; } count = 0; } } if(A[i] < 0){ if(A[i - 1] > 0){ count++; } else{ if(count > max){ max = count; last = i - 1; } count = 0; } } if(A[i] == 0){ if(count > max){ max = count; last = i - 1; } count = 0; } } if(max){ printf("\nMax sequence is A[%d] to A[%d] total %d elements\n", last - max, last, max + 1); for(i = last - max; i <= last; i++) printf("%d ", A[i]); putchar('\n'); } else puts("Sequence not found"); int min, x, j, temp; for(j = last - max; j <= last; j++){ for(i = j, min = A[j], x = j; i <= last; i++){ if(A[i] < min){ min = A[i]; x = i; } } temp = A[j]; A[j] = min; A[x] = temp; } for(j = last - max; j <= last; j++) printf("%d ", A[j]); return 0; }
Объяснение кода листинга программы
- В начале программы объявляется массив A типа int с размером N и инициализируются значениями случайных чисел от -5 до 5 с помощью функции rand() и оператора % (возвращает остаток от деления).
- Затем определяется переменная count, которая будет отслеживать количество положительных чисел в текущем подмассиве.
- Переменная max используется для отслеживания максимального количества последовательных положительных чисел, которые были найдены в массиве.
- В цикле for от 0 до N-1 происходит проверка каждого элемента массива A.
- Если элемент A[i] положительный, то увеличивается значение count.
- Если элемент A[i-1] отрицательный, то count сбрасывается в 0.
- Если элемент A[i-1] положительный, то значение count сравнивается с max.
- Если значение count больше max, то обновляются значения max и last.
- Если элемент A[i] отрицательный, то аналогичные действия происходят, но с отрицательными значениями.
- Если элемент A[i] равен 0, то значение count сбрасывается в 0.
- После цикла for проверяется значение max.
- Если max больше 0, то выводится сообщение о найденной последовательности с указанием индексов и количества элементов.
- Затем выводится сам подмассив с помощью цикла for и printf().
- Если max равно 0, то выводится сообщение о том, что последовательность не найдена.
- Далее начинается поиск минимального элемента в подмассиве с помощью цикла for и переменных min, x и temp.
- После нахождения минимального элемента происходит его перестановка на первое место в подмассиве с помощью переменных x и temp.
- В конце программы выводится отсортированный подмассив с помощью цикла for и printf().
- Функция main() возвращает 0, что означает успешное завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д