PDA

View Full Version : سوال مربوط به رشته



abodan0631
دوشنبه 05 دی 1390, 22:54 عصر
تابعي بنويسيد كه بدون استفاده از توابع كتابخانه اي دو رشته را به هم متصل كند و نتيجه را چاپ كند.

b.saminjad
سه شنبه 06 دی 1390, 21:33 عصر
سلام




#include <iostream>
#include <conio>

void insert(char x[],char y[])
{

int i=0 ;
while( x[i]!='\0')
i++;
int j=0;
while( x[j]!='\0')
j++;

for(int l=0;l<=j+2 ;i++,l++)
x[i]=y[l] ;

cout<<x;


}





void main()
{

char x[10]="C++‎";
char y[10]="programmer";

insert(x,y);
getch();



}

quiet_programmer
چهارشنبه 07 دی 1390, 11:44 صبح
با سلام.

برسی نکردم ببینم کد بالا درست هست یا نه ولی به جای قطعه کد زیر میتونی از تک دستور زیر استفاده کنی.
while( x[i]!='\0')
i++;


کد جایگزین:
i=strlen(x);

همچنین با درنظر گرفتن خط 11 اینکه منظور رشته y بوده چون اگه منظور x با شه کد غلطه میتونی از بجای کد زیر هم از دستور همون دستور بالایی یعنی Strlen استفاده کنی.

در ضمن از طرفی طول رشته x ده در نظر گرفته شده. پس از ادغام رشته x و y طول رشته حاصل 13 میشه که توی رشته X نمیتونه جا بگیره. هرچند شاید مشکلی پیش نیاد(منظور از مشکل خطای زمان اجرا) ولی احتمالا رشته y بعد از اجرای تابع insert خراب میشه و قسمتی از (یاکل) اون از بین میره. همچنین رشته x باید در نهایت به کاراکتر NULL ختم بشه تا انتهای رشته مشخص بشه.
نتیجه گیری اخلاقی: شاید کد بالا بدون مشکل اجرا بشه(منظورم از مشکل نداشتن خطای زمان اجراست) ولی مشکل داره.(البته بعد از اصلاح خط شماره 11)

یاحق.
موفق باشید/

b.saminjad
چهارشنبه 07 دی 1390, 14:40 عصر
سلام
سوال دوستمون اینطور بود که بدون توابع وگرنه استفاده از تابعstrlen ساده تر بود بعد این فقط جهت اموزش بود و بنده کاری به طول ارایه و تداخل حافظه نداشتم

quiet_programmer
پنج شنبه 08 دی 1390, 01:34 صبح
با سلام.


فقط جهت اموزش بود و بنده کاری به طول ارایه و تداخل حافظه نداشتم

این دیگه چه جور آموزشیه. کلا برای الحاق در رشته ها و اعمال ریاضی برای انواع عددی مهمترین نکته برسی اینکه بعد انجام عملگر خطای Overflow یا Underflow رخ نده. واین نوع توجه نکردن به حافظه و ظرفیت متغییر مشکلاتی رو پیش میاره.


یاحق.
موفق باشید/

b.saminjad
پنج شنبه 08 دی 1390, 08:56 صبح
سلام

ببینید اینجا هدف چیز دیگه ای بود وگرنه برنامه نویس سی پلاس حتما مدیریت حافظه رو بلده شما اگه میتونین چیزه جدیدی پست کنید لطفا ایراد بی مورد نگیرید

quiet_programmer
پنج شنبه 08 دی 1390, 15:47 عصر
با سلام.


لطفا ایراد بی مورد نگیرید اگه از نظر شما عرایض بنده ایراد بیمورد بوده :متعجب:بنده عذرخواهی میکنم.


اگه میتونین چیزه جدیدی پست کنیدشرمنده بلد نیستم:گریه:
آخه پسر یا دختر خوب اگه تداخل حافظه رو هم در نظر نگیریم باز اشتباس دیگه. من نیومدم که باهات کل بندازم. آخر رشته به NULL ختم نشده اینو چی میگی؟ بیخیال. به به چه کدی نوشتن این دوست خوبمون. آفرین احسنت.

یاحق.
موفق باشید/

quiet_programmer
پنج شنبه 08 دی 1390, 16:58 عصر
دوباره سلام.


اگه میتونین چیزه جدیدی پست کنید

اینم بخاط اینکه حرف دوستمون زیمن نیوفته:خجالت: و جناب abodan0631 (http://barnamenevis.org/member.php?234497-abodan0631) خوشحال باشن:چشمک:.

#include <stdio.h>

int Length(char *Str)
{
if(*Str)
return Length(Str+1)+1;
else
return 0;
}

char* ConcatString(char *Str1,char *Str2)
{
int i=0,j=0;
char Result[80];
if(Length(Str1)+Length(Str2)>=80)
return NULL;
while(Str1[i])
Result[i] = Str1[i++];

while(Str2[j])
Result[i++] = Str2[j++];

Result[i] = '\0';
return Result;
}
int main(void)
{
printf("%s\n",ConcatString("Quiet","_Programmer"));
printf("%d",Length("Javad.rasouli02@yahoo.com"));
return 0;
}

یاحق.
موفق باشید/

b.saminjad
پنج شنبه 08 دی 1390, 17:14 عصر
سلام
ببخشید دوست من قصد من ناراحتی جنابعالی نیست و در مسلط بودن شما شکی نیست بنده فقط خواستم بگم که هدف
نوشتن تابع بود پس من به بقیه دستورات توجه نکردم
بعدش کد رو تست کن تا بفهمی اشتباه نیست همونطور که خودت گفتی اخر رشته null من از همون برای جایگذاری استفاده کردم
خوب دقت کن
نکته بعد اینکه خود ارایه اشارگر ثابته پس اشتباه نیست و میتونی بگی تداخل حافظه داره

با تشکر از شما و راهنماییتون

quiet_programmer
جمعه 09 دی 1390, 01:10 صبح
با سلام.



بعدش کد رو تست کن تا بفهمی اشتباه نیست گفتی که کد رو تست کن تست کردم. طوری گفتی تست کن که به خودم شک کردم گفتم نکنه دارم اشتباه میکنم.بخدا فقط بهت ثابت کنم که داری اشتباه میکنی عکس زیر رو برات میزارم.

79884


همونطور که خودت گفتی اخر رشته null من از همون برای جایگذاری استفاده کردمهرچند دقیقا منظورتو نفهمیدم ولی گویا میخوای بگی که آخر رشته به NULL ختم شده. یه سوال اون A که بعد از الحاق دورشته به انتهای رشته اضافه شده چیه؟ چرا برنامه به مشکل خورد و باید بسته یا دیباگ بشه؟


خوب دقت کندقت کردم ولی با عرض پوزش...


نکته بعد اینکه خود ارایه اشارگر ثابته پس اشتباه نیست و میتونی بگی تداخل حافظه دارهنگرفتم منظورتو.

یاحق.
دیگه جدی جدی موفق باشید/

پ.ن: دیگه تو این تاپیک پست جدید برای ادامه این بحث نمیدم.

b.saminjad
جمعه 09 دی 1390, 09:52 صبح
سلام

داداش من ارایه خودش اشارگر و اشارگر هم میتونه به هرجای حافظه دسرسی داشته باشه اگه جایی مقدار دهی کنه که قبلا رزور شده بود اونوقت تداخل حافظه پیش میاد نه خطا!!!!!!!!!!!!!!

quiet_programmer
جمعه 09 دی 1390, 12:54 عصر
با سلام.

کس که خوابه رو میشه بیدار کرد ولی کسی که خودشو بخواب زده رو نه.

اشارگر هم میتونه به هرجای حافظه دسرسی داشته باشه اگه جایی مقدار دهی کنه که قبلا رزور شده بود اونوقت تداخل حافظه پیش میاد نه خطا!!!!!!!!!!!!!!
آفرین به این همه هوش و زکاوت.

بیخیال. آراه عزیزم کدت درسته. تداخل حافظه؟! کی گفته؟ هر کی میگه اشتباه میکنه. مگه رشته به NULL ختم میشه؟! بابا اینام خوشن ها. نمیدونن به چی گیر بدن الکی...:چشمک:

یاحق.
موفق باشید/

pe32_64
جمعه 09 دی 1390, 14:20 عصر
اینم هست:


char *_strcat(char* first ,const char* second)
{
char *ptr = 0,* temp = first;
while(*first!= '\0')
first++;
for(ptr =(char*) second;*ptr != '\0';ptr++)
{
*first = *ptr;
first++;

}
*first = 0;
return temp;

}

void main()
{
char p[22] ;
strcpy(p,"PEYMAN ");
char *e ="ESMAIELY";
printf("%s",_strcat(p,e));
}

quiet_programmer
شنبه 10 دی 1390, 00:48 صبح
با سلام.


نمیدونم چرا تابع Length رو اینطوری نوشته اید ؟ چرا از این روش (تابع بازگشتی) استفاده کردید ؟ این تابع کلی Overhead داره . هم از لحاظ time هم از لحاظ memory. با هر call شدن متعدد تابع Length حافظه Stack همینطوری اشغال میشه (برای Push کردن Register ها و ... ).اینکه این چرا اینجوری پیاده سازی شده دلیل بر اشتباه بودن کد نیست که شما فرمودین اشتباست.کاملادرسته فارغ از Overhead

بعد شما در تابع ConcatString آرایه ای به نام Result ایجاد کرده ای اون هم با طول محدود.باز هم دلیل بر اشتباه بودن کد نیست با توجه به دستور زیر:
if(Length(Str1)+Length(Str2)>=80) return NULL;

البته فرمایش شما صحیح که باید طول نتیجه نامحدود میشد. ولی اگه امکان داره نامحدود رو برام تعریف کنید. من حتی اگه حافظه مورد نیازمو میومدم با عملگر New میگرفتم باز یه محدودیت داشتم یانه؟ خوب من این محدودیت رو برای این برنامه 80 در نظر گرفتم و این 80 رو فقط و فقط بخاطر این در نظر گرفتم که در حالت پیشفرض Command Prompt از 80 ستون در حالت متنی تشکیل شده.خوب شما میتونین عدد بزرگتری رو درنظر بگیرین. شما اگه میگفتی که چرا طولش ثابته و پرتی حافظه داره بهتر بود و من هم با کمال میل قبول میکردم اینکه چه دلیلی داره برای الحاق A و B تعداد 78 عنصر از آرایه به پرتی میره ولی محدودیت رو قبول ندارم. چون تا حالا نه حافظه نامحدود شنیدم و نه دیدیم.

بدتر از اون در انتها شما آدرس آرایه ی Result که یک Local Variable میشه رو برگدوندید.:اشتباه:کاملا حق با شماست و مرسی از اینکه تذکر دادین.

یاحق.
موفق باشید/