Video Ngôn Ngữ C - 35 - Hàm trả về kiểu void

c
video

(Lê Trần Đạt) #1

#Đăng ký khóa học C++ cơ bản 2016 ( NEW ) tại đây :
#Thông tin về khóa học xem tại đây :

-Sự khác biệt giữa 2 khóa học cũ và mới :
+Khóa học C++ cơ bản 2016 là khóa học mới, được đầu tư nhiều hơn từ nội dung, phương pháp học, cách học hiệu quả.
+Trong khóa học còn có nhiều kiến thức mới như thực hành trên HackerRank, thực hành trên Codefights và Đạt nghĩ mọi người nên học khóa học mới, bởi vì đây là kiến thức mới, phù hợp với hiện tại… Mặt khác âm thanh cũng tốt hơn nhiều so với khóa học cũ giúp đỡ việc lắng nghe và hiểu được tốt hơn.


[Discuss] Anh em chỉnh lại cho đẹp giúp mình!
Tổng hợp các video hướng dẫn lập trình C của Lê Trần Đạt
(Thực tế khắc nghiệt) #2

a ơi bí ở bài tập này rồi :frowning:

 #include <stdio.h>
int so_nguyen_to(int n);
int main()
{
    printf("%s",so_nguyen_to(11));
    return 0;
}
int so_nguyen_to(int n)
{
    if (n==3||n==5||n=7)
        printf("so nay la so nguyen to");
    if (n<2)
        printf("so nay ko phai so nguyen to");
    if (n==2)
        printf("so nay la so nguyen to");
    if (n%2==0)
        printf("so nay ko phai so nguyen to");
    for (int i=3; i*i<=n; i=i+2) {
        if (i%n) printf("so nay ko phai so nguyen to");
        else
            printf("so nay la so nguyen to");
    }
    return 0;

}

(Thực tế khắc nghiệt) #3

Nếu e đổi hàm gọi tính số nguyên tố là void thì cũng bị lỗi! a xem giùm e sai ở đâu với


(Thực tế khắc nghiệt) #4

bài tập tính số hạng thứ n trong dãy Fibonacci! e giải không báo lỗi nhưng nó cung ko ra!

#include <stdio.h>

int day_fibonacci(int n);
int main()
{
    int n;
    scanf("%d",n);
    printf("so hang n trong day fibonacci: %d ",day_fibonacci(n));
    return 0;
}
int day_fibonacci(int n) // cach tinh : 1,2,3,5,8,...vd: 5=3+2;  f1+f2=f3
{
    int giatri_f1=0;
    int giatri_f2=1;
    int giatri_f3;
    for (int i=0;i<n;i++){
        giatri_f3=giatri_f1+giatri_f2; //fibo f3
        giatri_f1=giatri_f2;   //vong lap moi chuan bi: fibo f1 se tro thanh f2
        giatri_f2=giatri_f3;    // fibo f2 se tro thanh f3 de tiep tuc bieu thuc f1+f2=f3
    }
    return giatri_f3;
}

(Thực tế khắc nghiệt) #5

Bài số nguyên tố sau khi mỗi if em đem return để kết thúc thì nếu giá trị đúng e return 0, sai return 1 thì chạy ct no báo “Null”_rỗng. mà e đổi ngược lại thì program bug! ct bị lỗi! hic. a giải thích và sửa giùm e!


(Lê Trần Đạt) #6

Em sai nhiều chỗ

Cái này phải là n == 7 chứ. Mà không cần làm thế đâu :smile:

#include <stdio.h>
int so_nguyen_to(int n);
int main()
{
    printf(": %d",so_nguyen_to(11));
    return 0;
}
int so_nguyen_to(int n)
{
    if (n == 3 || n == 5 || n == 7)
        printf("so nay la so nguyen to");
    if (n<2)
        printf("so nay ko phai so nguyen to");
    if (n==2)
        printf("so nay la so nguyen to");
    if (n%2==0)
        printf("so nay ko phai so nguyen to");
    for (int i=3; i*i<=n; i=i+2)
    {
        if (i%n)
            printf("so nay ko phai so nguyen to");
        else
            printf("so nay la so nguyen to");
    }
    return n;
}

Em phải return n; chứ. Code này anh chỉ sửa lỗi cú pháp. Anh không sửa thuật toán nhé. Về thuật toán thì anh thấy forum khá nhiều bài nói về số nguyên tố. Em dùng tính năng search để tìm thử nhé.

Bài này cũng có rồi, em tìm lại nhé.


(Thực tế khắc nghiệt) #7

@ltd e lên google search điều kiện để thoả mãn số nguyên tố! và e đã tự giải! chứ như a nói thì e lên google kiếm code ngta rồi chạy cũng ok! a có thể yên tâm! điều kiện e đúng! mà a cứ cho là điều kiện e đúng vậy e nhờ a coi giùm e là e sai ở đâu ạ! cảm ơn a


(Thực tế khắc nghiệt) #8

quá trình của e là lên thư viện wiki đọc tìm hiểu về số nguyên tố! nhưng e chỉ hiểu đc 1/2 nghĩa là e tìm ra đc số nguyên tố đầu tiên : 2 3 5 7 sau đó e tìm hiểu được là phải xác định ước! e lại lên google để tìm cách tính ước sau đó e bắt đầu giải từng đk, kế đến e kiểm tra hàm nó báo lỗi, e so sánh code e vs ngta thấy khác mỗi code e dài hơn ngta! cuối cùng e mới lên hỏi a!


(Lê Trần Đạt) #9

Quá tốt :smile: Anh rất mừng vì em đã chọn “learn code the hard way”.

Thực ra anh không rõ cái chỗ i=i+2 trong for (int i=3; i*i<=n; i=i+2) có đúng hay không. Tại anh không nghiên cứu thuật toán tìm số nguyên tố này, anh nghĩ là ++i thì chắc ăn hơn.

Thêm nữa anh nghĩ không cần phải kiểm tra: if (n == 3 || n == 5 || n == 7) bởi vì câu lệnh for đã làm việc đó rồi.

Chuẩn, em đã đi đúng đường rồi đấy. Chậm mà chắc. Trong giải thuật của em thì anh nghĩ là ổn, chỉ cần bỏ cái kiểm tra n == 3,5,7 không cần thiết đi.


(Thực tế khắc nghiệt) #10

a Đạt phần fionacci e thấy số fionacci = 2 số sau + lại! và thuật toán e thấy trên web thì nó khó hiểu và ngay cả diễn đàn mình! e bik là diễn đàn k chỉ có e nên việc e cứ hỏi nhiều chắc a k vui! nhưng mà thực sự! e thấy cách e giải ko sai! e đáp ứng điều kiện nó rồi ! e đã ghi chú cho a ! a đọc giùm e xem coi là sai ở đâu! e sẽ tự khắc phục! tự mò lên khó lắm a!


(Lê Trần Đạt) #11

No, em sai rồi. Một người hay nhiều người hỏi không quan trọng. Cái quan trọng là anh không muốn xảy ra hiện tượng một câu hỏi được trả lời rồi lại bị hỏi thêm một lần nữa :smile: Anh đang hiện thực một cách quản lý nội dung để đảm bảo câu trả lời tốt nhất sẽ được sử dụng nhiều nhất. Thay vì hỏi đi hỏi lại một câu hỏi. Thời gian đầu anh đang cố gắng “làm mẫu” cho mọi người làm theo. Và anh cần những người như em để làm mẫu cho các bạn khác.

Được, anh sẽ xem và giải thích cho em vào sáng mai nhé. Bây giờ là 12h bên này rồi :smiley: Bữa giờ thiếu ngủ. Thấy mọi người hỏi nhiều anh vui, có điều không đủ sức để trả lời hết mọi câu hỏi trong thời gian ngắn nhất thôi.


(Thực tế khắc nghiệt) #12

sức khoẻ là trên hết! good night


(Thực tế khắc nghiệt) #13

e giải được rồi a! đây là bài số nguyên tố :smile:

#include <stdio.h>
int so_nguyen_to(int n);
int main()
{
    int n;
    scanf("%d",&n);
    if (so_nguyen_to(n)==0)
    printf("%d ko phai so nguyen to",n);
    else
    printf("%d la so nguyen to",n);
    return 0;
}
int so_nguyen_to(int n)
{
    if (n<2) return 0;
    if (n==2) return 1;
    if (n%2==0) return 0;
    for (int i=3; i*i<=n; i=i+2) {
        if (i%n) return 0;
         else
            return 1;
    }
    return n;
}

(Lê Trần Đạt) #14

Anh xin góp phần xử lý trong hàm main, mình nên viết như thế này thì nó “logic” hơn.

int main()
{
    int n;
    scanf("%d",&n);
    if (so_nguyen_to(n)) // đọc như sau: nếu là số nguyên tố thì 
      printf("%d la so nguyen to",n);
    else // ngược lại thì
      printf("%d ko phai so nguyen to",n);
    return 0;
}

Lý do tại sao ta có thể viết if (so_nguyen_to(n)) là vì so_nguyen_to sẽ trả về 01. Như ta đã biết trong C thì giá trị 0 tức là sai, khác 0 tức là đúng. Dẫn đến nếu so_nguyen_to trả về 1 có nghĩa là đúng. Khi đó mình chỉ cần ghi thế này là đủ

 if (so_nguyen_to(n))
      printf("%d la so nguyen to",n);
 else // ngược lại thì
      printf("%d ko phai so nguyen to",n);

(Thực tế khắc nghiệt) #15

hnay e tranh thủ làm xong sớm chạy về nhà để giải cho xong! về nhà tự dưng mò xong cái số nguyên tố này rồi bjo mò tới phần fibonacci cũng ok lun! thật chả hiểu! tự dưng khôn ra là sao? phần fibonacci vừa đi làm vừa suy nghĩ thì ra e gán sai!


(Lê Trần Đạt) #16

Không phải tự dưng khôn ra, cũng không phải may mắn. Đó là thành quả của luyện tập mà có.

Off-topic tí: Anh có hay đọc sách báo nước ngoài, có một bài viết nói về may mắn như sau. Khi một vận động viên golf đánh vào một quả golf cực khó thì người bình luận viên đã nói “Thật là may mắn, anh ấy đã thực hiện một cú đánh may mắn chưa từng có”. Nhưng người bình luận viên còn lại nói “May mắn, anh nghĩ đấy là may mắn sao? Tôi cá là nếu anh là người đánh cú đó thì anh sẽ chẳng bao giờ nhận được cái may mắn đấy. Bời vì để đạt được cái may mắn đấy vận động viên kia đã tập luyện hàng ngàn giờ cho những cú đánh tương tự”

Đó là lý do tại sao người ta lại hay nói “thằng đấy nó may mắn nên nó mới làm được”. Nhưng người ta chưa bao giờ chịu tìm hiểu lý do may mắn không tìm đến với họ, họ không hiểu rằng may mắn chỉ đến với người chăm chỉ.


(Dao Trong Bach) #17

Code của Honey_moon cho bài tập Kiểm tra số nguyên tố sai rồi. Em thử 13 hoăc 17 mà kết quả vẫn là “ko phải số nguyên tố”.


(Dao Trong Bach) #18

Em thử code này và kiểm tra thấy ko vấn đề gì. Anh xem có gì sai ko?

#include <stdio.h>
int so_nguyen_to(int n);
int main()
{
    int n;
    while((scanf("%d", &n)) != EOF)
    {
        if (so_nguyen_to(n))
            // gia tri = 0 thi n ko phai so nguyen to
            printf("%d la so nguyen to, gia tri ham tra ve la %d\n",n, so_nguyen_to(n));
        else
            printf("%d khong phai la so nguyen to, gia tri ham tra ve la %d\n",n, so_nguyen_to(n));
    }
    return 0;
}
int so_nguyen_to(int n)
{
    // gia tri = 0 thi n ko phai so nguyen to
    if (n<2) return 0;
    if (n==2) return 1;
    if (n%2==0) return 0;
    int so_luong_uoc =1;
    for (int i=3; i<=n; i=i+2)
    {
        if (n%i==0)
            so_luong_uoc++;
        if (so_luong_uoc > 2)
            return 0;
    }
    return 1;
}

(Lê Trần Đạt) #19

Bài hướng dẫn này đã “lớn tuổi” rồi nên close ở đây.

This topic is now closed. New replies are no longer allowed.


(Lê Trần Đạt) #20

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?