Hỏi về các hàm issupper, islower trong C

Mình có 2 đoạn code C sau, mục đích là chuyển hết các kí tự thường thành hoa và các âm tiết cách nhau bởi dấu cách, mình code cả hai đoạn nhưng không hiểu sao khi nộp lên coderforces thì code 1 bị error trong khi code 2 thì không. theo mình hiểu thì 2 đoạn code này tương đương với nhau, Mình có tìm đọc một lúc về mấy cái hàm issupper, islower … cũng chưa giải quyết vấn đề gì cả
code 1

#include<stdio.h>
#include<ctype.h>
int main()
{
    char s[151],p[151];
    gets(s);
    int i,n = 1,k=0;
    int length = strlen(s);
    for(i = 0;i < length ;i++) {
        if(isupper(s[i]))
        {   p[k]=s[i];
            k++;
            n=0;

        }
        else if(islower(s[i]))
        {
            p[k]=toupper(s[i]);
            k++;
            n=0;

        }
        else if(n == 0)
        {
            n++;
            p[k]=' ';
            k++;
        }
    }
    if ( k != 0)
    {
        if(p[k-1] == ' ')
        {
            p[k-1]='\0';
            printf("%s:%d",p,k-1);
        } else
        {
            p[k]='\0';
            printf("%s:%d",p,k);
        }

    } else
    {
        printf(":0");
    }
    return 0;
}

code 2

#include<stdio.h>
#include<ctype.h>
int main()
{
    char s[151],p[151];
    gets(s);
    int i,n = 1,k=0;
    int length = strlen(s);
    for( i = 0 ; i < length; i++) {
        s[i] = toupper(s[i]);
    }
    for(i = 0;i < length ;i++) {
        if(s[i] != ' ')
        {   p[k]=s[i];
            k++;
            n=0;
        }
        else if(n==0)
            {
                n++;
                p[k]=' ';
                k++;

            }
    }
    if ( k != 0)
    {
        if(p[k-1] == ' ')
        {
            p[k-1]='\0';
            printf("%s:%d",p,k-1);
        } else
        {
            p[k]='\0';
            printf("%s:%d",p,k);
        }


    } else
    {
        printf(":0");
    }
    return 0;
}

Mong mọi người giúp đỡ.

Thế kết quả chạy trên máy có giống nhau không?

2 Likes

Ngoài câu hỏi của @SITUVN.gcd, tớ cũng muốn hỏi thêm.

Cậu có thể cho bọn tớ biết coderforces báo code của cậu bị error gì được không?

Cậu có thể giải thích tại sao cậu lại hiểu vậy được không?

Cậu tìm hiểu được gì rồi? Cậu có thể tóm tắt những thứ tìm hiểu cho bọn tớ được không?

3 Likes

đề + code + input + kết quả mong đợi
để biết code sai, cần đủ 4 yếu tố trên và kết quả thực tế

3 Likes

mình chạy thử trên máy thì có giống nhau với các test mình nghĩ ra. Do code cũng khá ngắn, ý tưởng chỉ khác nhau, cai 1 thì không chuyển hết về chữ hoa để xét mà kiểm tra xem nó là chữ thưởng thì chuyển sang chữ hoa, còn là chữ hoa thì thôi. còn code 2 thì là chuyển hết từ đầu.

ý 1 nó báo sai test thôi.

ý 2, thì mình code thì mình hiểu nó tương đương thôi, chứ giải thích gì nữa.

ý 3 check các loại đầu vào xem hàm nó thay đổi, có trường hợp đặc biệt nào không thôi, thì thấy nếu không thõa mãn hàm thì nó đều trả về kết quả = 0 ngược lại là > 0

Cậu nên đưa chi tiết ra. Cậu thử nghĩ xem, câu này của cậu có thêm thông tin gì cho mọi người không?
Vì bọn tớ không biết sai ở đâu, làm thế nào tái hiện được, thì làm sao bọn tớ trả lời được cậu?
Còn nếu cậu muốn như mọi khi, tự trả lời rồi mark câu trả lời của cậu “solution”, cậu có thể ignore phần này :smiley:

Đó là giả thiết của cậu. Cậu có chứng minh được không?
Nếu cậu không làm được, 2 implementation đó không tương đương đâu. Thậm chí bằng chứng rõ ràng nhất cho việc nó không tương đương là test fail trên coderforce.
Chúng ta sẽ thống nhất không làm việc trên giả thiết, mà trên bằng chứng nhé!

Cảm ơn cậu, nó có vẻ như là điều tốt nhất cậu làm được tới giờ.

Tớ sẽ chờ câu trả lời thực sự của cậu cho việc test gì bị fail, lúc đó tớ, hay bất cứ ai khác, mới có thể troubleshoot tiếp được. Cậu có thể trả lời câu hỏi của @kisuluoibieng thay cho câu hỏi của tớ cũng được.

3 Likes

ý 1, test case của bài làm gì có mà nói cụ thể được bạn. mình thấy nó sai thì mình nói như vậy, chứ theo bạn mình cung câp thêm được thông tin gì, mình biết được test case nó sai trường hợp nào thì lại dễ rồi

ý 2, ok thế bạn thấy nó không tương đương thì bạn chứng minh cho mình, do là 2 trình biên dịch khác nhau nên mình chưa được khẳng định được gì nhiều. Mình hiểu sao thì nói vậy.

ý 4, đề mình đã nói từ đầu và kết quả mong đợi cũng đã nói từ đầu, bạn không hiểu rõ thì mình có thể trình bày lại. bạn cứ comment như kiểu là không đọc gì vậy. Hoặc là ở vấn đề mình trình bày thì bạn có thể hỏi rõ lại. Bạn nghĩ đi giải lúc nào cũng có 4 yêu tố như vậy để giải hay sao?

Do code nó khả ngắn bạn thì cần chạy thử 1 ví đụ là bạn hiểu vấn đề rồi, mình không hiểu sao lại thích bắt bẻ những cái không liên quan, thay vì tập chung vào vấn đề chính. Mình không có ý gì.

Về test tự bịa ra:
1 toàn dấu cách

"                                       "

2 trước chuỗi chưa nhiều dấu cách và sau chuỗi không chưa dấu cách

"                      aaaaaaaaaaaa"

3 trước chuỗi không chưa dấu cách và sau chuỗi chứa dấu cách

"aaaaaaaa               "

4 trước sau đều chứa dấu cách

"         aaaaaaaaaaaaa       "

5 có nhiều hơn 1 âm tiết trong chuỗi

6 là bao gồm cả viết hoa, viết thường trong âm tiết

Còn mấy cái test tự bịa này thì mình thấy đúng, mình không đưa ra, để mọi người tự đưa xem mình có liệt kê xót trường hợp nào không?

Toàn chữ a và dấu cách, thế số và các kí tự đặc biệt đã thử chưa?
2 hàm islower()isupper() đều trả về 0 (false) khi kí tự không thuộc [a-z] hoặc [A-Z]. Trong tài liệu cũng có nhắc đến rồi: http://www.cplusplus.com/reference/cctype/islower/

Liệu đề bài có ràng buộc phạm vi các kí tự?

6 Likes

đề nó không nói rõ, ok cám ơn bạn, có vẻ mình hiểu vấn đề rồi. vì cái test ví dụ nó đưa chỉ toàn chữ cái thôi.

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