مشکل:برنامه قرینه

mhabat

Member
با سلام.یه برنامه می خوام بنویسم که یک رشته از ورودی بگیره و اگه قرینش همون بود پیغام بده که قرینس.
سورسشو نوشت می خوام ایراداشو درست کنم:
کد:
#include <iostream.h>
#include <conio.h>
int main()
{
    clrscr();
    char x[100];
    cin >> x;
    int a=0,b=0;
    for (int i = 0; x[i] != '\0'; i++)
        a = a * 10 + x[i] - '0';
    for(int j=i;j>=0;j--)
        b = b * 10 + x[j] - '0';
  if(b=a)
 cout<<"the Number is gharine";
 
    getch();
    return 0;
}
خواستم ازین طور دستوری استفاده کنم اما نمیشد:
کد:
for (i--; i >= 0; i--)
برای اینکه خوام یه رشته رو میگیره با یک حلقه اندیس های آرایش رو از آخر به اول بشماره باید چه کارکنم؟
برای این می خوام که اونو بعدش بیام با یک حلقه که اندس هارو از اول به آخر می شماره مقایسه کنم .
خیلی ممنون
بــــدرود
 

the_king

مدیرکل انجمن
با سلام.یه برنامه می خوام بنویسم که یک رشته از ورودی بگیره و اگه قرینش همون بود پیغام بده که قرینس.
برای اینکه خوام یه رشته رو میگیره با یک حلقه اندیس های آرایش رو از آخر به اول بشماره باید چه کارکنم؟
برای این می خوام که اونو بعدش بیام با یک حلقه که اندس هارو از اول به آخر می شماره مقایسه کنم .
خیلی ممنون
بــــدرود
اگه طول یک آرایه رشته ای n کاراکتر باشه (کاراکتر null انتهای رشته رو حساب نمی کنیم) اندیس n - 1 آخرین کاراکتر
رشته است یعنی [x[n - 1
حالا شما یک متغیر i رو اندیس ابتدای رشته (اندیس 0) و j رو روی انتهای رشته (اندیس n - 1 ) قرار می دهید و
در حلقه i رو افزایش می دهید و j رو کاهش. اگر [x[i و [x[j برابر نبودند حلقه رو تموم کنید چون رشته قرینه نیست.
برای پایان دادن طبیعی حلقه می توانید شیوه های مختلفی رو بکار ببرید، مثلا وقتی بهم رسیدند (اگر طول رشته
فرد باشه) یا از هم رد شدند (طول رشته زوج باشه) یا اصلا به انتها و ابتدای رشته رسیدند (از وسط رشته به بعد
مقایسه هایی که میشه بی مورد و کار اضافی یه).
کد:
#include <iostream.h>
#include <conio.h>

int main()
{
    char x[100];
    cout << "Please enter a string :" << endl;
    cin >> x;
    int i, j;
[COLOR="Blue"][B]    for (j = -1; x[j + 1]; j++);[/B][/COLOR]
    for (i = 0; i < j; i++, j--)
        if (x[i] != x[j])
        {
            cout << "No" << endl;
            break;
        }
    if (i >= j)
        cout << "Yes" << endl;
    getch();
    return 0;
}
اون حلقه آبی رنگ j رو روی آخرین کاراکتر رشته تنظیم می کنه.
 

mhabat

Member
سلام میشه یه توضیحی در مورد این دوحلقه بدین:
کد:
[B][COLOR=#0000ff]for (j = -1; x[j + 1]; j++);[/COLOR][/B]
    for (i = 0; i < j; i++, j--)
همچنین چرا برای این قسمت از علامت بزرگتر هم استفاده شده.
کد:
if (i >= j)
با توجه به گفته های شما سوس زیر رو نوشت اما مشکل داره اگه میشه ایرادمو بگین.
سورس:
کد:
#include <iostream.h>
#include <conio.h>
int main()
{
    char x[100];
    cout << "Please enter a string :" << endl;
    cin >> x;
    int i, j;
     for(i=0;x[i]!=0;i++)
     for(j=i-1;j>0;j--)
     if (x[i] != x[j])
        {
            cout << "No" << endl;
            break;
        }
    if (i>= j)
        cout << "Yes" << endl;
    getch();
    return 0;
}
خیلی ممنون
بـــدرود
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام میشه یه توضیحی در مورد این دوحلقه بدین:
کد:
[B][COLOR=#0000ff]for (j = -1; x[j + 1]; j++);[/COLOR][/B]
    for (i = 0; i < j; i++, j--)
این دو حلقه تو در تو نیستند که دومی رو داخل تر نوشتید، این دو تا حلقه مجزا هستند که وقتی اجرا اولی
تموم شد اجرا دومی شروع میشه به اون کاراکتر ; بعد از کد حلقه اول توجه کنید، یعنی حلقه اونجا تموم شده.

توضیح حلقه اولی رو که قبلا دادم، موقعیت j رو روی آخرین کاراکتر رشته تنظیم می کنه، اول فرض می کنه
که طول رشته 0 ئه، یعنی در اندیس 0 کاراکتر null قرار داره، بعد مدام در حلقه بررسی می کنه که فقط زمانی j رو
افزایش بده که کاراکتر بعدی اش null (صفر) نباشه، هر وقت که کاراکتر بعدی null بود از حلقه خارج میشه تا
j روی آخرین کاراکتر رشته قرار داشته باشه، نه null

همچنین چرا برای این قسمت از علامت بزرگتر هم استفاده شده.
کد:
if (i >= j)
i و j هر کدوم در یک سمت رشته قرار دارند و بصورت همزمان به سمت هم می آیند.
اگر طول رشته فرد باشه، اینها در یک موقعیت بهم می رسند، یعنی i == j برقرار میشه :
کد:
ABCBA
>   <
 > <
  X
اما اگر طول رشته زوج باشه، این دو تا هیچوقت روی هم قرار نمی گیرند، چون در یک مرحله
همسایه مجاور هم می شوند و در مرحله بعدی جایشان با هم عوض می شود و i > j میشه :
کد:
ABCCBA
>    <
 >  <
  ><
  <>
 <  >
شرط i >= j را برای این می نویسیم که هر دو حالت زوج و فرد بودن طول رشته رو در نظر بگیریم.

کد:
if (i >= j)

با توجه به گفته های شما سوس زیر رو نوشت اما مشکل داره اگه میشه ایرادمو بگین.
قرار بود که i یک سر رشته باشه و j سر دیگه رشته و ایندو بصورت همزمان یک واحد یک واحد به سمت هم بیان.
این کدی که شما نوشتید دو حلقه تو در تو است، پس اولا i و j به صورت همزمان به سمت هم نمیان،
هر بار که i یک واحد افزایش پیدا می کنه یک حلقه جداگانه برای j رو برای چندین کاراکتر اجرا می کنید.
ثانیا j رو روی انتهای رشته تنظیم نکردید، شما دارید هر کاراکتر [x[i رو با همه کاراکتر های قبل از خودش
مقایسه می کنید، این ربطی به تقارن نداره. برای مقایسه باید یک حلقه داشته باشید نه دو حلقه تو در تو :
کد:
for (i = 0; i < j; i++, j--)

فقط قبلش باید j رو روی آخرین کاراکتر رشته تنظیم کنید :
کد:
for (j = -1; x[j + 1]; j++);

اینطوری هم میشه j رو تنظیم کرد :
کد:
for (j = 0; x[j]; j++);
j--;
 

جدیدترین ارسال ها

بالا