عمليات تکرار 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