Thống kê các chữ số trong 1 chuỗi

Mọi người cho e hỏi sai chỗ nào ạ!!!

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int main(){
	char s[100];
	int i,s0,s1,s2,s3,s4,s5,s6,s7,s8,s9;
	cout<<"Nhap chuoi:"; gets(s);
	for(i=0;i<strlen(s);i++)
		if(s[i]==0)
			s0++;
		if(s[i]==1)
			s1++;
		if(s[i]==2)
			s2++;
		if(s[i]==3)
			s3++;
		if(s[i]==4)
			s4++;
		if(s[i]==5)
			s5++;
		if(s[i]==6)
			s6++;
		if(s[i]==7)
			s7++;
		if(s[i]==8)
			s8++;
		if(s[i]==9)
			s9++;	
		cout<<"\nSo cac chu so 0 la: "<<s0;
		cout<<"\nSo cac chu so 1 la: "<<s1;
		cout<<"\nSo cac chu so 2 la: "<<s2;
		cout<<"\nSo cac chu so 3 la: "<<s3;
		cout<<"\nSo cac chu so 4 la: "<<s4;
		cout<<"\nSo cac chu so 5 la: "<<s5;
		cout<<"\nSo cac chu so 6 la: "<<s6;
		cout<<"\nSo cac chu so 7 la: "<<s7;
		cout<<"\nSo cac chu so 8 la: "<<s8;
		cout<<"\nSo cac chu so 9 la: "<<s9;
		
}

image

Tôi k biết c++ nên cũng k chắc lắm nhé, bạn tự check lại
Nguyên nhân có thể do:

  1. Bạn không khởi tạo giá trị ban đầu cho s0, s1, nó sẽ trả về giá trị trong ô nhớ nó trỏ tới (lâu lắm rồi k nhớ đúng vậy k nữa)
  2. S[i] tôi nghĩ là kiểu char (bạn check lại). Nên k thể so sánh với số 0, 1, 2… => đk if luôn trả về false
4 Likes

Lỗi sai mà mình thấy giống như bạn trên đã nói.
Thay vì tạo 10 biến S để đếm thì bạn nên dùng mảng 10 biến để đơn giản code dễ nhìn hơn.
Dùng 2 vòng lặp for (1 vòng để xét mảng char, 1 vòng để kiểm tra phần tử char tăng bộ đếm).
So sánh thì kí tự ‘0’ tương ứng với 48 nhé.

5 Likes

so sánh luôn với char 0 , char 1 ý :v

2 Likes
  1. Bạn so sánh kiểu char với các số nguyên 0 - 9 là sai. Bạn phải so sánh với kiểu char tương ứng: '0', '1',... '9' (có cặp nháy đơn).
  2. Các biến đếm số thì bạn dùng mảng để lưu luôn. Rất nhiều thứ lặp đi, lặp lại thì nên dùng mảng và vòng lặp thì hơn.
Lặp

Chép, dán & sửa:

cout << "Day la so: " << 0 << endl;
cout << "Day la so: " << 1 << endl;
cout << "Day la so: " << 2 << endl;
cout << "Day la so: " << 3 << endl;
cout << "Day la so: " << 4 << endl;
cout << "Day la so: " << 5 << endl;
cout << "Day la so: " << 6 << endl;
cout << "Day la so: " << 7 << endl;
cout << "Day la so: " << 8 << endl;
cout << "Day la so: " << 9 << endl;

Lặp:

for(int i = 0; i <= 9; ++i){
     cout << "Day la so: " << i << endl;
}
4 Likes

em có cho nháy đơn vào cũng không được ạ

a hướng dẫn e làm mảng 10 biến được không ạ …e mới học nên chưa rõ …

Code của em, mong các bác chỉ giáo thêm.

int a[10];
	for (int i=0;i<10;i++)
	{
		a[i]=0;
	}
	for (int i=0;i<strlen(s);i++)
	{
		if (s[i]<='9' && s[i]>='0')
			a[s[i]]++;
	}
	for (int i=0;i<10;i++)
	{
		if (a[i])
			cout <<i<<" xuất hiện "<<a[i]<<" lần"<<endl;
	}

k phải vội, bạn mới học, các thầy cô sẽ dạy. Bạn chịu khó luyện tập là được.
Học chắc lấy cái gốc và tư duy.

1 Like

@Mtuongpk Bạn chạy thử chưa nhỉ. Mình thấy có chỗ sai rồi đấy.

2 Likes
int a[10] = {0};

khỏi phải chạy từ 0->9 làm gì

if (s[i]<='9' && s[i]>='0')
       a[s[i]]++;

a của bạn chỉ có 10 elements, ASCII code của ‘0’->‘9’ là 48->57 kiểu gì cũng bị lỗi index out of range rồi

     a[s[i]-'0']++;
4 Likes

A post was split to a new topic: Sửa code tạo ma phương bậc lẻ

Mình phát hiện là bạn thiếu ngoặc nhá for ( ) { }, mọi người sửa code quên vụ ngoặc của bạn đó, lỗi sai c++ nhiều là do thiếu dấu.

nếu bạn gán cho mảng đếm thế là sai r bạn

@quan123ne Trời ơi 2 năm trôi qua rồi bạn ơi.

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