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

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.

3 Likes

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;
}

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); )
1 Like

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:

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;
}

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;
}
1 Like

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;
}
1 Like

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!

2 Likes

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

1 Like

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.

2 Likes

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

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

2 Likes

: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:

2 Likes

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ì ạ!

2 Likes

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

1 Like

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

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?