Ошибка в выводе массива - 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, что означает успешное завершение программы.