Tham dự Tech Lounge

Tham dự Tech Lounge


5: Cấu trúc điều khiển

iThanh
1/7/2013 4:11Phản hồi: 26
Bài 5: Cấu trúc điều khiển

Cấu trúc điêu khiển là gì?
Cấu trúc điều khiển là một đoạn mã (khối mã) có chức năng điều khiển việc thực thi mã trong khối lệnh đó sao cho phù hợp với điều kiện được đặt ra, hoặc tuần tự theo một trật tự nhất định. (Đó là định nghĩa tự hiểu của mình, nói dân gian cho dễ hiểu)

Khối lệnh là gì?
Khối lệnh là một tập hợp nhiều lệnh với nhau.
Mỗi lệnh được ngăn cách với nhau bằng dấu chấm phẩy (; )
Ngăn cách này chỉ đơn giản là chỉ cho ngôn ngữ biết rằng, đã kết thúc 1 câu lệnh và có thể chuyển qua câu lệnh mới.

1. Câu lệnh rẽ nhánh - if else.
Câu lệnh if có 2 phần, phần điều kiện và phần câu lệnh thực thi.
Cấu trúc câu lệnh đơn, chỉ có if:

Code:
if (<#condition#>) {
    <#statements#>
}
Ở câu lệnh đơn này, statements chỉ thực hiện khi điều kiện là condition đúng.
Ví dụ: Nếu tôi là học sinh giỏi thì mẹ tôi cho tôi đi du lịch.
Nếu viết một cách "lập trình hoá" thì sẽ như sau:

Code:
if (<#Tôi là học sinh giỏi#>) {
    <#Mẹ tôi cho tôi đi du lịch#>
}
Ở đây thật đơn giản để thiểu, bạn được học sinh giỏi thì mới được đi du lịch đúng không? Và ngược lại thì không được đi du lịch.

Phần điều kiện có thể là kết quả của một toán tử, một hàm, ...
Ví dụ: Nếu điểm thi của tôi lớn hơn hoặc bằng 8 tôi là học sinh giỏi.

Code:
if (<#Điểm thi >= 8#>) {
    <#Tôi là học sinh giỏi#>
}
Ở đây, bạn sẽ thấy rằng, Điểm thi có thể là một toán tử, bằng cách: điểm thi được trung bình cộng của nhiều con điểm khác với nhau. Phép so sánh ở đây, chúng ta dùng toán tử quan hệ để so sánh, bạn nhé (đã biết ở bài 4).
Ngoài ra, ngôn ngữ Objective-C còn cung cấp cho lập trình viên rẽ nhánh nếu điều kiện sai.

Quảng cáo


Code:
if (<#condition#>) {
    <#statements-if-true#>
} else {
    <#statements-if-false#>
}
Đến đây chắc bạn cũng hiểu, câu lệnh if-true chỉ thực thi khi điều kiện đúng. Câu lệnh if-false chỉ thực hiện khi điều kiện sai.
Ví dụ đối với trường hợp đi du lịch:

Code:
if (<#Tôi là học sinh giỏi#>) {
    <#Mẹ tôi cho tôi đi du lịch#>
} else {
    <#Mẹ tôi mua cho tôi một cây guitar mới#>
}
Ở đây bạn chỉ có thể, 1 là được đi du lịch, 2 là được mua guitar. Không bao giờ xảy ra 2 việc cùng lúc.
Hoặc đối với trường hợp điểm thi:

Code:
if (<#Điểm thi >= 8#>) {
    <#Tôi là học sinh giỏi#>
} else {
    <#Tôi có thể là học sinh khá, hoặc học sinh trùng bình, hoặc học sinh yếu#>
}
Đến đây sẽ phát sinh thêm về việc làm sao biết rõ học sinh đó yếu hay trung bình hay khá.
Thật dễ, bạn chỉ cần lồng các câu lệnh if trong câu lệnh if như sau:

Code:
if (<#Điểm thi >= 8#>) { // Lúc này điểm thi lớn hơn hoặc bằng 8
    <#Tôi là học sinh giỏi#>
} else { // Lúc này điểm thi đã nhỏ hơn 8
if (<#Điểm thi >= 6#>) { // Lúc này điểm thi lớn hơn bằng 6 nhưng lại nhỏ hơn 8
    <#Tôi là học sinh trung bình#>
} else { // Lúc này điểm thi nhỏ hơn 6
    <#Tôi là học sinh trung bình hoặc học sinh yếu#>
}
}


2. Rẽ nhánh switch case:

Quảng cáo


Cú pháp:

Code:
switch (<#expression#>) {
    case <#constant#>:
        <#statements#>
        break;
    default:
        break;
}
Tại sao lại sinh ra câu lệnh này. Như bạn thấy rằng ở ví dụ điểm thi, ta xét học sinh trung bình, học sinh yếu, khi đó sẽ mất nhiều thời gian để viết mã. Do đó, hàm này được sinh ra để giảm bớt thời gian lập trình. Giúp cho lập trình viên rõ ràng hơn trong việc nhìn đoạn mã, sẽ không rối, không có nhiều khối lệnh như câu lệnh if.
Cũng là ví dụ học sinh gỏi cho đến học sinh yếu, mình viết lại bằng câu lệnh switch như sau:

Code:
int DiemThi = 8;
switch (DiemThi) {
    case 8: case 9: case 10:
        NSLog(@"Học sinh Giỏi");
        break;
    case 6: case 7:
        NSLog(@"Học sinh Khá");
        break;
    case 4: case 5:
        NSLog(@"Học sinh Trung bình");
        break;
    case 0: case 1: case 2: case 3:
        NSLog(@"Học sinh Trung bình");
        break;
}
Đơn giản là, cứ đến đúng giá trị nào thích hợp, đoạn mã sẽ dừng lại ở đó và thực thi câu lệnh bên trong điều kiện đúng.
Lưu ý: kết thúc 1 điều kiện hoặc nhóm điều kiện phải có "break". Nếu không có break, đoạn mã sẽ chạy tuột luột từ trên xuống dưới luôn đó bạn. Điều này bạn có thể thử ngay lập tức.

3. Vòng lặp for:
Mình lấy ví dụ thế này: khi bạn muốn đi từ tầng 1, lên đến tầng 3, bạn phải bước từng bước theo từng bậc cầu thang. Đó là cách đơn giản nhất, đúng không bạn. Vậy thì ta phải suy nghĩ và đưa ra giải thuật tốt nhất để bước. Và giải thuật đó là tạo ra 1 vòng lặp, vòng lặp sẽ bắt ta bước từ bậc thang đầu tiên đến bậc thang cuối cùng. Đó là vòng lặp for.
Cấu trúc:

Code:
for (<#initialization#>; <#condition#>; <#increment#>) {
    <#statements#>
}
initialization: khởi tạo một biến, biến này sẽ định vị trí mà vòng lặp vừa đi qua.
condition: điều kiện của biến vị trí vừa tạo. Nghĩa là giới hạn số lần chạy.
increment: sự tăng hoặc giảm của biến vị trí.
statements: lệnh thực thi ở mỗi lần dừng lại của biến vị trí.

Mình lấy ví dụ, các bạn sẽ hiểu ngay, như sau: Cộng tổng các số từ 1 đến 5
Làm bằng tay: a = 1 + 2 + 3 + 4 + 5 = 15
Còn nếu bằng máy, trừ trường hợp bạn viết rõ ràng như vậy, và dùng toán tử cộng để cộng thì sẽ được.
Còn nếu sử dụng vòng lặp để làm điều này, sẽ cực kỳ đơn giản.

Code:
int Tong = 0; // Khởi tạo biến Tong (Tổng) để chứa giá trị được cộng vào và gán cho nó giá trị ban đầu bằng 0
for (int i = 1; i < 6; i++) {
    // Khởi chạy vòng for từ i = 1 đến i = 5 (i < 6)
    Tong = Tong + i;
    // Khi chạy đến i = 1, Tong = 0 + 1 = 1
    // Khi chạy đến i = 2, Tong = 1 + 2 = 3
    // Khi chạy đến i = 3, Tong = 3 + 3 = 6
    // Khi chạy đến i = 4, Tong = 6 + 4 = 10
    // Khi chạy đến i = 5, Tong = 10 + 5 = 15
}
    // Khi chạy đến i = 5 vòng lặp tự động thoát, vì mình ràng buộc nó chạy đến vị trí khi i < 6.
    // Lưu ý: ràng buộc i < 6, nghĩa là i sẽ chạy đến vị trí gần nhất với 6, chứ không dùng ở 4 hoặc 3.
NSLog(@"Tong: %i", Tong);

Sau này, khi làm quen thêm với các bài nâng cao, bạn sẽ hiểu thêm và vẫn dụng rõ hơn về hàm này.

4. Vòng lặp while:
Đây cũng là một loại vòng lặp, lặp đi lặp lại để thực hiện câu lệnh khi điều kiện vãn còn thoả mãn.
Cũng bài toán tính tổng từ 1 đến 5, như trên, mình có thể giải bằng vòng lặp while như sau:

Code:
int Tong = 0;
int i = 0;
// Khi bắt đầu chạy lần thứ nhất, Tong = 0 và i = 0
while (i < 5) {
    i = i + 1; // Hoặc i++;
    Tong = Tong + i;
    // Khi chạy lần thứ 1 -> i = 1, Tong = 0 + 1 = 1; i < 5
    // Khi chạy lần thứ 2 -> i = 2, Tong = 1 + 2 = 3; i < 5
    // Khi chạy lần thứ 3 -> i = 3, Tong = 3 + 3 = 6; i < 5
    // Khi chạy lần thứ 4 -> i = 4, Tong = 6 + 4 = 10; i < 5
    // Khi chạy lần thứ 5 -> i = 5, Tong = 10 + 5 = 15; i = 5
}
// Khi chạy lần thứ 6 -> i = 6, i > 5, nên vòng lặp tự dùng lại.
NSLog(@"Tong: %i", Tong);

Có nghĩa là khi mà điều kiện còn thoả mãn thì vòng lặp còn chạy.
Lưu ý: Vòng lặp sẽ kiển tra điều kiện trước khi thực hiện câu lệnh bên trong vòng lặp.

5. Vòng lặp do-while:
Cũng tương tự như vòng lặp while.
Nhưng khác 1 chỗ là vòng lặp này sẽ chạy 1 lần trước khi kiển tra điều kiện.
Bạn lưu ý ở điểm này để sử dụng sao cho đúng vòng lặp vào thuật toán của mình, tránh việc xảy ra vòng lặp vô hạn dẫn đến treo máy. Nói thì chủ quan chứ trong lúc giải thuật sẽ bị rất nhiều đấy bạn.
Cũng với bài toán tính tổng từ 1 đến 5, mình sẽ giải bằng vòng lặp do-while như sau:

Code:
int Tong = 0;
int i = 0;
do {
    i++;
    Tong = Tong + i;
} while (i < 5);
NSLog(@"Tong: %i", Tong);

6. Bài tập:
1. Tính tổng các số từ 1 đến 100.

2. Tính tổng các số chẵn từ 1 đến 250.

3. Tính tổng các số lẻ chia hết cho 3 từ 0 đến 1500.

4. Bài toán dân gian cho bạn:
Vừa gà, vừa chó
Bó lại cho tròn
Ba mươi sáu con
Một trăm chân chẵn.
Hỏi có bao nhiêu con gà, bao nhiêu con chó.

5. An và Bình là hai anh em. Tuổi của An gấp 3 lần tuổi của Bình. Tổng số tuổi của An và Bình là 12.
Hỏi An bao nhiêu tuổi?
Hỏi Bình bao nhiêu tuổi?
Code:
Bài giải mình sẽ đăng tải sau, nếu bạn chưa có bài giải xác đáng.


Chúc các bạn có những bài giải sáng tạo, đăng lên đây cho bạn bè cùng thảo luận, bạn nhé.
Và ghi nhớ những lưu ý mà mình có nói trong từng cấu trúc điều khiển.
26 bình luận
Chia sẻ

Xu hướng

vi_tieu_bao
ĐẠI BÀNG
11 năm
thanks a hi vọng những bài viết hay nữa của a
iThanh
ĐẠI BÀNG
11 năm
Mình nhận được Mail trả lời về đoạn code if.
Đó là đoạn mà mình hướng dẫn về cấu trúc. Chứ không phải là đoạn đã được lập trình.

Mình chờ các bài giải từ các bạn, để biết được các bạn có sự hợp tác và theo dõi đến đâu trong quá trình mình viết bài chia sẻ. Sẽ tốt hơn cho mình trong việc điều chỉnh các thức trình bày hướng dẫn cũng như đẩy nhanh tiến độ.

Mong nhận được sự hợp tác từ các bạn.
Hèn j code chạy báo lỗi
vi_tieu_bao
ĐẠI BÀNG
11 năm
Exercise 1:

+ Use “FOR”:

#import <Foundation/Foundation.h>

int main(int argc, constchar * argv[])
{

@autoreleasepool {

int Tong = 0;
int i;

for (i = 1; i <= 100; i++){
Tong = Tong + i;
}
NSLog(@"Tong tu 1 den 100 la: %i", Tong);

};
return 0;
}

+ Use “WHILE”:

#import <Foundation/Foundation.h>

int main(int argc, constchar * argv[])
{

@autoreleasepool {

int Tong = 0;
int i = 0;

while(i <100){
i++;
Tong = Tong + i;
}
NSLog(@"Tong tu 1 den 100 la: %i", Tong);

};
return 0;
}

+ Use “FOR”:

#import <Foundation/Foundation.h>

int main(int argc, constchar * argv[])
{

@autoreleasepool {

int Tong = 0;
int i = 0;

do {
i++;
Tong = Tong + i;
}
while(i < 100);

NSLog(@"Tong tu 1 den 100 la: %i", Tong);

};
return 0;

}
vi_tieu_bao
ĐẠI BÀNG
11 năm
iThanh ơi có 1 chỗ mình muốn hỏi là như trong bài 1 thì nếu dùng FOR thì điều kiện chỗ mình có gạch chân bôi đậm là i <= 100, còn dùng WHILE và DO - WHILE thì điều kiện phải là i < 100, thì đáp số mới đúng?
iThanh có thể nói thêm về chỗ này không?

Thanks
vi_tieu_bao
ĐẠI BÀNG
11 năm
Bài 2 này tương tự bài 1 nên mình ko làm cả 3 cách nữa ^^

Exercise 2:

#import <Foundation/Foundation.h>

int main(int argc, constchar * argv[])
{

@autoreleasepool {

int Tong = 0;
int i;

for( i = 0; i <= 250; i = i + 2){
Tong = Tong + i;
}
NSLog(@"Tong cac so chan tu 1 den 250 la: %i", Tong);

};
return 0;
}
iThanh
ĐẠI BÀNG
11 năm
Bạn có thể đọc kỹ về lý thuyết. Đặc biệt là những phần ghi chú thêm sau mỗi lần chạy.
Còn for, là chạy từ số a đến số b.
Thì bạn cho a = 1, b = 101
Lúc đó sẽ như thế này: for (i = 1; i < 101; i++)

Nói chung thì bạn có thể làm thế nào cũng được, miễn sao kết quả đúng và cách viết của bạn ngắn gọn nhất, diễn thuật dễ hiểu nhất.
Bài toán là tĩnh, cách giải là động mà.
vi_tieu_bao
ĐẠI BÀNG
11 năm
int Tong = 0;
int i = 0;
// Khi bắt đầu chạy lần thứ nhất, Tong = 0 và i = 0
while (i < 5) {
i = i + 1; // Hoặc i++;
Tong = Tong + i;
// Khi chạy lần thứ 1 -> i = 1, Tong = 0 + 1 = 1; i < 5
// Khi chạy lần thứ 2 -> i = 2, Tong = 1 + 2 = 3; i < 5
// Khi chạy lần thứ 3 -> i = 3, Tong = 3 + 3 = 6; i < 5
// Khi chạy lần thứ 4 -> i = 4, Tong = 6 + 4 = 10; i < 5
// Khi chạy lần thứ 5 -> i = 5, Tong = 10 + 5 = 15; i < 5
}
// Khi chạy lần thứ 6 -> i = 6, i > 5, nên vòng lặp tự dùng lại.
NSLog(@"Tong: %i", Tong);

Có nghĩa là khi mà điều kiện còn thoả mãn thì vòng lặp còn chạy.
Lưu ý: Vòng lặp sẽ kiển tra điều kiện trước khi thực hiện câu lệnh bên trong vòng lặp.

iThanh cho mình hỏi 1 cái nữa là chỗ gạch chân bôi đậm là i = 5 xong rùi suy ra i<5 nên điều kiện thỏa thì có bị mâu thuẫn ko?

iThanh giải thích với nhé?

Thanks
iThanh
ĐẠI BÀNG
11 năm
Mình xin lỗi, mình không ghi rõ ràng hơn ở việc so sánh giá trị của i sau mỗi lần chạy.
Mình nói lại thế này:

Trong cấu trúc while, điều kiện sẽ được xét trước. Không biết chạy bao nhiêu lần (tuỳ theo điều kiện).
Vì ở đây mình đặt i bàn đầu bằng 0, thì lần chạy khi i = 4, Tong = 6 + 4 = 10; i < 5.
Lần chạy i = 5 lúc đó giá trị của i vẫn chưa được cộng vào (vì mới bước vào vòng lặp, i được xét ngay là i = 4), khi vào vòng lặp, i mới được cộng thêm, cho nên sau khi thực hiện xong phép cộng Tong ở i = 5, lúc đó quay trở lại vòng lặp, i mới được tính là i = 5.

Mình sửa lại chỗ đó là:
// Khi chạy ln thứ 5 -> i = 5, Tong = 10 + 5 = 15; i = 5
để các bạn dễ hiểu 😁

Cảm ơn bạn vi_tieu_bao.
vi_tieu_bao
ĐẠI BÀNG
11 năm
hix 3 câu cuối khó quá ah. chắc nhờ iThanh post bài giải quá hix
iThanh
ĐẠI BÀNG
11 năm
// Bài tập 3:
Code:
int Tong = 0;
        for (int i = 1; i < 1501; i++) {
            if (i == 1 || i % 2 != 0) { // Kiểm tra số lẻ
                if (i % 3 == 0) { // Kiểm tra chia hết cho 3
                    Tong = Tong + i;
                }
            }
        }
// Bài tập 4:
// Theo lập luận thông thường. Gọi số con gà là x, số con chó là y. Lúc này ta có x + y = 36 và 2x + 4y = 100 (hoặc x + 2y = 50).
// Lấy 36 là tổng số cần tìm (số lớn nhất có thể để chạy vòng lặp)
// Ta có bài giải như sau:
Code:
int x = 0;
        int y = 0;
        for (x = 1; x < 36; x++) {
            for (y = 1; y < 36; y++) {
                if ((2*x + 4*y) == 100 && (x + y) == 36) {
                    NSLog(@"Ga: %i - Cho: %i", x, y);
                }
            }
        }

// Còn bài 5, các bạn giải tương tự nhé.
@iThanh Bác xem giùm em code của em đc chưa ak. Thanks bác.

Code:
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
      
        // Bài 1
          int tong=0;
        for(int i=1; i<=100; i++){
            tong+=i;
        }
        NSLog(@"\n\tBài 1: \n\tTổng từ 1 đến 100: %i",tong);

        //Bài 2
        int tong2=0;
        for(int i=0; i<=250; i++){
            tong2+=i;
        }
        NSLog(@"\n\tBài 2: Tổng số chẵn từ 1 đến 250 là: %i", tong2);
       
        //Bài 3
        int k=0, tong3=0;
        while(k<=1500){
            k++;
            if(k%3==0 && k%2!=0){
                tong3+=k;
            }
        }
        NSLog(@"\n\tBài 3: Tổng số lẻ chia hết 3 nhỏ hơn 1500 là: %d",tong3);
   
        //Bài 4
        int x=0,y=0;
        for(x=1;x<36;x++)
            for(y=1;y<36;y++)
                if((x+y)==36 && (2*x+4*y)==100 ){
                    NSLog(@"\n\tBài 4: Số gà: %i \n\t\tSố chó: %i", x,y);
                }
       
        //Bài 5
        int a=0,b=0,an=0,binh=0;
        while(a<12 && b<12){
            a++; b++;
            if((a=3*b) && ((a+b)==12)){
                an=a; binh=b;
            }
        }
        NSLog(@"\n\tBài 5: Tuổi của An: %d \n\t\tTuổi của Bình: %d", an, binh);
   
    }
    return 0;
}
vi_tieu_bao
ĐẠI BÀNG
11 năm
He, post luôn bài 5

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

@autoreleasepool {

int An = 0;
int Binh = 0;

for (An = 0; An < 12; An++) {
for (Binh = 0; Binh < 12; Binh++) {
if (An == Binh * 3 && An + Binh == 12) {
NSLog(@"Tuoi An la: %i, tuoi Binh la: %i", An, Binh);
}
}
};

};
return 0;


}
// --------------TUAN 5--------------

// cau 1
int TONG1 = 0;
for (int i = 1; i <= 100; i++)
{
TONG1+=i;
}
NSLog(@"TONG LA: %i",TONG1);

// cau 2
int TONG2 = 0;
for (int i = 1; i<=250; i++)
{
if (i%2==0)
{
TONG2+=i;
}
}
NSLog(@"TONG SO CHAN LA: %i",TONG2);

// cau 3
int TONG3 = 0;
for (int i = 1; i<=1500; i++)
{
if (i%3==0)
{
TONG3+=i;
}
}
NSLog(@"TONG SO LE CHIA HET CHO 3 LA: %i",TONG3);

// cau 4
int y=0;
for (int x=1; x<=36; x++)
{
y=36-x;
if (x*2+y*4==100)
{
NSLog(@"KET QUA LA: x=%i, y=%i",x,y);
}
}

// cau 5
int b=0;
for (int a=1; a<=12; a++)
{
b=12-a;
if (a/b==3)
{
NSLog(@"AN %i tuoi, BINH %i tuoi",a,b);
}

}
iThanh
ĐẠI BÀNG
11 năm
Bạn tuanhsu10, bạn nên đưa vào [*CODE*] cho mọi người dễ nhìn.
123songroi
ĐẠI BÀNG
11 năm
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

@autoreleasepool {
int i,tong;

for(i=0;i<1501;i++)

{
if(i%2==0){
if(i%3==0){
tong +=i;}

}}
// insert code here...
NSLog(@"%i",tong);

}
return 0;
}
bài 3 như thế này đúng chưa kết quả là 188250;
thanhtv1505
ĐẠI BÀNG
11 năm
// exam 1. Tính tổng các số từ 1 đến 100.
int Tong = 1;
for (int i = 0; i < 100; i++) {
Tong += i;
}
NSLog(@"Tổng 1 -> 100 = %i", Tong);

// exam 2. Tính tổng các số chẵn từ 1 đến 250.
int TongSoChan = 0;
for (int j = 0; j <= 250; j += 2) {
TongSoChan += j;
}
NSLog(@"Tổng chẵn 1 -> 250 = %i", TongSoChan);

// exam 3. Tính tổng các số lẻ chia hết cho 3 từ 0 đến 1500.
int TongSoLe = 0;
for (int k = 0; k <= 1500; k ++) {
if (k % 3 == 0) {
TongSoLe += k;
}
}
NSLog(@"Số lẻ chia hết cho 3: %i", TongSoLe);

//4. Bài toán dân gian cho bạn:
// Vừa gà, vừa chó
// Bó lại cho tròn
// Ba mươi sáu con
// Một trăm chân chẵn.
// Hỏi có bao nhiêu con gà, bao nhiêu con chó.
int cho = 0;
int ga;
do {
cho ++;
ga = 36 - cho;
} while ((cho*4 + ga*2) < 100);
NSLog(@"Gà: %icon; Chó: %icon", ga, cho);

// 5. An và Bình là hai anh em.
// Tuổi của An gấp 3 lần tuổi của Bình.
// Tổng số tuổi của An và Bình là 12.
// Hỏi An bao nhiêu tuổi?
// Hỏi Bình bao nhiêu tuổi?
int binh = 1;
int an;
do {
binh ++;
an = binh * 3;
} while (an + binh < 12);

NSLog(@"An: %it; Bình: %it;", an, binh);
@thanhtv1505

Bác ơi, bài 5 vì sao while không phải là (an + binh == 12) ?

Xu hướng

Bài mới









  • Chịu trách nhiệm nội dung: Trần Mạnh Hiệp
  • © 2024 Công ty Cổ phần MXH Tinh Tế
  • Địa chỉ: Số 70 Bà Huyện Thanh Quan, P. Võ Thị Sáu, Quận 3, TPHCM
  • Số điện thoại: 02822460095
  • MST: 0313255119
  • Giấy phép thiết lập MXH số 11/GP-BTTTT, Ký ngày: 08/01/2019