PDA

View Full Version : Kiểm tra chuỗi đối xứng. Sai khi nhập chuỗi 3 ký tự, còn lại đúng. Ai xem giúp mình với



Shock0z
16-10-2011, 07:35 PM
#include <stdio.h>
#include <conio.h>
#include <string.h>
main()
{
char ch[50];
int i,j;
printf("\nNhap chuoi: ");
gets(ch);
int n=strlen(ch)-1;
int k=0;
for(i=0,j=n;i<n,j>0;i++,j--){
if(ch[i]==ch[j])
k=0;
else
k=1;
}
if(k==0)
printf("\nChuoi doi xung");
else
printf("\nChuoi ko doi xung");
getch();
}

Nhập các chuỗi khác thì đúng hết. Riêng với trường hợp nhập 3 ký tự thì sai.
Mọi người xem rồi giải thích giúp mình nhé. Thanks

kitti
16-10-2011, 08:37 PM
bạn sửa như thế này:

for(i=0,j=n;i<=n/2,j>n/2;i++,j--)

treatmaster
16-10-2011, 10:46 PM
for(i=0;i<n/2;i++)
{
if(a[i]!=a[n-i-1])
{
flag = 0 ;
break ;
}
}



ngắn gọn hơn.

VoTichSu
17-10-2011, 10:10 AM
Code trên thực ra sai cho tất cả các chuỗi chứ không riêng gì chuỗi 3 ký tự. Vì bạn chưa chạy đủ kiểu nên chưa thấy thôi.

Lý do:



for(i=0,j=n;i<n,j>0;i++,j--){
if(ch[i]==ch[j])
k=0; // gặp kt đối xứng, k sẽ bị reset lại thành 0, trường hợp không đối xứng trước đó bị overwritten
else
k=1;
}

// sửa lại code theo gia chủ:

for(i=0,j=n; j > i; i++,j--){ // chỉ cần tính lúc j > i thôi
if(ch[i]!=ch[j])
k=1;
}

// code hiệu quả hơn cho chuỗi dài, không cần phải dùng biến k

for(i=0, j=strlen(ch)-1; j > i; i++, j--)
if(ch[i]!=ch[j]) break;
if (j > i) // chuỗi không đối xứng vì thoát ra vòng lặp sớm

Shock0z
17-10-2011, 12:55 PM
hi, hiểu rùi. Cảm ơn mọi người nhiều :D
Bây giờ mới hiểu cái "break" :P. Ngoài việc dừng câu lệnh ở trên nó ra, thì nó còn tác dụng gì ko mọi người ? Ngu quá, chỉ bít dùng khi sử dụng "switch" ^^

Mọi người ơi, lại giúp mình lần nữa ^^
Cũng chuỗi đối xứng này, nhưng là viết hàm kiểm tra. Mà nó toàn in ra ko đối xứng thui :mad:
Mới học hàm nên chưa hiểu :P

#include <stdio.h>
#include <conio.h>
#include <string.h>
int ktra();
int ktra(){
char s[50];
int i,j;
int kt=0;
for(i=0,j=strlen(s)-1;j>i;i++,j--){
if(s[i]!=s[j]){
kt=1;
break;
}
}
return kt;
}
main(){
char s[50];
int kt;
printf("\nNhap chuoi: ");
gets(s);
ktra();
if(kt==0) printf("\nChuoi doi xung");
else printf("\nChuoi ko doi xung");
getch();
}
Thanks mn nhìu nhìu

VoTichSu
22-10-2011, 08:41 AM
Mới học hàm thì học cho kỹ về phạm vi của biến

Hàm của bạn tự kiểm tra chuõi của riêng nó chứ có kiểm tra chuỗi nhập vào đâu.

Shock0z
22-10-2011, 10:17 AM
Thanks bạn nhìu..................

namnguyen1251
09-11-2011, 11:48 AM
Code trên thực ra sai cho tất cả các chuỗi chứ không riêng gì chuỗi 3 ký tự. Vì bạn chưa chạy đủ kiểu nên chưa thấy thôi.

Lý do:





// code hiệu quả hơn cho chuỗi dài, không cần phải dùng biến k

for(i=0, j=strlen(ch)-1; j > i; i++, j--)
if(ch[i]!=ch[j]) break;
if (j > i) // chuỗi không đối xứng vì thoát ra vòng lặp sớm

if(ch[i]!=ch[j]) break;
if (j > i) // chuỗi không đối xứng vì thoát ra vòng lặp sớm
Cái này ai có thể giải thích rõ hơn cho mình đc koh?

namnguyen1251
09-11-2011, 11:50 AM
static void Main(string[] args)
{

string chuoi="";
Console.Write("Nhap vao 1 chuoi:");
chuoi = Console.ReadLine();
char[] n = chuoi.ToCharArray();
int dau = 0;
int cuoi = n.Length - 1;
while(dau<cuoi)
{
dau++;
cuoi--;
if (n[dau] == n[cuoi])
{

Console.Write("Chuoi doi xung");
Console.ReadLine();
}
else
{
Console.Write("Chuoi Ko doi xung");
Console.ReadLine();
break;
}
}//end while
[/QUOTE]
Mình hiểu và viết như vầy.Nhưng ko hiểu sao.Nhập chuỗi khác thì đúng.Chứ nhập chuỗi ABCDECBA or 1234BE4321 Nó cứ bào ra là đối xứng.Ai giải thích giúp mình đc koh???

clchicken
10-11-2011, 01:08 AM
static void Main(string[] args)
{

string chuoi="";
Console.Write("Nhap vao 1 chuoi:");
chuoi = Console.ReadLine();
char[] n = chuoi.ToCharArray();
int dau = 0;
int cuoi = n.Length - 1;
while(dau<cuoi)
{
dau++;
cuoi--;
if (n[dau] == n[cuoi])
{

Console.Write("Chuoi doi xung");
Console.ReadLine();
}
else
{
Console.Write("Chuoi Ko doi xung");
Console.ReadLine();
break;
}
}//end while

Mình hiểu và viết như vầy.Nhưng ko hiểu sao.Nhập chuỗi khác thì đúng.Chứ nhập chuỗi ABCDECBA or 1234BE4321 Nó cứ bào ra là đối xứng.Ai giải thích giúp mình đc koh???

Thuật toán của bạn bỏ qua 2 điểm mút n[0] và n[length-1] .
Thuật toán của bạn in ra 1 tràng "Chuoi doi xung" cho đến lúc nào nó ko đối xứng nữa thì out :D

allvalk
12-11-2011, 09:28 PM
mình nghĩ bài này nên làm theo cách đảo xâu thì nhanh hơn có ai có ý kiến khác k

#include <conio.h>
#include <stdio.h>
#include <string.h>
int main()
{
char a[100];
char *p;
printf("\n nhap xau: ");
gets(a);
p=strrev(a);
if(strcmp(a,p)==0);
printf("\ la xau doi xung");
if(strcmp(a,p)!=0)
printf("\n xau khong doi xung");
getch();
return(0);
}