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

Объяснение кода листинга программы

  1. Ввод размера массива (n) и заполнение массива (mas(a, n)).
  2. Проверка массива на симметричность (внутренний цикл for).
  3. Переменные k и l используются как индексы для сравнения элементов массива.
  4. Флаг flag используется для определения симметричности участка массива.
  5. Если flag равен 1, то проверяется длина симметричного участка (внешний цикл for).
  6. Если длина нового участка больше текущей максимальной длины, то обновляются значения maxbegin и maxend.
  7. Вывод на экран максимального симметричного участка (внутренний цикл for).
  8. Обнуление элементов массива a.
  9. Проверка, хочет ли пользователь продолжить выполнение программы (ввод z).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5
Похожие ответы