Отладить программу, которая ищет в массиве чисел симметричные участки - 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).