حلقه های تکرار عباسپور 1 عمليات تکرار repetition از مهمترين...
Post on 21-Dec-2015
229 views
TRANSCRIPT
تکرار های حلقهعباسپور
1
Repetitionعمليات تکرار
از مهمترين ويژگيهای هر زبان برنامه •نويسی است که اجازه می دهد تا يک بلوک
گردد.مکررا& اجرااز دستورات در فرترنDO (DO Construct)ساختار •
جهت تکرار بلوک هايي از دستورات مختلف–فرم کلی–
[name:] DO [Control Clause شرط کنترل ]block
END DO [name]
تکرار های حلقهعباسپور
2
DOانواع حلقه های نامحدود • تکرار با حلقه
[name:] DO block of statements END DO [name]
گردد می نهايت بی تا بلوک تکرار باعثمثال:
e=1.0; k=1; j=1
DO e=e+1.0/REAL(j)k=k+1j=j*k
END DOشود نمی متوقف وضوح به برنامه حلقه نوع اين در
تا دهد می ادامه انجا تا شود jبرنامه بيشتر پردازنده برد از
تکرار های حلقهعباسپور
3
بی نهايت DOکنترل حلقه
(IF ) همراه با دستور EXITدستور • می END DOکنترل به اولين دستور بعد از •
رودمثال:
INTEGER::ifib(100)Ifib(1)=1; ifib(2)=1; i=3DO
ifib (i)=ifib(i-1)+ifib(i-2)i=i+1IF(i>100)EXIT
END DO
تکرار های حلقهعباسپور
4
STOPدستور
(C در exitدستوری ساده ولی قوی )شبيه تابع •اين دستور اجرای برنامه را در هر جا که باشد •
)ازجمله داخل حلقه تکرار( متوقف می کند IFاين دستور با يد همراه با نوعی از دستور •
باشد• IF (condition) STOP
ياIF (condition) THEN
block of statementsSTOP
END IF
تکرار های حلقهعباسپور
5
DO WHILEحلقه
فرم کلی•DO WHILE (condition)
block of statementsEND DO
باشد حلقه تکرار TRUE به صورت conditionماداميکه خواهد شد در غير اينصورت کنترل به دستور بعد از
END DOمی رود اين حلقه معادل حالت زير است:
DOIF (.NOT. condition) EXITblock of statements
END DO
تکرار های حلقهعباسپور
6
مثال
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
تکرار های حلقهعباسپور
7
DO در حلقه های CYCLEدستور برای جهش به پايين بلوک و برگشت به •
ابتدای آن ولی با اين دستور کنترل از حلقه خارج نمی شود
C در continueمعادل •Do
WRITE(*,*) “type the password”READ(*,*)yourwordIF (yourword/=password)CYCLEWRITE(*,*)”that’s right, now type a new password”READ(*,*) passwordWRITE(*,*) “the new password is”,passwordEXIT
END DO
اگر کلمه رمز درست تايپ نشود کاربر هرگز نمی تواند از حلقه خارج شود
تکرار های حلقهعباسپور
8
CYCLE و EXIT حلقه های متداخل و دستور هایبه منظور جلوگيری از اغتشاش بهتر است حتما& حلقه ها دارای اسم باشند )به مثال زير •
توجه شود(PROGRAM averscore REAL :: mark, average INTEGER:: stid, loop ,nWRITE(*,*)”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 average=(average+mark) END DO innerloop average=(average)/n WRITE(*,*) 'Average of student',stid,' is = ',average END DO mainloop END PROGRAM averscore
CYCLEاگر در دستور نام حلقه مشخص
نشود تکرار در داخلی ترين حلقه مد نظر
قرار می گيرد
تکرار های حلقهعباسپور
9
حلقه تکرار با شاخص شمارندهفرم کلی•
[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 مقدار
مقداری مثبت step باشد و start کوچکتر از stopاگر صفر شده حلقه اصًال& تکرار نخواهد شد countانگاه
تکرار های حلقهعباسپور
10
مثال
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
تکرار های حلقهعباسپور
11
CASE وDOمثالی از ترکيب
PROGRAM do_case!This program interpret input, out put text as a numberCHARACTER (8)::string, textINTEGER::npointsstart: DO READ (*,*)text IF(text(1:1)=="!")THEN PRINT*,"Terminate the program" STOP END IF
string=“ “npoints=0
تکرار های حلقهعباسپور
12
• 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
تکرار های حلقهعباسپور
13
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
تکرار های حلقهعباسپور
14
در محاسبات مهندسی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
ادامه..........
تکرار های حلقهعباسپور
15
REAL::v0,theta,gee,angle,tymax,ymax,xmaxINTEGER::ngee=32.17!outer loop for different velocitiesPRINT*, "Input number of velocities to be used"READ(*,*)nouter_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
تکرار های حلقهعباسپور
16
Cساختار هاي تكرار در whileساختار تكرار •
تا زماني كه شرط خاصي بر قرار است عمليات داخل حلقه • در فرترن(Do WHILEتكرار مي شود )مشابه
شرط در ابتداي حلقه بررسي مي شود–فرم كلي•
while (<logical exp>) <statement>;به صورت بلوك نيز قابل قبول است•
while (<logical exp>) { <statement1>;<statement2>;
……..<statement n>;}
تکرار های حلقهعباسپور
17
whileمثال محاسبه فاكتوريل يك
عدد
#include <stdio.h>
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);}
تکرار های حلقهعباسپور
18
C در forحلقه تكرار يك حلقه تكرار معين يا مطلق است•در فرترن 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چاپ اعداد مضرب for (count=100; count>=0; count -=5) printf(“%d”, count);
تکرار های حلقهعباسپور
19
C در forادامه حلقه حلقه بصورت بلوك نيز نوشته مي شود•
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++) // شرط حذف شده است ) بايد به طريقي از تكرار بينهايت آنجلوگيري كرد(
تکرار های حلقهعباسپور
20
مثال: برنامه اي بنويسيد كه
تعدادي عدد را دريافت و
كوچكترين و بزرگترين آنها را
چاپ نمايد
#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; printf("average= %f, Maximum= %d, Minimum =%d", average, max, min);}
تکرار های حلقهعباسپور
21
forمثال حلقه متداخل: تعيين اعداد اول تا
1000
#include <stdio.h>
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}