输入10个字串,印出共有多少不同的子句?

Home Home
引用 | 编辑 karen7710
2007-06-09 18:51
楼主
推文 x0
请问大大以下这个题目应该怎么写呢?
题目:
输入10个字串,每个字串 ..

访客只能看到部份内容,免费 加入会员



献花 x0
引用 | 编辑 GNUGCC
2007-06-09 22:47
1楼
  
可能的做法是先配置一块二维阵列储存找到的字串
当然最好是可以用动态配置记忆体的方式比较省记忆体
然后再根据找到的字串先记录在二维阵列可以用在
之后找到相同的字串的时候记录出现字串的次数...

这个是我目前想到的...你可以先试着写看看...^^

献花 x0
引用 | 编辑 a86980
2007-06-10 11:11
2楼
  
这个题目有一点排列组合的味道

所以要套用到排列组合的公式

.
.
.
.
.
.
.

排列组合的方式

偶忘光了 表情

献花 x0
引用 | 编辑 karen7710
2007-06-10 15:36
3楼
  
我只会设输入10个字串,跟字串长度的限制,

印出有多少不同的子句不知道要怎么写?

下面是输入10个字串跟长度限制的程式,
复制程式
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
    char a[10][49];
    int i; 
    printf("输入十个字串\n"); 
      for(i=0;i<10;i++)
       {
           gets(a[i]); 
       }
     system("pause");
     return 0;   
}


献花 x0
引用 | 编辑 ladese05
2007-06-10 20:02
4楼
  
表情 表情 表情
已经存到ARRAY了
直接比对他们就OK拉
用个COUNTER计算有几个不同
如果不知道怎么下手
你先从比对2个字串开始写
2个字串会了
10个自然迎刃而解

献花 x0
引用 | 编辑 gamewalk
2007-06-11 05:47
5楼
  
我的想法是前面应该就先把输入的字串存起来,在来应该就会用到strtok(切割字串)跟strcmp(比对字串,但是有分大小写)...

最后我的作法可能对不懂指标的人有点难,就是先建立一个结构里面就放 子句,次数和一个指着与自己相同结构的指标, 以LinkList的形式来做新增....不过如果不懂指标 还是不建议你用....可以参考其他大大的写法...

献花 x0
引用 | 编辑 karen7710
2007-06-11 19:40
6楼
  
因为一个字串里,会有好几个子句,
那就不能直接二个字串比较,要先把自己字串里的子句先比较!
那用strcmp(a,??),问号那里要打什么跟a比较呢?

献花 x0
引用 | 编辑 GNUGCC
2007-06-11 23:13
7楼
  
如果输入一个字串然后用空白字元做间隔当做下一个字串的开始
可能必需先用回圈找出每个阵列储存的字串中那些地方有空白字元并且
做比对动作应该可以解决这个问题...

献花 x0
引用 | 编辑 gamewalk
2007-06-12 00:40
8楼
  
你也可以把切割出来的子句再找个地方放 , 这种新增动作是用动态配制比较好...但是如果不会的话那就宣告一个存放子句的阵列以及一个计数的阵列至于多大自己设吧... , 然后比对如果比对完没有相同的就新增一个需要比对的子句并且在他的计数栏设为 1 (因为第一个自己要算 ),若有相同的就只要在他计数栏+1即可....

献花 x0
引用 | 编辑 GNUGCC
2007-06-12 00:58
9楼
  
这个范例会用到几个函式库,例如像 strcpy(), strchr(), strcmp() 或是 strcmpi()...
我建议你可以先查询这些函式库的使用方式及参数型态
并试着写看看然后 po 出来有问题的地方比较好给答案...

献花 x0
引用 | 编辑 karen7710
2007-06-12 21:05
10楼
  
不好意思,我真的想不出来要怎么比较>"< 表情
我目前有教到strcpy(), strcmp()可是不太会运用!
麻烦大大可以提示一下大概要怎么打~ 谢谢啰^^

献花 x0
引用 | 编辑 GNUGCC
2007-06-13 01:24
11楼
  
// 储存输入的字串
char string_save[10][50];
// 储存 string_save 找到的字串
char find_string[100][50];
// 记录字串出现的笔数
int find_count[100];

void FindCompare(void)
{
  int i, j, k, v;
  for ( i = 0, v = 0; i < 10; i++ )
  {
    for ( j = 0, k = strlen(string_save)); j <= k; j++ )
      if ( string_save[j]) == 32 || j == k )
      {
        string_save[j] = 0;
        for ( int f = 0; f < 100; f++ )
          if ( strlen(find_string[f])) == 0 )
          {
            strcpy(find_string[f], string_save + v);
      find_count[f]++;
      break;
          }
          else if ( strcmpi(find_string[f], string_save + v) == 0 )
          {
            find_count[f]++;
      break;
          }      

          v = j + 1;
      }

      v = 0;
  }
}

上面的函式只负责从 string_save 阵列中找出字串重复
的次数, 要记得在你写的主程式内将输入的字串存在
string_save 阵列内, 输入的字串大小不要超过 49 个字元,
假如要输入的字串会很大的话请自行调整阵列大小...
如果程式看不懂的话再拿出来讨论吧... 祝你成功^^

如果程式写的不好的话请多多包含...欢迎指教^^

献花 x0
引用 | 编辑 GNUGCC
2007-06-13 01:32
12楼
  
因为 po 上去的时候发现有些字没有在里面所以做了更新 :

// 储存输入的字串
char string_save[10][50];
// 储存 string_save 找到的字串
char find_string[100][50];
// 记录字串出现的笔数
int find_count[100];

void FindCompare(void)
{
int i, j, k, v;
for ( i = 0, v = 0; i < 10; i++ )
{
  for ( j = 0, k = strlen(string_save[ i ]); j <= k; j++ )
    if ( string_save[ i ][ j ] ) == 32 || j == k )
    {
    string_save[j] = 0;
    for ( int f = 0; f < 100; f++ )
      if ( strlen(find_string[ f ]) == 0 )
      {
        strcpy(find_string[ f ], string_save[ i ] + v);
    find_count[f]++;
    break;
      }
      else if ( strcmp(find_string[ f ], string_save[ i ] + v) == 0 )
      {
        find_count[f]++;
    break;
      }    

      v = j + 1;
    }

    v = 0;
}
}

献花 x1
引用 | 编辑 gamewalk
2007-06-13 05:07
13楼
  
楼上的GNUGCC大大...虽然你改了但是还是有一个地方被系统吃掉了....提醒你一下 希望别介意 表情
if ( string_save[ i ][ j ] ) == 32 || j == k )
{
string_save[j] = 0; <-----这里 应该是 string_save[ i ][ j ] 我想那个 [ i ] 又被吃掉了 我之前也遇过
for ( int f = 0; f < 100; f++ )
if ( strlen(find_string[ f ]) == 0 )
{
strcpy(find_string[ f ], string_save[ i ] + v);
find_count[f]++;
break;
}
else if ( strcmp(find_string[ f ], string_save[ i ] + v) == 0 )
{
find_count[f]++;
break;
}
v = j + 1;
}

其实GNUGCC大大的方法就可以了....不过看起来好像有点复杂 表情 ...如果逻辑不好的人可能很快就挂了... 像我就快挂了 表情

献花 x0
引用 | 编辑 GNUGCC
2007-06-13 07:34
14楼
  
呵呵^^昨天看了很久还是有漏网之鱼啊...感谢 gamewalk 大大的指教...感激不尽
在下的程式功力浅薄欢迎网上大大能提供更好的演算法解决这个问题...^^

献花 x0
引用 | 编辑 gamewalk
2007-06-13 17:43
15楼
  
下面是引用GNUGCC于2007-06-13 07:34发表的 :
呵呵^^昨天看了很久还是有漏网之鱼啊...感谢 gamewalk 大大的指教...感激不尽
在下的程式功力浅薄欢迎网上大大能提供更好的演算法解决这个问题...^^


其实只是我觉得一般这样使用的话会很容易自乱阵脚...但是GNUGCC大大却能运用自如... 表情

也许多加一些注解看起来就不会那么复杂了...不过楼主看得懂的话...那就不用了...
因为这又不是为我写得 表情

P.S.还有就是贴程式码用"插入代码"这个功能 , 应该就不会发生那种 [ i ] 被吃掉的问题了...
(虽然这么说但是我也常常忘记用)

献花 x0
引用 | 编辑 karen7710
2007-06-13 21:32
16楼
  
我加上我之前输入10个字串的程式后,好像出现错误不能跑,麻烦大大看看哪里出错!
复制程式
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void FindCompare(void);

int main(void)
{
char string_save[10][50];
char find_string[100][50];
int a,find_count[100];
 
    printf("输入十个字串\n"); 
      for(a=0;a<10;a++)
       {
           gets(string_save[a]); 
       }
     FindCompare();
     system("pause");
     return 0;   
}


void FindCompare(void)
{
char string_save[10][50];
char find_string[100][50];
int find_count[100];     
int i, j, k, v;
for ( i = 0, v = 0; i < 10; i++ )
{
  for ( j = 0, k = strlen(string_save[ i ]); j <= k; j++ )
    if ( string_save[ i ][ j ] ) == 32 || j == k )
    {
    string_save[i][j] = 0;
    for ( int f = 0; f < 100; f++ )
      if ( strlen(find_string[ f ]) == 0 )
      {
        strcpy(find_string[ f ], string_save[ i ] + v);
    find_count[f]++;
    break;
      }
      else if ( strcmp(find_string[ f ], string_save[ i ] + v) == 0 )
      {
        find_count[f]++;
    break;
      }     

      v = j + 1;
    }

    v = 0;
}
} 


献花 x0
引用 | 编辑 GNUGCC
2007-06-13 22:13
17楼
  
char string_save[10][50];
char find_string[100][50];
int find_count[100];  

把上面的阵列放在函式外面,包括主程式和 FindCompare 函式都不要有阵列的宣告...
呼叫完 FindCompare 函式记得要在加上输出的程式列出搜寻结果...
或许可以先把阵列内的变数值先设为 0 确保资料不会有问题^^

在做测试的时候记得字串跟下一个字串要用空白隔开因为程式里有用到是否遇到空白字元 :

if ( string_save[ i ][ j ] ) == 32 || j == k )

代码 32 代表的是空白字元, 先这样试看看...^^

献花 x0
引用 | 编辑 gamewalk
2007-06-13 22:41
18楼
  
好像又看到一个问题 表情
if ( string_save[ i ][ j ] ) == 32 || j == k ) <--里面string_save[ i ][ j ]前面 好像少了一个左括号" ( "

献花 x0
引用 | 编辑 GNUGCC
2007-06-13 23:11
19楼
  
的确...再次感恩 gamewalk 大大...
下面才是正确的...

if ( (string_save[ i ][ j ]) == 32 || j == k )

今天怎么搞的 ??? 连我自已也不知道...

献花 x0
引用 | 编辑 karen7710
2007-06-14 08:09
20楼
  
更改过后的程式,还是有错误~
出现这个错误:
  In function `FindCompare':
35 'for' loop initial declaration used outside C99 mode
复制程式
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void FindCompare(void);
char string_save[10][50];
char find_string[100][50];
int find_count[100];  

int main(void)
{

int a;
 
    printf("输入十个字串\n"); 
      for(a=0;a<10;a++)
       {
           gets(string_save[a]); 
       }
     FindCompare();
     system("pause");
     return 0;   
}


void FindCompare(void)
{
   
int i, j, k, v;
for ( i = 0, v = 0; i < 10; i++ )
{
  for ( j = 0, k = strlen(string_save[ i ]); j <= k; j++ )
    if ( (string_save[ i ][ j ] ) == 32 || j == k )
    {
    string_save[i][j] = 0;
    for ( int f = 0; f < 100; f++ )
      if ( strlen(find_string[ f ]) == 0 )
      {
        strcpy(find_string[ f ], string_save[ i ] + v);
    find_count[f]++;
    break;
      }
      else if ( strcmp(find_string[ f ], string_save[ i ] + v) == 0 )
      {
        find_count[f]++;
    break;
      }     

      v = j + 1;
    }

    v = 0;
}
} 


献花 x0
引用 | 编辑 gamewalk
2007-06-14 15:54
21楼
  
请问你是要用 c 还是 c++ 如果副档名是.cpp的话应该是正常 , 若是.c的话把FimdCompare 里面的
for (int f = 0; f < 100; f++ ) 里面的 int f 改成 宣告在前面变数那边...,也就是这里会变成
for( f= 0; f < 100; f++ )

献花 x1
引用 | 编辑 karen7710
2007-06-14 18:47
22楼
  
原来如此,谢谢啰!
那要印出来的话printf里面应该打什么呢?

献花 x0
引用 | 编辑 gamewalk
2007-06-14 19:14
23楼
  
复制程式
  for( a = 0 ; a < 100 ; a++ )
  {
       if( find_string[a][0] == 0 ) //当find_string[a]是空的,表示是最后一个...就break跳出 
           break;
       else
           printf("%s : %d次\n",find_string[a],find_count[a]);
  }

要印的话...应该就这样吧

献花 x0
引用 | 编辑 karen7710
2007-06-14 19:31
24楼
  
嗯嗯,感谢你的回答喔^^ 表情

献花 x0