Loop(while, for, do...while) === Intro --- **Loop** is a tool for special purpose, it allows program operating similar instructions repeatly. ex. Counting, Array Traversal, List some information And in general, we have 3 kinds of loop: **while loop**, **for loop** and **do...while** ```c= // Counting // it will print from 0~(n-1) for(int i=0;i<n;i++){ printf("%d ", i); } ``` "while" Loop --- **while** loop is most basic loop, and it usually which contains 3 parts: 1. **Shell** 2. **Checking Statement** 3. **Instructions**. ```c= while(2.Check){ // 1.Shell ... ... Instrunction Instrunction // 3.Instructions Instrunction ... ... } //1.Shell ``` And **while loop** works by 3 steps 1. Check the statement -> if **true**, continue next step -> if **false**, break the while loop 2. Do instructions 3. Go back step 1 ### Practice: #### Collatz conjecture: There is a number **n**, and the rule is: if n is **even**, divide it by 2 if n is **odd**, time it by 3 and plus 1 n finally go back to 1 So, there is a example. Input a number **n**, and please ouput the outcomes of **n** at every step and the step(s) where **n** will go back to **1** according to the rule of **Collatz conjecture**. ex. input: 10 ouput: 5 16 8 4 2 1 6 ```c= #include<stdio.h> int main(){ int n, count = 0; scanf("%d", &n); while(/*Statement*/){ if(/*Statement*/) n /= 2; else n = (3 * n + 1); printf("%d ", n); count++; } printf("\n"); printf("%d\n", count); } ``` :::success Hint: **while loop** is usually used for **UNKNOWN** steps operations. ::: "for" Loop --- **for loop** is a kind of loop based on the **while loop**, in other words, **for loop** can also be implemented by **while loop**. **for loop** contains 5 parts: 1. Shell 2. Initial Declaration 3. Checking Statement 4. Instructions 5. Operation after Intrucitons ```c= for(2.Init;3.Check;4.Oper){ // 1.Shell ... ... Instrunction Instrunction // 5.Instructions Instrunction ... ... } // 1.Shell ``` And **for loop** works by 3 steps 1. Initial Declaration 2. Check the statement -> if **true**, continue next step -> if **false**, break the while loop 3. Do instructions 4. Do operation 5. go back step 2 :::success Hint: **for loop** is used more often than other 2 types of loop, because its convenience for **iterations**, **traversal** and so on. We usually use letter 'i' to be the iteration variable in the for loop, meaning "Iterations", and it became a kind of common sense... So, something you will see very common in **programs** or **projects** is like: ```c= for(int i=0;i<n;i++){ ...blablabla } ``` ::: ### Practice There is a program, 1. Please trace the following code step by step. 2. Please implement same function by using **while loop** 3. Analyze what will happen if we remove "i+=2" ```c= #include<stdio.h> int main(){ int x = 100; for(int i=0;i<10;i+=2, x-=10){ printf("x: %d\n", x); } return 0; } ``` "do...while" Loop --- **do...while** is a kind of variation of **while**, and it is used least among 3 types of **loop**, the only difference between them is that **do...while** checking the statement after instructions. Therefore, Instructions in **do...while** will be executed at least once, however, those in **while** may not. ps. You can test by yourself if you are curious. ex. ```c= // Using do...while int i = 0; do { System.out.println("This will be printed at least once"); i++; } while (i < 3); // Using while int j = 0; while (j < 3) { System.out.println("This may not be printed if the condition is false initially"); j++; } ``` Excercise --- ZeroJudge: 1. [因數分解](https://zerojudge.tw/ShowProblem?problemid=a010) 3. [數字翻轉](https://zerojudge.tw/ShowProblem?problemid=a038) 4. [阿姆斯壯數](https://zerojudge.tw/ShowProblem?problemid=a040) 5. [迴文](https://zerojudge.tw/ShowProblem?problemid=a022) // 需要Array Multi-Level Loop --- We can do something advanced bu using **multi-level loop**. ### 1. Multiplication Table: Generate a multiplication table using nested loops. Allow the user to input the number up to which they want the table. Example: ``` Enter the number for the multiplication table: 5 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 5 10 15 20 25 ``` ### 2. Print a Triangle Pattern: Write a program to print a triangle pattern using nested loops. Example: ``` Enter the height of the triangle: 5 * ** *** **** ***** ``` ### 3. Matrix Transposition: Write a program to transpose a given matrix. The user inputs the number of rows and columns, and then the matrix elements. Example: ``` Enter the number of rows: 3 Enter the number of columns: 2 Enter matrix elements: 1 2 3 4 5 6 Transposed Matrix: 1 2 3 4 5 6 ``` Ans --- ```c= //因數分解 #include<stdio.h> #include<stdbool.h> int main(){ int n, remaining; bool first; scanf("%d", &n); first = true; remaining = n; for(int i=2;i<=n;i++){ int count = 0; while(remaining % i == 0){ remaining /= i; count++; } if(count){ if(first){ first = false; }else{ printf(" * "); } printf("%d", i); if(count >= 2) printf("^%d", count); } } printf("\n"); return 0; } ``` ```c= // Multiplication Table #include<stdio.h> int main(){ int n; scanf("%d", &n); int maxN = n*n; int digits = 0; int tempN = maxN; while(tempN / 10 != 0){ tempN /= 10; digits++; } int space = digits + 1; for(int i=0;i<n;i++){ int start = i+1; for(int j = 0;j<n;j++){ int num = start*(j+1); int digits = 0; int tempN = num; while(tempN / 10 != 0){ tempN /= 10; digits++; } printf("%d", num); for(int k = 0;k<space-digits;k+=1){ printf(" "); } } printf("\n"); } return 0; } // at most t digits // t + 1 space for 1 number ```