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