مشکلی غریب - مشکل در درک مفاهیم سی پلاس - char

ali0480

Member
مشکلی غریب

سلام به دوستان مجید آنلاینی
اقا من یه سوال داشتم به این سورس نگاه کنید :
کد:
#include<conio.h>
#include<stdio.h>
int main()
{
clrscr();
int i;
char x[4],y[4],z[5];
puts("enter the first number");
gets(x);
puts("enter the second number");
gets(y);
for(i=0;i<4;i++)
z[i]=x[i]+y[i];
puts(z);
getch();
return 0;
}

توی خط 13 هم من می خوام عدادایی رو که تو تک تک خونه های رشته x و y ذخیره شده رو باهم جمع کنم و توی یکی از خونه های رشته z بذارم مثلا :
x[4]={'1','2','3'}
y[4]={'3','2','1'}​

حالا مثلا :
x[1]+y[1]=z[1]​

باشه ولی خروجی های رشته های x و y کاراکتر هستند و می دهند "2" و "2" و جمع "2"+"2" نمی شود 4 حالا من سوالم اینه برای رفع این مشکل باید چی کار کنم ؟؟
امید وارم منظورم رو فهمیده باشید.
و اگرم نفهمیدید لطفا یه برنامه برایم بنویسید که 2 عدد 3 رقمی رو گرفته و هر کدوم رو توی یه رشته بذاره و رشته ثالثی باشه که جمع این 2 عدد رو توی خودش ذخیره کنه و اخره سر رشته ثالث رو چاپ کنه.
بسیار ممنون. 
 

the_king

مدیرکل انجمن
موارد زیر را در نظر بگیرید :

مورد اول) زمانی که شما یک کاراکتر char را با یک کاراکتر char دیگر جمع می کنید، کد ASCII داخلشان با هم جمع می شوند.
کد کاراکتر '0' برابر 48 است و کد کاراکتر '1' برابر 49 و کد کاراکتر '2' برابر 50 و ...
به همین دلیل اگر شما کاراکتر '2' را با کاراکتر '2' جمع کنید، کاراکتری با کد 100 خواهید داشت (کاراکتر 'd') و نه عدد 4 یا حتی
کاراکتر '4'
شما پیش از جمع کردن دو کاراکتر بایستی کد کاراکتر '0' (عدد 48) را از آنها کم کنید تا به رقم معادلشان (اعداد 0 الی 9)
تبدیل شوند.
زمانی که نوبت نمایش مجدد حاصل جمع رسید نیز مجددا کد کاراکتر '0' (عدد 48) را به آنها اضافه کنید تا به کاراکتر معادلشان
(کاراکتر های '0' الی '9') تبدیل شوند.

مورد دوم) زمانی که دو عدد مانند 9 و 9 را با هم جمع می کنید حاصل تقسیم (18) بایستی به دو رقم یکان و دهگان
تجزیه شده و در دو کاراکتر مجزا نوشته شود. رقم دهگان حاصل (1) در جمع زدن رقم های بعدی موثر است، به همین دلیل
جمع دو عدد را از سمت راست به چپ بایستی انجام دهید و نه چپ به راست.
حلقه ای که شما ساخته بودید از اندیس 0 آغاز می شد (اولین کاراکتر سمت چپ) که اشتباه است.

مورد سوم) برای محاسبه رقم های یکان و دهگان به ترتیب از باقیمانده تقسیم عدد بر 10 (j % 10) و تقسیم صحیح
عدد بر 10 (j / 10) استفاده کنید.

مورد چهارم) رشته z نیاز به مقدار اولیه دارد (این مقدار دهی اولیه می تواند توسط یک حلقه یا تابع strcpy هم پیاده سازی شود)

مورد پنجم) دو رشته x و y بایستی حتما سه کاراکتر طول داشته باشند مثلا بجای 15 عبارت 015 در ورودی دریافت شود.
در غیر اینصورت بایستی برای انتقال (Shift) دادن رقم ها به سمت راست و پر کردن جای خالی با کاراکتر 0 کدهای دیگری نیز
اضافه گردد.

کد:
#include<conio.h>
#include<stdio.h>
int main()
{
clrscr();
int i,j;
char x[4],y[4],z[5]="0000";

puts("Enter the first number (3 Digits) : ");
gets(x);
puts("Enter the second number (3 Digits) : ");
gets(y);

for(i = 2; i >= 0; i--)
{
   j = x[i] - '0' + y[i] - '0';
   z[i + 1] += (j % 10);
   z[i] += j / 10;
}
puts("Sum = ");
puts(z);
getch();
return 0;
}
 

ali0480

Member
the_king جان از راهنمایی های بسیار خوبت ممنون اما 4 مورد اول و با هزار بد بختی و کلی فکر کردن خودم فهمید در مورد 5 هم یه موضوعی وجود داره اونم اینه که من نمی خوا کاربر عدد 15 رو به صورت 015 وارد کنه چون من این برنامه رو برای اعداد بزرگ می نویسیم فعلا گفتم بذار با اعداد کوچیک رو به راش کنم بعد می روم سراغ اعداد بزرگ حالا مثلا دو عدد ورود ی اگه 50 رقمی باشه کاربر که نباید 48 تا صفر قبل 15 بذاره در مورد این مشکل اگه می تونی و زحمتی نیست یه کم کمکم کن ولی جواب رو بهم نگو فقط کمک
در مورد ، مورد 1 هم من گفتم بیام هر خونه رشته رو -48 کنم بعد هو زمان هر خونه رشته رو تو یه خونه ارایه بریزم که دیگه این موشکل کاراکتری رو نداشته باشم حالا مشکل من اینه من اینه وقتی کار بر عدد 1 را وارد میکند با عدد 123 این دو عدد در رشته این طوری ذخیره می شن : "0"و"0"و"1" و "3"و"2"و"1" و موقع جمع خروجی عدد 223 را نمایش می ده برای این کار چی کار کنم؟؟؟
من پیشه خودم گفتم بیاد خونه ها رو تا زمانی جمع کنه که مقدارشون مخالف 0 هست بعد دیدم اگه کاربر بخواد عدد 10 و 123 رو با هم جمع کنه 0 ، 10 رو برنامه حساب نمی کنه حالا موندم چی کار کنم !! اگه تونستی یه راهنمایی ما رو بکن
 

the_king

مدیرکل انجمن
برای اینکه بتوانید که الگوریتم جمع را برای کامپیوتر بنویسید، اول باید توانید خودتان آنرا بصورت دستی انجام دهید.
در جمع دو رقم از دو عدد، همیشه احتمال یک رقم نقلی 1 وجود دارد که بایستی با حاصل جمع رقم سمت چپی جمع شود.
شما نمی توانید جمع کردن را از سمت چپ به راست انجام دهید و این رقم نقلی را به درستی در نظر بگیرید.

فرض کنید که بخواهید عدد 687 را با عدد 313 جمع کنید. اگر شما جمع را از سمت چپ به راست (از اندیس 0 رشته به سمت
اندیس1 رشته) آغاز کنید در جمع دو رقم اول و دوم (از سمت چپ) به 99 می رسید که اشتباه است. شما همواره باید
جمع کردن دو عدد را از سمت راست به چپ انجام دهید، این جزو قوانین ریاضی جمع دو عدد است و ناچار هستید که
رعایت کنید.

مشکل شما در این است که رقم ها به درستی در زیر هم قرار نمی گیرند، مگر اینکه طول رشته ها یکسان باشد.
کاری که باید انجام بدهید مشکل نیست، ابتدا طول رشته را در نظر بگیرید. مثلا رشته "1" یک کاراکتر طول دارد.
بعد این طول رشته را از تعداد رقم های مطلوب (در مثال شما طول رشته ها می بایستی 3 رقمی می بودند) کم کنید.
یعنی 1 - 3 که برابر است با 2
این عدد 2 مشخص می کند که هر کاراکتر در رشته "1" بایستی چند خانه به سمت راست منتقل (Shift) پیدا کند.
انتقال هم حتما بایستی از سمت راست به چپ آغاز شود و نه چپ به راست. این هم جزو موارد اصولی انتقال
درجا است. درجا از این جهت که محتویات یک آرایه را در خود همان آرایه جابجا می کنید.

دقت کنید که در انتهای هر رشته یک کاراکتر null با کد صفر قرار دارد و خانه های بعد از این کاراکتر null، مقدار مشخص
و قابل پیش بینی ای ندارند. هر جابجایی که انجام دادید، جای قبلی را با صفر پر کنید. اگر این جابجایی را از سمت چپ
به راست آغاز کنید، نتیجه مطلوب را خواهید داشت.

چون تقاضا کردید که صرفا راهنمایی بکنم، صرفا یک تصویر قرار می دهم که نحوه جابجایی اعداد مختلفی را در
یک رشته سه رقمی نشان می دهد، الگوریتم جمع کردن هم همانطوری که در کد قبلی قرار دادم خواهد بود و
تغییری نخواهد کرد :

63vl36.gif
 
آخرین ویرایش توسط مدیر:

ali0480

Member
the_king جان تا ته شو خوندم(البته با کمک شما)
خیلی خیلی ممنونم همون یه کلمه shift کلی چیزایی رو که یادم رفته بود که می شد در این برنامه استفاده کرد یادم انداخت در واقع shift کلمه طلایی و کلیدی بود
بازم خیلی خیلی ممنون
اگه مشکلی بود بازم مزاحمت می شم
فعلا
بای تا های
 

ali0480

Member
the_king جان من طریقه shift یک متغییر معمولی رو بلد بودم و فکر کردم shift ارایه یا رشته هم به همون شکله ولی این طوری نبود اگه لطف کنی و طریقه shift ارایه و رشته هم بگی خیلی خیلی ازت ممنون می شم
 

the_king

مدیرکل انجمن
the_king جان من طریقه shift یک متغییر معمولی رو بلد بودم و فکر کردم shift ارایه یا رشته هم به همون شکله ولی این طوری نبود اگه لطف کنی و طریقه shift ارایه و رشته هم بگی خیلی خیلی ازت ممنون می شم

یک تابع ()shift به برنامه اضافه کردم که دو پارامتر داره، پارامتر اول رشته ای است که باید عناصرش را به سمت راست
انتقال (Shift) بدهیم و پارامتر دوم طول رشته مطلوب است که در برنامه شما عدد 3 است.

کد:
#include<conio.h>
#include<stdio.h>

void [B]shift[/B](char s[], int n)
{
   int i, j;
   for (i = 0; s[i]; i++);
   j = n - i;
   if (j > 0)
   {
      for (; i >= 0; i--)
      {
         s[i + j] = s[i];
         s[i] = '0';
      }
   }
}

int main()
{
   clrscr();
   int i, j;
   char x[4], y[4], z[5] = "0000";
   puts("Enter the first number (3 Digits) : ");
   gets(x);
   puts("Enter the second number (3 Digits) : ");
   gets(y);
   [B]shift[/B](x, 3);
   [B]shift[/B](y, 3);
   for(i = 2; i >= 0; i--)
   {
      j = x[i] - '0' + y[i] - '0';
      z[i + 1] += (j % 10);
      z[i] += j / 10;
   }
   puts("Sum = ");
   puts(z);
   getch();
   return 0;
}
 

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

بالا