-
-
Notifications
You must be signed in to change notification settings - Fork 95
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
221 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,221 @@ | ||
--- | ||
title: '1.11 حلقه ها (for)' | ||
slug: go-for | ||
weight: 1011 | ||
--- | ||
|
||
## حلقه | ||
حلقهها را در زبان گو به سادهترین شکل ممکن و فقط با استفاده از کلید واژه for و در مدلهای مختلف (سهبخشی, بی نهایت, foreach و ...) میتوان پیادهسازی کرد. | ||
|
||
### حلقه سه بخشی | ||
این نمونه از حلقهها که متداولترین نوع حلقه است با استفاده از سهبخش: | ||
- مقداردهی | ||
- شرط | ||
- شمارنده | ||
ایجاد میشوند. | ||
```go | ||
for initialization ; condition ; counter { | ||
//loop codes | ||
} | ||
``` | ||
در کد زیر نمونهای از این حلقهها قابل مشاهده و اجرا است. | ||
```go | ||
package main | ||
|
||
import "fmt" | ||
|
||
func main() { | ||
sum := 0 | ||
for i := 1; i < 10; i++ { | ||
sum += i | ||
} | ||
|
||
fmt.Println(sum) | ||
} | ||
``` | ||
|
||
```shell | ||
$ go run main.go | ||
45 | ||
``` | ||
|
||
{{< playground url=MIWIFPb4Guc >}} | ||
|
||
### حلقه while | ||
این مدل حلقه تماماً شبیه به رفتار do-while در زبان C را دارد با این تفاوت که پیادهسازی آن، تنها با کلیدواژهی `for` و با حذف بخش مقداردهی و شمارنده حلقه سهبخشی انجام میگیرد. در واقع در این حلقه تنها با تعریف یک شرط کدهای داخل حلقه تا زمان برقراری آن شرط اجرا میشوند. | ||
|
||
```go | ||
package main | ||
|
||
import "fmt" | ||
|
||
func main() { | ||
i := 0 | ||
for i < 10 { | ||
fmt.Println(i) | ||
i++ | ||
} | ||
} | ||
``` | ||
```shell | ||
$ go run main.go | ||
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | ||
6 | ||
7 | ||
8 | ||
9 | ||
``` | ||
|
||
{{< playground url=SX3Cok8QcH8 >}} | ||
|
||
|
||
### حلقه بینهایت | ||
اگر از حلقهی `while` بخش شرط را حذف کنیم چه اتفاقی میافتد؟ در این حالت ما یک شرط بی نهایت ساختهایم (شبیه به while(1)) که تا زمانی که برنامه متوقف نشود و یا کدهای داخل حلقه، فرمان خروج از حلقه را ندهند، چرخه زندگی حلقه ادامه خواهد داشت. | ||
|
||
```go | ||
package main | ||
|
||
import "fmt" | ||
|
||
func main() { | ||
sum := 0 | ||
for { | ||
sum++ | ||
} | ||
|
||
fmt.Println("this line will never execute") | ||
} | ||
``` | ||
|
||
{{< playground url=SmQqVTvoNO4 >}} | ||
|
||
با اجرای کد بالا خطای تایماوت دریافت خواهید کرد، بهدلیل اینکه حلقه هیچگاه پایان نمیپذیرد. | ||
|
||
### کلید واژه break | ||
با استفاده از `break` میتوان چرخهی اجرای یک حلقه را پایان داد. به عنوان مثال در حلقه بینهایت بالا میتوان با تعریف یک شرط خاص از حلقه خارج شد. کد زیر نمونه استفاده از `break` را نمایش میدهد. | ||
|
||
```go | ||
package main | ||
|
||
import "fmt" | ||
|
||
func main() { | ||
sum := 0 | ||
for { | ||
sum++ | ||
if sum == 10 { | ||
break | ||
} | ||
} | ||
|
||
fmt.Println(sum) | ||
fmt.Println("now this line will execute") | ||
} | ||
``` | ||
|
||
```shell | ||
$ go run main.go | ||
10 | ||
now this line will execute | ||
``` | ||
|
||
{{< playground url=IThD0UAK3kE >}} | ||
|
||
|
||
### کلیدواژه continue | ||
این کلیدواژه چرخهی اجرای حلقه را یک مرحله جلو میبرد. به اینمعنی که اگر در حلقه از این کلیدواژه استفاده شود، کدهای بعد از continue اجرا نشده و چرخه بعدی (گام بعدی) اجرا خواهد شد. | ||
|
||
```go | ||
package main | ||
|
||
import "fmt" | ||
|
||
func main() { | ||
|
||
for i := 1; i < 10; i++ { | ||
if i%2 == 0 { | ||
continue | ||
} | ||
fmt.Println(i) | ||
} | ||
} | ||
``` | ||
|
||
```shell | ||
$ go run main.go | ||
1 | ||
3 | ||
5 | ||
7 | ||
9 | ||
``` | ||
|
||
{{< playground url=drg--mcz-Mf >}} | ||
|
||
|
||
{{< hint info >}} | ||
قابل ذکر است که `continue` و `break` در حلقههای تودرتو، فقط روی اولین حلقه درونی تاثیر خواهند گذاشت. | ||
{{< /hint >}} | ||
|
||
## خودآزمون حلقه | ||
{{< tabs "loop_exam" >}} | ||
{{< tab "سوال" >}} | ||
|
||
با استفاده از زبان Go برنامهای بنویسید که سری زیر را ایجاد کند: | ||
```bash | ||
1 | ||
22 | ||
333 | ||
55555 | ||
88888888 | ||
13131313131313131313131313 | ||
212121212121212121212121212121212121212121 | ||
``` | ||
{{< /tab >}} | ||
{{< tab "الگوریتم پاسخ" >}} | ||
- 1 + 0 = 1 | ||
- 1 + 1 = 2 | ||
- 2 + 1 = 3 | ||
- 3 + 2 = 5 | ||
- 5 + 3 = 8 | ||
- 8 + 5 = 13 | ||
- 13 + 8 = 21 | ||
|
||
--- | ||
- a + b = c | ||
- b = a | ||
- a = c | ||
|
||
--- | ||
|
||
|
||
{{< /tab >}} | ||
{{< tab "کد پاسخ" >}} | ||
```go | ||
package main | ||
|
||
import "fmt" | ||
|
||
func main() { | ||
var ( | ||
n = 6 // can define any result count ... | ||
a, b, c = 1, 0, 0 | ||
) | ||
for i := 0; i <= n; i++ { | ||
c = a + b | ||
for j := 1; j <= c; j++ { | ||
fmt.Print(c) | ||
} | ||
fmt.Println() | ||
b, a = a, c | ||
} | ||
} | ||
``` | ||
{{< /tab >}} | ||
{{< /tabs>}} | ||
|