Tổng Hợp

Bài 61. Đếm số từ trong chuỗi C/C++

Tiếp tục là các bài tập giúp các bạn luyện tập tri thức về chuỗi và xử lý chuỗi trong C. Hôm nay tất cả chúng ta cùng nhau đi khắc phục 1 bài tập về xử lý chuỗi: đếm số từ trong chuỗi nhập từ keyboard sử dụng C/C++. Đồng thời, tất cả chúng ta cũng sẽ khắc phục bài toán chuẩn hóa chuỗi luôn nhé.


Bài tập đếm số từ trong chuỗi

  1. Nhập vào một chuỗi từ keyboard
  2. Đếm số từ có trong chuỗi vừa nhập
  3. Xóa bỏ khoảng trắng ở đầu, giữa và cuối chuỗi
  4. Viết hoa chữ cái trước nhất, các chữ cái còn lại viết thường
  5. In ra số từ và xâu sau thời điểm chuẩn hóa

Input:

1

2

 

Nhap chuoi:    LAP    trINH    khong    KHO!

 

Output:

1

2

3

 

So tu cua ”   LAP    trINH    khong    KHO!” la 4

Xau chuan hoa la: Lap trinh khong kho!

 


Cách đếm số từ trong chuỗi

Ý tưởng: Nếu ký tự hiện tại là dấu cách và ký tự tiếp theo không phải dấu cách thì ta coi đó là khởi đầu của 1 từ.

Lưu ý: Có thể từ trước nhất không khởi đầu bằng dấu cách.

1

2

3

4

5

6

7

8

9

10

11

12

13

 

int

WordCount

(

char

str

[

]

,

int

length

)

{

    

int

word

=

(

str

[

]

!

=

‘ ‘

)

;

    

for

(

int

i

=

;

i

<

length

1

;

i

++

)

    

{

        

if

(

str

[

i

]

==

‘ ‘

&& str[i + 1] != ‘ ‘)

        {

            word++;

        

}

    

}

    

return

word

;

}

 


Chuẩn hóa chuỗi trong C

Ý tưởng chuẩn hóa chuỗi trong C như sau:

  1. Bỏ các ký tự khoảng trắng thừa ở đầu chuỗi
  2. Bỏ các ký tự khoảng trắng thừa ở cuối chuỗi
  3. Viết hoa chữ cái trước nhất của chuỗi
  4. Bỏ qua các khoảng trắng thừa ở giữa
  5. Mang toàn bộ về lowercase
  6. Viết hoa chữ cái xuất phát điểm từ theo ý tưởng đếm từ phía trên

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

 

void

Correct

(

char

str

[

]

,

int

length

)

{

    

int

first

=

,

last

=

length

1

;

    

// Xóa dấu trắng đầu chuỗi

    

while

(

first

<

last

&& str[first] == ‘ ‘)

        first++;

    

// Xóa dấu trắng cuối chuỗi

    

while

(

last

>

first

&& str[last] == ‘ ‘)

        last–;

 

    

// Viết hoa chữ cái trước nhất

    

if

(

str

[

first

]

>

=

‘a’

&& str[first] <= ‘z’)

        str[first] -= 32;

    

for

(

int

i

=

first

+

1

;

i

<

=

last

;

i

++

)

    

{

        

// Mang hết về chữ thường

        

if

(

str

[

i

]

>

=

‘A’

&& str[i] <= ‘Z’){

            str[i] += 32;

        

}

        

if

(

i

+

1

<

=

last

)

        

{

            

// Bỏ dấu trắng thừa ở giữa

            

if

(

str

[

i

]

==

str

[

i

+

1

]

&& str[i] == ‘ ‘)

            {

                continue;

            

}

            

// Nếu là chữ cái đầu mỗi từ thì viết hoa

            

if

(

str

[

i

]

==

‘ ‘

&& str[i + 1] >= ‘a’ && str[i + 1] <= ‘z’)

            {

                str[i + 1] -= 32;

            

}

        

}

        

printf

(

“%c”

,

str

[

i

]

)

;

    

}

}

 


Lời giải chuẩn hóa chuỗi và đếm số từ trong C

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

 

#include <stdio.handgt;

#include <string.handgt;

 

int

WordCount

(

char

str

[

]

,

int

length

)

{

    

int

word

=

(

str

[

]

!

=

‘ ‘

)

;

    

for

(

int

i

=

;

i

<

length

1

;

i

++

)

    

{

        

if

(

str

[

i

]

==

‘ ‘

&& str[i + 1] != ‘ ‘)

        {

            word++;

        

}

    

}

    

return

word

;

}

 

void

Correct

(

char

str

[

]

,

int

length

)

{

    

int

first

=

,

last

=

length

1

;

    

// Xóa dấu trắng đầu chuỗi

    

while

(

first

<

last

&& str[first] == ‘ ‘)

        first++;

    

// Xóa dấu trắng cuối chuỗi

    

while

(

last

>

first

&& str[last] == ‘ ‘)

        last–;

 

    

// Viết hoa chữ cái trước nhất

    

if

(

str

[

first

]

>

=

‘a’

&& str[first] <= ‘z’)

        str[first] -= 32;

    

for

(

int

i

=

first

+

1

;

i

<

=

last

;

i

++

)

    

{

        

// Mang hết về chữ thường

        

if

(

str

[

i

]

>

=

‘A’

&& str[i] <= ‘Z’){

            str[i] += 32;

        

}

        

if

(

i

+

1

<

=

last

)

        

{

            

// Bỏ dấu trắng thừa ở giữa

            

if

(

str

[

i

]

==

str

[

i

+

1

]

&& str[i] == ‘ ‘)

            {

                continue;

            

}

            

// Nếu là chữ cái đầu mỗi từ thì viết hoa

            

if

(

str

[

i

]

==

‘ ‘

&& str[i + 1] >= ‘a’ && str[i + 1] <= ‘z’)

            {

                str[i + 1] -= 32;

            

}

        

}

        

printf

(

“%c”

,

str

[

i

]

)

;

    

}

}

 

int

main

(

)

{

    

char

str

[

100

]

;

    

// Nhập chuỗi

    

printf

(

“nNhap chuoi: “

)

;

    

fgets

(

str

,

sizeof

str

,

stdin

)

;

    

// Do sử dụng fgets nên chuỗi của tất cả chúng ta sẽ đọc cả ký tự ‘n’.

    

// Xóa bỏ nó đi.

    

int

length

=

strlen

(

str

)

1

;

    

str

[

length

]

=

Xem thêm bài viết thuộc chuyên mục: Tổng Hợp
Xem thêm :  Cách nấu canh ngao nấu chua “ngon hết sẩy”

Related Articles

Back to top button