我最近就是为这道题郁闷 大虾们速来帮忙啊!!

tianhang2009 2009-06-19 10:16:53
录入一篇英文文章(存放在字符数组a【n】中),统计单词个数,
假定这段文章不超过1000个字符,单词不超过240个。
请自我设计录入结束条件。
这道题要用指针的一维数组做哦 我想的是每个单词之间都有空格 可是文章都有标点的 怎么排除非单词 我想不懂
希望大虾给做个程序自学一下 最好是完整的这道题的程序 谢谢了!! !

orz!!!!
...全文
47 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
棋盗 2009-06-21
  • 打赏
  • 举报
回复
抱歉,粘的是没改的,本来最后的输出是这样的
if(a[i-1]>='a'&&a[i-1]>='A'&&a[i-1] <='z'&&a[i-1] <='Z')
cout < <"共有" < <s < <"个单词" < <endl;
else cout < <"共有" < <s +1< <"个单词" < <endl;
如果结尾没有标点最后一个单词不计
所以有个判别
19楼的大哥问题指出的很对,这问题不仅会出现在结尾,
在任何两个标点连着的地方都有这样的问题,受教了!
再加一段复查代码:
if (a[i]>='a'&&a[i]<='z'|| a[i]>='A'&&a[i] <='Z')//2判断分小写和大写
i=0;
else
i=1;
for(;i<=strlen(a);i++)
{
if(a[i]>'z'&&a[i]>'Z'||a[i] <'a'&&a[i] <'A')//确定一个单词结束 /*3和2同样的问题*/
if(a[i-1]>'z'&&a[i-1]>'Z'||a[i-1] <'a'&&a[i-1] <'A')
s=s-1;
}



ysysbaobei 2009-06-21
  • 打赏
  • 举报
回复
顶下
xmrforever 2009-06-21
  • 打赏
  • 举报
回复

#include <conio.h>
#include <iostream.h>
#include <string.h>
#include <stdio.h>
int main()
{
int i=0/*1初始化i,否则不能直接a[i]访问*/,s,t,j,p;
char a[1000];
cout <<"请输入一篇文章" <<endl;
gets(a);
puts(a);
// if(a[i]>='a'&&a[i]>='A'&&a[i] <='z'&&a[i] <='Z')//确定第一个字符是否为标点
if (a[i]>='a'&&a[i]<='z'|| a[i]>='A'&&a[i] <='Z')//2判断分小写和大写
i=0;
else
i=1;
t=i;//第一个单词起始位置
s=0;
// cout <<t <<endl;
for(;i<=strlen(a);i++)
{
if(a[i]>'z'&&a[i]>'Z'||a[i] <'a'&&a[i] <'A')//确定一个单词结束 /*3和2同样的问题*/
{
s=s+1;
j=i;//记录结束时位置
}
else continue;//未遇到空格或标点(单词没结束)进入下一次循环
for(p=t;p <j;p++)//输出刚确定的单词
{
cout <<a[p];
}
t=j+1;//下一个单词的起始位置
cout <<endl;
}
// if(a[i-1]>='a'&&a[i-1] <='z'||a[i-1]>='A'&&a[i-1] <='Z') //这句注释掉后如果最后一个标点多于1个就会出现问题
cout <<"共有" <<s-1 <<"个单词" <<endl;

return 0;
}

xmrforever 2009-06-21
  • 打赏
  • 举报
回复
我把楼上的程序改了一下

#include <stdio.h>
// // #include<conio.h>
// #include <windows.h>
#include <iostream.h>
// #include <string>
//
// #define Step 10 //空间增加的步长.
//
// char * getstr() //任意长度的字符串输入,返回字符串的首地址.
// {
// char *temp, *str=(char *)malloc(10);
// int c=0, len=0, times=1, number=0;
// if(!str)
// {
// printf("内存不够,无法开辟字符串空间!");
// return (char *)NULL;
// }
// number+=times*Step;
// while((c=getche())!='\r') //遇到回车则输入结束。
// {
// if(len==number)
// {
// times++;
// number=times*Step;
// temp=str;
// str=(char *)realloc(str,number);
// if(str==NULL)
// {
// printf("内存不够,字符串输入受限!");
// str=temp;
// break;
// }
// }
// *(str+len)=c;
// len++;
// }
// str=(char *)realloc(str,len+1); //字符串的实际长短调整空间.
// *(str+len)='\0';
// return str;
// }
//
// int main()
// {
// char *str=NULL;
// str=getstr(); //字符串输入
// printf("\nstr=%s\n",str);
// free(str);
// return 0;
// }



// #include <iostream>
// #include <list>
// using namespace std;
// class Person
// {
// public:
// char*name;
// int gender;
// };
//
// class Student:public Person
// {
// public:
// int grade;
// Student(char *Name,int Gender,int Grade)
// {
// name=Name;
// gender=Gender;
// grade=Grade;
// }
// };
//
// class Teacher:public Person
// {
// public:
// Teacher(char *n,int g)
// {
// name=n;
// gender=g;
// }
// public:
// list <Student> student;
// };
//
// class Printer
// {
// public:
// void printStudent(Student s)
// {
// cout <<"student:" <<endl;
// cout <<"\t Name:" <<s.name <<endl;
// if(s.gender==0)
// cout <<"\t Gender:" <<"female" <<endl;
// else
// cout <<"\t Gender:" <<"male" <<endl;
// cout <<"\t Grade:" <<s.grade <<endl;
// }
// void printTeacher(Teacher s)
// {
// cout <<"Teacher:" <<endl;
// cout <<"\t Name:" <<s.name <<endl;
// if(s.gender==0)
// cout <<"\t Gender:" <<"female" <<endl;
// else
// cout <<"\t Gender:" <<"male" <<endl;
// }
// };
//
// int main()
// {
// Teacher teacher("Johnny",1);
// Student student1("Catherine",0,1);
// Student student2("peter",1,2);
//
// teacher.student.push_back(student1); //从后面向list容器中添加数据
//
// teacher.student.push_back(student2);
//
// student1.grade=2;
// student2.grade=3;
//
// Printer printer;
// printer.printTeacher(teacher);
// list <Student>::iterator itr=teacher.student.begin();
// for(;itr!=teacher.student.end();itr++)
// {
// printer.printStudent(*itr);
// }
// return 0;
// }

// #include <iostream.h>
//
// void jiaohuan(int x,int y)
// {
// int temp;
// temp=x;
// x=y;
// y=temp;
// cout<<x<<'\t'<<y<<endl;
// }
//
// void zhizhen(int *x,int *y)
// {
// int temp;
// temp=*x;
// *x=*y;
// *y=temp;
// cout<<*x<<'\t'<<*y<<endl;
// }
//
// void shengming(int &x,int &y)
// {
// int temp;
// temp=x;
// x=y;
// y=temp;
// cout<<x<<'\t'<<y<<endl;
// }
//
// void shuzu(int a[],int b[])
// {
// int temp[1];
// temp=a;
// a=b;
// b=temp;
// cout<<a[0]<<'\t'<<b[0]<<endl;
// }
// void main()
// {
// int a=5,b=6;
// jiaohuan(a,b);
// cout<<a<<'\t'<<b<<endl;
// zhizhen(&a,&b);
// cout<<a<<'\t'<<b<<endl;
// shengming(a,b);
// cout<<a<<'\t'<<b<<endl;
// int c[1],d[1];
// c[0]=5;d[0]=6;
// shuzu(c,d);
// cout<<c[0]<<'\t'<<d[0]<<endl;
// }

// #include <iostream>
//
// int ma(int);
//
// int main()
// {
// using namespace std;
// int lang;
//
// cout <<"Enter a namber for lang:_____\b\b\b\b";
// cin>>lang;
// cout <<lang <<" lang is" <<ma(lang) <<"ma\n";
// return 1;
// }
// int ma(int l)
// {
// using namespace std;
// // int l;
// int m;
// m=l*200;
// return m;
// }


// union
// {
// int i;
// char x[2];
// }a;
// #include <cstringt.h>
// void main()
// {
// unsigned int j;
// unsigned char mil=0x00,cs[6];
// float md,x=x=1095216660480.0;
//
// md=123.386;
// if(md==x)
// cs[0]=cs[1]=cs[2]=cs[3]=cs[4]=cs[5]=0xff;
// else
// {
// for(;md<x;)
// {
// md=md*2;
// mil++;
// }
// md=md/2;
// mil--;
// cs[5]=mil;
// j=(int)(md /(65536.0*65536.0));
// cs[0]=0x80&j;
// md=md-j*65536.0*65536.0;
// j=(int)(md/(256.0*65536.0));
// cs[1]=j;
// md=md-j*256.0*65536.0;
// j=(int)(md/65536.0);
// cs[2]=j;
// md=md-j*65536.0;
// j=(int)(md /256.0);
// cs[3]=j;
// md=md-j/256.0;
// j=(int)md;
// cs[4]=j;
// }
// printf("123.386的十六进制表示为");
// printf("%x%x%x%x%x%x%x%x%x%x",cs[0]/16,cs[0]%16,cs[1]/16,cs[1]%16,cs[2]/16,cs[2]%16,cs[3]/16,cs[3]%16/16,cs[4],cs[4]%16);
// printf("小数位数为%x%x",cs[5]/16,cs[5]%16);
// }

// #include <iostream>
// using namespace std;
//
// void main(void)
// {
// enum egg {a,b,c};
// egg test; //在这里你可以简写成egg test;
// test = c;
// cout<<test;
//
// }

#include <windows.h>
#include <iostream.h>

// DWORD WINAPI ThreadProc1(
// LPVOID lpParameter // thread data
// );
// HANDLE h_thread1;
// void main()
// {
//
// h_thread1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
// CloseHandle(h_thread1);
// }
//
// DWORD WINAPI ThreadProc1(
// LPVOID lpParameter // thread data
// )
// {
// WaitForSingleObject(h_thread1,INFINITE);
// cout<<"lihaia";
// return 0;
#include <conio.h>
#include <iostream.h>
#include <string.h>
#include <stdio.h>
int main()
{
int i=0/*1初始化i,否则不能直接a[i]访问*/,s,t,j,p;
char a[1000];
cout <<"请输入一篇文章" <<endl;
gets(a);
puts(a);
// if(a[i]>='a'&&a[i]>='A'&&a[i] <='z'&&a[i] <='Z')//确定第一个字符是否为标点
if (a[i]>='a'&&a[i]<='z'|| a[i]>='A'&&a[i] <='Z')//2判断分小写和大写
i=0;
else
i=1;
t=i;//第一个单词起始位置
s=0;
// cout <<t <<endl;
for(;i<=strlen(a);i++)
{
if(a[i]>'z'&&a[i]>'Z'||a[i] <'a'&&a[i] <'A')//确定一个单词结束 /*3和2同样的问题*/
{
s=s+1;
j=i;//记录结束时位置
}
else continue;//未遇到空格或标点(单词没结束)进入下一次循环
for(p=t;p <j;p++)//输出刚确定的单词
{
cout <<a[p];
}
t=j+1;//下一个单词的起始位置
cout <<endl;
}
// if(a[i-1]>='a'&&a[i-1] <='z'||a[i-1]>='A'&&a[i-1] <='Z') //这句注释掉后如果最后一个标点多于1个就会出现问题
cout <<"共有" <<s-1 <<"个单词" <<endl;

return 0;
}
棋盗 2009-06-20
  • 打赏
  • 举报
回复
晚上熄灯了,今天补
本以为半个小时搞定,结果调了近两个小时,还没调出来
黑眼圈也出来了
#include <iostream.h>
#include<string.h>
#include<stdio.h>
int main()
{
int i,s,t,j,p;
char a[1000];
cout<<"请输入一篇文章"<<endl;
gets(a);
puts(a);
if(a[i]>='a'&&a[i]>='A'&&a[i]<='z'&&a[i]<='Z')//确定第一个字符是否为标点
i=0;
else
i=1;
t=i;//第一个单词起始位置
s=0;
cout<<t<<endl;
for(;i<=strlen(a);i++)
{
if(a[i]>'z'&&a[i]>'Z'&&a[i]<'a'&&a[i]<'A')//确定一个单词结束
{
s=s+1;
j=i;//记录结束时位置
}
else continue;//未遇到空格或标点(单词没结束)进入下一次循环
for(p=t;p<j;p++)//输出刚确定的单词
{
cout<<a[p];
}
t=j+1;//下一个单词的起始位置
cout<<endl;
}
if(a[i-1]>='a'&&a[i-1]>='A'&&a[i-1]<='z'&&a[i-1]<='Z')
cout<<"共有"<<s<<"个单词"<<endl;

return 0;
}
运行时错误
"0x0040ff4a"指令引用的"0xccdfc850"内存。该内存不能为"read"。
各位大大帮忙看看
ameyume 2009-06-19
  • 打赏
  • 举报
回复
顶,按照楼上的方法来吧
光宇广贞 2009-06-19
  • 打赏
  • 举报
回复
那么扫描单词的时候太简单了,两个单词分隔符之前的一块,就是一个单词,其实 split 函数,就是这么实现的。

一维数组,一次遍历便可以完成。

我想我已经说得够清楚的了。
光宇广贞 2009-06-19
  • 打赏
  • 举报
回复
楼主可以自己写一个 Split 函数,如我所述的那个,提供一个接口,参数表是“单词的分隔符列表”,空格和标点都加入其内。返回的是单词的数组,也可以是单词的个数。

或者楼主可以自己参考 string.Split 函数来做。

我记得C++库里面有 Split 函数,楼主查一下 CSTRING吧。
光宇广贞 2009-06-19
  • 打赏
  • 举报
回复
放到C#下太TMD的简单了:


string fuck = "Fuck lady, lady fuck. Oh my fuck god! Give me a fuck!";

string[] Fuck = fuck.Split ( new char [] { ' ', ',', '.', '!' } );

Fuck.Length 就是单词的个数。


其实楼主完全可以按照这个思路来做。
adventurelw 2009-06-19
  • 打赏
  • 举报
回复
空格照常录入(换行符也转换成空格),如果需要输出单词的话,不需要的话则算了
标点判断用ispunct(ch),是标点的话则舍去。
coolyama 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xmrforever 的回复:]
就判断空格和标点符号就可以了啊
遇到空格或者标点符号,单词的计数变量就自加一次
结束条件可以自己设计
比如输入一个@结束输入
[/Quote]
不能就判断空格和标点符号。
"i love csdn!"
这样的话不是数成5个单词了?(2个引号,2个空格,一个感叹号)
  • 打赏
  • 举报
回复
[Quote=引用楼主 tianhang2009 的帖子:]
录入一篇英文文章(存放在字符数组a【n】中),统计单词个数,
假定这段文章不超过1000个字符,单词不超过240个。
请自我设计录入结束条件。
这道题要用指针的一维数组做哦 我想的是每个单词之间都有空格 可是文章都有标点的 怎么排除非单词 我想不懂
希望大虾给做个程序自学一下 最好是完整的这道题的程序 谢谢了!! !

orz!!!!
[/Quote]

遇到非英文字母,就认为一个单词结束啊。
1st这些数字除外,或者可以认为遇到非英文字母(包括大小写,和数字),其他的都认为是单词结束。

不难吧
xmrforever 2009-06-19
  • 打赏
  • 举报
回复
就判断空格和标点符号就可以了啊
遇到空格或者标点符号,单词的计数变量就自加一次
结束条件可以自己设计
比如输入一个@结束输入
pathuang68 2009-06-19
  • 打赏
  • 举报
回复
ameyume 2009-06-19
  • 打赏
  • 举报
回复
Orz
囧rz

你可以先做个不计算标点的,遇到标点就舍去,或者录入时不录入标点
然后一步步再完善,计算标点等
arong1234 2009-06-19
  • 打赏
  • 举报
回复
作业应该自己做,不应该别人帮忙。如果你连这个都不做,怎么可能学好编程
tianhang2009 2009-06-19
  • 打赏
  • 举报
回复
对了 题目补充一下:我还想把单词依次输出来
棋盗 2009-06-19
  • 打赏
  • 举报
回复
快停电了
wuleibilly3 2009-06-19
  • 打赏
  • 举报
回复
LZ学过编译原理么 有章是说 词法分析的 你说的题目完全可以满足
把空格 标点符号 都看成 终结符,先把这些终结符预先保存在一个表里【一维数组】,
由于文章可能出现数字,所以不能算是单词,还有一些其它等不能算单词的,
构造个简单的状态机
读入一个字符时判断时候为字母,是字母则继续判断下一个,当遇到终结符的时候,一个单词截取完成,

1.截取字符-》2.判断是否为字符,如果是非法字符则忽略这个字符继续下一个-》3.是的话循环判断第二步-》4.直到遇到终结符截取一个单词完成
-》5.计数器+1-》继续取下一次的判断

没办法 画不了图 讲究下
至善者善之敌 2009-06-19
  • 打赏
  • 举报
回复
我给个反向的思路给你,具体你自己写了

比如 I am a student,you are a teacher.是一句话

你统计一下空格和标点符号一共是8个,那单词就是8个。

又比如 "I am Addy,Who is there?"

有两个"这样的符号你统计的时候可统计成一个,并且?"连用的时候也统计成一个,那么空格和标点一共为6个,单词也是6个,

仅供参考!!
加载更多回复(1)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧