Code đưa vào switch case chạy không ổn định?

Mình có một chương trình chính, trong chương trình này sẽ có nhiều chương trình còn dạng menu như sau

cout<<"1.Tim X = {x thuoc S1 hoac x thuoc S2}"<<endl;
        cout<<"2.Tim X = {x thuoc S1 va x thuoc S2}"<<endl;
        cout<<"3.Tim X = {x thuoc S1 va x khong thuoc S2}"<<endl;
        cout<<"4.Tim tap ky tu va so lan xuat hien moi ky tu trong ca S1, S2 (Không ke ky tu trong)"<<endl;
        cout<<"5.Tim tap ky tu va so lan xuat hien moi ky tu thuoc ca S1, S2 (Không ke ky tu trong)"<<endl;
        cout<<"6.Tim tap ky tu va so lan xuat hien moi ky tu thuoc S1 nhung khong thuoc S2 (Không ke ky tu trong)"<<endl;
        cout<<"7.ma hoa x bang ky thuat chan le"<<endl;
        cout<<"8.giai ma x bang ky thuat chan le"<<endl;
        cout<<"9.tim tap tu va so lan xuat hien moi tu trong s1 hoac s2 "<<endl;
        cout<<"10.tim tap tu va so lan xuat hien moi tu trong s1 va s2"<<endl;
        cout<<"11.tim tap tu va so lan xuat hien moi tu trong s1 nhung khong xh trong s2"<<endl;

Tuy nhiên menu 2 có lỗi, ở bài 2 là tìm các kí tự thuộc cả 2 xâu. Hàm search của mình là kiểm tra xem kí tự s có thuộc xâu a hay không rồi return 0 hoặc 1.

Đây là toàn bộ code

#include <iostream>
#include <string>
#include <windows.h>
#include <stdio.h>
using namespace std;

typedef struct
{
    char kitu;
    int solan;
} word;

int search(char s,char *a)
{
    for(int i=0; i<=strlen(a)-1; i++)
    {
        if(s==a[i]) return 1;
    }
    return 0;
}
int main()
{
    int dung=1,bai;
    do
    {
        system("cls");
        cout<<"1.Tim X = {x thuoc S1 hoac x thuoc S2}"<<endl;
        cout<<"2.Tim X = {x thuoc S1 va x thuoc S2}"<<endl;
        cout<<"3.Tim X = {x thuoc S1 va x khong thuoc S2}"<<endl;
        cout<<"4.Tim tap ky tu va so lan xuat hien moi ky tu trong ca S1, S2 (Không ke ky tu trong)"<<endl;
        cout<<"5.Tim tap ky tu va so lan xuat hien moi ky tu thuoc ca S1, S2 (Không ke ky tu trong)"<<endl;
        cout<<"6.Tim tap ky tu va so lan xuat hien moi ky tu thuoc S1 nhung khong thuoc S2 (Không ke ky tu trong)"<<endl;
        cout<<"7.ma hoa x bang ky thuat chan le"<<endl;
        cout<<"8.giai ma x bang ky thuat chan le"<<endl;
        cout<<"9.tim tap tu va so lan xuat hien moi tu trong s1 hoac s2 "<<endl;
        cout<<"10.tim tap tu va so lan xuat hien moi tu trong s1 va s2"<<endl;
        cout<<"11.tim tap tu va so lan xuat hien moi tu trong s1 nhung khong xh trong s2"<<endl;
        cout<<"nhap bai: ";
        cin>>bai;
        switch(bai)
        {
        case 1:
        {
            char a[20],b[20],c[20];
            cout<<"nhap xau a: ";
            fflush(stdin);
            cin>>a;
            cout<<"nhap xau b: ";
            fflush(stdin);
            cin>>b;
            strcat(a,b);
            int m=0;
            for(int i=0; i<=strlen(a); i++)
            {
                if(search(a[i],c)==0)
                {
                    c[m]=a[i];
                    m++;
                }
            }
            for(int i=0; i<=m-1; i++) cout<<c[i];
            break;
        }
        case 2:
        {
            char a[20],b[20],c[20];
            cout<<"nhap xau a: ";
            fflush(stdin);
            cin>>a;
            cout<<"nhap xau b: ";
            fflush(stdin);
            cin>>b;
            int m=0;
            for(int i=0; i<=strlen(a)-1; i++)
            {
                if(search(a[i],b) && search(a[i],c)==0)
                {
                    c[m]=a[i];
                    m++;
                }
            }
            for(int i=0; i<=m-1; i++) cout<<c[i];
            break;
        }
        case 3:
        {
            char a[20],b[20],c[20];
            cout<<"nhap xau a: ";
            fflush(stdin);
            cin>>a;
            cout<<"nhap xau b: ";
            fflush(stdin);
            cin>>b;
            int m=0;
            for(int i=0; i<=strlen(a)-1; i++)
            {
                if(search(a[i],b)==0)
                {
                    c[m]=a[i];
                    m++;
                }
            }
            for(int i=0; i<=m-1; i++) cout<<c[i];
            break;
        }
        case 4:
        {
            word x[20];
            char a[20],b[20],c[20];
            cout<<"nhap xau a: ";
            fflush(stdin);
            cin>>a;
            cout<<"nhap xau b: ";
            fflush(stdin);
            cin>>b;
            strcat(a,b);
            int m=0;
            for(int i=0; i<=strlen(a)-1; i++)
            {
                if(search(a[i],c)==0)
                {
                    c[m]=a[i];
                    x[m].kitu=a[i];
                    x[m].solan=1;
                    m++;
                }
                else
                {
                    for(int j=0; j<=m-1; j++)
                    {
                        if(x[j].kitu==a[i]) x[j].solan++;
                    }
                }
            }
            for(int i=0; i<=m-1; i++) cout<<"ki tu "<<x[i].kitu<<" xuat hien "<<x[i].solan<<" lan"<<endl;
            break;
        }
        }
        cout<<endl;
        cout<<"nhap 0 de dung lai,1 de tiep tuc";
        cin>>dung;
    }
    while(dung==1);
}

Vấn đề là nếu để riêng cái case 2 sang 1 bài khác thì ra kết quả còn đưa vào bài thì lại không cho ra kết quả. Mọi người có thể cho mình biết lý do tại sao không?

1 Like

Mình sửa lại bài viết của bạn rồi nhé. Bạn xem cách chèn code vào bài viết tại đây

Cách Dùng markdown chèn code trong diễn đàn

2 Likes

Mình thấy code chạy khá ổn mà, nhưng mà để nhập chuỗi có khoảng trắng thì dùng gets chứ đừng dùng cin

 case 2:
        {
            char a[20],b[20],c[20];
            cout<<"nhap xau a: ";
            fflush(stdin);
            gets(a);
            cout<<"nhap xau b: ";
            fflush(stdin);
            gets(b);
            int m=0;
            for(int i=0; i<=strlen(a)-1; i++)
            {
                if(search(a[i],b) && search(a[i],c)==0)
                {
                    c[m]=a[i];
                    m++;
                }
            }
            for(int i=0; i<=m-1; i++) cout<<c[i];
            break;
        }

Tuy nhiên @nguyenhongnhu thiết kế chương trình như vậy là không ổn. Nên viết như sau để sau này sửa lỗi nó dễ hơn

#include <iostream>
#include <string>
#include <windows.h>
#include <stdio.h>
using namespace std;

typedef struct
{
    char kitu;
    int solan;
} word;

int search(char s,char *a)
{
    for(int i=0; i < strlen(a); i++)
    {
        if(s==a[i])
            return 1;
    }
    return 0;
}

int menu()
{
    int bai = 0;
    system("cls");
    cout<<"0.Thoat"<<endl;
    cout<<"1.Tim X = {x thuoc S1 hoac x thuoc S2}"<<endl;
    cout<<"2.Tim X = {x thuoc S1 va x thuoc S2}"<<endl;
    cout<<"3.Tim X = {x thuoc S1 va x khong thuoc S2}"<<endl;
    cout<<"4.Tim tap ky tu va so lan xuat hien moi ky tu trong ca S1, S2 (Không ke ky tu trong)"<<endl;
    cout<<"5.Tim tap ky tu va so lan xuat hien moi ky tu thuoc ca S1, S2 (Không ke ky tu trong)"<<endl;
    cout<<"6.Tim tap ky tu va so lan xuat hien moi ky tu thuoc S1 nhung khong thuoc S2 (Không ke ky tu trong)"<<endl;
    cout<<"7.ma hoa x bang ky thuat chan le"<<endl;
    cout<<"8.giai ma x bang ky thuat chan le"<<endl;
    cout<<"9.tim tap tu va so lan xuat hien moi tu trong s1 hoac s2 "<<endl;
    cout<<"10.tim tap tu va so lan xuat hien moi tu trong s1 va s2"<<endl;
    cout<<"11.tim tap tu va so lan xuat hien moi tu trong s1 nhung khong xh trong s2"<<endl;
    cout<<"nhap bai: ";
    cin>>bai;
    return bai;
}

void tim_x_1()
{
    char a[20],b[20],c[20];
    cout<<"nhap xau a: ";
    fflush(stdin);
    cin>>a;
    cout<<"nhap xau b: ";
    fflush(stdin);
    cin>>b;
    strcat(a,b);
    int m=0;
    for(int i=0; i<=strlen(a); i++)
    {
        if(search(a[i],c)==0)
        {
            c[m]=a[i];
            m++;
        }
    }
    for(int i=0; i<=m-1; i++) cout<<c[i];
    cout << "\nNhan phim bat ky de tiep tuc\n";
    getchar();
}

void tim_x_2()
{
    char a[20],b[20],c[20];
    cout<<"nhap xau a: ";
    fflush(stdin);
    gets(a);
    cout<<"nhap xau b: ";
    fflush(stdin);
    gets(b);
    int m=0;
    for(int i=0; i<=strlen(a)-1; i++)
    {
        if(search(a[i],b) && search(a[i],c)==0)
        {
            c[m]=a[i];
            m++;
        }
    }
    for(int i=0; i<=m-1; i++)
        cout<<c[i];
    cout << "\nNhan phim bat ky de tiep tuc\n";
    getchar();
}

void tim_x_3()
{
    char a[20],b[20],c[20];
    cout<<"nhap xau a: ";
    fflush(stdin);
    cin>>a;
    cout<<"nhap xau b: ";
    fflush(stdin);
    cin>>b;
    int m=0;
    for(int i=0; i<=strlen(a)-1; i++)
    {
        if(search(a[i],b)==0)
        {
            c[m]=a[i];
            m++;
        }
    }
    for(int i=0; i<=m-1; i++)
        cout<<c[i];
    cout << "\nNhan phim bat ky de tiep tuc\n";
    getchar();
}

void tim_tap_ky_tu_4()
{
    word x[20];
    char a[20],b[20],c[20];
    cout<<"nhap xau a: ";
    fflush(stdin);
    cin>>a;
    cout<<"nhap xau b: ";
    fflush(stdin);
    cin>>b;
    strcat(a,b);
    int m=0;
    for(int i=0; i<=strlen(a)-1; i++)
    {
        if(search(a[i],c)==0)
        {
            c[m]=a[i];
            x[m].kitu=a[i];
            x[m].solan=1;
            m++;
        }
        else
        {
            for(int j=0; j<=m-1; j++)
            {
                if(x[j].kitu==a[i]) x[j].solan++;
            }
        }
    }
    for(int i=0; i<=m-1; i++)
        cout<<"ki tu "<<x[i].kitu<<" xuat hien "<<x[i].solan<<" lan"<<endl;
    cout << "\nNhan phim bat ky de tiep tuc\n";
    getchar();
}
int main()
{
    int tieptuc=1;
    do
    {
        switch(menu())
        {
        case 0:
            tieptuc = 0;
            break;
        case 1:
            tim_x_1();
            break;
        case 2:
            tim_x_2();
            break;
        case 3:
            tim_x_3();
            break;
        case 4:
            tim_tap_ky_tu_4();
            break;
        default:
            cout << "nhap loi\n";
            break;
        }
    }
    while(tieptuc);
}

bài này mình sửa lại chạy được rồi nhưng mà vẫn còn 1 lỗi

#include <iostream>
#include <string>
#include <windows.h>
#include <stdio.h>
using namespace std;

typedef struct{
	char kitu;
	int solan;
}word;

int search(char s, char *a){
	int t = strlen(a) - 1;
	for (int i = 0; i <= t; i++){
		if (s == a[i]) return 1;
	}
	return 0;
}

int main(){
	int dung;
	do
	{
		system("cls");
		int bai;
		cout << "1.Tim X = {x thuoc S1 hoac x thuoc S2}" << endl;
		cout << "2.Tim X = {x thuoc S1 va x thuoc S2}" << endl;
		cout << "3.Tim X = {x thuoc S1 va x khong thuoc S2}" << endl;
		cout << "4.Tim tap ky tu va so lan xuat hien moi ky tu trong ca S1, S2 (Không ke ky tu trong)" << endl;
		cout << "5.Tim tap ky tu va so lan xuat hien moi ky tu thuoc ca S1, S2 (Không ke ky tu trong)" << endl;
		cout << "6.Tim tap ky tu va so lan xuat hien moi ky tu thuoc S1 nhung khong thuoc S2 (Không ke ky tu trong)" << endl;
		cout << "7.ma hoa x bang ky thuat chan le" << endl;
		cout << "8.giai ma x bang ky thuat chan le" << endl;
		cout << "9.tim tap tu va so lan xuat hien moi tu trong s1 hoac s2 " << endl;
		cout << "10.tim tap tu va so lan xuat hien moi tu trong s1 va s2" << endl;
		cout << "11.tim tap tu va so lan xuat hien moi tu trong s1 nhung khong xh trong s2" << endl;
		cout << "nhap bai: "; cin >> bai;
		switch (bai){
		case 1:
		{
				  char a[20], b[20], c[20];
				  cout << "nhap xau a: ";
				  fflush(stdin);
				  cin >> a;
				  cout << "nhap xau b: ";
				  fflush(stdin);
				  cin >> b;
				  strcat(a, b);
				  int m = 0;
				  for (int i = 0; i <= strlen(a); i++){
					  if (search(a[i], c) == 0){
						  c[m] = a[i];
						  m++;
					  }
				  }
				  for (int i = 0; i <= m - 1; i++) cout << c[i];
				  break;
		}
		case 2:
		{
				  char a[20], b[20], c[20];
				  cout << "nhap xau a: ";
				  fflush(stdin);
				  cin >> a;
				  cout << "nhap xau b: ";
				  fflush(stdin);
				  cin >> b;
				  int m = 0;
				  for (int i = 0; i <= strlen(a) - 1; i++){
					  if (search(a[i], b) == 1 && search(a[i], c) == 0){
						  c[m] = a[i];
						  m++;
					  }
				  }
				  for (int i = 0; i <= m - 1; i++) cout << c[i];
				  break;
		}
		case 3:
		{
				  char a[20], b[20], c[20];
				  cout << "nhap xau a: ";
				  fflush(stdin);
				  cin >> a;
				  cout << "nhap xau b: ";
				  fflush(stdin);
				  cin >> b;
				  int m = 0;
				  for (int i = 0; i <= strlen(a) - 1; i++){
					  if (search(a[i], b) == 0 && search(a[i],c)==0){
						  c[m] = a[i];
						  m++;
					  }
				  }
				  for (int i = 0; i <= m - 1; i++) cout << c[i];
				  break;
		}
		case 4:
		{
				  word x[20];
				  char a[20], b[20], c[20];
				  cout << "nhap xau a: ";
				  fflush(stdin);
				  cin >> a;
				  cout << "nhap xau b: ";
				  fflush(stdin);
				  cin >> b;
				  strcat(a, b);
				  int m = 0;
				  for (int i = 0; i <= strlen(a) - 1; i++){
					  if (search(a[i], c) == 0){
						  c[m] = a[i];
						  x[m].kitu = a[i];
						  x[m].solan = 1;
						  m++;
					  }
					  else {
						  for (int j = 0; j <= m - 1; j++){
							  if (x[j].kitu == a[i]) x[j].solan++;
						  }
					  }
				  }
				  for (int i = 0; i <= m - 1; i++) cout << "ki tu " << x[i].kitu << " xuat hien " << x[i].solan << " lan" << endl;
				  break;
		}
		}
		cout<<endl;
		cout<<"nhap 0 de dung lai, 1 de tiep tuc";
		cin>>dung;
	}while(dung==1);
}

ví dụ mình chạy bài 4. chạy xong thì mình chạy lại 1 lẫn nữa thì kết quả sai. có thể là do bộ nhớ các xâu của lần test trước chưa xóa nên bị lỗi. Mình có đọc về hàm fflush(stdin) và đưa vào bài toán nhưng mà không đúng mong bạn sửa lại giùm mình.

@nguyenhongnhu trước hết bạn xem cái thiết kế chương trình của mình trước. Sau đó bạn xem chuyển đổi sang tương tự để sau này mình có thể sửa lỗi dễ hơn.

Không nên viết mọi code vào trong hàm main đâu. Rất khó quản lý và sửa lỗi. Bài này bạn phải làm 11 bài nhỏ đúng không? Vậy nên cố gắng để code trong các hàm bên ngoài thì hơn.

Sau khi sửa xong thì gửi lại code, Đạt sẽ hướng dẫn tiếp cho cách code sao cho tránh lỗi.

Quảng cáo tí: Đạt đi làm 4 năm rồi, đã code được 11 năm :slight_smile:

2 Likes

à nhưng mà trước hết cho e (hehe) hỏi là cái code của a thì nó không dừng lại để xem kết quả. e đa thêm system(“pause”) nhưng vẫn không được

1 Like

được rồi a ạ.đợi e chỉnh lại cái code của e rồi e gửi lên cho a xem

1 Like

nãy giờ e tìm cái định nghĩa lệnh getchar() mà chưa thấy a giải thích cho e được không?

getchar() để nhận vào một ký tự thôi em.

Em có thể xem nhanh ở đây, video anh hướng dẫn getchar

Phân biệt getchar và getch

e bỏ lệnh getchar() thì chương trình vẫn chạ bình thường a ạ

à nó giúp dừng màn hình lúc chạy file exe đúng không a.

1 Like

Đúng rồi đấy em. Em sửa code theo cấu trúc của anh sẽ dễ đọc và dễ sửa lỗi hơn đấy.

1 Like

chỗ bài 2 sao lại phải đổi thành gets chứ không phải cin hả anh. và còn phaie đe fflush(stdin); mới chạy được

đừng dùng cin để nhập chuỗi, dùng gets thôi.

cin để nhập số

bài 2 nếu dùng cin thì không hiện kết quả, còn như của a thì không bị lỗi. thế sao bài 1 và 3, 4 dùng cin vẫn được hả a

#include <iostream>
#include <string>
#include <windows.h>
#include <stdio.h>
using namespace std;
typedef struct{
	char kitu;
	int solan;
}word;
int search(char s, char *a){
	int t = strlen(a) - 1;
	for (int i = 0; i <= t; i++){
		if (s == a[i]) return 1;
	}
	return 0;
}
int menu(){
		int bai;
		system("cls");
		cout << "o.dung lai"<<endl;
		cout << "1.Tim X = {x thuoc S1 hoac x thuoc S2}" << endl;
		cout << "2.Tim X = {x thuoc S1 va x thuoc S2}" << endl;
		cout << "3.Tim X = {x thuoc S1 va x khong thuoc S2}" << endl;
		cout << "4.Tim tap ky tu va so lan xuat hien moi ky tu trong ca S1, S2 (Không ke ky tu trong)" << endl;
		cout << "5.Tim tap ky tu va so lan xuat hien moi ky tu thuoc ca S1, S2 (Không ke ky tu trong)" << endl;
		cout << "6.Tim tap ky tu va so lan xuat hien moi ky tu thuoc S1 nhung khong thuoc S2 (Không ke ky tu trong)" << endl;
		cout << "7.ma hoa x bang ky thuat chan le" << endl;
		cout << "8.giai ma x bang ky thuat chan le" << endl;
		cout << "9.tim tap tu va so lan xuat hien moi tu trong s1 hoac s2 " << endl;
		cout << "10.tim tap tu va so lan xuat hien moi tu trong s1 va s2" << endl;
		cout << "11.tim tap tu va so lan xuat hien moi tu trong s1 nhung khong xh trong s2" << endl;
		cout << "nhap bai: "; cin >> bai;
		return bai;
}
void tim_x_1()
{
    char a[20], b[20], c[20];
	cout << "nhap xau a: ";
	cin >> a;
	cout << "nhap xau b: ";
	cin >> b;
	strcat(a, b);
	int m = 0;
	for (int i = 0; i <= strlen(a); i++){
		if (search(a[i], c) == 0){
			c[m] = a[i];
			m++;
		}
	}
	for (int i = 0; i <= m - 1; i++) cout << c[i];
	cout<<endl;
	system("pause");
}

void tim_x_2()
{
    char a[20], b[20], c[20];
	cout << "nhap xau a: ";
    cin >> a;
    cout << "nhap xau b: ";
    cin >> b;
    int m = 0;
    for (int i = 0; i <= strlen(a) - 1; i++){
  	    if (search(a[i], b) == 1 && search(a[i], c) == 0){
	 	    c[m] = a[i];
		    m++;
	    }
    }
    for (int i = 0; i <= m - 1; i++) cout << c[i];
    cout<<endl;
        system("pause");
}

void tim_x_3()
{
    char a[20], b[20], c[20];
	cout << "nhap xau a: ";
	cin >> a;
	cout << "nhap xau b: ";
	cin >> b;
	int m = 0;
	for (int i = 0; i <= strlen(a) - 1; i++){
		if (search(a[i], b) == 0 && search(a[i],c)==0){
			c[m] = a[i];
			m++;
		}
	}
	for (int i = 0; i <= m - 1; i++) cout << c[i];
	cout<<endl;
    system("pause");
}

void tim_tap_ky_tu_4()
{
	word x[20];
	char a[20], b[20], c[20];
	cout << "nhap xau a: ";
	cin >> a;
	cout << "nhap xau b: ";
	cin >> b;
	strcat(a, b);
	int m = 0;
	for (int i = 0; i <= strlen(a) - 1; i++){
		if (search(a[i], c) == 0){
			c[m] = a[i];
			x[m].kitu = a[i];
			x[m].solan = 1;
			m++;
		}
		else {
			for (int j = 0; j <= m - 1; j++){
				if (x[j].kitu == a[i]) x[j].solan++;
			}
		}
	}
	for (int i = 0; i <= m - 1; i++) cout << "ki tu " << x[i].kitu << " xuat hien " << x[i].solan << " lan" << endl;
	cout<<endl;
	system("pause");
}
int main()
{
    int tieptuc=1;
    do
    {
        switch(menu())
        {
        case 0:
            tieptuc = 0;
            break;
        case 1:
            tim_x_1();
            break;
        case 2:
            tim_x_2();
            break;
        case 3:
            tim_x_3();
            break;
        case 4:
            tim_tap_ky_tu_4();
            break;
        default:
            cout << "nhap loi\n";
            break;
        }
    }
    while(tieptuc);
}

em sửa lại chương trình và đã chạy đúng hết. a xem có chỗ nào chưa tốt thì a chỉ giúp e ạ.

1 Like

Anh thấy mình cần sửa các điểm sau

  • vòng lặp for
 for (int i = 0; i <= strlen(a) - 1; i++)

nên sửa thành

 for (int i = 0; i < strlen(a) ; i++)
  • nếu không cần thiết thì không nên viết 1 dòng như thế này
for (int i = 0; i <= m - 1; i++) cout << c[i];

mà nên viết

for (int i = 0; i <= m - 1; i++) 
    cout << c[i];
  • tên biến và kiểu truy cập nên thay đổi
int search(char s, char *a)

thành

int search(char c, const char *s)

const char *s là để tránh thay đổi giá trị của chuỗi nhập vào một cách vô tình

1 Like

Mỗi hàm 1 công việc! sau đó test : nhập vào sai thì sửa nhập, tính sai thì sửa tính, xuất sai thì sửa xuất, … như thế code dễ sửa mà lại ko rối!

2 Likes

Chính xác rồi. Nếu mình có thể chia nhỏ cụ thể một công việc thì nên tạo hàm ra để xử lý công việc đó.

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