免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 1653 | 回复: 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
16 [报告]
发表于 2003-09-12 15:41 |只看该作者

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

hoho
精彩问答
鼓掌。。。。。

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

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

谢谢呀,我知道我的做法急功近利了。一个人的编程能力是和平时的努力是分不开的,因为我校开的是VB,所以C我只学了一点皮毛。以后我会努力的,尽量不帖这些让大家不耻的问题。这里辱了大家的眼,不好意思呀!
最后再一次谢谢小雨加雪。

论坛徽章:
0
14 [报告]
发表于 2003-09-12 09:52 |只看该作者

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

现在的学生啊

论坛徽章:
0
13 [报告]
发表于 2003-09-12 08:47 |只看该作者

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


你的代码贴的不完整,我猜测这里的WORD应该是前面定义的类似char * WORD[10];
的语句,里面存放的是要删除的那十个单词,如果是这样,那么这里的tag代表当前
p扫描到单词尾,又一个单词产生。if(tag)和if(tag==1)是一样的,只是为了代码更
简练。

论坛徽章:
0
12 [报告]
发表于 2003-09-12 08:31 |只看该作者

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

for(i=0;i<totnum;i++)
                 j=num[0]-48+num[1]-48+num[2]-48+num[3]-48;
           /这里应该是求四位数的各数字之和,可是为什么要减去48?/

           /*--------------------------------------------------/
           照题目意思,我推测这个四位的整数应该是以char型存贮的
           所以num存的是数字的ASCII值,比如如果num[0]=9,那么
           其ASCII值为57,所以减去48才能得到真正的数字值。
           ---------------------------------------------------*/

                 if(j%2==0)
                 /这里是偶数的情况,如果是基数,为什么可以直接用if(j%2)?/

                 /*-------------------------------------------------------
                 如果是奇数的话,j%2要么为0,要么不为0,而if语句只有在其逻
                 辑判定条件为真时才执行下面的语句,所以如果为奇数,可以直接
                 执行下面的语句。如果为偶数,只有j%2==0这条语句为真时才执行
                 下面语句。
                 -------------------------------------------------------*/

                      {totcnt++;
                        he+=xx;}

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

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

又遇到问题,向你请教了。
第一
编制函数calvalue()
(1)求出文件中的正整数的个数totnum
(2)求出这些数中各位数字之和是偶数的数的个数totcnt.
很简单,不过有一个地方我不解(程序只列了一部分,希望不影响理解)
  1.   for(i=0;i<totnum;i++)
  2.                  j=num[0]-48+num[1]-48+num[2]-48+num[3]-48;
  3.            /这里应该是求四位数的各数字之和,可是为什么要减去48?/
  4.                  if(j%2==0)
  5.                  /这里是偶数的情况,如果是基数,为什么可以直接用if(j%2)?/
  6.                       {totcnt++;
  7.                         he+=xx[i];}
复制代码

第二
编制函数DELWORD()分别删除一篇英语文章中的各行的空格,标点,以及10个不分大小的单词。余下的单词倒置后仍然按行顺序存入数组XX中。
答案

  1.         DELWORD()
  2.          {int i,j,k,tag;
  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.                          tag=1;
  16.                          for(k=0;k<10&&k++)
  17.                          if(strcmp(word,WORD[K])==0;
  18.                          if(tag)strcat(str,strrev(word));                     
  19.                          j=0;
  20.                           memset(word,0,21);
  21.                           while(*p&&(!isalpha(*p)))p++;
  22.                          }
  23.                   strcpy(xx[i],str);
  24.                }
  25.           }      
复制代码

这里的for循环中(k<10&&tag)tag的作用是什么?
if中的tag是否=1?为什么要省略?是空不空的意思?那不是与指针有关?

论坛徽章:
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循环中唯一的一次)的作用是在每次复制单词之后将单词缓冲区置零,以备下次循环之用。
不知我的理解有没有失误的地方。

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

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

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

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

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

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

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

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP