01/10/2018, 09:26

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

chr word[10];
int *ptr,dem=0,i;
printf("
 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

Nguyễn Duy Hùng viết 11:35 ngày 01/10/2018

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

Phạm Văn dũng viết 11:29 ngày 01/10/2018

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

rogp10 viết 11:37 ngày 01/10/2018

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.

Phạm Văn dũng viết 11:40 ngày 01/10/2018

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

Khoa NTA viết 11:35 ngày 01/10/2018

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.

Phạm Văn dũng viết 11:36 ngày 01/10/2018

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 ạ

Nguyễn Duy Hùng viết 11:37 ngày 01/10/2018

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;
}
Phạm Văn dũng viết 11:37 ngày 01/10/2018

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

Nguyễn Duy Hùng viết 11:27 ngày 01/10/2018

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

Phạm Văn dũng viết 11:37 ngày 01/10/2018

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 ạ

Nguyễn Duy Hùng viết 11:34 ngày 01/10/2018

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 =)))

Khoa NTA viết 11:43 ngày 01/10/2018

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
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).

Phạm Văn dũng viết 11:42 ngày 01/10/2018

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 ạ

Khoa NTA viết 11:33 ngày 01/10/2018

À, 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

Bài liên quan
0