Напечатать только положительные числа последовательности - C (СИ)
Формулировка задачи:
Задание: Дана последовательность. Напечатать только положительные числа из этой последовательности, причем, если подряд идет несколько положительных чисел, печатать их в обратном порядке, используя стек.
Run-Time Check Failure #2 - Stack around the variable 'stack' was corrupted.
Прога ведет себя все время по разному.. не могу понять в чем загвоздка
#include "stdafx.h"
#include "conio.h"
#include "locale.h"
#define NMAX 80
/*главная ф-я*/
void main()
{
int str[NMAX];
int stack[NMAX];
int i;
int j=-1;
int n, nom=0;
setlocale (LC_ALL, "Russian");
printf("Введите кол-во элементов:\n");
scanf_s ("%d", &n);
printf("Последовательность:\n");
for (i=0; i < n; i++)
scanf_s("%d", &str[i]);
for (i=0; i < n; i++)
{
if (str[i] > 0 )
stack[++j] = str[i];
else
{
if (j >= 0)
{
for (j=nom; j >=0; j--)
printf ("%d ", stack[j]);
j=-1;
nom=0;
}
}
nom++;
}
_getch();
}Решение задачи: «Напечатать только положительные числа последовательности»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#define NMAX 80
int main()
{
int arr[NMAX];
int i, j, k;
int n;
setlocale(LC_ALL, "Russian");
printf("Введите кол-во элементов: ");
scanf("%d", &n);
printf("Последовательность: ");
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
i = 0;
while (i < n)
{
for (; (i < n) && (arr[i] <= 0); ++i) { ; }
k = i;
for (; (i < n) && (arr[i] > 0); ++i) { ; }
for (j = i - 1; j >= k; --j)
{
printf("%d ", arr[j]);
}
}
_getch();
return 0;
}
Объяснение кода листинга программы
Вывод программы представляет собой последовательность положительных чисел из исходного массива.
- Объявлены три переменные: i, j, k, которые будут использоваться в качестве индексов массива.
- Переменная n инициализируется вводом пользователя, который указывает количество элементов в последовательности.
- В цикле scanf-printf пользователь вводит исходную последовательность.
- Следующий цикл while отбирает отрицательные элементы.
- В каждой итерации внутреннего цикла while, если текущий элемент отрицательный, увеличивается значение i, и выполнение внутреннего цикла прерывается.
- Когда внутренний цикл while завершается, k присваивается значение i.
- В каждой итерации внешнего цикла while, если текущий элемент больше нуля, увеличивается значение i.
- Когда внешний цикл while завершается, для каждого значения j от k до i-1 выводится элемент массива arr[j].
- Программа завершается, когда пользователь нажимает любую клавишу.
- Значение 0 возвращается в функцию main(), что означает успешный конец работы программы.