عمليات تکرار Repetition - ????????

Download Report

Transcript عمليات تکرار Repetition - ????????

‫عمليات تکرار ‪Repetition‬‬
‫• از مهمترين ويژگيهای هر زبان برنامه نويس ی است که اجازه می‬
‫ً‬
‫دهد تا يک بلوک از دستورات مکررا اجرا گردد‪.‬‬
‫• ساختار ‪ (DO Construct) DO‬در فرترن‬
‫– جهت تکرار بلوک هايي از دستورات مختلف‬
‫– فرم کلی‬
‫] شرط کنترل ‪[Control Clause‬‬
‫‪[name:] DO‬‬
‫‪block‬‬
‫]‪END DO [name‬‬
‫‪1‬‬
‫حلقه های تکرار‬
‫عباسپور‬
‫انواع حلقه های ‪DO‬‬
‫•‬
‫حلقه با تکرار نامحدود‬
‫‪[name:] DO‬‬
‫‪block of statements‬‬
‫]‪END DO [name‬‬
‫باعث تکرار بلوک تا بی نهايت می گردد‬
‫مثال‪:‬‬
‫‪j=1‬‬
‫;‪e=1.0; k=1‬‬
‫‪DO‬‬
‫)‪e=e+1.0/REAL(j‬‬
‫‪k=k+1‬‬
‫‪j=j*k‬‬
‫‪END DO‬‬
‫در اين نوع حلقه برنامه به وضوح متوقف نمی شود‬
‫برنامه تا انجا ادامه می دهد تا ‪ j‬از برد پردازنده بيشتر شود‬
‫‪2‬‬
‫حلقه های تکرار‬
‫عباسپور‬
‫کنترل حلقه ‪ DO‬بی نهايت‬
‫• دستور ‪ ( EXIT‬همراه با دستور ‪)IF‬‬
‫• کنترل به اولين دستور بعد از ‪ END DO‬می رود‬
‫مثال‪:‬‬
‫)‪INTEGER::ifib(100‬‬
‫‪Ifib(1)=1; ifib(2)=1; i=3‬‬
‫‪DO‬‬
‫)‪ifib (i)=ifib(i-1)+ifib(i-2‬‬
‫‪i=i+1‬‬
‫‪IF(i>100)EXIT‬‬
‫‪END DO‬‬
‫‪3‬‬
‫حلقه های تکرار‬
‫عباسپور‬
‫دستور ‪STOP‬‬
‫• دستوری ساده ولی قوی (شبيه تابع ‪ exit‬در ‪)C‬‬
‫• اين دستور اجرای برنامه را در هر جا که باشد (ازجمله داخل حلقه تکرار)‬
‫متوقف می کند‬
‫• اين دستور با يد همراه با نوعی از دستور ‪ IF‬باشد‬
‫‪• IF (condition) STOP‬‬
‫يا‬
‫‪IF (condition) THEN‬‬
‫‪block of statements‬‬
‫‪STOP‬‬
‫‪END IF‬‬
‫‪4‬‬
‫حلقه های تکرار‬
‫عباسپور‬
‫حلقه ‪DO WHILE‬‬
‫• فرم کلی‬
‫)‪DO WHILE (condition‬‬
‫‪block of statements‬‬
‫‪END DO‬‬
‫ماداميکه ‪ condition‬به صورت ‪ TRUE‬باشد حلقه تکرار خواهد شد در غير‬
‫اينصورت کنترل به دستور بعد از ‪ END DO‬می رود‬
‫اين حلقه معادل حالت زير است‪:‬‬
‫‪DO‬‬
‫‪IF (.NOT. condition) EXIT‬‬
‫‪block of statements‬‬
‫‪END DO‬‬
‫‪5‬‬
‫حلقه های تکرار‬
‫عباسپور‬
‫مثال‬
x=1.0; y=1.0; z=1.0; count=0
Sample:DO WHILE ((x**2+y**2+z**2)<1000000.0)
xplus=10.0*(y-x)
yplus=x*z+28.0*x-y
zplus =x*y-8.0*z/3.0
Test=ABS(xplus)+ABS(yplus)+ABS(zplus)
IF (test<=0.000001)EXIT
Count=count+1
END DO sample
‫حلقه های تکرار‬
‫عباسپور‬
6
‫دستور ‪ CYCLE‬در حلقه های ‪DO‬‬
‫• برای جهش به پايين بلوک و برگشت به ابتدای آن ولی با اين‬
‫دستور کنترل از حلقه خارج نمی شود‬
‫• معادل ‪ continue‬در ‪C‬‬
‫‪Do‬‬
‫”‪WRITE(*,*) “type the password‬‬
‫‪READ(*,*)yourword‬‬
‫‪IF (yourword/=password)CYCLE‬‬
‫”‪WRITE(*,*)”that’s right, now type a new password‬‬
‫‪READ(*,*) password‬‬
‫‪WRITE(*,*) “the new password is”,password‬‬
‫‪EXIT‬‬
‫‪END DO‬‬
‫اگر کلمه رمز درست تايپ نشود کاربر هرگز نمی تواند از حلقه خارج‬
‫شود‬
‫‪7‬‬
‫حلقه های تکرار‬
‫عباسپور‬
CYCLE ‫ و‬EXIT‫حلقه های متداخل و دستور های‬
ً
)‫• به منظور جلوگيری از اغتشاش بهتر است حتما حلقه ها دارای اسم باشند (به مثال زير توجه شود‬
PROGRAM averscore
REAL :: mark, average
INTEGER:: stid, loop ,n
WRITE(*,*)”type in the number of students”
mainloop: DO
WRITE(*,*) 'Please give student id'
READ(*,*) stid
IF (stid==0) EXIT mainloop
average=0
innerloop: DO loop=1,n
WRITE(*,*) 'Please enter mark'
READ(*,*) mark
IF (mark==0) CYCLE innerloop
negs: IF (mark<0) THEN
WRITE(*,*) 'Wrong mark. Start again'
CYCLE mainloop
END IF negs
‫ نام حلقه‬CYCLE ‫اگر در دستور‬
average=(average+mark)
‫مشخص نشود تکرار در داخلی ترين‬
END DO innerloop
‫حلقه مد نظر قرار می گيرد‬
average=(average)/n
WRITE(*,*) 'Average of student',stid,' is = ',average
‫حلقه های تکرار‬
8
END DO mainloop
‫عباسپور‬
END PROGRAM averscore
‫حلقه تکرار با شاخص شمارنده‬
‫• فرم کلی‬
‫]‪[name:] DO count = start, stop [,step‬‬
‫‪block of statements‬‬
‫]‪END DO [name‬‬
‫‪ Count‬يک ‪ INTEGER‬يا يک متغير ‪ INTEGER‬جهت کنترل حلقه‬
‫‪ Start‬به صورت ‪ INTEGER‬و بيانگر شروع ‪ count‬است‬
‫‪ Stop‬به صورت ‪ INTEGER‬و بيانگر مقدار نهايي ‪ count‬است‬
‫‪ Step‬مقدار نمو ‪ count‬است و اگر نباشد ‪ 1‬در نظر گرفته می شود‬
‫‪No. of iteration=(stop + step - start)/ step‬‬
‫مقدار ‪ count‬در داخل حلقه نمی تواند تغيير کند‬
‫کوچکتر از ‪ start‬باشد و ‪ step‬مقداری مثبت انگاه ‪ count‬صفر شده‬
‫اگر ‪ً stop‬‬
‫حلقه اصال تکرار نخواهد شد‬
‫‪9‬‬
‫حلقه های تکرار‬
‫عباسپور‬
‫مثال‬
all: DO i=1,10
WRITE(*,*) i !write numbers 1 to 10
END DO all
even: DO j=10,2,-2
WRITE(6,*) j !write even numbers 10,8,6,4,2
END DO even
‫حلقه های تکرار‬
‫عباسپور‬
10
CASE‫ و‬DO ‫مثالی از ترکيب‬
PROGRAM do_case
!This program interpret input, out put text as a number
CHARACTER (8)::string, text
INTEGER::npoints
start: DO
READ (*,*)text
IF(text(1:1)=="!")THEN
PRINT*,"Terminate the program"
STOP
END IF
string=“ “
npoints=0
‫حلقه های تکرار‬
‫عباسپور‬
11
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
text: DO I=1,LEN(text)
digit: SELECT CASE (text(i:i))
CASE ("0":"9")
string=TRIM(string)//text(i:i)
CASE (",")
WRITE(*,*)"Commas are disregarded"
CASE (".")
npoints=npoints+1
string=TRIM(string)//"."
CASE ("O")
WRITE (*,*)"An O has been interpreted as zero"
string=TRIM(string)//"0"
CASE ("I")
WRITE (*,*)"An I has been interpreted as 1"
string=TRIM(string)//"1"
CASE (" ")
WRITE (*,*)"A blank has been disregarded"
CASE DEFAULT
WRITE (*,*)"There is a fatal ERROR!!!!"
STOP
END SELECT digit
END DO text
‫حلقه های تکرار‬
‫عباسپور‬
12
points: SELECT CASE (npoints)
CASE (0)
WRITE (*,*)" check: there was no decimal point"
CASE (2:)
WRITE (*,*) "there was more than one decimal point"
STOP
CASE DEFAULT
WRITE(*,*) "your number was correct"
END SELECT points
WRITE(*,*) "your number: ",text
WRITE(*,*) "changed to",string
END DO start
END PROGRAM do_case
‫حلقه های تکرار‬
‫عباسپور‬
13
‫ در محاسبات مهندس ی‬DO ‫مثالی از کاربرد حلقه‬
PROGRAM trajectory
!*****************************************************************************************
!* A program to calculate the particle trajectory data for varying angles *
!* and initial velocities
*
!* Programming language class, Dept. of Farm Machinery, Dr. Abbaspour*
!*****************************************************************************************
! variable definition
!v0=initial velocity
!theta=angle of trajectory in degree
!gee=local gravitational acceleration
!angle=angle of trajector in radians
!tymax=time, in second, to reach the top of trajectory
!ymax=maximum hieht of trajectory, feet
!xmax=distance from launch to impact, feet
!n=number of velocities to be input
..........‫ادامه‬
‫حلقه های تکرار‬
‫عباسپور‬
14
REAL::v0,theta,gee,angle,tymax,ymax,xmax
INTEGER::n
gee=32.17
!outer loop for different velocities
PRINT*, "Input number of velocities to be used"
READ(*,*)n
outer_loop:DO I=1,n
PRINT*,"Input initial velocity (ft/s)"
READ(*,*)v0
WRITE(*,*)"For an initial velocity of ",v0," the data are:"
WRITE(*,*) "Angle Time
Maximum Y
Height &
&
Distance"
! Inner loop for varying angle
inner_loop:
DO J=1,89,2
theta=REAL(J)
angle=theta/57.3
tymax=v0*sin(angle)/gee
ymax=v0*sin(angle)*tymax-0.5*gee*tymax**2
xymax= v0*cos(angle)*tymax
xmax=2.0*xymax
WRITE(*,*)theta,tymax,ymax,xymax,xmax
END DO inner_loop
END DO outer_loop
END PROGRAM trajectory
‫حلقه های تکرار‬
‫عباسپور‬
15
‫ساختار هاي تكرار در ‪C‬‬
‫• ساختار تكرار ‪while‬‬
‫• تا زماني كه شرط خاص ي بر قرار است عمليات داخل حلقه تكرار مي شود‬
‫(مشابه ‪ Do WHILE‬در فرترن)‬
‫– شرط در ابتداي حلقه بررس ي مي شود‬
‫• فرم كلي‬
‫;>‪while (<logical exp>) <statement‬‬
‫• به صورت بلوك نيز قابل قبول است‬
‫{ )>‪while (<logical exp‬‬
‫;>‪<statement1‬‬
‫;>‪<statement2‬‬
‫‪……..‬‬
‫;>‪<statement n‬‬
‫}‬
‫حلقه های تکرار‬
‫‪16‬‬
‫عباسپور‬
#include <stdio.h>
while ‫مثال‬
‫محاسبه فاكتوريل يك عدد‬
void main(){
int i,
number;
long int factorial;
printf("please enter the number:");
scanf("%d",&number);
factorial=1;
i=1;
while (i<=number){
factorial*=i;
i++;
}
printf("factorial of %d is %d", number, factorial);
}
‫حلقه های تکرار‬
‫عباسپور‬
17
‫حلقه تكرار ‪ for‬در ‪C‬‬
‫• يك حلقه تكرار معين يا مطلق است‬
‫• مشابه حلقه ‪do‬در فرترن‬
‫• فرم كلي‬
‫;>‪for ( <exp1> ; <exp2> ; <exp3> ) <statement‬‬
‫عبارت مربوط به مقدار دهي اوليه شمارنده ‪<exp1> :‬‬
‫عبارت مربوط به شرط تكرار حلقه (در صورت درست بودن) ‪<exp2> :‬‬
‫عبارت مربوط به نحوه افزايش متغير شمارنده حلقه ‪<exp3>:‬‬
‫• مثال (چاپ اعداد بين صفر و ‪100‬‬
‫;‪int count‬‬
‫)‪for (count=0; count<=100; count++‬‬
‫;)‪printf(“%d”, count‬‬
‫• چاپ اعداد مضرب ‪5‬‬
‫;)‪for (count=0; count<=100; count+=5) printf(“%d”, count‬‬
‫چاپ اعداد مضرب ‪ 5‬بصورت معكوس‬
‫‪18‬‬
‫حلقه های تکرار‬
‫)‪for (count=100; count>=0; count -=5‬‬
‫;)‪printf(“%d”, count‬‬
‫عباسپور‬
‫ادامه حلقه ‪ for‬در ‪C‬‬
‫• حلقه بصورت بلوك نيز نوشته مي شود‬
‫{) >‪for ( <exp1> ; <exp2> ; <exp3‬‬
‫‪statements‬‬
‫‪……….‬‬
‫}‬
‫• قسمت مقدار دهي اوليه و شمارنده مي تواند شامل چند عبارت باشد كه توسط كاما جدا مي‬
‫شوند‬
‫)‪for (a=0,b=100; b-a>50; a++, b--‬‬
‫• قسمت شرطي مي تواند هر نوع شرط مركب باشد‬
‫)‪for (count=0; count<100 && sw==1; count++‬‬
‫• مي توان هر يك از سه عبارت را خذف كرد‬
‫ً‬
‫قبال به نحوي مقدار دهي شده باشد‪for (; i<100; i++) //‬‬
‫حذف مقدار دهي اوليه ( بايد شمارنده‬
‫حذف نحوه تغيير متغير (نحوه تغيير پيچيده و توسط برنامه نويس در داخل حلقه تعيين مي شود) ‪for (; i<100;) //‬‬
‫شرط حذف شده است ( بايد به طريقي از تكرار بينهايت آن جلوگيري كرد) ‪for (i=0; ; i++) //‬‬
‫‪19‬‬
‫حلقه های تکرار‬
‫عباسپور‬
#include <stdio.h>
#include <values.h>
void main(){
int i, n, number;
int sum, max, min;
float average;
printf("please enter number of iteration:");
scanf ("%d",&n);
sum=0;
min= MAXINT;
max=-MAXINT-1;
for(i=1; i<=n; i++){
‫ برنامه اي بنويسيد كه‬:‫مثال‬
‫تعدادي عدد را دريافت و‬
‫كوچكترين و بزرگترين آنها را‬
‫چاپ نمايد‬
printf("please enter the number
:");
scanf ("%d",&number);
sum+= number;
if (number>max)
max=number;
if (number<min)
min=number;
}// end of for loop
average=(float) sum / (float) n;
‫حلقه‬
20
printf("average= %f, Maximum= ‫تکرار‬
%d,‫های‬Minimum
=%d", average, max, min);
}
‫عباسپور‬
#include <stdio.h>
:‫ متداخل‬for ‫مثال حلقه‬
1000 ‫تعيين اعداد اول تا‬
void main(){
int number,i;
int primDetect;
printf("prim numbers between 1 and 1000:\n");
printf("1 2 ");
number=3;
// loop for numbers
for (; number<=1000; number+=2){
primDetect=1;
// loop for detecting prim number
for (i=2; i< number&& primDetect==1; i++){
if (number%i==0)
primDetect=0;
}
// end of inner for loop
if(primDetect==1) printf("%d\n", number);
}//end of outer for loop
}
‫حلقه های تکرار‬
‫عباسپور‬
21