30/09/2018, 17:43

Lỗi tìm và đếm số lần xuất hiện tập từ chung của 2 xâu

Cho hai xâu ký tự S1 và S2. Hãy viết chương trình tìm các từ chung của hai xâu S1 và S2. Chú ý: mỗi từ chỉ liệt kê 1 lần kèm theo tổng số lần xuất hiện trong 2 xâu, theo thứ tự xuất hiện trong xâu S1.
INPUT:

2 
abc ab ab ab abcd ab
abc ab 
aaa xyz ab zzz abc dd dd abc 
dd xyz ttt sas cdc 

OUTPUT:

abc 2 
ab 5

xyz 2 
dd 3 

CODE:

#include<stdio.h>
#include<string.h>
FILE *f1 = fopen("m.inp","r");
FILE *f2 = fopen("m.out","w");

struct tu
{
	char nd[100];
	int xh;
};
tu ds1[100],ds2[100];
int n1=0,n2=0;

void tachtu(char s[],tu ds[],int &n)
{
	char *q=strtok(s," ");
	while(q!=NULL)
	{
		strcpy(ds[n].nd,q);
		ds[n].xh=1;
		n++;
		q=strtok(NULL," ");
	}
}

void loaitu()
{
	int i,j,b[100]={0},c[100]={0};
	for(i=0;i<n1;i++)
	{
		for(j=0;j<n2;j++)
		{
			if(strcmp(ds1[i].nd,ds2[j].nd)==0)
			{
				ds1[i].xh++;
				ds2[j].xh++;
			}
		}
	}
	
	for(i=0;i<n1;i++)
	{
		if(b[i]==0)
		{
			b[i]=1;
			for(j=i+1;j<n1;j++)
				if(ds1[i].xh>1 && strcmp(ds1[i].nd,ds1[j].nd)==0)
					{
						b[i]++;
						b[j]=-1;
					}
			if(ds1[i].xh>1) fprintf(f2,"%s %d
",ds1[i].nd,ds1[i].xh);
		}
	}
}

main()
{
	int t;
	fscanf(f1,"%d
",&t);
	
	while(t--)
	{
		char s1[100],s2[100];
		fgets(s1,10000,f1);
		if(s1[strlen(s1)-1]=='
') s1[strlen(s1)-1]='';
		
		fgets(s2,10000,f1);
		if(s2[strlen(s2)-1]=='
') s2[strlen(s2)-1]='';
		
		n1=n2=0;
		tachtu(s1,ds1,n1);
		tachtu(s2,ds2,n2);
		loaitu();
		fprintf(f2,"
");
	}
}

Phần đếm số xuất hiện các từ chung của e bị sai. Ai xem giúp vs ạ. E cám ơn.

*grab popcorn* viết 19:56 ngày 30/09/2018

Phần đếm thì đúng nhưng in ra lại bị sai :?
Do đâu thì do đoạn bạn in ra mình ko debug nổi @_@
Nên mình recode lại luôn

for(j=0;j<n2;j++) c[j]=1;
for(i=0;i<n1;i++) {
	for(j=0;j<n2;j++) {
		if(!strcmp(ds1[i].nd,ds2[j].nd)&&c[j] && ds2[j].xh>1)  {
			c[j] = 0;
			printf("%s %d\n",ds1[i].nd,ds2[j].xh);		
		}
	}
}
Linh Trần viết 19:48 ngày 30/09/2018

Cám ơn b nhiều. CODE của m chạy ra chỉ đúng phần tìm từ chung, còn đếm từ thì sai. Biết code đếm như vậy là sai nhưng lại chưa biết sửa thế nào

*grab popcorn* viết 19:59 ngày 30/09/2018

Mình test thấy code đếm bạn đúng rồi :v
In ra sai thôi.

Linh Trần viết 19:46 ngày 30/09/2018

Vậy lạ nhỉ? Lúc thi mình cx phải in ra file .inp nên in sai là tạch luôn r

Linh Trần viết 19:59 ngày 30/09/2018

CODE:

#include<stdio.h>
#include<string.h>
FILE *f1 = fopen("m.inp","r");
FILE *f2 = fopen("m.out","w");

struct tu
{
	char nd[100];
	int xh;
};
tu ds1[100],ds2[100];
int n1=0,n2=0;

void tachtu(char s[],tu ds[],int &n)
{
	char *q=strtok(s," ");
	while(q!=NULL)
	{
		strcpy(ds[n].nd,q);
		ds[n].xh=1;
		n++;
		q=strtok(NULL," ");
	}
}

void loaitu()
{
	int i,j;
	for(i=0;i<n1;i++)
	{
		for(j=0;j<n2;j++)
		{
			if(strcmp(ds1[i].nd,ds2[j].nd)==0)
			{
				ds1[i].xh++;
				ds2[j].xh++;
			}
		}
	}
	
	for(i=0;i<n2-1;i++) 
	{
		for(j=i+1;j<n2;j++) 
			if(strcmp(ds2[i].nd,ds2[j].nd)==0) ds2[j].xh++;
	}
		
	int c[100]={0};
	for(j=0;j<n2;j++) c[j]=1;
	for(i=0;i<n1;i++) 
	{
		for(j=0;j<n2;j++) 
		{
			if(!strcmp(ds1[i].nd,ds2[j].nd)&&c[j] && ds2[j].xh>1) 
			{
				c[j] = 0;
				fprintf(f2,"%s %d\n",ds1[i].nd,ds2[j].xh);		
			}
		}
	}
}

main()
{
	int t;
	fscanf(f1,"%d\n",&t);
	
	while(t--)
	{
		char s1[100],s2[100];
		fgets(s1,10000,f1);
		if(s1[strlen(s1)-1]=='\n') s1[strlen(s1)-1]='\0';
		
		fgets(s2,10000,f1);
		if(s2[strlen(s2)-1]=='\n') s2[strlen(s2)-1]='\0';
		
		n1=n2=0;
		tachtu(s1,ds1,n1);
		tachtu(s2,ds2,n2);
		loaitu();
		fprintf(f2,"\n");
	}
}

B ơi nếu mình sửa INPUT là:

2 
abc ab ab ab abcd ab 
abc xyz abc ab ddd ab                (có thêm nhiều từ chung ab, abc,xyz ở xâu s2)
aaa xyz ab zzz abc dd dd abc 
dd xyz ttt sas cdc xyz

thì OUTPUT của m lại là:

abc 2
abc 3
ab 5
ab 6

xyz 2
xyz 3
dd 3

M có bổ sung CODE thêm tí nhưng lại in thừa mất. Vì để nguyên CODE của b thay thử vào INPUT mới của m thì nó chưa ra đúng. B xem hộ m vs?

Linh Trần viết 19:56 ngày 30/09/2018

À thôi m giải đc r b nhé.

nhatlonggunz viết 19:45 ngày 30/09/2018

Mấy anh viết code viết cách cách ra được hông :’( nhìn code là hết muốn làm gì nữa rồi :’(

Bài liên quan
0