问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言,有道题目,将 "I am a boy"这句话中的单词按由短到长的顺序排列...

发布网友 发布时间:2024-07-02 12:16

我来回答

2个回答

热心网友 时间:2024-10-13 00:55

我把它做出来了, 你看下。。。VC6.0编译通过。不保证这个方法最简单。。。
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
//以下是函数声明
int* GetWordLenth(char sentence[]);//得到每个单词的长度,数组保存
int *GetWordIndex(char sentence[]);//得到单词首字母在句子中的索引
int CountWord (char sentence[]);//计算单词的数量
int* OrderByIndex(char sentence[]);//对单词的长度排序,插入排序法
void PrintSentence(char sentence[]);
char* ConvertSentence(char sentence[]);//将句子按单词长度顺序重新组合
//以下是函数的定义
char* ConvertSentence(char sentence[])
{
int* index =OrderByIndex(sentence);
int *WordLen =GetWordLenth(sentence);
char* result = (char*)malloc(strlen(sentence)+1);
int num = CountWord(sentence);
int n = 0 ;
for(int i =0 ;i<num;i++)
{
int j = index[i];
while((sentence[j]!=' ') && (sentence[j]!='\0') )
{
result[n]=sentence[j];
n++;
j++;
}
result[n]=' ';
n++;
}
return result;
}
void PrintSentence(char sentence[])
{
int len=strlen(sentence);
for(int i =0;i<len;i++)
{
cout<<sentence[i];
}
cout<<endl;
}
int* OrderByIndex(char sentence[])//对单词的长度排序,插入排序法,返回排序后的索引
{
int num=CountWord(sentence);//取得单词个数
int* index=GetWordIndex(sentence);
int *WordLen =GetWordLenth(sentence);
for(int i=1;i<num;i++)//从第二个开始排起
{
//j为已排序区域最后一个
int j= i-1;//已经排好序的位置j
int x = WordLen[i];//保存要插入的数
int y = index[i];
//要插入的数和已排序区域的数比较,当要插入的数比比较的数小时,插入比较的数的左边
while ((j>=0) && (x<WordLen[j]))
{
WordLen[j+1]=WordLen[j];
index[j+1]=index[j];
j--;
}
WordLen[j+1]=x;
index[j+1]=y;
}
return index;
}

int* GetWordLenth(char * sentence)
{
int* index=GetWordIndex(sentence);//取得单词索引
int num=CountWord(sentence);//取得单词个数
int* WordLen =(int*)malloc(num*sizeof(int));
//取得前n-1 个单词的长度
for(int i =0; i<num-1;i++)
{
WordLen[i]=index[i+1]-index[i]-1;
}
//取得最后一个单词的长度
WordLen[num-1]=strlen(sentence)-index[num-1];
return WordLen;

}

int CountWord (char sentence[])//计算单词的数量
{
int num = 0;
for(int i=0;i<(int)strlen(sentence);i++)
{
if(sentence[i]==' ')
{
num++;
}
}
return ++num;
}

int* GetWordIndex(char sentence[])//得到单词首字母在句子中的索引
{
int num =CountWord(sentence);
int *Index=(int *)malloc(num*sizeof(int));
Index[0]=0;//第一个单词的首字母索引肯定为0
int j = 1;//lenth数组的索引
for(int i =0;i<(int)strlen(sentence);i++)//i是sentence[]的索引
{
if(sentence[i]==' ')//一个单词结束,记录索引
{
Index[j]=i+1;
j++;
}
}
return Index;
}

void main()
{
char sentence[] ="I am a boy";
char* res=ConvertSentence(sentence);
PrintSentence(res);

}

热心网友 时间:2024-10-13 01:02

给你点提示哈,判断一个单词结束的标准就是它后面有无空格 或者是不是最后一个字符。了解了这一点就可以把单词扣出来,然后用strlen来算长度,按照长度排序就行了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
易企秀如何分享链接给微信好友?-易企秀分享链接给微信好友的方法 华为荣耀3c系统辅助功能服务老是自动关闭,求解决方案。 我用一键清理忽... 华为荣耀3c手机双击唤醒屏幕不好用了怎么办? 荣耀手机刷机包从哪下 木地板为啥走过会响 瓷砖块要斜成几度角人踩上去不会烂 刚出生的婴儿肚子胀怎么办 新生儿涨肚子按摩图 刚生小宝宝胀气怎么办 白果怎么炒好吃 白果可以制作哪些美食 有道程序填空题,请高手帮帮忙,就一个空格,简单 我有道C语言题目~ 有兴趣请做做~~ 初学C++,有道题目帮忙解答下,可以+分. 阴历:二零二三年九月十六(阳历:2023年10月30日)出生的女宝宝取名_百度... 阴历:二零二三年八月廿六(阳历:2023年10月10日)出生的女宝宝取名_百度... don't put the dlib folder in your include path怎么解决 华为Mate60怎么充电 AB代表哪个对哪个是错 “AB”代表什么? word表格单倍行距还是很大word表格单倍行距还是很宽 为什么我设置的单倍行距还是很大? 为什么我的段落设置单倍行距后还是很大? 石狮的职校有哪些 山东省德州市作业本费怎么交 好听、声音美、可以让人听了心情就会喜悦的歌曲,可以达到放松心情,减少... 喜庆欢快的歌曲有哪些 奥沙利文球技好吗? 方向盘异常!大家帮忙看看? 喜悦歌曲有哪些 历史不会忘记这些曾经为新昌大佛龙井的茶人 微信退群,群主会知道吗? stretch lined tri blend是什么面料 双查双亮是什么意思? 一案双查的是什么意思? 师生双查是什么意思? 当飞利肝宁片美大康 痛立定的介绍 下列词语中加点字的读音完全不相同的一项是( ) A.百合拜倒摆门面稗官... 类+风+湿+因+子是什么?是不是引起类风湿关节炎的原因还是组成?我确实是... 贺州坐高铁到怀集要几长时间?什么时候开通 ? 我买车票贺州至怀集可以在高铁上补票到广州南吗? 孕妇喝水果榨汁搭配表 努比亚X如何实现无刘海全面屏和背面OLED屏幕的无缝切换? 厦门中升丰田4s店电话怎么样 为什么喝酒一定要喝纯粮食酒? 汉字危机主要表现在哪几方面 含有数字的词语或成语有 2024年属羊多大了虚岁 不同年份出生的属羊人命运 重庆海尔冰箱维修电话? 鬼打墙色是什么意思?