Отладить программу, которая ищет в массиве чисел симметричные участки - C (СИ)
Формулировка задачи:
порграмма иногда работает правильно, а иногда выводит на экан какую-то чушь( помогите разобраться пожалуйста
#include "stdafx.h" #include <iostream> using namespace std; void mas(int a[], int n)//функция которой заполняю массив {int i; cout<<"zapolnite massiiv"<<endl; for(i=0; i<n; i++) cin>>a[i]; return ; } int _tmain(int argc, _TCHAR* argv[]) {int a[100], n, i, j, k, l, flag=1, t, maxbegin, maxend, maxlen, c,v; char z; do//ду вайл для повтора программы { maxbegin=1;//позиция начального i maxend=1;//конечного maxlen=1;// сиимметричный участок нужен максимальной длинны, сюда длины будут записываться cout<<"vvedite razmernost'"<<endl; cin>>n;//вводим размерность массива mas(a, n);//заполняем массив for(i=0; i<n-1; i++)//бежим по масссиву и проверяем его на симметричность for(j=n-1; j>=i; j--) { k=i;// что бы не испорить сами i и j ,будем работать с их копиями l=j; t=j; flag=1;//если флаг в конце останется равен 1 то участок симметричный и в maxbedin и maxend запишем i и j while(l>=k)//уменьшать будем до тех пор пока меньше или равно, потому что случаи симметричности бывают такие( 121, 1221) k++, l--; if(a[k]!=a[l])//если к-ый элемент не равен l-евому, то флаг сбиваем flag=0; if(flag==1)//если флаг остался равен 1 то проверяем какой длиины симметричный кусок массива нашего, тк в конце должен вывестись наибольший симметричный участок if((j-i)>maxlen) { maxlen=(j-i);//если больше уже имеющейся длинны, то maxbegin=i;//перезаписываем позицию начала maxend=j;}//и позицию конца } for(i=maxbegin; i<=maxend; i++)//в конце концов по идее должны получиться "координаты" самого длиннго //симметричного кускаа cout<<a[i]<<" "; //ну и выводим на экран его for(i=0; i<n; i++) a[i]=0; cout<<"prodolgit' vipolnenie?"<<endl; cin>>z; } while(z=='y'||z=='Y') ; system("pause"); return 0; }
Решение задачи: «Отладить программу, которая ищет в массиве чисел симметричные участки»
textual
Листинг программы
#include "stdafx.h" #include <iostream> using namespace std; void mas(int a[], int n)//функция которой заполняю массив {int i; cout<<"zapolnite massiiv"<<endl; for(i=0; i<n; i++) cin>>a[i]; return ; } int _tmain(int argc, _TCHAR* argv[]) {int a[100], n, i, j, k, l, flag=1, t, maxbegin, maxend, maxlen, c,v; char z; do//ду вайл для повтора программы { maxbegin=1;//позиция начального i maxend=1;//конечного maxlen=1;// сиимметричный участок нужен максимальной длинны, сюда длины будут записываться cout<<"vvedite razmernost'"<<endl; cin>>n;//вводим размерность массива mas(a, n);//заполняем массив for(i=0; i<n-1; i++)//бежим по масссиву и проверяем его на симметричность for(j=n-1; j>=i; j--) { k=i;// что бы не испорить сами i и j ,будем работать с их копиями l=j; t=j; flag=1;//если флаг в конце останется равен 1 то участок симметричный и в maxbedin и maxend запишем i и j while(l>=k)//уменьшать будем до тех пор пока меньше или равно, потому что случаи симметричности бывают такие( 121, 1221) { if(a[k]!=a[l])//если к-ый элемент не равен l-евому, то флаг сбиваем flag=0; k++, l--; } if(flag==1)//если флаг остался равен 1 то проверяем какой длиины симметричный кусок массива нашего, тк в конце должен вывестись наибольший симметричный участок if((j-i)>maxlen) { maxlen=(j-i);//если больше уже имеющейся длинны, то maxbegin=i;//перезаписываем позицию начала maxend=j;}//и позицию конца } for(i=maxbegin; i<=maxend; i++)//в конце концов по идее должны получиться "координаты" самого длиннго //симметричного кускаа cout<<a[i]<<" "; //ну и выводим на экран его for(i=0; i<n; i++) a[i]=0; cout<<"prodolgit' vipolnenie?"<<endl; cin>>z; } while(z=='y'||z=='Y') ; system("pause"); return 0; }
Объяснение кода листинга программы
- Ввод размера массива (n) и заполнение массива (mas(a, n)).
- Проверка массива на симметричность (внутренний цикл for).
- Переменные k и l используются как индексы для сравнения элементов массива.
- Флаг flag используется для определения симметричности участка массива.
- Если flag равен 1, то проверяется длина симметричного участка (внешний цикл for).
- Если длина нового участка больше текущей максимальной длины, то обновляются значения maxbegin и maxend.
- Вывод на экран максимального симметричного участка (внутренний цикл for).
- Обнуление элементов массива a.
- Проверка, хочет ли пользователь продолжить выполнение программы (ввод z).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д