PDA

View Full Version : زیردنباله صعودی یا نزولی



sa1378
یک شنبه 16 شهریور 1393, 09:44 صبح
میخوایم برنامه ای بنویسیم که یه رشته بگیره و بزرگترین زیردنباله متوالی صعودی ای نزولی اونو خروجی بده(به هماره طولش)
برنامه من اینه:
ولی خرجیش اشتباهه
لطفا ببینین اشتباهش کجاست
#include <iostream>

using namespace std;

int tool(char x[])
{
int i=0;
while(x[i]!=NULL)
i++;

return i;
}

int main() {

char a[20];
cin>>a;
int t=tool(a);
pair <int,string> max;
pair <int,string> max2;

max.first=0;
max.second="";
for(int i=0;i<t-1;i++)
{
max2.first=1;
max2.second=a[i];
int sort;

if(a[i]<a[i+1])
sort=0;
else sort=1;

max2.first=2;
max2.second+=a[i+1];

for(int j=i+1;j<t-1;j++)
{
if((sort=0 && a[j]<a[j+1]) || (sort=1 && a[j]>a[j+1]))
{
max2.first++;
max2.second+=a[j+1];
}

}

if(max.first<max2.first)
{
max.first=max2.first;
max.second=max2.second;
}

}
cout<<max.first<<" "<<max.second<<endl;


return 0;
}

rahnema1
یک شنبه 16 شهریور 1393, 18:02 عصر
سلام، این واسه صعودی

#include <stdio.h>
int main()
{
char a[20];
scanf("%s",a);
int l=0,r=0,i=0,f=0;
while(a[i++])
{
if (a[i-1] > a[i])
{
if (i-f > r-l)
{
l=f;
r=i;
}
f=i;
}
}
printf("%.*s\n",r-l,a+l);
printf("length=%d",r-l);
}

sa1378
یک شنبه 16 شهریور 1393, 18:07 عصر
سلام، این واسه صعودی

#include <stdio.h>
int main()
{
char a[20];
scanf("%s",a);
int l=0,r=0,i=0,f=0;
while(a[i++])
{
if (a[i-1] > a[i])
{
if (i-f > r-l)
{
l=f;
r=i;
}
f=i;
}
}
printf("%.*s\n",r-l,a+l);
printf("length=%d",r-l);
}

برای هم صعودی هم نزولی میخوام
که اونم فکر نکنم زیاد سخت باشه
کدشو من نوشتم ولی میخوام بدونم کجاش اشتباهه

omid_kma
یک شنبه 16 شهریور 1393, 18:14 عصر
چرا از دیباگر استفاده نمیکنی و خودت خط به خط تست نمی کنی ؟
if((sort=0
نباید این باشه؟
if((sort==0

rahnema1
یک شنبه 16 شهریور 1393, 18:14 عصر
حلقه تودرتو لازم نیست. یک حلقه کافیه

sa1378
یک شنبه 16 شهریور 1393, 20:29 عصر
چرا از دیباگر استفاده نمیکنی و خودت خط به خط تست نمی کنی ؟
if((sort=0
نباید این باشه؟
if((sort==0
Dev C++ دیباگر داره؟
چجوری میشه باهاش کار کرد؟

sa1378
یک شنبه 16 شهریور 1393, 20:32 عصر
حلقه تودرتو لازم نیست. یک حلقه کافیه

میشه کد رو توضیح رو بدین؟
یکم گیج شدم

rahnema1
یک شنبه 16 شهریور 1393, 20:48 عصر
میشه کد رو توضیح رو بدین؟
یکم گیج شدم

ابتدا پیشنهاد می کنم این تمرین را انجام بدید:
بیشترین مقدار موجود در رشته و شماره اندیس اون را پیدا کنید

هر زیر رشته که پیدا می کنیم یک اندیس ابتدا و یک اندیس انتها داره که با l و r نشون می دهیم
یک رشته ممکنه شامل چند زیر رشته صعودی باشه. وظیفه ما اینه که زیر رشته با بیشترین طول را استخراج کنیم

omid_kma
یک شنبه 16 شهریور 1393, 21:01 عصر
Dev C++‎ دیباگر داره؟
چجوری میشه باهاش کار کرد؟
https://www.youtube.com/watch?v=kHFpzxMFB3E

sa1378
دوشنبه 17 شهریور 1393, 12:27 عصر
ابتدا پیشنهاد می کنم این تمرین را انجام بدید:
بیشترین مقدار موجود در رشته و شماره اندیس اون را پیدا کنید

هر زیر رشته که پیدا می کنیم یک اندیس ابتدا و یک اندیس انتها داره که با l و r نشون می دهیم
یک رشته ممکنه شامل چند زیر رشته صعودی باشه. وظیفه ما اینه که زیر رشته با بیشترین طول را استخراج کنیم

بیشترین مقدار که با یه int max و یه حلقه for پیدا میشه
ولی این کد و کر f , i و اینکه چجوری بزرگترین زیررشته رو برمیگردونه رو نفهمیدم

rahnema1
دوشنبه 17 شهریور 1393, 13:39 عصر
س:از کجا متوجه میشیم یک زیر رشته صعودی تموم شده و به زیر رشته بعدی رسیدیم؟

ج:وقتی که کاراکتر جدید از کاراکتر فعلی کوچکتر باشه

س:یک زیر رشته چگونه مشخص میشه؟

ج:به وسیله اندیس ابتدا و انتهای اون

شما فرض کنید l و r همون int max ما هستند که اندکس زیررشته حداکثر را در خودشون نگه میدارند
با i که کل آرایه را از ابتدا تا انتها طی می کنیم ( کاربرد دیگه اش هم اینه که اندیس انتهای هر زیر رشته را به طور موقتی درخودش نگه می داره)
f هم در واقع اندیس ابتدای هر زیر رشته جدید که با آن مواجه میشیم را ذخیره می کنه در صورتیکه طول اون زیر رشته از طول زیر رشته حداکثر موجود بزرگتر باشه اون زیر رشته به عنوان زیررشته حداکثر معرفی میشه و r و l هم به عنوان اندیس اون قرار می گیرند