تمارين برمجة باسكال
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
نبذة
هذه الصفحة هي بالاصل مأخوذة من كتاب تمارين برمجة محلولة خطوة على طريق البرمجة (نسخة باسكال ) إعداد وسيم أبوزينة في حال كنت تملك حلولاً اخرى يمكنك وضع الحل الذي تراه مناسباً بعد اضافة سطر يحوي طريقة اخرى .
وسيم أبو زينة ساهم بشكل رئيسي في تحرير هذا المقال
|
الفصل الاول تمارين ابتدائية
1-اكتب برنامج بلغة T.Pascal لقراءة عددين صحيحين وطباعة نواتج عملية الضرب والقسمة والجمع والطرح لهذين العددين
Program Calc (output) ;
Var x,y:integer;
Begin
Writeln(‘Enter Two number ‘ );
Readln(x,y);
Writeln(‘The Result of ‘,x,’ + ’,y, ‘ = ‘,x+y);
Writeln(‘The Result of ‘,x,’ * ’,y, ‘ = ‘,x*y);
Writeln(‘The Result of ‘,x,’ - ’,y, ‘ = ‘,x-y);
Writeln(‘The Result of ‘,x,’ / ’,y, ‘ = ‘,x/y);
End.
2-اكتب برنامج بلغة T.pascal يقوم بقراءة عدد صحيح X وعدد صحيح موجب n ثم يقوم بحساب Xn
Program Power_To_ppl ;
Var x,n,i,Res:integer;
Begin
Res :=1;
Writeln(‘Enter Two numbers X, and n ‘);
Readln(x,n)
For i=1 to n do
Res= Res *X;
Writeln(‘The Result is ‘,Res);
End.
3-اكتب برنامج لقلب عدد صحيح مدخل مثال العدد المدخل 1234 يصبح 4321
Program Flip_Flop ;
Var n,m,num:integer;
Begin
Writeln(‘Enter The Number ‘);
Readln(n);
while (n div 10 <>0 )do
begin
m:= n mod 10;
num:= m+num*10;
n:= n div 10;
end;
Writeln(‘The Number After Flipping ‘,n);
end.
4-اكتب برنامج يقوم بحساب قيمة تقريبية ل ex بحيث
مع العلم انه يتوقف الحساب عندما تكون قيمة الحد الأخير الذي نصل إليه اصغر آو تساوي
Program Damn_The_e ;
Var x,n,i,counter :integer;
Power,fact ,res:real
Begin
fact :=1; counter=2; res =0;
Writeln(‘Enter Two numbers X ‘);
Readln(x);
Power=x;
While (power div fact < 10 ^(-5)) do
begin
For i=2 to counter do
begin
power= power *X;
fact = fact *i;
end;
Counter = counter +1;
Power =x; fact= 1;
Res= Res + (power div fact);
End;
Writeln(‘The Result is ‘,Res);
End.
5-أكتب خوارزمية تقوم بقراءة عددين A,B و طباعة الأعداد المحصورة بينهما بطريقة تنازلية دون معرفة أي العددين A,B هو الأكبر .
2-أكتب خوارزمية تقوم بقراءة عدد N و طباعة مجموع الأعداد الزوجية المحصورة بين n و الصفر .
3-أكتب خوارزمية تقوم بقراءة رقمm ما و طباعة عدد خاناته .
program Numberz;
var
Digit_counter,m, i,a,b,min,max,sum,first,last:integer;
begin
Readln(a,b);
If (a>b)then
Max =a; min =b
Else
max=b; min =a
first=min ; last =max
while (first <=max ) do
begin
last = last -1
fisrt = first +1
writeln(last)
end;
end.
2:
Readln(n)
Sum=0;
For i=0 to n do
If i mod 2 =0 then
Sum= sum+i;
3:
Readln(m)
Digit_counter=0;
While (m <>0) do
begin
Digit_counter = Digit_counter+1;
M = m div 10;
End;
writeln(m);
End.
6-وضع أحد العملاء مبلغ sum في البنك لعدد year من السنوات ..
ما هي قيمة هذا المبلغ بعد هذه السنوات علماً أن العميل يتقاضى على المبلغ فائدة (مركبة) سنوية p%
2-وضع أحد العملاء مبلغ sum في البنك فإذا علمت أن العميل يتقاضى على المبلغ فائدة (مركبة )سنوية p% بعد كم سنة يتضاعف المبلغ ..؟؟؟
program Banks;
var i,num,year,value:integer;
p :float ;
begin
1:
Readln(year,num,p)
For i=1 to year do
Num = num + Num *p;
2:
Y=0; Value =2*num;
While (num<= value )do
begin
num= num +num *p;
Y=Y+1;
End;
Writeln(y);
end;
7-لدينا فاتورة مشتريات تحوي البيانات التالية :
عدد المواد N
عدد الوحدات من كل مادة q
سعر الوحدة unit price
يقوم التاجر بحسم جزء من قيمة الفاتورة إن كانت هذه القيمة مرتفعة كما يلي : حسم 10% إذا كانت قيمة الفاتورة أكبر من 25000
حسم 15% إذا كانت قيمة الفاتورة أكبر من 50000
حسم 20% إذا كانت قيمة و الفاتورة أكبر من 100000
و المطلوب: كتابة برنامج يقوم بقراءة البيانات السابقة ثم حساب و طباعة:
السعر الإجمالي total price (و هو قيمة الفاتورة قبل الحسم ).
السعر الصافي net price ( قيمة الفاتورة بعد الحسم ).
program Bills ;
var
N,q,Unit_price,Total,net_price :integer;
q=0; Unit_price=0 ; Total =0; net_price=0 ;
begin
Readln(n);
For i =1 to n do
begin
Writeln(‘Enter the price for the product num ‘,i);
Readln(Unit_price);
Writeln(‘Enter the Quantity for the product num ‘,i);
Readln(q);
Total = total +q* unit_price;
End;
If (tp> 100000)
Netprice = (total * 20)/100;
Else If (tp> 50000)
Netprice = (total * 15)/100;
Else If (tp> 25000)
Netprice = (total * 10)/100;
writeln(Netprice,’ ‘, ‘total ‘);
end.
8-اكتب برنامج لقراءة نص محرف محرف ينتهي بنقطة (.) والمطلوب :
1-حساب عدد المحارف الكلي
2-حساب عدد الأحرف وعدد الأرقام وعدد علامات التنقيط
3-طباعة النص مع استبدال كل حرف صغير في اول الكلمة بحرف كبير
4-تحويل كل عدد إلى عدد عشري حيث ان العدد العشري =n-9 أي المتمم إلى10
program Reading with the stars ;
var ch,ch1 : char;
countchr: integer; // Char counter
countnum: integer; // Numbers Counter
counter3: integer; // Other Char Counter
begin
writeln('Enter the text');
countchr:=0; countnum:=0; counter3:=0;
while (ch <> '.') do
begin
ch1:=ch;
read (ch);
case ch of
'0'..'9' :
begin
ch:=chr(ord('9')-ord(ch) + ord('0') ) ; //Converting Number
countnum:=countnum+1;
end;
'a'..'z':
begin
countchr:= countchr+1;
ch:=chr(ord('A')+ord(ch)-ord('a')); // Converting to Capital
end;
if (ch1 = ' ') or (ch1= ',') or (ch1= ' " ') then
counter3:=counter3+1;
end; // While
write(ch);
end;
writeln('The number of the letters =',countchr);
writeln('The number of numbers are = ',countnum);
writeln('Number of the symbols = ',counter3+countnum+countchr);
end. // End of program
9-اكتب برنامج يعطي نتيجة منطقية True آو False عن تناظر مصفوفة أحادية بعدها n بالنسبة لمنتصفها مثال نقول عن مصفوفة احادية انها متناظرة
في حال بعد المصفوفة
N=9 فردي
2 7 5 6 4 6 5 7 2
N=8 زوجي
2 7 5 6 6 5 7 2
نقول عن مصفوفة احادية انها غير متناظرة
7 6 5 2 1 1
program Semitic _Arrays;
const maxn=100;
var A:array [1..maxn]of integer;
b:boolean;
n:integer;
i:integer;
begin
writeln('Please enter the Array Length ');
readln(n);
writeln('Please enter the elements so The Array can be initialized ‘);
For i:=1 to n do
readln(A[i]);
b:=true;
For i:=1 to n do
if (A[i]<>A[n-i+1]) then
b:=false;
if (b=true) then
writeln('The matrix is Semitic ‘);
else if (b=false) then
writeln('The matrix is not Semitic ‘);
readln;
end.
10-يتم حساب رواتب الموظفين في دائرة حكومية بالشكل التالي : لكل موظف راتب اساسي يضاف إليه قيمة تعويضات يستحقها حسب نشاطه وعمله وتخصم منه قيمة حسميات حسب إجازاته وعطله اكتب برنامج بلغة باسكال ينظم جداول رواتب الموظفين يطلب فيه
1-قراءة الأرقام التسلسلية للموظفين وتخزينها في جدول ارقام الموظفين
ارقام الموظفين
2-قراءة تفصيل راتبه حيث يتم التخزين في 3 جداول كالتالي:
الراتب الأساسي – التعويضات –الحسميات الراتب الأساسي
التعويضات
الحسميات
3-حساب إجمالي الراتب للموظفين وتخزينه في جدول حيث اجمالي الراتب = الراتب الأساسي + التعويضات – الحسميات إجمالي الراتب
4-اظهار اكبر قيمة للراتب الأساسي
إظهار رقم الموظيف الذي يتقاضى اعلى قيمة تعويضات
إظهار رقم الوظف الذي يخصم من راتبه اقل قيمة حسميات
حساب وسطي الراتب الإجمالي وتخزين هذه القيم في جدول النتائج التالي:
النتائج
اكبر قيمة للراتب الأساسي – رقم الموظف الذي له اعلى تعويضات –رقم الموظف الذي له اقل حسميات –وسطي الراتب الإجمالي
اكبر قيمة للراتب الأساسي رقم الموظف الذي له اعلى تعويضات رقم الموظف الذي له اقل حسميات وسطي الراتب الإجمالي
5-إظهار النتائج السابقة بالشكل
رقم الموظف – الراتب الأساسي – التعويضات – الحسميات –إجمالي الراتب
النتائج
رقم الموظف – الراتب الأساسي التعويضات – الحسميات إجمالي الراتب
Program employee ;
Const m=100;
Type Matrix =array[1..m] of integer;
Var
Num,basic,comp,dis,total:matrix;
I,j,max1,max2,min,sum,x,y,z:integer;
Avg:real
Begin {main }
Writeln(‘Please Enter the whole numbers of employees‘);
Readln(z);
Writeln(‘Please Enter the number of the employee’);
For j =1 to z do
begin
Readln(Num[j]);
End;
Writeln(‘Please Enter the basic Salary for each employee’);
For j=1 to z do
begin
Readln(Basic[j]);
End;
Writeln(‘Plz Enter the compensations for each employee’);
For j=1 to z do
begin
Readln(Comp[j])
End;
Writeln(‘Please Enter the Discounts for each employee’);
For j=1 to z do
begin
Readln(Dis[j]);
End;
For j=1 to z do
Total[j]=Basic[j]+Comp[j]-Dis[j]
Writeln(‘employee No Basic Salary Bounces Discounts Total ‘);
Writeln;
For j=1 to z do
Begin
Write(Num[j]:5,’ ‘,Basic[j]:5,’ ‘,Comp[j]:5,’ ‘,Dis[j]:5,’ ‘,Total[j]:5);
Writeln;
End;
Max1=Basic[1];
Mx2=Comp[1];
X=num[1];
Y =num[1];
Min=dis[1];
Sum=0;
For j=1 to z do
Begin
If Basic[j]>max1 then
Max1=Basic[j];
If comp[j]>max2 then
begin
Max2= comp[j];
X=num[j];
End;
If dis[j]<min then
Begin
Min= dis[j];
Y=num[j];
End;
Sum= sum + total[j];
End;
Avg= sum/z;
Write(max1,x,y,avg);
End.
11.لدينا مصفوفة مربعة بعدها n.n يتم إدخال البعد n من قبل المستثمر والمطلوب 1-حساب مجموع عناصر محيط هذه المصفوفة
2- حساب مجموع عناصر الأسطر m الأخيرة من هذه المصفوفة
3-حساب مجموع عناصر المثلث العلوي في المصفوفة المربعة ما عدا القطر الرئيسي
4-فرز عناصر القطر الثانوي لمصفوفة مربعة تصاعدياً
program Matrix ;
const z= 100;
var A: array [1..z,1..z]of integer;
B: array [1..z,1..z]of integer;
t, v,m,sumv, sum1,sum2, n,i,j:integer;
f,k,l, sumq1, sumq2, summ, sumrec, sum, sum11,sum22:integer;
g:boolean;
begin
writeln('Enter the length of the array');
readln(n);
{reading the Array}
for i:=1 to n do
for j:=1 to n do
readln(A[i,j]);
// جمع عناصر السطر الأخير والسطر الأول والعمود الأول والأخير
sum1:=0;
for i:=1 to n do
sum1:=(sum1+A[i,1]);
sum11:=0;
for i:=1 to n do
sum11:=sum11+A[i,n];
sum2:=0;
for j:=1 to n do
sum2:=(sum2+A[1,j]);
sum22:=0;
for j:=1 to n do
sum22:=sum22+A[n,j];
// مجموع المحيط هو مجموع الأربعة اسطر واعمدة
sum:=sum1+sum11+sum22+sum2-A[1,1]-A[1,n]-A[n,n]-A[n,1];
writeln('the sum of the circumfence is',sum);
// طباعة المصفوفة بشكل ثنائي
for i:=1 to n do
begin
write(' ');
for j:=1 to n do
write(A[i,j],' ');
writeln(' ');
end;
writeln('Enter m number of lines to show u the sum');
readln(m);
if (m>n) or (m<0) then
begin
writeln('please try again');
g:=false;
readln(m);
while (m>n) do
readln(m)
end
else v:=n-m;
for j:=v+1 to n do
for i:=1 to n do
sumv:=sumv+A[j,i];
writeln('the sum of the last ',m,' lines is ',sumv);
//الطلب ال3
f:=2; sumrec:=0;
for i:=1 to n do
begin
for j:=f to n do
sumrec:=sumrec+A[i,j];
f:=f+1;
end;
writeln('the sum for the rectangle is ',sumrec);
for f := 1 to n-1 do
begin
j:= n;
for i := 1 to n-f do
begin
if a[i,j] < a[i+1,j-1] then
begin
t := a[i,j];
a[i,j] := a[i+1,j-1];
a[i+1,j-1] := t;
end;
j:= j-1
end;
end;
for i := 1 to n do
begin
writeln(' ');
for j := 1 to n do
write(a[i,j] , ' ');
writeln(' ');
end;
readln;
end.
End.
12.اكتب تابع يقوم بفحص مصفوفة مربعة بعدها n فيما اذا كانت متناظرة ام لا
2-اكتب اجرائية تقوم بإيجاد القيمة العظمى لعناصر مصفوفة متناظرة
3-اكتب تابع يقوم بإيجاد القيمة العظمى لعناصر مصفوفة غير متناظرة
4-اكتب برنامجاً يستدعي التوابع والإجرائيات السابقة لإيجاد القيمة العظمى لعناصر مصفوفة ما
program Matrix_part2;
type mat=array[1..10,1..10]of integer;
var a:mat;
n,i,j,max:integer;
ok:boolean;
{1}
function simitric(n:integer):boolean;
var i,j:integer;
error:boolean;
begin
i:=1;
error:=false;
while (i<=n ) and (not error) do
begin
j:=1;
while (j<=n) and (not error) do
begin
if a[i,j]<>a[j,i] then
error:=true
else
j:=j+1;
end;
i:=i+1;
end;
simitric:=not error;
end;
{end fo function simitric}
{2}
procedure max1(n:integer;var max:integer);
var i,j:integer;
begin
max:=a[1,1];
for i:=1 to n do
for j:=1 to n do
if a[i,j]>max then
max:=a[i,j];
end;
{end for procedure max1 }
{3}
function max2(n:integer):integer;
var i,j,max:integer;
begin
max:=a[1,1];
for i:= 1 to n do
for j:=1 to n do
if a[i,j]>max then
max:=a[i,j];
max2:=max;
end;
{ end fo function max2}
{4}
begin {main program}
writeln('please inter long the matrix');
readln(n);
for i:=1 to n do
for j:=1 to n do
readln(a[i,j]);
ok:=simitric(n);
if ok=true then
writeln('the matrix is simitric')
else
writeln('the matrix is not simitric');
max1(n,max);
writeln('the max value in the simitric matrix by procedure =',max);
writeln('the max value in the simitric by function =', max2(n));
writeln;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln;
end;
readln;
End.
13.اكتب اجرائية تاخذ كوسيط سلسلة محارف تمثل تعبير رياضي وتعيد نتيجة منطقية تدل على صحة هذا التعبير آو عدمه علماً ان سلسلة المحارف تقبل فقط محارف رقمية 0-9 وتقبل العمليات *و-و+
2-اكتب تابع ياخذ كوسيط سلسلة محارف تمثل تعبير رياضي ويعيد قيمة هذا التعبير علماً ان سلسلة المحارف تقبل فقط محارف رقمية 0-9 وتقبل العمليات *و+و-
3-اكتب برنامج يقرا سلسلة محارف ويستدعي الإجرائية الأولى للتأكد اذا كانت سلسلة المحارف هذه تمثل تعبير رياضي آو لا وفي حال كانت تعبير عن تعبير رياضي فيطلب استدعاء التابع الثاني لإيجاد قيمة هذا التعبير
program MatExp;
type
PStack=^Element;
Element=record
val:string;
prev:PStack;
end;
var
a:string;
x,c:char;
elem:Element;
n,n1,n2,b:integer;
top,auxtop,ptop,Rtop:PStack;
procedure Push(var ptop:PStack; elem:Element);
var
temp:PStack;
begin
new(temp);
temp^:=elem;
temp^.prev:=ptop;
ptop:=temp;
end;
procedure Clear(var ptop:PStack);
var
temp:PStack;
begin
while (ptop<>nil) do
begin
temp:=ptop;
ptop:=ptop^.prev;
dispose(temp);
end;
end;
function StrToIntConvert(a:string; n:integer):integer;
var
conc,i,j,s:integer;
begin
conc:=0;
j:=1;
while (j<=n) do
begin
s:=(ord(a[j])-ord('0'));
for i:=j+1 to n do
s:=s*10;
conc:=conc+s;
j:=j+1;
end;
StrToIntConvert:=conc;
end;
function Calc(n1,n2:integer; c:char):integer;
var
sum:integer;
begin
case c of
'+': sum:=n1+n2;
'*': sum:=n1*n2;
end;
Calc:=sum;
end;
function IntToStrConvert(b:integer):string;
var
t,c,i,n,d:integer;
s:string;
begin
t:=b;
n:=0;
while (t<>0) do
begin
t:=t div 10;
n:=n+1;
end;
c:=1;
for i:=2 to n do
c:=c*10;
i:=1;
s:=' ';
while (i<=n) do
begin
d:=b div c;
s:=s+chr(ord('0')+d);
b:=b-(d*c);
c:=c div 10;
i:=i+1;
end;
delete(s,1,1);
IntToStrConvert:=s;
end;
function Combine(var ptemp:PStack):string;
var
bo:boolean;
s:string;
begin
s:=ptemp^.val;
bo:=true;
while (bo) do
begin
if ((ptemp^.prev^.val='1') or (ptemp^.prev^.val='2') or (ptemp^.prev^.val='3') or (ptemp^.prev^.val='4')
or (ptemp^.prev^.val='5') or (ptemp^.prev^.val='6') or (ptemp^.prev^.val='7') or (ptemp^.prev^.val='8') or (ptemp^.prev^.val='9')) then
begin
s:=s+ptemp^.prev^.val;
ptemp:=ptemp^.prev;
end
else
bo:=false;
end;
Combine:=s;
end;
procedure Transfer(var top,auxtop:PStack);
var
d,Ssum:string;
temp,temp1:PStack;
check1,check2:boolean;
num1,num2,sum:integer;
begin
temp:=top;
while (temp<>nil) do
begin
if (temp^.val='(') then
begin
temp1:=temp^.prev;
check1:=true;
check2:=false;
while (temp1^.val<>')') and (check1) do
begin
if (temp1^.val='(') then
check1:=false;
if ((temp1^.val ='+') or (temp1^.val='*')) then
check2:=true;
temp1:=temp1^.prev;
end;
if (check1) and (check2) then
begin
temp:=temp^.prev;
sum:=0;
while (temp^.val<>')') do
begin
if ((temp^.val<>'+') and (temp^.val<>'*')) then
begin
d:=Combine(temp);
num1:=StrToIntConvert(d,length(d));
temp:=temp^.prev;
c:=temp^.val[1];
temp:=temp^.prev;
d:=Combine(temp);
num2:=StrToIntConvert(d,length(d));
sum:=Calc(num1,num2,c);
temp:=temp^.prev;
end
else
begin
num1:=sum;
c:=temp^.val[1];
temp:=temp^.prev;
d:=Combine(temp);
num2:=StrToIntConvert(d,length(d));
sum:=Calc(num1,num2,c);
temp:=temp^.prev;
end;
end;
Ssum:=IntToStrConvert(sum);
elem.val:=Ssum;
push(auxtop,elem);
end
else
push(auxtop,temp^);
end
else
push(auxtop,temp^);
temp:=temp^.prev;
end;
clear(top);
end;
procedure AuxTransfer(var top,auxtop:PStack);
var
temp:PStack;
begin
temp:=auxtop;
while (temp<>nil) do
begin
push(top,temp^);
temp:=temp^.prev;
end;
clear(auxtop);
end;
Begin
top:=nil;
Rtop:=nil;
auxtop:=nil;
writeln(‘plz insert a mathematical expression between parentheses and ending with "." ');
read(x);
while (x<>'.') do
begin
elem.val:=x;
push(Rtop,elem);
read(x);
end;
AuxTransfer(top,Rtop);
while (top^.prev<>nil) do
begin
Transfer(top,auxtop);
AuxTransfer(top,auxtop);
end;
writeln;
writeln('after calculating ... the conclusion = ', top^.val);
readln;
readln;
End.
الفصل الثاني مسائل ابتدائية 2
1.اكتب برنامج يقرأ4 أعداد ويجد الأكبر بينهم
Read ( a,b,c,d )
If (a >b ) then
Max1 =a;
Else
Max1=b;
If (c>d)then
Max2=c;
Else
Max2= d;
If (max2 >max1 )
Max1 = Max2
Writeln( Max1)
ملاحظة برمجية عند وجود شرطين if متتالين كما في مثالنا فإن الحاسب سيقوم بفحص الشرطين معاً وفي حال عدم تحقق احدهما سينتقل إلى else الموافقة لل if للشرط المختل الحل بطريقة اخرى :
If (a>b ) And (a>c ) And (a>d) then
Max =a
Else if (b>c) And (b>d) then
Max =b
Else if (c>d)
Max=c
Else max=d
Writeln(max)
2.اكتب برنامج يقرأ مجموعة من الأعداد ويطبعا وإذا ادخل 10 يتوقف البرنامج عن العمل
Readln(n)
While (n <> 10 ) do
Writeln(n);
Readln(n);
آو عن طريق التعليمة التالية break التي تؤمن خروج من الحلقة غير المنتهية
While (true)
Readln(n)
If (n = 10)
Break
Writeln(n)
3.اكتب برنامج يبدل بين قيميتن مثال إذا كانت a=3 و b=2 يصبح a=2 و b=3
الطريقة الأولى :عن طريق 3 متحولات
Temp = a;
a=b;
b=Temp;
الطريقة الثانية : عن طريق متحولين فقط
a =a-b
b =a+b
a =b-a
4.السنة الكبيسة هي سنة يكون فيها عدد أيام شهر شباط 29 يوماً بدلا من 28 يوم ,تكون السنة كبيسة إذا كانت تقبل القسمة على 4 بدون باقي ,باستثناء السنوات التي تأتي في نهاية كل قرن حيث يجب ان تقبل القسمة على 400 بدون باقي لتكون كبيسة وهكذا فإن السنوات 1996و 1940 و 200 مثلا هي سنوات كبيسة في حين السنوات مثل 1995 و 1969 و1900 و 1800 ليست كبيسة . اكتب برنامج بلغة شبه الرماز لقراءة السنة وطباعة إن كانت كبيسة ام لا
Readln( year )
Isleap= false;
If (year mod 4 = 0 )then
If (year mod 400 =0 )then
Isleap= true
Else
If (year mod 100 =0 )then
Isleap=false;
Else isleap=true;
Else
Isleap = false
السنة تقبل القسمة على 4 و 400 = كبيسة
السنة تقبل القسمة على 4 ولا تقبل القسمة على 400 وتقبل على 100 = ليست كبيسة
السنة تقبل القسمة على 4 ولا تقبل على 400 ولا 100 = كبيسة
5.لدى عميل في بنك مبلغ قيمته A يتقاضى فائدة سنوية قيمتها p لعدد من السنوات y احسن واطبع قيمة المبلغ بعد انقضاء عدد السنوات y
Read A,p,y
C=1
While (c<= y )do
A = A+A*p
C= C+1
Writeln(A)
6.اكتب برنامج يقرأ مبلغ قدره A والفائدة التي يعطيها البنك لهذا المبلغ p والمطلوب طباعة بعد كم سنة يتضاعف المبلغ
Readln(a,p)
Y=0
Value =2*a;
While (a<= value )do
A= A +A *p;
Y=Y+1
Writeln(y)
7.اكتب برنامج لقراءة عددين a,b وطباعة الأعداد المحصورة بينها تنازلياً
If (a>b)then
Max =a; min =b
Else
max=b; min =a
first=min ; last =max
while (first <=max ) do
last = last -1
fisrt = first +1
writeln(last)
8.اكتب برنامج لقراءة عدد صحيح n وطباعة n! بحيث تعرف n!= n*(n-1)*(n-2)*(n-3)*…….1
fact: =1;
readln(n)
for i:=1 to n do
fact:=fact*n;
writeln)‘The Factor of the number ‘,n,’is ‘,fact(;
9.اكتب برنامج لحساب X مرفوع للقوة n بحيث يكون x,n دخل من المستثمر بطريقة تكرارية
Res :=1;
Readln(x,n)
For i=1 to n do
Res= Res *X;
Writeln(Res);
10.اكتب برنامج لحساب مجموع الأعداد الفردية من 1 إلى 100
Sum=0
For i =1 to 100 do
Sum = sum +i
Writeln(sum)
11.اكتب برنامج لجدول ضرب العدد n بجميع الأعداد من 1 إلى 10
Readln(n)
For i=0 to 10 do
Prod =n *i
Writeln( prod)
12.اكتب برنامج يوجد جدول الضرب لجميع الأعداد من 1 إلى 10 وذلك بان نوجد جدول خاص لضرب الأعداد مثلا بين 1 وبين باقي الأعداد وبين 2 وباقي الأعداد وهكذا
نحتاج إلى حلقتين كوننا نسير على مجموعتين من الأعداد
For i =1 to 10 do
For j = 1 to 10 do
begin
Prod= i*j
Writeln(prod)
end;
13.اكتب برنامج يقوم بعملية الضرب باستخدام الجمع
Readln(m,n)
mult:=0;
For i:=1 to n do
Mult:=Mult+m;
Writeln(mult)
14.اكتب برنامج لقراءة وطباعة التاريخ ويقوم بما يلي
قراءة متحول يمثل السنة 1989 إلى 2007
قراءة متحول يمثل الشهر من 1 إلى 12
قراءة متحول يمثل رقم اليوم 1 إلى b
بحيث يمكن ان نناقش اذا كانت السنة كبيسة ام لا وتعود b إلى الشهر المناسب فهناك اشهر فيها 31 يوم واخرى 30 و29 المطلوب إدخال المستخدم رقم التاريخ وإذا ادخل رقم خاطىء نطلب منه إعادة الإدخال حتى يتم الادخال الصحيح وعند الادخال الصحيح يتم أظهار التاريخ بشكل كامل
Cyear =false هل هي سنة كبيسة ام لا
Between = false
Read a,b // years
While not (between ) do
Read (year )
If (year >=a ) and (year <=b )
Between =true
If (year mod 4 =0 )
Cyear =true لن ندخل بكثير من التفاصيل سنقبل بالقسمة على 4 فقط ولن نتطرق إلى كافة الشروط
Between =false
While not (between )do
Read(month)
If (mnth >=1 ) and (month <=12 )
Between =true
A=1 , b=31
If (m=2)
If cyear =true then
B=29
Else b=28
Else if (m=4) or (m=6) or (m=9) or (m=11)
B=30
Between =false
While not (between)do
Read (day)
If day>=1 and day<=b
Between =true
Writeln(day, month, year )
15.اكتب برنامج يقوم بعملية القسمة باستخدام عملية الطرح
Read m,n ; sub:=1;
repeat
sub = sub+1;
m = m-n;
until )m-n <>0(
Writeln)‘The result is ‘,sub(;
16.أكتب برنامج يطبع n من الأعداد الموجبة بشرط ألا يطبع الأعداد الأولية:
تعريف العدد الأولي :هو العدد الذي يقبل القسمة على نفسه والواحد فقط مثال العدد 7 عدد أولي لانه يقبل القسمة على نفسه وعلى ال1 فقط
Readln)num(; j=0;
While )j <=n( do
begin
readln)m(; {الأرقام المدخلة من المستخدم }
isdone_ check:=false; i:=2;
While )i <=m-1( and )not isdone_ check) do {true }
if i mod m=0 then { أي انه ليس أولي }
isdone_ check:=true;
else
i:=i+1;
isdone_ check:=false;
end; {while 2}
if isdone_ check =true then
write)m(;
j = j+1;
end; { while 1}
شرح الطريقة
مثال لنفرض انه n =3 أي هناك 3 أعداد للإدخال نقرأ العدد m ثم نسند ل i متحول من نمط عدد صحيح العدد 2 لان الواحد يقبل القسمة already وهذه العملية ستبين التالي : نفرض ان تم إدخال 6 ثم 7 بالنسبة لل 6 سيدخل i وياخد القيم من 2 –5 وبيشوف إذا في عدد متل 2 هلق هو يقبل القسمة على 2 إذا هيك بيطلع وما بيطبع العدد بينما إذا فتنا على 7 لح نلاقي انو مافي أعداد من 2-6 بتقبل القسمة على 7 فلا نطبعه
17.اكتب برنامج يجمع آخر عددين مدخلين
Readln n ; عدد الأرقام المدخلة sum:=0;
for i:=1 to n do
begin
Readln m ;
if i+1=n then
sum:=sum+m;
end;
writeln(sum)
آو طريقة أخرى نحن لا نعلم عدد الأرقام المدخلة
Sum=0,m=0;
C :srting
While ( c <>‘no ‚) do
begin
Writeln(‘Do u want to read a number ‘)
Readln(c)
Sum2=m; // The old value of m
If c=’yes’ then
Readln(m)
Sum2=m;
Else
Sum =sum1 +sum2;
End;
18.اكتب برنامج يطبع الشكل حيث يدخل المستخدم عدد n ليحدد عدد الأسطر
1
212
32123
4321234
Readln n ;
Writeln)1(;
for i:=2 to n do
for j:=i downto 2 do
write)j:4(;
for j:=1 to i do
write)j):4((;
19.اكتب برنامج يدخل 10 أعداد تكون محصورة بين 10-100 ويطبع التي لم تتكرر ملاحظة للحل :بما ان لدينا 10 أعداد فنشكل مصفوفة لا ن بعدها ثابت ونضع الأرقام ثم نطبع الأعداد غير المتكررة
var A: array]1..10[ of integer;
i:=1;
while i<=10 do
begin
read m
if m in 10..100 then {m >=10 & m<=100}
begin
A]i[n=n m;
i:=i+1;
end;
else
writeln )‘Enter a number which have the domain 10..100’(
j:=1;
{// طباعة غير المكرر}
while j< 10 do
for k:=j+1 to 10 do
begin
if A]j[ n=n A]k[ then
found:=true
else found:=false;
end;
if found=false then writeln A]j[;
end;
20.اكتب برنامج يقوم بتبديل بين أول مرتبة وآخر مرتبة بالعدد مثال : العدد 1217 يصبح 7211 سؤال وظيفة عملي
num,mid=0,n2,digits,last,first,n1=0,res : integer;
readln num;
first =num mod 10;
n2 =num; digits =1;
while )n2 div 10 <> 0( do
begin
Digits = digits +1;
n2 =n2 div 10;
last =n2;
end
n2 =num div 10;
int digit_counter =1;
for ) i=1 to digits-2 ( do
begin
mid = n2 mod 10 * powf)10,digit_counter(;
n1 =n1+mid;
n2 =n2 div 10;
digit_counter=digit_counter+1 ;
end
for ) m=1 to digits-1 ( do
first =first*10;
res =last+first+n1;
Writeln ) res (
شرح الطريقة ناخذ الرقم الاول بعملية واحدة هي العدد mod ال10 بينما الرقم الأخير نقوم بحساب عدد خاناته ولنفترض لديناالرقم 1234 فينتج لدينا 4 خانات فيكون آخر عدد 1234 مقسوم على 1000 فينتج 1 فيكون العدد الناتج هو 4000+ 1 + رقم نشكله وهو يمثل القسم الأوسط من العدد نقوم بعملية بسيطة لنشكل العدد 230 وهذه العملية بعد تعريف digit_counter بالقسم الأوسط من الكود
21.اكتب برنامج يقوم بإدخال عدد من المستثمر ويحسب عدد خاناته
Function Number_digit )n:integer(integer;
Var digit:integer;
Begin
Digit:=0;
While n div 1o <> 0 do
begin
digit:= digit+1;
n:=n div 10
end;
end;
22.اكتب برنامج يقيوم بمعرفة هل الرقم المدخل بدايتو تساوي نهايتو
Readln n
first:=n mod 10;
while n <>0 do
begin
last:=n div 10
n:=n div 10
end;
if first = last then write first,last ;
23.المطلوب كتابة برنامج يقوم بجمع الأعداد m المتتالية وفق القاعدة التالية :مثال: m=8
sum=1-2+3-4+5-6+7-8
Read m
For k:=1 to n do
If k mod 2 = 0 then
Sum:=sum-k;
Else
sum:=sum+k;
24.ندخل عدد الثواني ثم يقوم الحاسب بإظهار عدد الساعات ،الدقائق،الثواني على الشكل التالي h:m:s
program time;
var
hour,min,sec,temp,temp2,day,t:longint;
begin
writeln)'enter your time in the form of seconds'(;
Readln)t(;
sec:=t mod 60;
temp:=t div 60;
min:=temp mod 60;
temp2:=temp div 60;
hour:=temp2 mod 24;
day:=temp2 div 24;
writeln)'day=',day,' hour=',hour,' min=',min,' sec',sec(;
readln;
end.
آو يمكن الحل بهذه الطريقة
Function getTime)seconds: LongInt(: String;
Var
H, M, S: Integer;
Begin
H := seconds div 3600;
seconds := seconds mod 3600;
M := seconds div 60;
S := seconds mod 60;
getTime := IntToStr)H( + ':' + IntToStr)M( + ':' + IntToStr)S(;
End;
25.اكتب برنامج ينشى السلسة التالية : 1-1-2-3-5-8-13-21-34…..
هذه السلسة هي سلسة فيبوناتشي حيث ينتج كل حد نتيجة جمع حدين سابقين له الحل وفق متحولين وسيطين دون العودية وفق طريقة تكرارية وهي اسرع بكثير من العودية
x=0;
y=1
for i=2 to n-1 do
begin
temp=y
y=y+x
x=temp
end
26.أوجد جذر عدد مدخل موجب
الحل يترك كوظيفة للقارىء
احدى الطرق تتمثل بان نجمع عدد الأعداد الفردية المكونة للرقم مثال جذر ال16 هو 4 لان عدد الأعداد الفردية والتي مجموعها يساوي 16 هي 4 أعداد فردية 1+3+5+7
الفصل الثالث مسائل على المحارف Char
بعض الملاحظات الهامة في التعامل مع المحارف في باسكال الأعداد :
متمم العدد للعدد 9 Ch:=chr)ord)0) n+n ord)9) n-n ord)ch));
متمم للعدد 10 Ch:=chr)ord)0) n+n ord)9) n-n ord)ch) n+n 1(;
متمم عدد من اجل أي عدد n جميع الحقوق محفوظة لواز
X:=n-9
Ch:=chr)ord)0( + ord)9) - ord)ch) + x(
الأحرف التحويل من حرف صغير إلى كبير a..z ch:=chr)ord)‘A’ + (ord)‘a’ - (ord)ch((; آو يمكن بطريقة أخرى
ch:=chr)ord)‘Z’ ( n-n ord)‘z’ (n+n ord)ch((;
التحويل من حرف كبير إلى حرف صغير A..Z
Ch=chr(-ord(‘a’) +ord(‘A’) +ord(ch));
1.اكتب برنامج لتحويل سلسلة من الكلمات من كبتل إلى اسمول وحساب أحرف العلة
تذكرة : أحرف العلة بالإنجليزية تذكرة a,u,e,o,i
S:string
for i=1 to length)s( do
if ord)s]i[ >’A’( and ord)s]i[<’Z’(
s]i[ n=n chr)ord)c(n-n ord)‘A’) n+n ord)‘a’((
if s]i]n=n ’a’ or s]i] n=n ’u’ or ……. then
Vowel=vowel +1
2.اكتب برنامج يعكس كل كلمة داخل سلسلة
first,last:integer
s:string]100[
first=1
while i<= length)s( do
if s]i] n=n ’ ‘ then
begin
first=i+1 ; last=i-1
for j=last downto first do
write s]i[ ;
writeln;
end;{if}
else
i=i+1
3.اكتب برنامج يأخذ أول حرف من كل كلمة ويطبعه
Write s]1] n:n 4
for j=2 to length)s(do
if s]j] n=n’ ‘ then
write)s]i+1] n:n 4(
4.اكتب برنامج يعرف ان هل الكلمة تقرأ من الجانبين ام لا )بكلمة أخرى هل هي متناظرة ام لا بالنسبة للمنتصف
For i =1 to length (s) div2 do
begin
If S[i] = S[length (s) –i+1] then
Is_semtirc =true;
Else
Begin
Is_semtirc =false ;
Break;
End;
End;
5.اكتب برنامج تدخل سلسلة من الكلمات ويعكس جميع الكلمات ما عدا اول وآخر كلمة
إيجاد خانة البداية لثاني كلمة وآخر كلمة
For i =1 to length (s) do
If S[i] =‘ ‚ then {space }
First =i
If S[length (s) –i+1 ] = ‚ ‚ then {space }
Last = length (s) –i+1
العمل ضمن مجال الكلمة لعكس الأحرف
First _temp_word = first;
For i = first to last do
If S[i] = ‘ ‘ then {space }
begin
Last_temp_word = i;
For j= First _temp_word to Last_temp_word div 2 do
S[j]= S [Last_temp_word –j +1]
First _temp_word= i+1;
End;
6.اكتب برنامج يطبع أوسط كل حرف من كل كلمة
First=1;
For i =1 to length (s) do
If S[i] =‘ ‚ then {space }
Begin
Last =i;
Writeln(S[first+last /2] )
First =i+1
End;
7.اكتب برنامج يطبع كلمة Capital وكلمة Small
i=1
for j=1 to length)s(
if i mod 2=o then زوجي
begin
if ord)s]i[(>’a’( and ord)s]i[ <’z’( then الحرف صغير
write s]i] n:n 4
else
write )chr)ord)s]i[(-ord)‘A’(+ord)‘a’((
end {if}
else فردي
if ord)s]i[(>’A’( and ord)s][i[<’Z’( then
write)s]i[:4(;
else
write )chr)ord)s]i[ n)+n ord)‘A’) n-n ord)‘a’((
8.المطلوب إدخال نص (محرف محرف ) ينتهي بنقطة ومن ثم اظهار النص المدخل و ذلك بعد عكس المحارف
مثال: النص المدخل .dido
و النص بعد المعالجة odid.
A:array ]1..100[ of char
C:char
Repeat
Read c
A]i] = c
I:=i+1;
Until c=’.’
For j:=I downto 1 do
Write)A]i[:4(
program paragraph )input,output( ;
const
n = 10;
var
a : array]1..n[ of char;
i:integer;
m:char;
begin
read m ;
writeln) ' Please enter the text in order to reverse it' ( ;
i:=1 ;
while )m<> ' . ' (and )i<>n(do
begin
a]i[ := m;
read m ;
i:= i+1;
end;
for i:=n downto 1 do
begin
write)a]i[( ;
end;
readln; readln;
end.
9.اكتب برنامج بلغة باسكال يقوم بقراءة سلسلة من المحارف(string)تنتهي بالمحرف(.)ثم يقوم البرنامج بأيجاد المحرف ذي التواتر الاكبر(المحرف الذي يرد في سلسلة المحارف لاكبر عدد من المرات) وأظهاره
program test;
type
vect=array]'a'..'z'[of integer;
var j:char; max,i:integer; s:string; a:vect; found:boolean;
begin
writeln)'write the text'(
read)s(;
i:=1;
j:='a';
while)s]i[<>'.'do
begin
found:=false;
j:='a';
while)j<>'z' ( and)not found(do
begin
if)s[i] =j )then
begin
a[j]= a[j+1]
found:=true;
end;
j:=succ(j)
end;
i:=i+1;
end;
(*this section is to count the freq for each letter *)
max:=a]'a'[; (*comparing the max *)
for j:='a' to 'z' do
begin
if(max<a[j] ) then
max:=a[j] ;
end;
for j:='a' to 'z' do (*showing off that max*)
begin
if(max=a[j] )then
begin
case j of
'a':writeln('a');
'b':writeln('b');
'c':wrietln('c');
.........
'z':writeln('z');
end; (*case*)
end; (*if*)
end; (*for*)
readln;
end.
10.أكتب برنامج لفصل سلسلة حرفية الى ثلاث مجاميع واحدة للحروف الكبيرة و الثانية للأرقام و الثالثة للحروف المتبقية من السلسلة الحرفية طبعا باستخدام ال string
Capital :array ]‘A’..’Z’[ of char
Number:array ]1..9[ of integer;
ordinary:array]‘a’..’z’[of char
Writeln)‘Enter the text’(;
Read)s(; )*s is verify as string *(;
For i:=1 to length)s( do
Case s]i[ of
‘A’..’Z’ : capital]i[ =s]i[;
‘1’..’2’ : number ]i[ =s]i[;
‘a’..’z’ : ordinary]i[ =s]i[;’