View Full Version : پاسکال: جمع دو عدد 20 رقمی
sajjadrad
دوشنبه 30 آذر 1388, 03:01 صبح
سلام دوستان
یه برنامه نوشتم که توش مشکل دارم
برنامه ای که دو عدد 20 رقمی رو در پاسکال با هم جمع کنه
همونطور که می دونید در پاسکال بزرگترین بازه رو اعداد longint تشکیل می دن که اونام 10 رقمن.
یه برنامه با کمک آرایه ها نوشتم اما مشکل اینجاست که بیت تک تک رقم ها باید space زد .
اگه بتونیم طوری تعریف کنیم که تمامی ارایه های ورودی تک رقمی هستن مشکل حله.
اینم سورس برنامه:
{Written By SAJJAD RAD}
program gold_digit;
uses crt;
var
a,b,c:array[1..100]of integer;
i,n,temp:integer;
begin
clrscr;
writeln('This Program Is Written By SAJJAD RAD');
writeln('(c) 2009 Radtech Corporation.All Right Reserved.');
writeln;
textcolor(red);
writeln('Guide:');
writeln('For enter numbers seprate the digit by space key!');
textcolor(white);
writeln;
writeln('Enter 20 digit number #1:');
for i:=1 to 20 do
read (a[i]);
readln;
writeln('Enter 20 digit number #2:');
for i:=1 to 20 do
read (b[i]);
readln;
for i:=20 downto 1 do
begin
temp:=0;
temp:=a[i]+b[i];
if i=1 then
begin
c[i]:=temp;
break;
end;
if temp>9 then
begin
n:=temp mod 10;
c[i]:=n;
a[i-1]:=1+a[i-1];
end;
if temp<=9 then
c[i]:=temp;
end;
writeln;
write('Sum of two 20 digit numbers is= ');
for i:=1 to 20 do
write(c[i]);
writeln('Press Any Key To Exit...');
writeln;
readln;
end.
لطفا هر چه زودتر برام جواب پست کنید ممنون:قلب::بوس:
دلفــي
دوشنبه 30 آذر 1388, 08:55 صبح
یه برنامه با کمک آرایه ها نوشتم اما مشکل اینجاست که بیت تک تک رقم ها باید space زد .
براي اينكه از Space استفاده نكني به جاي اين كد :
writeln('Enter 20 digit number #1:');
for i:=1 to 20 do
read (a[i]);
از كد زير استفاده كن :
writeln('Enter 20 digit number #1:');
for i:=1 to 20 do
a[i]:= ReadKey;
sajjadrad
دوشنبه 30 آذر 1388, 14:22 عصر
از كد زير استفاده كن :
کد:
writeln('Enter 20 digit number #1:');
for i:=1 to 20 do
a[i]:= ReadKey;
دوست عزیز ممنون که به سوالم اهمیت دادی
اما وقتی این دستور رو در برنامه می نویسم خطا تایپ میده:
http://uploadsajjad.persiangig.com/image/Lerarning/error_type_mis.JPG
ممنون....کمکم کن اطفا
sajjadrad
دوشنبه 30 آذر 1388, 14:24 عصر
راستی مکان نما هم موقع خطا روی دستور readkey هستش.
بازم ممنون
منتظرم
دلفــي
دوشنبه 30 آذر 1388, 15:27 عصر
دوست عزیز ممنون که به سوالم اهمیت دادی
اما وقتی این دستور رو در برنامه می نویسم خطا تایپ میده:
ممنون....کمکم کن اطفا
خروجي تابع Readkey از نوع Char ميباشد پس شما بايد آرايه a رو از نوع Char تعريف كنيد .
sajjadrad
دوشنبه 30 آذر 1388, 20:37 عصر
خروجي تابع Readkey از نوع Char ميباشد پس شما بايد آرايه a رو از نوع Char تعريف كنيد .
درسته اما مشکل اینجاست که char قابل جمع کردن نیست.
کد زیر رو ببینید:
for i:=20 downto 1 do
begin
temp:=0;
temp:=a[i]+b[i];
if i=1 then
begin
c[i]:=temp;
break;
end;
if temp>9 then
begin
n:=temp mod 10;
c[i]:=n;
a[i-1]:=1+a[i-1];
end;
if temp<=9 then
c[i]:=temp;
end;
بعد از خوندن آرایه ها باید اونا رو جمع کرد..
بازم ممنون..
منتظر جوابتون هستم
alinikaein
سه شنبه 01 دی 1388, 02:42 صبح
سلام؛
فكر نكنم تبديل كاراكتر به عدد كار سختي باشه. كافيه از ORD(CH) - 48 استفاده كني.
يا علي... موفق باشي...
sajjadrad
سه شنبه 01 دی 1388, 10:32 صبح
فكر نكنم تبديل كاراكتر به عدد كار سختي باشه. كافيه از ORD(CH) - 48 استفاده كني.
درسته دوست عزیز میشه کداسکی رو بدست آورد و 48 واحد کم کرد..اما این برای موقعیه که بخوایم char ما فقط عدد باشه...اما برنامه نمیفهمه که ما char رو به عدد تبدیل کردیم...بازم سر جمع خطا کامپایلری میده چون متغیر های char با هم جمع شدن که این غیر عادیه...اما اگه بتونیم کاری کنیم که ورودی ارایه های integer تک رقمی فرض بشن مشکل حله.من تو یجا دیده بودم که واسه Read طول میدان تعریف کرده بود امابازم جواب نمدیده...از نظراتتون ممنون..
کمکم کنییییید
لطفااااااااااااا
دلفــي
سه شنبه 01 دی 1388, 11:01 صبح
درسته دوست عزیز میشه کداسکی رو بدست آورد و 48 واحد کم کرد..اما این برای موقعیه که بخوایم char ما فقط عدد باشه...اما برنامه نمیفهمه که ما char رو به عدد تبدیل کردیم...بازم سر جمع خطا کامپایلری میده چون متغیر های char با هم جمع شدن که این غیر عادیه...اما اگه بتونیم کاری کنیم که ورودی ارایه های integer تک رقمی فرض بشن مشکل حله.من تو یجا دیده بودم که واسه Read طول میدان تعریف کرده بود امابازم جواب نمدیده...از نظراتتون ممنون..
کمکم کنییییید
لطفااااااااااااا
دوست عزيز شما چرا مساله رو پيچيده ترش ميكنيد ، براي اينكه برنامتون كار بكنه كافيه در كد برنامه هر جا از
a[i] و امثال اون استفاده كرديد بجاش
Ord(a[i])-48 و هر جا هم از
temp و امثال اون استفاده شده به جاش از
Chr(temp) استفاده كنيد !
sajjadrad
چهارشنبه 02 دی 1388, 00:18 صبح
دوستان ممنون که بهم اهمیت میدین
فقط بهم بگین مشکل کجاست و راه حل شما چه کمکی میکنه..اینجوری گیج میشم.چون هدفم نوشتن برنامه نیست..هدف اینه که یه چیز یاد بگیرم...
ممنون از دوست عزیز دلفی..واقعا مزاحمت ایجاد کردم...
راستی کدی که گفتید رو اجرا کردم...بازم متاسفانه کار نمیکنه
http://myprograms.persiangig.com/image/error_.JPG
وست عزيز شما چرا مساله رو پيچيده ترش ميكنيد ، براي اينكه برنامتون كار بكنه كافيه در كد برنامه هر جا از کد:
a[i]
و امثال اون استفاده كرديد بجاش کد:
Ord(a[i])-48
و هر جا هم از کد:
temp
و امثال اون استفاده شده به جاش از کد:
Chr(temp)
استفاده كنيد !
واقعا شرمنده شمام
دلفــي
چهارشنبه 02 دی 1388, 08:17 صبح
دوستان ممنون که بهم اهمیت میدین
فقط بهم بگین مشکل کجاست و راه حل شما چه کمکی میکنه..اینجوری گیج میشم.چون هدفم نوشتن برنامه نیست..هدف اینه که یه چیز یاد بگیرم...
ممنون از دوست عزیز دلفی..واقعا مزاحمت ایجاد کردم...
راستی کدی که گفتید رو اجرا کردم...بازم متاسفانه کار نمیکنه
واقعا شرمنده شمام
دوست عزيز به اين صورت بنويس :
البته من اين كد رو تو NotePad تايپ كردم اگه غلط دستوري داشت خودت اصلاحش كن .
program gold_digit;
uses crt;
var
a,b,c:array[1..100]of Char;
i,n,temp:integer;
begin
clrscr;
writeln;
textcolor(red);
writeln('Guide:');
textcolor(white);
writeln;
writeln('Enter 20 digit number #1:');
for i:=1 to 20 do
a[i]:= ReadKey;
readln;
writeln('Enter 20 digit number #2:');
for i:=1 to 20 do
b[i]:= ReadKey;
readln;
for i:=20 downto 1 do
begin
temp:=0;
temp:=(Ord(a[i])-48)+(Ord(b[i])-48);
if i=1 then
begin
c[i]:=Chr(temp);
break;
end;
if temp>9 then
begin
n:=temp mod 10;
c[i]:=Chr(n);
a[i-1]:=1+(Ord(a[i-1])-48);
end;
if temp<=9 then
c[i]:=Chr(temp);
end;
writeln;
write('Sum of two 20 digit numbers is= ');
for i:=1 to 20 do
write(c[i]);
writeln('Press Any Key To Exit...');
writeln;
readln;
end.
Hamid.Kad
چهارشنبه 02 دی 1388, 13:28 عصر
چرا اینجوری ننوشتید؟
C:Char;
c:=ReadKey;
a[i]:= Ord(C)-48;
دیگه لازم نیست تعریف آرایه رو بصورت Char بنویسید
sajjadrad
پنج شنبه 03 دی 1388, 17:37 عصر
سلام دوستان
واقعا ممنونم که کمکم کردید مخصوصا دوست عزیزم دلفی
دوست عزيز به اين صورت بنويس :
البته من اين كد رو تو NotePad تايپ كردم اگه غلط دستوري داشت خودت اصلاحش كن .
واقعا ممنون چون رویه کارت باعث شد بتونم مساله رو حل کنم
برنامه شما در این قسمت:
c[i]:=Chr(temp);
اضافی بود یعنی برای ریختن مقدار توی c[i] نیازی به تبدیل اون به کاراکتر نیست.و این کار برنامه رو فغلط میکنه.
در ضمن در قسمت:
a[i-1]:=1+(Ord(a[i-1])-48);
بعد از اینکه یک واحد اضافه شد دوباره باید chr اون رو توی a[i-1] بریزیم.
در هر صورت کد کامل برنامه رو که دوستان عزیزم بهم کمک کردن بنویسم رو میزارم:
{Written By SAJJAD RAD}
program gold_digit_com2;
uses crt;
var
a,b:array[1..256]of char;
c:array[1..256]of integer;
i,n,temp,p:integer;
flog:boolean;
begin
clrscr;
textcolor(13);
writeln('This Program Is Written By SAJJAD RAD sajjad.273@gmail.com');
writeln('(c) 2009 Radtech Corporation.All Right Reserved.');
writeln('Sum Of Two X Digit(s) Numbers:Complete version');
textcolor(white);
writeln;
writeln;
textcolor(white);
writeln;
writeln('How Many Digits To Sum? Range 1~255');
readln(p);
writeln('Enter ',p,' digit(s) number #1:');
flog:=true;
for i:=1 to p do
begin
if flog=false then
break
else
a[i]:= ReadKey;
if ord(a[i])>57 then
flog:=false;
write(a[i]);
end;
writeln;
if flog=true then
writeln('Enter ',p,' digit(s) number #2:');
for i:=1 to p do
begin
if flog=false then
break
else
b[i]:= ReadKey;
write(b[i]);
end;
writeln;
for i:=p downto 1 do
begin
if flog=false then
break
else
temp:=0;
temp:=(ord(a[i])-48)+(ord(b[i])-48);
if i=1 then
begin
c[i]:=temp;
break;
end
else if temp>9 then
begin
n:=temp mod 10;
c[i]:=n;
a[i-1]:=chr(ord(a[i-1])-47);
end
else if temp<=9 then
c[i]:=temp;
end;
writeln;
if flog=false then
begin
textcolor(red);
writeln('Error! You didn''t enter digit of number');
textcolor(white);
end
else
begin
write('Sum of two ',p,' digit(s) numbers is= ');
for i:=1 to p do
write(c[i]);
end;
writeln;
writeln;
writeln('Press Any Key To Exit...');
writeln;
readln;
end.
این برنامه بجای 20 رقم قادر به جمع دو عدد n رقمی هست اما برای کمتر استفاده شدن حافظه نهایتا 255 رقم در نظر گرفتم.که به راحتی قابل تغییره
بازم از دلفی عزیز ممنونم
واقعا اگر راهنمایی های ایشون نبود این مساله حل نمیشد.
:بوس::بوس::بوس::بوس::بوس::بوس:: وس::بوس::بوس::بوس::بوس::بوس::ب س::بوس::بوس::بوس::بوس::بوس:
دلفــي
سه شنبه 08 دی 1388, 15:54 عصر
اين هم تابع جمع دو عدد n رقمي در دلفي :
http://barnamenevis.org/forum/showthread.php?p=877417#post877417
MOJTABAATEFEH
دوشنبه 21 دی 1388, 09:38 صبح
سلام دوستان
واقعا ممنونم که کمکم کردید مخصوصا دوست عزیزم دلفی
واقعا ممنون چون رویه کارت باعث شد بتونم مساله رو حل کنم
برنامه شما در این قسمت:
اضافی بود یعنی برای ریختن مقدار توی c[i] نیازی به تبدیل اون به کاراکتر نیست.و این کار برنامه رو فغلط میکنه.
در ضمن در قسمت:
بعد از اینکه یک واحد اضافه شد دوباره باید chr اون رو توی a[i-1] بریزیم.
در هر صورت کد کامل برنامه رو که دوستان عزیزم بهم کمک کردن بنویسم رو میزارم:
{Written By SAJJAD RAD}
program gold_digit_com2;
uses crt;
var
a,b:array[1..256]of char;
c:array[1..256]of integer;
i,n,temp,p:integer;
flog:boolean;
begin
clrscr;
textcolor(13);
writeln('This Program Is Written By SAJJAD RAD sajjad.273@gmail.com');
writeln('(c) 2009 Radtech Corporation.All Right Reserved.');
writeln('Sum Of Two X Digit(s) Numbers:Complete version');
textcolor(white);
writeln;
writeln;
textcolor(white);
writeln;
writeln('How Many Digits To Sum? Range 1~255');
readln(p);
writeln('Enter ',p,' digit(s) number #1:');
flog:=true;
for i:=1 to p do
begin
if flog=false then
break
else
a[i]:= ReadKey;
if ord(a[i])>57 then
flog:=false;
write(a[i]);
end;
writeln;
if flog=true then
writeln('Enter ',p,' digit(s) number #2:');
for i:=1 to p do
begin
if flog=false then
break
else
b[i]:= ReadKey;
write(b[i]);
end;
writeln;
for i:=p downto 1 do
begin
if flog=false then
break
else
temp:=0;
temp:=(ord(a[i])-48)+(ord(b[i])-48);
if i=1 then
begin
c[i]:=temp;
break;
end
else if temp>9 then
begin
n:=temp mod 10;
c[i]:=n;
a[i-1]:=chr(ord(a[i-1])-47);
end
else if temp<=9 then
c[i]:=temp;
end;
writeln;
if flog=false then
begin
textcolor(red);
writeln('Error! You didn''t enter digit of number');
textcolor(white);
end
else
begin
write('Sum of two ',p,' digit(s) numbers is= ');
for i:=1 to p do
write(c[i]);
end;
writeln;
writeln;
writeln('Press Any Key To Exit...');
writeln;
readln;
end.
این برنامه بجای 20 رقم قادر به جمع دو عدد n رقمی هست اما برای کمتر استفاده شدن حافظه نهایتا 255 رقم در نظر گرفتم.که به راحتی قابل تغییره
بازم از دلفی عزیز ممنونم
واقعا اگر راهنمایی های ایشون نبود این مساله حل نمیشد.
:بوس::بوس::بوس::بوس::بوس::بوس:: وس::بوس::بوس::بوس::بوس::بوس::ب س::بوس::بوس::بوس::بوس::بوس:
دوست عزيز موقع كامپايل در ست كامپايل ميشه ولي موقع اجر ا خطاي زير رو مگيره
(خطاي تقسيم بر صفر)
ERROR 200 : Division by Zero
مشكل كجاست لطفا بررسي نماييد
با تشكر
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.