یکی از تمریناتی که استاد اکبری در کلاس حل تمرین گفتن این بود که:برنامه ای بنویسید که یک رشته عددی را دریافت کرده و آنرا به عدد تبدیل کرده و ضرب در 2 کند.
قانون کپی رایت:من روش حل این برنامه رو از آقای وفادار نیا پرسیدم و نوشتمش و امیدوارم دوستان استفاده کنند.توضیح برنامه رو در ادامه مطلب بخونید.
اول دو آرایه تعریف میکنیم.یکی از نوع char و یکی از نوع int.در آرایه نوع کاراکتری رشته ورودی کاربر رو ذخیره میکنیم و در آرایه نوع عدد صحیح هم کد های اسکی مربوط به کاراکتر های ورودی قرار میگیره(چطورش رو توضیح میدم).
char string1[30];
int str_ascii[30];
int string1_length;
int power=1;
بعد از اینکه رشته ذخیره شد طول اون رو بدست میاریم:
gets(string1);
for(string1_length=0;string1[string1_length]!='';string1_length++);
دقت کنید که متغیر string1_length باید بصورت سراسری از قبل تعریف بشه.
حالا کد اسکی مربوط به هر یک از کاراکتر های رشته ورودی رو در آرایه str_ascii ذخیره میکنیم.
for(int string1_index=0;string1[string1_index]!='';string1_index++)
{
str_ascii[string1_index]=(int)string1[string1_index];
}
در این حلقه رشته ورودی کاربر رو از اول تا آخر پیمایش کرده و هر دفعه کد اسکی کاراکتر رو در آرایه str_ascii قرار میدیم.قطعه کد زیر کد اسکی کاراکتر رو بر میگردونه.
(int)string1[string1_index];
حالا ما یه آرایه داریم(str_ascii) که طولش با طول رشته برابر اما مقادیر خونه هاش بجای کاراکتر ها کد اسکی اونا هست.
در مرحله آخر یک حلقه for مینویسیم و شمارنده اون رو برابر یکی کمتر از طول رشته که قبلا بدست آوردیم میذاریم.این کل دستور for هست که خط به خط توضیح میدم.
int index=string1_length;
for(index--;str_ascii[index]>=48&&str_ascii[index]<=57;index--)
{
temp=str_ascii[index]-48;
temp*=power;
sum+=temp;
power*=10;
}
خط اول:اول یه توضیح بگم که بازه کد اسکی اعداد بین 48 تا 57 هست.یعنی کد اسکی عدد صفر برابر 48 و کد اسکی عدد نه برابر 57 هست.
حالا اگه کران پایین این بازه یعنی 48 رو ازکداسکی عددی کم کنیم خود اون عدد بدست میاد.مثلا کد اسکی عدد 5 برابر 53 هست و 48-53=5.عدد بدس اومده رو در یه متغیر کمکی(temp) نگه میداریم.
خط دوم:حالا این متغیر کمکی رو در متغیر power ضرب میکنیم.متغیر power نشاندهنده ارزش مکانی عدد هست.مقدار اولیه این متغیر 1 (یکان) بوده و هر دفعه که حلقه اجرا میشه مقدار اون در 10 ضرب میشه.برای مشخص شدن ارزش های مکانی طول رشته رو محاسبه کردیم و در این حلقه هم رشته رو از آخر به اول پیمایش میکنیم.(علت اینکه رشته رو برعکس پیمایش میکنیم)
خط سوم:بعد از اینکه ارزش مکانی عدد مشخص شد اونو با یه متغیری که مقدار اولیش صفر هست جمع میکنیم و در نهایت عدد مورد نظر تو همین متغیر تشکیل میشه.
خط چهارم:در این خط متغیری که نمانگر ارزش مکانی ارقام بود (power) ده برابر میشه.
و در آخر هم متغیر sum رو ضرب در 2 کرده و به عنوان جواب چاپ میکنیم.
امیدوارم کامل توضیح داده باشم.
موفق باشید