Skip to content

Commit

Permalink
Fixed conflict
Browse files Browse the repository at this point in the history
  • Loading branch information
mahdimehrabi committed Dec 13, 2022
2 parents 195783f + 1dfb03e commit 340c847
Showing 1 changed file with 221 additions and 0 deletions.
221 changes: 221 additions & 0 deletions content/chapter 1/1.11-for.md
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>}}

0 comments on commit 340c847

Please sign in to comment.