免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 1650 | 回复: 15
打印 上一主题 下一主题

菜鸟求救:关于一道三级上级题的困惑! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-09-10 17:23 |只看该作者 |倒序浏览
大虾们好,我是一名菜鸟,马上就要考三级,可是上机有许多问题,希望得到大家的帮助。
例子:一道题中,要我编制函数DELWORD()分别删除一篇英语文章中的各行的空格,标点,以及序列是基数的单词。余下的单词倒置后仍然按行顺序存入数组XX中。
答案
  1.         DELWORD()
  2.          {int i,j,k;
  3.                char word[21],*p;
  4.                char  str[80];
  5.                 for(i=0;i<maxline;i++)
  6.                  {memset(str,0,80);
  7.                    p=xx[i];
  8.                    j=0;
  9.                    k=0;
  10.                    memset(word,0,21);
  11.                    while(*P)
  12.                        {if(isalpha(*p))
  13.                           {word[j++]=*p++;
  14.                              if(*p)continue;}
  15.                           if(strlen(word))k++;
  16.                           if(k%2==0)strcat(str,strrev(word));
  17.                           j=0;
  18.                           memset(word,0,21);
  19.                           while(*p&&(!isalpha(*p)))p++;
  20.                          }
  21.                   strcpy(xx[i],str);
  22.                }
  23.           }      
复制代码

疑问一:题中的I表示行,K表示单词个数,J表示每个单词内的字母?可以这样理解吗?
疑问二:对于while语句和if语句里面的条件可以略写吗?
       while(*P)  if(isalpha(*p)   if(*p)
           while(*p&&(!isalpha(*p))) 等详细的条件是什么?
疑问三:j=0;
                  memset(word,0,21);
                  while(*p&&(!isalpha(*p)))p++;
           这三句怎么理解?为什么又定义j=o
           为什么第二次定义 memset(word,0,21);
            while里面的条件怎么理解?
因为我是自学的C,所以这道题有许多的疑问,大家可以帮忙一下,因为马上就考试了。在这里我谢谢了。

论坛徽章:
0
2 [报告]
发表于 2003-09-10 18:03 |只看该作者

菜鸟求救:关于一道三级上级题的困惑!

我知道我的问题对于大家太简单了,可是我真的搞不懂,可以帮帮忙吗?

论坛徽章:
0
3 [报告]
发表于 2003-09-10 18:19 |只看该作者

菜鸟求救:关于一道三级上级题的困惑!

兄弟,这程序你写的吗?下次贴程序时,把它排排好,大家都是有正经工作的人,这样会浪费别人很多时间的。。。。。。

论坛徽章:
0
4 [报告]
发表于 2003-09-10 18:39 |只看该作者

菜鸟求救:关于一道三级上级题的困惑!

我排好了呀,不过显示成这个样子,我也没有办法呀(我还重新编辑过)
不好意思,浪费了大家的时间,不过仍然希望得到大家的帮忙!

论坛徽章:
0
5 [报告]
发表于 2003-09-10 20:13 |只看该作者

菜鸟求救:关于一道三级上级题的困惑!

疑问一:题中的I表示行,K表示单词个数,J表示每个单词内的字母?可以这样理解吗?

I可以看作文章的行数,K指示当前行的第几个单词,J是当前所指的字母

疑问二:对于while语句和if语句里面的条件可以略写吗?
while(*P) if(isalpha(*p) if(*p)
while(*p&&(!isalpha(*p))) 等详细的条件是什么?

while(*P)表示P所指的字符不是空(也就是NULL)就进入WHILE循环
if(isalpha(*p))判断P所指的是不是字母
if(*p)判断P所指的是不是NULL
while(*p&&(!isalpha(*p)))
这个留给你自己思考吧^_^

疑问三:j=0;
memset(word,0,21);
while(*p&&(!isalpha(*p)))p++;
这三句怎么理解?为什么又定义j=o
为什么第二次定义 memset(word,0,21);

memset(word,0,21);
表示将WORD所指的首地址开始的21个char长度的内存初始化为0。
while(*p&&(!isalpha(*p)))p++;
这句表示如果没到当前行的行尾,并且P所指的不是字母就让P指向下一个字符,直到P所指的字符是一字母或到行尾。
因为每次都用WORD存放单词,所以一个单词比较完毕要将其清零以备下次用。

论坛徽章:
0
6 [报告]
发表于 2003-09-11 07:55 |只看该作者

菜鸟求救:关于一道三级上级题的困惑!

谢谢小雨加雪 的详细解答,我懂了许多。
真是看君几行字,胜我几时想,谢谢你呀!
可以再问一个问题吗?
还有一例,编制函数charconvA()实现以行为单位把字符串中最后一个字符的ASCII值又移四位后加倒数第二字符的ASCII值,得到一个新的字符,倒数第二的ASCII值又移四位后加倒数第三字符的ASCII值,得到一个新的字符,依次类推,一直到第一个字符的ASCII值又移四位后加最后一个字符的ASCII值,得到一个新的字符,得到的新字符分别存放在原来字符串对应的位置上。
答案:

  1.    int i,j;
  2.     char ch,th,
  3.     for(i=0;i<maxline;i+++)
  4.     { ch=xx[i][strlen(xx[i]-1]
  5.         for(j=strlen(xx[i]-1;j>;=0;j--)
  6.             { th=xx[i][j];
  7.              th>;>;=4;
  8.              if(j)xx{i][j]=th+xx[i][j-1];}
  9.          xx[i][0]+=ch;
  10.         }
复制代码

疑问一:对于定义的ch, 列向量strlen(xx-1)是何意?
它是不是与一直到第一个字符的ASCII值又移四位后加最后一个字符的ASCII值有关?
疑问二,根据小雨加雪   的指点,题中的if(j)是不是J的向量的首地址不为空?
疑问三:对于最后一行xx[o[]+=ch中为什么列向量用0?
呵呵,又提了这么多简单的问题,劳烦大家了?

论坛徽章:
0
7 [报告]
发表于 2003-09-11 09:38 |只看该作者

菜鸟求救:关于一道三级上级题的困惑!

int i,j;
char ch,th,
for(i=0;i<maxline;i+++)
{
ch=xx[strlen(xx-1]

照题意,上面应该这样写
ch=xx[strlen(xx)-1];
strlen(xx)-1指列的坐标,这条语句是将每一行的
最后一个字符赋植给ch,以备后用---------------------------------------->;

for(j=strlen(xx-1;j>;=0;j--)                                                   

上面应该这写                                                   
for(j=strlen(xx)-1;j>;=0;j--)表示从一行的最后一个字符递减

{                                                                                             
th=xx[j];                                                                              th>;>;=4;                                                                                 
if(j)xx{i][j]=th+xx[j-1];}                                                      
xx[0]+=ch; <--------------------------------------------------------

这里判断是不是到了行首,也就是看J是否为0,如果不为零,就把th(右移过的字符)加上他前一个字符的ASCII植,否则就是到了行首(列坐标为0),所以用xx[0]加上以前保存在ch里字符的ASCII值做为新的行首字符。其实上面这句完全可以写成xx[j]+=ch;
     
}
}

论坛徽章:
0
8 [报告]
发表于 2003-09-11 10:02 |只看该作者

菜鸟求救:关于一道三级上级题的困惑!

程序排版用[code]....[/code]

另外,楼主的问题,不算很复杂,简单地说主要是指针与一些函数的问题,
函数可以书上找,指针要靠自己的悟性(楼主好象对指针的使用不太清楚)。自己要多看书,多想想。否则考出三级又如何。

论坛徽章:
0
9 [报告]
发表于 2003-09-11 10:27 |只看该作者

菜鸟求救:关于一道三级上级题的困惑!

谢谢DONI的关于排版的指点,我编辑了我的帖子。
另外,我的问题在这个高手云集的论坛了,有点贻笑大方了。
不过我的第一个问题确实搞不清楚,但第二个自己想想,应该可以解决的。所以我会努力的,考级并不重要,主要是自己要掌握一种思维。
再一次谢谢小雨加雪的指点。

论坛徽章:
0
10 [报告]
发表于 2003-09-11 10:46 |只看该作者

菜鸟求救:关于一道三级上级题的困惑!

经过大家的指点,我现在对于第一道题的思考如下:

  1. DELWORD()
  2. {
  3.   int i, j, k;
  4.   char word[21], *p;
  5.   char str[80];
  6.   for (i = 0; i < maxline; i++)
  7.   {
  8.     memset(str, 0, 80);
  9.     p = xx;
  10.     j = 0;
  11.     k = 0;
  12.     memset(word, 0, 21);
  13.     while (*p)
  14.     {
  15.       if (isalpha(*p)) // 如果是字母则复制字符
  16.       {
  17.         word[j++] = *p++;
  18.         if (*p) // 若未到末尾,则继续
  19.           continue;
  20.       }
  21.       if (strlen(word)) // 单词计数增1
  22.         k++;
  23.       if (k % 2 == 0) // 如果是偶数将单词倒置并复制倒置后的单词
  24.         strcat(str, strrev(word));
  25.       j = 0; // 单词字母置0
  26.       memset(word, 0, 21); // 清空字串
  27.       while(*p && (!isalpha(*p))) // 一个单词结束后,过滤所有的非字母字符
  28.         p++;
  29.     }
  30.     strcpy(xx, str);
  31.   }
  32. }
复制代码

*p是判断字符串是否结束,是进行字符串操作时必备的部分。isalpha(*p)表示的是当前字符是否字母.
“第二次”使用memset(实际是这个while循环中唯一的一次)的作用是在每次复制单词之后将单词缓冲区置零,以备下次循环之用。
不知我的理解有没有失误的地方。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP