东华大学 oj92——字符串统计

  • Post author:
  • Post category:其他


问题描述 :

明明最近在做一个有关字符串的统计工作。两个由小写字母组成的字符串s1和s2,明明需要统计出以下四种关系:

(1)在s1或s2中存在的字母(包括在s1和s2中都存在的字母);

(2)在s1中且在s2中的字母;

(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母;

(4)不在s1中且也不在s2中的字母;

例如两个字符串s1为“lkjsvoahs”,s2为“qglhskjdfg”:

(1)在s1或者在s2或者s1、s2中都存在的字母:adfghjkloqsv;

(2)在s1中且在s2中的字母:hjkls;

(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母:adfgoqv;

(4)不在s1中且也不在s2中的字母:bceimnprtuwxyz;

明明统计了很久,但是由于统计过程十分繁琐,且很容易出错,导致明明的进度非常慢,很有可能因为统计不完而错过了晚上的约会。因此明明想请你帮个忙,帮他写一个程序,用程序来统计出以上几项内容。

明明的问题可以归结为:

输入两串由小写字母组成的字符串s1和s2,比较其中的字母,输出以下四项,输出的字母以字典顺序排列:

(1)在s1或s2中存在的字母(包括在s1和s2中都存在的字母);

(2)在s1中且在s2中的字母;

(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母;

(4)不在s1中且也不在s2中的字母;

例如字符串s1为sadf,s2为asdf,则需输出以下四行(注意输出的格式):

in s1 or s2:adfs

in s1 and s2:adfs

in s1 but not in s2 ,or in s2 but not in s1:

not in s1 and s2:bceghijklmnopqrtuvwxyz

输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据两行,每组测试数据的第一行为字符串s1,每组测试数据的第二行为字符串s2;s1和s2都由小写英文字母组成,且长度不超过26个字符。测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。

每组运算结果由四行组成:

第一行为在s1或者在s2或者s1、s2中都存在的字母;

第二行为在s1中且在s2中的字母;

第三行为在s1中但不在s2中的字母,在s2中但不在s1中的字母;

第四行为不在s1中且也不在s2中的字母;

具体格式请参考样例输出。

每组运算结果其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。

注:通常,显示屏为标准输出设备。

输入范例 :

sadf

asdf

lkjsvoahs

qglhskjdfg

输出范例 :

in s1 or s2:adfs

in s1 and s2:adfs

in s1 but not in s2 ,or in s2 but not in s1:

not in s1 and s2:bceghijklmnopqrtuvwxyz

in s1 or s2:adfghjkloqsv

in s1 and s2:hjkls

in s1 but not in s2 ,or in s2 but not in s1:adfgoqv

not in s1 and s2:bceimnprtuwxyz

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

typedef struct{
	int flaga[30];
	int flagb[30];
}flags;

int main(int argc, char *argv[]) {
	char s1[30],s2[30],len1,len2,i;
	flags flag;
	int temp;
	while(gets(s1) != NULL){
		gets(s2);
		len1=strlen(s1);
		len2=strlen(s2);
		//初始化
		for(i=0;i<30;i++){
			flag.flaga[i]=flag.flagb[i]=0;
		}

		//将字符数组s1,s2分别转换成对应数字,给a,b数组对应数字下标的数据标记
		for(i=0;i<len1;i++){
			temp=s1[i]-'`';
			flag.flaga[temp]=1;
		}
		for(i=0;i<len2;i++){
			temp=s2[i]-'`';
			flag.flagb[temp]=1;
		}

		printf("in s1 or s2:");
		for(i=0;i<30;i++){
			if(flag.flaga[i]==1||flag.flagb[i]==1)
				printf("%c",i+96);
		}
		printf("\n");
		printf("in s1 and s2:");
		for(i=0;i<30;i++){
			if(flag.flaga[i]==1&&flag.flagb[i]==1)
				printf("%c",i+96);
		}
		printf("\n");
		printf("in s1 but not in s2 ,or in s2 but not in s1:");
		for(i=0;i<30;i++){
			if((flag.flaga[i]==1&&flag.flagb[i]!=1)||(flag.flaga[i]!=1&&flag.flagb[i]==1))
				printf("%c",i+96);
		}
		printf("\n");
		printf("not in s1 and s2:");
		for(i=1;i<27;i++){
			if(flag.flaga[i]==0&&flag.flagb[i]==0)
				printf("%c",i+96);
		}
		printf("\n\n");
	}
	return 0;
}



版权声明:本文为qq_44169095原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。