Ошибка в выводе массива - C (СИ)

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

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

Само задание: Данa последовательность a1,...,an (n<=100) действительныx чисeл. Выделить из нее знакочеpедующуюся подпоследовательность наибольшей длины и упоpядочить ее по возpастанию. Код
#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;
}
Результат: 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
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;
}

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

  1. В начале программы объявляется массив A типа int с размером N и инициализируются значениями случайных чисел от -5 до 5 с помощью функции rand() и оператора % (возвращает остаток от деления).
  2. Затем определяется переменная count, которая будет отслеживать количество положительных чисел в текущем подмассиве.
  3. Переменная max используется для отслеживания максимального количества последовательных положительных чисел, которые были найдены в массиве.
  4. В цикле for от 0 до N-1 происходит проверка каждого элемента массива A.
  5. Если элемент A[i] положительный, то увеличивается значение count.
  6. Если элемент A[i-1] отрицательный, то count сбрасывается в 0.
  7. Если элемент A[i-1] положительный, то значение count сравнивается с max.
  8. Если значение count больше max, то обновляются значения max и last.
  9. Если элемент A[i] отрицательный, то аналогичные действия происходят, но с отрицательными значениями.
  10. Если элемент A[i] равен 0, то значение count сбрасывается в 0.
  11. После цикла for проверяется значение max.
  12. Если max больше 0, то выводится сообщение о найденной последовательности с указанием индексов и количества элементов.
  13. Затем выводится сам подмассив с помощью цикла for и printf().
  14. Если max равно 0, то выводится сообщение о том, что последовательность не найдена.
  15. Далее начинается поиск минимального элемента в подмассиве с помощью цикла for и переменных min, x и temp.
  16. После нахождения минимального элемента происходит его перестановка на первое место в подмассиве с помощью переменных x и temp.
  17. В конце программы выводится отсортированный подмассив с помощью цикла for и printf().
  18. Функция main() возвращает 0, что означает успешное завершение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5