Video Ngôn Ngữ C - 27 - Viết chương trình đếm ký tự

c
video

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

Source code:

#include <stdio.h>

int main()
{
    long nc;
    nc = 0;
    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%ld\n", nc);
    return 0;
}

#Đă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.


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 Đạt ơi giải thích giùm e tại sao code trên ra đúng mà code dưới lại ra sai! và cho e bik cách hoặt động ạ!

#include <stdio.h>
void main()
{
   int i,c,dong;
    dong=0;
    for(i=0; ((c=getchar())!=EOF); i++)
        if(c=='\n')
            dong++;
    printf("dong: %d",dong);
    return 0;
}
#include <stdio.h>
void main()
{
   int c,dong;
    for(dong=0; ((c=getchar())!=EOF); dong++)
        if(c=='\n')
    printf("dong: %d",dong);
    return 0;
}

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

Vì ở trên em đếm số dòng sau khi em tìm thấy ký tự xuống dòng \n.

if(c=='\n')
    dong++;

Còn ở dưới thì không.

Bổ sung: Em không cần phải khai báo i chỗ này, vì em không dùng i.

 for(i=0; ((c=getchar())!=EOF); i++)

Có thể viết như sau

 for(; ((c=getchar())!=EOF); )

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

vậy là 3 cái điều kiện đó có thể bỏ trống! giờ e mới biết! ặc! cảm ơn a! :smile:


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

Bài Tập 3: in 1 dữ liệu ra màn hình không có khoảng trắng từ 1 chuỗi bên trong có 1 khoảng trắng ( ví dụ Le Tran Dat -> LeTranDat )
e mò lâu lắm rồi! trên google thì là có cái hàm strlen gì đó! vậy bài này hỏi ngu nhờ a Đạt code theo 2 cách là dùng ham strlen và ko dùng! e cảm ơn!

#include<stdio.h>
int main()
{
    char c;
    char ten[20]="";
    printf("nhap ten va ket thuc bang enter\n");
    int i=0;
    for(;c!='\n';i++){
        c=getchar();
    
    if (c!='\ ')
        ten[i]=ten[i-1];
    else
        ten[i]=c;
        break;
    }
    printf("xin chao %s\n",ten);
    return 0;
}

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

Ui, bài này sai quá chừng sai luôn. Em thử làm theo cái video này để sắp xếp lại code đi. Em sẽ thấy code em sai cho mà xem.

Code em hiện giờ như thế này, không thể chạy được đâu.

#include<stdio.h>
int main()
{
    char c;
    char ten[20]="";
    printf("nhap ten va ket thuc bang enter\n");
    int i=0;
    for(; c!='\n'; i++)
    {
        c=getchar();

        if (c!='\ ')
                ten[i]=ten[i-1];
                else
                ten[i]=c;
                break;
            }
                printf("xin chao %s\n",ten);
                return 0;
            }

Nhìn code thế này thì chắc chắn là bị sai lỗi “cú pháp” chứ không phải lỗi “logic” nữa rồi Mít ơi.

Lỗi thế này là do em viết c!='\ ') Sửa lại

#include<stdio.h>
int main()
{
    char c;
    char ten[20]="";
    printf("nhap ten va ket thuc bang enter\n");
    int i=0;
    for(; c!='\n'; i++)
    {
        c=getchar();

        if (c!=' ')
            ten[i]=ten[i-1];
        else
            ten[i]=c;
        break;
    }
    printf("xin chao %s\n",ten);
    return 0;
}

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

Bài này có thể làm như sau. Em nghiên cứu code chỗ nào không hiểu thì hỏi nhé.

#include<stdio.h>
int main()
{
    char c;
    char ten[20]="";
    printf("nhap ten va ket thuc bang enter\n");
    int i=0;
    while((c = getchar()) != '\n') // trong khi c khac \n
    {
        if (c != ' ') // neu c khac ' '
            ten[i++] = c; // nhap c vao mang
        if (i == 19) // neu nhap duoc 19 ky tu roi thi thoat vi mang co 20 ky tu thoi
            break;
    }
    ten[i] = 0; // ket thuc chuoi
    printf("xin chao %s\n",ten);
    return 0;
}

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

Qua bài trả lời của a! e rút ra rằng e hiểu sai dấu != nghĩa là “phải bằng” mà nghĩa đúng của nó là “khác với” . 1 điểm nữa sau khi xem lại clip của anh là hàm getchar() em hiểu thêm là không phải nhập hết 1 chuỗi các ký tự, mà là nó có thể lấy được cả khoảng trắng rồi truyền từng giá trị của chuỗi vào biến! cảm ơn anh! cứ mỗi lần giải ko ra thì nhức đầu nhưng mà khi ra rồi thì hiểu chi tiết luôn!


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

Anh đọc là “khác bằng”


(BaoLe) #10

Về bản chất thì vòng lặp forwhile là tương đương với nhau.Cụ thể:

  • Khi dùng vòng lặp for tuân theo cú pháp:
for(biểu thức 1;biểu thức 2;biểu thức 3)
                statemen;
-Thế thì khi dùng While thì ta lại tuân theo cú pháp:
biểu thức 1;
while(biểu thức 2)
{
biểu thức 3;
statement;
}

Nhưng tùy trường hợp cụ thể mà ta có cách dùng thích hợp, thường mà nếu biết số lần lặp thì dùng for còn chưa biết số lần lặp thì dùng while.


(Light Way) #11

hóng phần ++nc và nc++ của a Đạt lắm đấy :wink:


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

Oh, có phải em nói tới cái này


(Light Way) #13

:smile: e chưa coi tới clip này nữa, thôi note lại v, mốt coi tự nhiên nhớ lại bài chắc nhớ lâu hơn kiến thức này :smiley:


(Dương Nguyễn Văn) #14

Dạ thưa anh. em đã code theo anh nhưng k ra được kết quả trên video :

#include <stdio.h>
/* count characters in input; 1st version */
main()
{
    long nc;
    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);
}

Khi em nhap kí tự rồi enter nó k báo là có bao nhiêu kí tự cả. em nhập ^z rồi enter cũng k báo gì ạ!


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

Em phải nhập chuỗi, enter trước 1 cái, rồi ^z, rồi enter lần nữa.


(Cao Cảnh Linh) #16

cho em hỏi là cách viết chương trình đếm số kí tự lặp lại ạ


(Người bí ẩn) #17

Cho nhập 1 chuỗi.
Dùng vòng lặp mẹ duyệt chuỗi đó, trong mỗi lần lặp dùng vòng lặp con thứ 1 duyệt về trước xem có ký tự nào trùng với ký tự đang xét không, nếu không thì tạo 1 vòng lặp con thứ 2 duyệt về sau, nếu có ký tự nào trùng thì tăng biến đếm lên, còn nếu duyệt về trước mà có ký tự trùng thì bỏ qua bằng lệnh continue. Kết quả vừa tìm xuất ra màn hình luôn. Như thế là đã đếm được số lần lặp lại của các ký tự trong 1 chuỗi, vượt qua yêu cầu của đề bài rồi nhé :smile:


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