当前位置: 代码迷 >> C语言 >> c编程 字母排序
  详细解决方案

c编程 字母排序

热度:390   发布时间:2005-03-26 19:56:00.0
c编程 字母排序
最近有道题做不出来,是三级数据库还请高手指教 英文文章存放在xx数组中,函数StrOL()的功能以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排,最后把已处理的字符串,按行重新存入字符串xx中,最后调用函数输出。 例: You He Me I am a student. 结果: Me He You student a am I void StrOL(void) { inti,j,k,str1,l; char c; for(j=0;j<strlen(xx[i]);j++) { c=xx[i][j]; if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c==' '&&(c>=0&&c<=9)); else xx[i][j]==' '; } } for(l=0;l<maxlime;l++) { char ch[80]={0}; char pp[80]={0}; strl=strlen(xx[l]); i=str1-1; k=1; while(l) { while(((xx[l][i]>='a'&&xx[l][i]<='z')||(xx[l][i]>='A'&&xx[l][i]<='Z')||xx[l] [i]>='0'&&xx[l][i]<='9'))&&i>=0) /*处理字母和数字*/ { for(j=k;j>=0;j--) /*从当前行的最后一个字母开始取字符,直到遇到空格*/ pp[j+1]=pp[j]; pp[0]=xx[l][i]; /*这两句我有点看不懂,还请高手指教*/ k++;i--; } strcat(ch,pp); /*把该单词存放到数组中*/ strcpy(pp,""); /*清空数组pp*/ k=1; if(i==-1)break; /* 如果处理完了一行,则退出循环 */ while((xx[l][i]<'0'||xx[l][i]>'9')&&(xx[l][i]<'A'||xx[l][i]>'z')&&i>=0) /*处理空格*/ { for(j=k;j>=0;j--) pp[j+1]=pp[j]; pp[0]=xx[l][i]; k++; i--; } strcat(ch,pp); /*把空格加到数ch中*/ strcpy(pp,""); /*清空数组pp*/ k=0; if(i==-1)break; /*如果处理完了一行,则退出循环*/ } strcpy(xx[l],ch); /*把己处理的字符串仍按行重新存入字符串数组xx中*/ } }
搜索更多相关的解决方案: 字母  数据库  void  student  

----------------解决方案--------------------------------------------------------
"You He Me"
You和Me??
好强的E文!!!

这题好像不用三级数据库的知识吧,任何一个过二级C语言的学生都可以弄得出来.

----------------解决方案--------------------------------------------------------
这是计算机三级考试的题目。
----------------解决方案--------------------------------------------------------
哎哟!这位大哥这是三级里的题,是在我买的上机题库的书里带着的,就这么一道题,难道我还会闲着没事蒙大家不成。至于you me这是题目里自带的例子,只是说明这个函数要完成的功能,不是我的e文强!其实我的e文也不怎么样!如果明白的话,指点一下,救救我吧!
----------------解决方案--------------------------------------------------------

函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数StrOL(),其函数的功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT6.DAT中。

例如:原文:You He Me

I am a student.

     结果:Me He You

student a am I

原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。

部分源程序存在文件prog1.c中。

请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。

#include <stdio.h>

#include <string.h>

#include <conio.h>

#include <ctype.h>

char xx[50][80];

int maxline=0;/*文章的总行数*/

int ReadDat(void);

void WriteDat(void);

/*在无忧及捷成版模拟系统中都通过测试(输入文件句末有标点的在输出文件中句前有空格*/

void StrOL(void)

{ int i,j,k,s,m,strl;

char str[80];

for(i=0;i<maxline;i++)

{ strl=strlen(xx[i]);

memset(str,0,80);

s=k=0;

for(j=strl-1;j>=0;j--)

{ if(isalpha(xx[i][j])) k++;

else { for(m=1;m<=k;m++)

str[s++]=xx[i][j+m];

k=0;

}

if(!isalpha(xx[i][j])) str[s++]=' ';

}

for(m=1;m<=k;m++)

str[s++]=xx[i][j+m];

str[s]='\0';

strcpy(xx[i],str);

}

}

void main()

{

clrscr();

if(ReadDat()){

printf("数据文件IN.DAT不能打开!\n\007");

return;

}

StrOL();

WriteDat();

}

int ReadDat(void)

{

FILE *fp;

int i=0;

char *p;

if((fp=fopen("IN.DAT","r"))==NULL) return 1;

while(fgets(xx[i],80,fp)!=NULL){

p=strchr(xx[i],'\n');

if(p)*p=0;

i++;

}

maxline=i;

fclose(fp);

return 0;

}

void WriteDat(void)

{

FILE *fp;

int i;

clrscr();

fp=fopen("OUT6.DAT","w");

for(i=0;i<maxline;i++){

printf("%s\n",xx[i]);

fprintf(fp,"%s\n",xx[i]);

}

fclose(fp);

}

捷成版模拟系统中的解法

/*在无忧模拟系统中没通过测试(输入文件句末有标点的在输出文件中句前无空格*/

void StrOL(void)

{

int i, j ;

char word[21], yy[80], zz[80], *p ;

for(i = 0 ; i < maxline ; i++) {

p = xx[i] ;

j = 0 ;

memset(word, 0, 21) ;

memset(yy, 0, 80) ;

while(*p) {

if(isalpha(*p)) {

word[j++] = *p++ ;

if(*p) continue ;

}

strcpy(zz, yy) ;

sprintf(yy, "%s %s", word, zz) ;

j = 0 ;

memset(word, 0, 21) ;

while(*p && (!isalpha(*p))) p++ ;

}

strcpy(xx[i], yy) ;

}

}
----------------解决方案--------------------------------------------------------
  相关解决方案