برنامه جمع را طوری نوشتم که مهم نیست دو عدد تعداد رقمهایشان با هم برابر باشد یا نه.
نحوه کار:
ما اول می بایست دو عدد را از فایل بخوانیم و چون این اعداد به صورت رشته می باشند باید اول آنها را به عدد تبدیل کنیم و سپس آنها را وارد خانه های ارایه کنیم و بعد از آن یکی یکی اعداد را از آرایه خارج کرده و با هم جمع کنیم و در آرایه دیگر با عنوان ارایه نتیجه قرار دهیم.
شرح خطوط:
سه ارایه با نامهای num1 و num2 و pهمگی از نوع int و 5000 خانه ای تعریف کرده ایم.
آرایه num1 برای خواندن عدد از فایل 1.txt می باشد و قرار است مقادیر این فایل را در خود نگهداری کند.
آرایه num2 برای خواندن عدد از فایل 2.txt می باشد و قرار است مقادیر این فایل را در خود نگهداری کند.
ارایه p برای ذخیره کردن مجموع اعداد دو ارایه دیگر است.
int num1[5000];
int num2[5000];
//-------------------------------file1
int num1[5000];
cout<<"Number one :";
ifstream fp1("c:\\1.txt");
while(!fp1.eof()) {
ch=fp1.get();
if((int)ch==48) num1[i]=0; if((int)ch==49) num1[i]=1;
if((int)ch==50) num1[i]=2; if((int)ch==51) num1[i]=3;
if((int)ch==52) num1[i]=4; if((int)ch==53) num1[i]=5;
if((int)ch==54) num1[i]=6; if((int)ch==55) num1[i]=7;
if((int)ch==56) num1[i]=8; if((int)ch==57) num1[i]=9;
cout<<ch;
i++;
}
n1=i-1;
fp1.close();
شرح دستورات فوق:
ifstream fp1("c:\\1.txt")
در اینجا ما بعد از باز کردن فایل شروع به خواندن مقادیر درون فایل میکنیم تا رسیدن به اخرین کاراکتر فایل، این کار را با حلقه While انجام میدهیم و شرط اتمام حلقه را رسیدن به انتهای فایل میگذاریم.
کاراکتر به کاراکتر را از فایل خاج میکنیم.
بدلیل اینکه کاراکترها باید به عدد تبدیل شوند و درون آرایه قرار گیرند. اول کد اسکی انها را بدست آورده (int)ch و سپس مشخص میکنیم این کد اسکی برابر با کدام عدد می باشد.
به عنوان مثال کد اسکی عدد صفر برابر با 48 است و کد اسکی عدد یک برابر با 49 ....
و پس از تبدیل هر عدد آن را برای نمایش در مانیتور چاپ میکنیم cout<<ch
برای بدست اوردن طول ارایه یا به عبارتی طول عدد از متغیر i استفاده کرده ایم یه این صورت که پس از هر بار تبدیل کاراکتر به عدد یک واحد به i اضافه می کنیم و در نهایت طول رشته یا همان عدد تبدیل شده را در i خواهیم داشت. در اخر طول ارایه را در متغیر n1 میریزیم
در اخر هم فایل باز کرده را میبندیم fp1.close
//-------------------------------file2
ch='0'; i=0;
int num2[5000];
cout<<endl<<"Number two :";
ifstream fp2("c:\\2.txt");
while(!fp2.eof()) {
ch=fp2.get();
if((int)ch==48) num2[i]=0; if((int)ch==49) num2[i]=1;
if((int)ch==50) num2[i]=2; if((int)ch==51) num2[i]=3;
if((int)ch==52) num2[i]=4; if((int)ch==53) num2[i]=5;
if((int)ch==54) num2[i]=6; if((int)ch==55) num2[i]=7;
if((int)ch==56) num2[i]=8; if((int)ch==57) num2[i]=9;
cout<<ch;
i++;
}
n2=i-1;
fp2.close();
دستورات فوق نیز همانند دستورات مرحله قبل میباشند با این تفاوت که این بار اعداد از فایل 2.txt خوانده شده و در Num2 نگهداری میشوند. طول این عدد در متغیر n2 نگهداری میشود.
//------------------------------------
int c=0;
int max,b1=0,b2=0,a=0;
int p[5000];
if (n1>n2) {max=n1;} else {max=n2;}
if((num1[max]+num2[max])>9){c=1;}
for (i=0;i<max+1;i++)
حال نوبت به جمع دو عدد موجود در ارایه ها می رسد.
توجه داشته باشید که در جمع ممکن است نتیجه جمع دو عدد بیشتر از 9 و دو رقمی شود .پس میبایست سر ریز جمع دو عدد را بر روی عدد بعدی تاثیر بگذاریم.
فرض کنید دو عدد 8 و 5 را بخواهید با هم جمع کنید نتیجه 13 خواهد شد و ما باید 3 را چاپ کرده و ده بر یک ان را بع عدد بعدی بدهیم و چون عدد بعدی وجود ندارد باید ده بر یک را چاپ کنیم که در نهایت 13 خواهد شد.
متغییر c را برای نگهداری سر ریز تعریف کرده ایم
و متغییر max را برای نگهداری طول ارایه بزرگتر تعریف کردیم یه این صورت که n1 و n2 که طول ارایه اول و دوم هست را با هم مقایسه میکنیم و هرکدام که بزرگتر بود آنرا درون max میریزیم.
حال متغییر های b1 و b2 برای نگهداری موقت خانه های دو ارایه استفاده میشود.
متغییر a برای نگهداری جمع دو ععد به کار برده شده است.
{if((num1[max]+num2[max])>9){c=1
در این دستور چک میکنیم که اخرین خانه ارایه اول با اخرین خانه ارایه دوم جمع شود و اگر سرریز داشت یعنی جمع دو عدد 2 رقمی میشود متغییر سر ریز یعنی c را برابر با یک میکنیم(یعنی سرریز وجود دارد)
حلقه for هم برای خواندن خانه های ارایه از اول تا اخر میباشد و تا رسیدن به طول ارایه بزرگتر در حال چرخش است
b1=num1[n1-i];
b2=num2[n2-i];
if(n1<i) {b1=0;}
if(n2<i) {b2=0;}
a=b1+b2;
if (c==1) { a++; c=0;}
if (a<10)
{
p[max-i]=a;
}
else
{ p[max-i]=a-10;
c=1;
}
در هر بار چرخش حلقه for اعداد ارایه ها به متغییر های کمکی b1 و b2 داده میشود تا بر روی انها محاسبات انجام شود.
از دو دستور if یه این خاطر استفاده میکنیم. چون در صورتی که طول یکی از اعداد کمتر از عدد دوم باشد یعنی مثلا عدد اول 3000 رقمی باشد و عدد دوم 3500 رقمی در این صورت 500 رقم اضافه عدد دوم مستقیما و بدون محاسبات خاصی چاپ میشود.123456 را با 12 جمع کنید خواهید دید که اعداد 1234 بدون تغییر چاپ میشوند و جواب میشود 123468
بعد از جمع دو عدد، برسی میشود که ایا سرریز وجود د اشته یا نه؟
اگر سر ریز وجود نداشته باشد جواب چاپ خواهد شد و در غیر این صورت باید سر ریز را با جواب جمع کنیم.
نتیجه هر جمع را درون ارایه p میریزیم
و به همین ترتیب تا انتهای ارایه ها را چاپ خواهیم کرد.
cout<<endl<<"Result Add :";
if (a>=10) {cout<<1;}
for(i=0;i<max;i++)
cout<<p[i];
getch();
در نهایت ارایه p یا همان ارایه نتیجه را از اول تا اخر چاپ میکنیم