| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2778 人关注过本帖
标题:初学C语言的新手遇到了一个难以解决的问题,请求高手指点
只看楼主 加入收藏
Pancras
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-11-7
收藏
 问题点数:0 回复次数:5 
初学C语言的新手遇到了一个难以解决的问题,请求高手指点
我先列一下问题吧,拍的看不清纯手打,保证无错字漏字。
编写一个程序,输入一个英文句子,然后使用如下规则对该句子中的每一个单词进行处理:
1.如果该单词是第一次出现,则保持其原样
2.如果该单词是第二次出现,则将它复制一遍
3.如果该单词是第三次或第三次以上出现,则将它删除
经过上述处理之后,将会得到一个新的句子,然后将该句子打印出来。
说明:①必须将新生成的句子保存在一个字符数组中,然后再整体打印出来,不能一个单词一个单词地打印;②由于句子当中包含空格,所以应该用gets函数来输入这个句子,不要用scanf;③输入的句子当中只包含英文字母和空格,单词之间用一个空格隔开;④不用考虑单词的大小写,假设输入的都是小写字母;⑤句子长度不超过500个字符,每个单词的长度不超过50个字符。
输入只有一行,即一个英文句子
输出只有一行,即一个英文句子
示例
jungle bells jungle bells jungle all the way
jungle bells junglejungle bellsbells all the way
我的问题主要在于如何一个一个接收单词并计算次数,接下来的操作也不太会,查了一天资料还是一脸懵
顺便说一句,我才刚刚学到数组,只会基本的定义和倒序输出,这个问题算不算难啊???
谢谢各位能看到我的问题,如果能帮忙解决一下就更好了,感激不尽
搜索更多相关主题的帖子: 输入 单词 出现 字符 空格 
2018-11-07 18:45
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:633
专家分:3045
注 册:2011-4-22
收藏
得分:0 
1,单词是毫无疑问以空格或回车区分的。
2,一旦得到一个单词,马上入库(单词数组)并进行比对
2018-11-07 18:57
Pancras
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-11-7
收藏
得分:0 
回复 2楼 zbjzbj
这个单词数组是一开始定义的容量为500的整个句子的数组么
还是说把每个单词再定义成一个字符串?
2018-11-07 20:14
豆豆的滴
Rank: 9Rank: 9Rank: 9
来 自:湖南
等 级:贵宾
威 望:33
帖 子:368
专家分:1087
注 册:2018-5-7
收藏
得分:0 
是输入一个单词就与数组内的单词匹配吧
也就相当于2个字符串匹配的问题吧
2018-11-07 20:43
Tomorrw_I
Rank: 10Rank: 10Rank: 10
等 级:禁止访问
威 望:6
帖 子:406
专家分:1712
注 册:2018-10-16
收藏
得分:0 
#include "stdafx.h"
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{   
    char array[500],arrayA[500][50];     //一维数组,用来获取键盘输入的句子!  二维数组用来保存每一个单词
    char arrayB[500];                    //arrayB[500]用来保存空格在原一维数组中的位置
    arrayB[0] = 0;
    int j=1,m=0;
    int n = 0;
    gets(array);                         //获取输入
    for (int i = 0; i < 500; i++)        //遍历一维数组
    {
        while (array[i] == ' ');         //空格获取
        {
            arrayB[j] = i;               //将空格位置保存进arrayB数组中
            j++;                         //保存array的空格个数,原值为1,j最终保存了总单词数
        }
        while (array[i] == '\0')         //用来判断数组array保存的语句结束
        {
            m = i-1;                     //m保存array数组中最后一个有效字符的下标
            i = 500;                     //跳出for循环
        }
    }
    for (int i = 0; i <=j+1; i++)        
    {

    }
    return 0;
    /*输入的句子,在array中的结构都出来了!    array[m]是最后一个字符的下标!
      arrayB[500]这个数组,保存了所有空格在array数组中的下标,共j个单词
      原意是用二位数组arrayA[500][50],根据空格位置,还有单词总数,做一个循环,将每个单词保存进二维数组的每一行!
      然后用二位数组,进行单词比较!进行题目的1-2-3的操作!

      今天喝了点酒,这会有点懵逼,下面的事情,其他大神帮忙吧!

      鉴于楼主只学到数字,只用数组实现, 如果能用其他方式,就好办多了

    */
}

学C有用吗?
学C++有前途吗?
数据库有必要学吗?
……
别问,你还什么都不会,学就对了
……
2018-11-07 20:58
Mr_doge
Rank: 5Rank: 5
等 级:贵宾
威 望:10
帖 子:159
专家分:385
注 册:2018-6-28
收藏
得分:0 
楼上的,你打那么详细干啥,大纲讲一下自己动手丰衣足食才是好,现成代码就是过眼云烟,不是自己打的记不住的

废话讲完,开始给大纲

处理方式
方案1

首先,声明一个读取输入的缓存数组char input[],越大越好,最好1000,反正1000个char类型洒洒水啦(按照题目要求的话不能小于501以免出现各种问题)

然后,声明一个用于存储单词的字符串的数组char cache[],不得小于501,接着声明一个处理用指针数组char * p1[]和接收指针数组char * p2[](这两个指针数组都得不小于500/2),用来处理单词字符串数组的排查之类

最后,声明一个用于存储输出的单个句子的字符串的char数组char output[],该数组依旧不应小于501

读取输入并存至input,计算intput大小,大于501个字符直接输出表示输入超出500字符巴拉巴拉,然后退出(怎么退出?if和else啥的怎么用自己看书)

将input用字符串处理的函数指令复制至cache,然后用一个循环把空格全变'\0',并把除结尾的'\0'外每一个'\0'后的字符地址传递给p[n]并把n单独赋值出去,n为该循环的循环次数也是单词个数,这样就把单个char数组变成字符串数组了

然后就是喜闻乐见的排查时间,p1暴力法循环校验单词一致性,没问题传递指针至p2,有问题+1,2次则被校验到的靠后的成员赋值NULL,循环遇见的NULL都跳过,至于校验一致性计数这种细节麻烦活请自行体会下变量处理的麻烦性,以增加抗晕能力

经过这个复杂的麻花校验循环,p2的指针数组里的字符串就是我们需要的结果,使用一个循环,将所有'\0'变为空格输入(最后一个不变)传输至output
printf("%s",output);
问题解决
(没错程序已经在脑里过一遍了,但是我懒,希望你别一样懒,自己码出来吧,现在不行,学学,过阵子再试)

方案n
高效率办法静待dalao表演,什么快速算法啊表啊链表啊树啊,在下太菜不会,告辞

另外这种处理根本不是给真新手玩的,是给对指针,数组,字符串,函数都非常熟悉的老司机玩的,会玩这个题的根本不能称之新手啊mmp,突然给初学C的这种题,你不懵逼我先懵逼
2018-11-08 06:36
快速回复:初学C语言的新手遇到了一个难以解决的问题,请求高手指点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026927 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved