30/09/2018, 16:11
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?
Bài liên quan
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
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ùngcin
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
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
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
à 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
đượ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
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.
Đú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.
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
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 ạ.
Anh thấy mình cần sửa các điểm sau
nên sửa thành
mà nên viết
thành
const char *s
là để tránh thay đổi giá trị của chuỗi nhập vào một cách vô tìnhMỗ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!
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 đó.