C语言,有道题目,将 "I am a boy"这句话中的单词按由短到长的顺序排列,用指针来做这题~~~希望大虾帮助一下~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言,有道题目,将 "I am a boy"这句话中的单词按由短到长的顺序排列,用指针来做这题~~~希望大虾帮助一下~相关的知识,希望对你有一定的参考价值。

我把它做出来了, 你看下。。。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);

参考技术A 给你点提示哈,判断一个单词结束的标准就是它后面有无空格 或者是不是最后一个字符。了解了这一点就可以把单词扣出来,然后用strlen来算长度,按照长度排序就行了追问

我写了个程序哦,您看下行吗?#include
#include
char str[],in_str[];
int i,length,maxlength=1;
char ch;
gets(str);
while (str[i]!='\0')
if(str[i]!=" ")
start=i;
else
end=i-1;break;

i++;
strchr(in_str,str[end]);
length=strlen(in_str);
if(length>maxlength)
maxlength=length;
printf("%c",str[end]);

追答

很多错误啊

关于c语言的小问题

157. main ( )
union int k; char i[2]; a, *s = &a ;
s -> i[0] = 0x39; s -> i[1] = 0x38; printf ( " %x \n ", s -> k ) ;

这个怎么看啊~输出值是什么?为什么?

107. int i;
main ( )
int i = 1, j = 2;
fun ( fun (i, &j ), &j );

fun ( int a, int *b )
static int m = 2;
i += m + a; m = ++( *b );
printf (" %d, %d ", i, m);
return ( m );

这个程序是怎么运算的啊,i是全局变量吗?那么在函数fun里面它的初值还是1吗?第二次m的值又是多少

44. 若有以下定义语句:int m[ ] = 5, 4, 3, 2, 1 ,i = 4;, 则下面对m数组元素的引用中错误的是:
A) m[ --i ] B) m [ 2*2 ] C) m [m[0] ] D) m [ m[i] ]
C和D的区别是什么啊?

不好意思,开始的时候看花眼了

157.该提输出值不确定,因为C++中规定,新声明的变量如果没有付初值则该变量的默认值将随机出现。如果在s->i[0]=0x39以前,先s->k=0,则将输出14393.
联合体的所占内存的大小等于其内所占内存最多的成员,因此,这个联合体的长度是4个字节。而k,i[0],i[1]共享这四个字节,其中i[0]为低八位,i[1]为次低八位,k占所有的四位。如果有s->k=0时内存空间中内容的二进制表示为32个0,而0x39=00111001,0x38=00111000,因此赋值后内存中的二进制表现是
00000000000000000011100100111000=十进制的14393
107.改程序考察三个知识点,第一个是,为函数传递参数的两种方式,传值和传地址的区别(还有一种是传引用,此处没考)。第二个是static修饰符的性质。第三个是++运算符的使用。
传值调用时函数在函数体中对形参的赋值不会改变实参的值,举个例子
fun(int i)

i=1;

main采用如下方式调用
main()

int n=0;
fun(n);

fun(n)运行后,main中n的值依旧为0
传地址调用会将地址传送给函数,对形参的改变会导致实参的值发生变化。比如:
fun(int *i)

*i=1;

main中采用上面相同的调用方式调用函数fun(n)后,n的值变为1。
函数中static修饰的变量声明语句只在第一次运行到该语句的时候有效,其他时间被忽略,函数结束后,对static修饰的变量所进行的修改值保留。
++运算符当放置在变量之前的时候表示先增值在引用,比如
int i=5;
int b=0;
b=++i;
则先i=i+1,然后b=i,即b=6
当++放置在变量后面时表示先引用在增值。比如
int i=5;
int b=0;
b=i++;
则先b=i,然后i=i+1,即b=5
当fun(fun(i,&j),&j)被调用的时候,首先括号内的fun(i,&j)先被运行,进入fun函数中后,形参a=1,b为j的地址,*b=2,static int m=2第一次运行,因此该语句有效,此时m=2。i+=m+a,即i=3,m=++(*b),首先*b=*b+1,然后m=*b,因此m=3,注意这里由于b的地址指向实参j的地址,因此实参j的值变为2,fun函数返回,返回值为3。回到main调用外层的fun函数又进入fun函数体,当执行到static int m=2时,由于前面已经调用过一次该语句,因此该语句被忽略,此时m为上一次运行后的结果,即m=3.形参a=3,b为j的地址,此时的值为2,运行i+=m+a,结果为6,m=++(*b)后结果为4,*b结果为4.
这里还隐藏着一个知识点,即++和*两个运算符的先后问题,例如:
int a=10;
int *b=a;
int c1=0,c2=0;
c1=++(*b);
c2=*(++b);
运行结果c1=11,那么c2等于多少呢?c2将为一个随机的数值,++b以后,b所指向的内存不再是a的地址,因此使用*求值会得到一个随机的值
44.语法上都没有错误。但C选项引用方式会报错,原因是m[0]=5,而数组m合法下标为0,1,2,3,4,因此m[m[0]]=m[5],下标溢出
参考技术A 晕,学了一学期c
竟还是看不懂你的题
union 公用体 老师说不考 s -> i[0] = 0x39 这个没看懂
fun ( fun (i, &j ), &j );函数前怎么没声明啊,还嵌套调用,i在fun函数中怎么没有初始值呢,i的作用域只在main函数。
参考技术B s -> i[0] = 0x39; s -> i[1] = 0x38; printf ( " %x \n ", s -> k ) ;
0x39是十六进制输出3*16+9=57

i是全局变量!i的初值在main中初始的在fun中也是1(最先)。

C中m[0]=5,则m[m[0]]即m[5],因为m的长度是5,所以m【】是从0开始的,所以m[]最大是4,
D中m[i]中i=4则m[i]=m[4]=1,所以m[m[i]]=m[1]=5是正确的引用
参考技术C 自己在电脑运行一下试试吧 一下子也说不明白的

以上是关于C语言,有道题目,将 "I am a boy"这句话中的单词按由短到长的顺序排列,用指针来做这题~~~希望大虾帮助一下~的主要内容,如果未能解决你的问题,请参考以下文章

国王的麦子,老题目,c语言(dev-c++),要高精度,输入第n格,输出那一格麦子数

C语言问题:字符串(单词)反转,例如:I am boy,反转为 I ma yob 简单实用,指针操作

关于c语言的小问题

求这道c语言的编程题

c语言将数组中的数逆序存放

C语言,将一个数组中的值按逆序重新存放