Bài tập đếm nguyên âm

chr word[10];
int *ptr,dem=0,i;
printf("\n nhap chu : ");
scanf("%s",word);
ptr=&word[0];
for(i=0 ;i < strlen(word);i++) {
    if ((*ptr='u') || (*ptr='e') || (*ptr='o') || (*ptr='a') || (*ptr='i')	)
        dem++;
    ptr++;
}
printf("chuoi co %d ki tu la nguyen am",dem);

em debug thì vòng lặp chỉ chạy 1 lần rồi thoát khỏi chương trình luôn ai giải thích cho em với

Tại sao lúc thì ptr lúc thì *ptr. Dấu so sánh là == chứ ko phải =

mình định dùng con trỏ để gán ạ dấu = là để gán mà phải k nhỉ

Bạn viết vậy thì nên thay for bằng while(*ptr != 0) luôn là vừa. Vì bạn đâu có truy xuất qua i đâu.

uh đúng mình quên nhưng dùng == vẫn không đúng ?

Vấn đề ở chỗ bạn dùng con trỏ kiểu int để làm việc với mảng kiểu char nên kiểu truy xuất sẽ khác. Với đoạn code test như sau:

#include <stdio.h>
#include <string.h>

int main() {
    char word[10];
    int *ptr, dem=0, i;
    printf("\n nhap chu : ");
    fflush(stdout);
    scanf("%s", word);
    ptr = (int *) &word[0];
    for(i = 0; i < strlen(word); i++) {
        if ((*ptr == 'u') || (*ptr == 'e') || (*ptr == 'o') || (*ptr == 'a') || (*ptr == 'i'))
            dem++;
        printf("| %d ", *ptr);
        ptr++;
    }
    printf("chuoi co %d ki tu la nguyen am", dem);
    return 0;
}

Input:

abcef

Output:

| 1701012065 | 102 | 4195977 | 0 | 0
chuoi co 0 ki tu la nguyen am

Cái cụm số đầu tiên khó hiểu đó chính là mã hex theo thứ tự của “ecba” (0x65 63 62 61) và 102 chính là 0x66 'f'. Nên cẩn thận hơn, kiểu int cần 4 bytes, nên mỗi khi truy xuất thì nó sẽ truy xuất 4 bytes (thay vì 1 bytes như kiểu char).
Giải quyết: con trỏ ptr phải đổi thành kiểu char.

2 Likes

chính xác bạn ơi mình chạy được rồi nhưng làm sao bạn có thể biết dc input và output thế kia v
mà chương trình truy xuất ngược ạ

sao cứ phải dùng char _

#include <iostream>

using namespace std;
int countVowels(string str){
    int c = 0;
    string vowels = "euoai";
    for(auto i : str){
        if(vowels.find(i) != string::npos){
            c++;
        }
    }
    return c;
}
int main()
{
    string str = "";
    cout<<"Nhap vao chuoi: ";
    cin>>str;
    cout<<countVowels(str)<<endl;
    return 0;
}

em chưa có học c++ :frowning:

:v nó cũng từa tựa nhau ý mà, sau này quay lại tìm hiểu kỹ hơn về con trỏ của C.

e thấy h như c là ngôn ngữ cổ và không mạnh em có nên học để hiểu sâu về c không ạ
hay e nên bắt đầu học c++ luôn ạ

:smile: cổ thì không cổ đâu tại mình thấy nó cập nhật sửa đổi các chuẩn nhiều lắm chuẩn mới nhất của C hình như là 2011 còn c++ là sắp tới có C++17 hay sao ấy. Học 2 thằng này có cái là phải tự làm mọi thứ các thuật toán, cấu trúc dữ liệu v.v @.@ C++ thì có vẻ dễ chịu hơn một chút, hỗ trợ OOP cũng tốt hơn. Nếu mà e theo CNTT thì sớm muộn cũng đụng cái thằng củ chuối OOP này đánh rớt biết bao nhiều sanh mạng =)))

2 Likes

Input: do mình chọn ra thôi.
Output: Bạn để ý dòng printf("| %d ", *ptr); của mình. Chỗ đó là in giá trị của con trỏ, giá trị kiểu int nên in ra 4 bytes :smile:
Còn mấy cái còn lại là do suy luận ra thôi. (Biết 1 chút python sẽ làm việc debug dễ dàng hơn).

2 Likes

tại sao biết 1 chút về python lại có thể debug dễ dàng hơn a nói kĩ hơn để e hiểu rõ hơn dc k ạ

À, thì dễ kiểm nghiệm xem nó có đúng là 4 bytes theo thứ “ecba” không đó mà. Code trên Python cho code ngắn hơn, dễ đọc hơn. Python có thể làm tốt công việc làm mã giả cho C hay ngôn ngữ khác :joy:

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