C++c语言程序改错题技巧,不知道哪里错了,初学者

6791人阅读
C++(281)
  有学生向我求助,他编了一个程序,设计一个“点”类,求出两点距离的程序。程序看着没有问题,却出了一大堆的错误。程序如下:#include &iostream&
#include &math.h&
class point
double distance(point p1,point p2);
int main()
point p1= {3,5},p2= {6,9};
cout&&distance(p1,p2);
double distance(point p1,point p2)
double d=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}  在codeBlocks下编译,错误直接引到stl_iterator_base_types.h文件中,错误一大堆:||=== example, Debug ===|
D:\C++\codeBlock\example\example.cpp|15|instantiated from here|
d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_iterator_base_types.h|127|error: no type named 'iterator_category' in 'class point'|
d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_iterator_base_types.h|128|error: no type named 'value_type' in 'class point'|
d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_iterator_base_types.h|129|error: no type named 'difference_type' in 'class point'|
d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_iterator_base_types.h|130|error: no type named 'pointer' in 'class point'|
d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_iterator_base_types.h|131|error: no type named 'reference' in 'class point'|
||=== Build finished: 5 errors, 0 warnings ===|  对于这样的问题,初学C++的同学肯定直接蒙。这里的问题出在命名空间中名字的冲突,再多说一些,与STL也有些关系。不过,解决这样的问题并不一定得知道这么多。我还是试着与大家绕开这个环节,从其他途径找点感觉。  光标置到“D:\C++\codeBlock\example\example.cpp|15|instantiated from here|”一行,双击,发现错误在程序的第15行。鼠标放到15行的distance函数上时,浮现出了一行提示,见图:  看出了一点疑惑:distance不是在这个程序中编的自定义函数吗?怎么识别成了std::distance(...,...)?  这就是问题的根源!编译器没有将distance当作自定义函数处理!至于进一步的解释不再深入,抓住这个要点,程序就可以改好了。  修改方法之一:既然函数名字上出问题,试试改个名字?将distance改个名字,如dist,一切正常。  修改方法之二:凭什么让我改?distance多好的一个函数名(不过提醒,可以自学一下命名空间了,此是好机会,不必等着老师讲。)需要做的工作是,不用std命名空间(删除或注释掉一行)然后在依赖std的cout前加上std::,程序如下:#include &iostream&
#include &math.h&
////不再用命名空间std
class point
double distance(point p1,point p2);
int main()
point p1= {3,5},p2= {6,9};
std::cout&&distance(p1,p2);
//保证编译系统知道用std命名空间中的cout
double distance(point p1,point p2)
double d=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
  修改方法之三:方法二有点自私了。std中有不少常用的东东,就此全都得写std::,这个程序中无妨,如果再大些的程序呢?胳膊不必和大腿拧,换种思路,也是一样。将distance在调用时,写作为::distance,指出distance是当前程序中定义的名字。问题解决就此解决,程序如下:#include &iostream&
#include &math.h&
class point
double distance(point p1,point p2);
int main()
point p1= {3,5},p2= {6,9};
cout&&::distance(p1,p2);//指定distance不是别处的,就是本文件中定义的
double distance(point p1,point p2)
double d=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
  修改方法之四:前三种方法中,个人倾向于第一种,山不转水转,换个名字也妨。其实这也不是最好的。原始的程序中定义了类,但只有数据成员,没有成员函数,像求距离之类的,设计为成员函数多好。面向对象的机制就是为了信息封装等特性的,为何要如此浪费?这个程序我就不写了,请自行解决。  补充:用其他编程环境时,观察和修改的方法也类似,例如在VS2008下编译,错误居然有25个之多:1&------ 已启动生成: 项目: example, 配置: Debug Win32 ------
1&正在编译...
1&example.cpp
1&d:\program files\microsoft visual studio 9.0\vc\include\xutility(764) : error C2039: “iterator_category”: 不是“point”的成员
d:\c++\vs2008 project\example\example\example.cpp(5) : 参见“point”的声明
d:\c++\vs2008 project\example\example\example.cpp(16): 参见对正在编译的类 模板 实例化“std::iterator_traits&_Iter&”的引用
_Iter=point
(此处省略N多的提示)
1&生成日志保存在“file://d:\C++\VS2008 project\example\example\Debug\BuildLog.htm”
1&example - 25 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========  在源程序中,鼠标光临distance函数时,可以看出编译器对distance函数有两种解释,如下图:  编译器对此局面真的很迷茫了。余下的修改思路相同,不再罗嗦。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4466855次
积分:72799
积分:72799
排名:第14名
原创:1969篇
转载:10篇
评论:6400条
难度:初级
类型:技术教程
难度:中级
类型:技术教程
难度:中级
类型:技术教程
文章:453篇
阅读:1328868
文章:483篇
阅读:1457903
文章:15篇
阅读:40963
迂者自勉:
※能取得一点点突破,就是进步
※并肩学生与不良学风坚决斗争
※甘为草根,仰慕草根之力量
※还原大学和大学学习之本色
∞心系教育,热爱生活
∞我的专栏-
∞给我写信
∞不用QQ-它会谋杀整段的时间
友情链接:周兆熊为IT学子解惑、
(1)(22)(3)(6)(17)(13)(25)(19)(5)(4)(15)(45)(45)(44)(5)(45)(37)(107)(123)(64)(82)(78)(27)(43)(30)(15)(9)(13)(24)(43)(65)(60)(13)(16)(63)(56)(41)(18)(29)(10)(28)(32)(43)(46)(7)(10)(59)(83)(51)(38)(20)(32)(15)(22)(30)(28)(16)(4)(38)(1)小木虫 --- 500万硕博科研人员喜爱的学术科研平台
&&查看话题
初学者,C++纠错
//这个是几个数相加得小代码,最后总是结果输不出来,麻烦哪位大神帮忙看一下
//多个数字的加减乘除
#include&iostream&
#include&conio.h&
#include&stdio.h&
int main()
& & & & int num1=0;
& & & & int num2;
& & & & cout&&&Expression:&;
& & & & cin&&num1;
& & & &&&if(!cin)exit(0);&&//如果输入的类型不一致就错误
while(cin&&ap)
& & & & if(ap!=';')cin&&num2;
& & & & if(!cin)exit(0);
& & & & switch(ap)
& & & & case'+':
& & & & & & & & num1+=num2;
& & & & & & & &
& & & & case'-':
& & & & & & & & num1-=num2;
& & & & & & & &
& & & & case'*':
& & & & & & & & num1*=num2;
& & & & & & & &
& & & & case'/':
& & & & & & & & num1/=num2;
& & & & & & & &
& & & & default:
& & & & cout&&&error.\n&;
cout&&&result:&&&num1&&&\n&;
我也觉得是,但是不知道怎么改
代码里面有跳出语句,注意!:o:o
上面我说的”没有加空格“不严谨,应该是没有加 空白字符
#include&iostream&
#include&conio.h&
#include&stdio.h&
int main()
& & & & int num1=0;
& & & & int num2;
& & & & cout&&&Expression:&;
& & & & cin&&num1;
& & & & if(!cin)exit(0);&&//如果输入的类型不一致就错误
& & & & while(cin&&ap)
& & & & & & & & if(ap!=';')cin&&num2;
& & & & & & & &
& & & & & & & & if(!cin)exit(0);
& & & & & & & & switch(ap)
& & & & & & & & {
& & & & & & & & case'+':
& & & & & & & & & & & & num1+=num2;
& & & & & & & & & & & &
& & & & & & & & case'-':
& & & & & & & & & & & & num1-=num2;
& & & & & & & & & & & &
& & & & & & & & case'*':
& & & & & & & & & & & & num1*=num2;
& & & & & & & & & & & &
& & & & & & & & case'/':
& & & & & & & & & & & & num1/=num2;
& & & & & & & & & & & &
& & & & & & & & default:
& & & & & & & & & & & & cout&&&error.\n&;
& & & & & & & & }
& & & & cout&&&result:&&&num1&&&\n&;
& & & & getch();
& & & & return 0;
输入完之后按 分号(英文输入法下的)退出
你是说 if(!cin) exit(0); 吗? 这只是针对输入的类型不一致做出判断。 while(cin&&ap) ,ap 是char型,键盘输入任何字符都可以看作char型。
你只做了else break这一行的修改啊?循环跳出还是没有解决
”=“只有两种情况,一种是mun1=0,另一种是num1+=num2.我不知道这两处的等号后面加空格跟循环跳出有什么关系。
程序没错,只是运行的时候要注意输入格式。
不明白:cry:
你输入分号循环就退出了,你可以运行试试看
是退出了,但是输入“1+2+3”,回车之后没有结果输出
你得输入 1,&&回车,+,回车,2,回车,+,回车,3,回车,分号,回车。&&再试试
研究生必备与500万研究生在线互动!
扫描下载送金币
浏览器进程
登录小木虫
打开微信扫一扫
随时随地聊科研共有 74 人关注过本帖
标题:新手——程序出错了请指教。
等 级:新手上路
&&问题点数:20&&回复次数:4&&&
新手——程序出错了请指教。
程序出错了请指教。
#include&stdio.h&
# define epsiln le-4
void main()
{printf(&\t\t\t\t循环语句迭代法\n求一正数a的平方根。\n\n&);
double x,x1,x2;
&&& printf(&Input a number (&=0.0 and 0 to quit):\n&);
&&& scanf(&%lf&,&x);
&&& if(x==0.0)
&&& {printf(&sqrt(%lf)=%lf\n&,x,x);
&&& if(x&0.0)
&&& printf(&x must be&=0.0! Try again.\n&);
&&& {x1=1.0;
&&& x2=0.5*(x1+x/x1);
&&& while((x1&x2?x1-x2:x2-x1)&epsiln)
&&& {x1=x2;
&&& x2=0.5*(x1+x/x1);}
&&& printf(&sqrt(%lf)=%lf\n&,x,x2);
}while(1);
liang001.cpp
F:\迅雷下载\练习\liangzi\liang001.cpp(20) : error C2065: 'le' : undeclared identifier
执行 cl.exe 时出错.
liang001.exe - 1 error(s), 0 warning(s)
来 自:重庆市奉节县
等 级:友情版主
帖 子:97
专家分:246
建议你去学习一下宏观定义常量的用法#define
新手上路,望大家多多照顾,谢谢!
等 级:新手上路
你的LE没有确定的意义
等 级:新手上路
(8)字符串& &中永远不包含宏
(10)宏定义不存在类型问题,它的参数也是无类型的
来 自:&&&&&&&&g
等 级:友情版主
帖 子:633
专家分:2246
#define .... 1e-4
这就像乘方符号^一样,你不能指望 a=2^2能给你计算平方,要用专门的乘方函数。
类似的e这东西也不能直接使用,要用函数。
至于用什么函数 你可以自行百度“C e”,自己找到的会比较印象深刻,关键是体会一下找的方法。或者直接访问
/link?url=aM11B0KxTPj8lVPeCKAiedWfJs0OnQe5qqEuhoFT1Ii6175SkjNThlV98ZgwnDv1-dw0GLSOBw139lla6PAj-a&wd=&eqid=d657f7bb0f
(百度知道的网址这么长啊。。。)
&&&&&&&&&欢迎诸位来我数据结构与算法版块讨论算法问题。&&&&&&&&& 一点点冷清,所以不得不出来贴个小广告哈
版权所有,并保留所有权利。
Powered by , Processed in 0.032181 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved1770人阅读
2014C++教学(94)
课程主页在,实践要求见。课程资源在同步展示,使用的帐号请到课程主页中查看。&【项目1】下面是最经典和最简单的C++程序。在中运行程序,并在能正确运行的程序基础上,“捣乱”制造些错误,对此进行观察。经验是从错误中得来的,这个项目就是要让大家积累这一类经验。#include &iostream&
int main( )
cin&&a&&b;
cout&&&a+b=&&&sum&&
} (1)将第6行cin&&a&&b; 一行末尾的分号去掉要制造的错误如下(一项“捣乱”结束后,将程序再改正过来,继续“捣乱”):(2)将第5行int a,b,改为int a,,即声明变量时,未声明sum(3)将第8行cout&& 写为 Cout&&,注意前面表述中的大小写(4)将第8行cout&& 写为了 cout&&(5)将第7行sum=a+b; 改为 sum= 即漏写了加号(6)将第10行程序最后的右花括号 } 删除(7)将第5行int a,b, 改为imt a,b, 注意,可能小手一哆嗦,int成了imt(8)你是个比贺老师还坏的坏孩子,还想到什么捣乱,自己来参考解答:说明:下面的提示,是中的提法出现的错误提示,在其他平台中,可能会有不同的描述,但意思一般相同;鉴于同学们刚学,不能用太专业和深入的解释,下面的提示只追求让同学有体会即可,随着学习的进展,你自己可以给出完整的解释。各种乱改后的解释:(1)将第6行cin&&a&&b; 一行末尾的分号去掉系统提示“編譯失敗(CE)”具体地:1. prog.cpp: In function ‘int main()’:2. prog.cpp:7:5: error: expected ‘;’ before ‘sum’3.
& & sum=a+b;&4.
& & ^  第1行提示“In function ‘int main()’”,指出在函数int main()中出现错误了  第2行提示“7:5:”指这个错误出现的原因,与第7行上溯第5行的程序有关,这是一个错误(error),原因是“expected ‘;’ before ‘sum’”,即“在sum前希望有个分号”。程序中每一个语句后都得有分号,第6行末缺分算,算帐算到第7行!这个事实要接受。修改方法,按提示,sum前,即上一行末,加上分号。  第3行指出,错误是在“sum=a+b”这儿发现的  第4行的“^”指向了出问题的具体位置(2)将第5行int a,b,改为int a,,即声明变量时,未声明sum“編譯資訊”部分提示1. prog.cpp: In function ‘int main()’:2. prog.cpp:7:5: error: ‘sum’ was not declared in this scope3.
& & sum=a+b;&4.
& & ^  第1行提示“In function ‘int main()’”,指出在函数int main()中出现错误了  第2行提示“7:5:”指这个错误出现的原因,与第7行上溯第5行的程序有关,这是一个错误(error),原因是“‘sum’ was not declared in this scope”,即“sum在这个范围内没有被声明”,的确,程序中第7行要用sum,但之前未声明,错误和第7行有关;程序第5行是个声明语句,要是在此声明了,也不会出错误,说和第5行有关,也算合理。  第3行指出,错误是在“sum=a+b”这儿发现的  第4行的“^”指向了出问题的具体位置(3)将第8行cout&& 写为 Cout&&,注意前面表述的大小写  提示的第2行是:  prog.cpp:8:5: error: ‘Cout’ was not declared in this scope  C++的词汇中,大小写严格区分,编译器认识“cout”,遇到“Cout”不认识了,就说“Cout在这个范围内没有声明。”冷静点,不要按提示声明Cout去,而是把大写改成小写。(4)将第8行cout&& 写为了 cout&&  提示的第2行指出:  prog.cpp:8:9: error: no match for ‘operator&&’(#@#&*!$#……)  这是操作符不匹配。cout应该与&&匹配,与&&匹配的是cin。(5)将第7行sum=a+b; 改为 sum= 即漏写了加号  提示的第2行指出  prog.cpp:7:9: error: ‘ab’ was not declared in this scope  漏写了加号,ab连起来是一个新的变量名,这个变量逃不脱“未被声明”。(6)将第10行程序最后的右花括号 } 删除  提示的第2行指出  prog.cpp:9:13: error: expected ‘}’ at end of input  有左括号,必须有右括号匹配,这个提示相当精准。(7)将第5行int a,b, 改为imt a,b, 注意,可能小手一哆嗦,int成了imt  出现了一堆的提示,“一错百错”?int 是数据类型的名字,写成imt,系统以为是变量名,是变量名,得提前声明,然而却没有,于是第一个提示:  prog.cpp:5:5: error: ‘imt’ was not declared in this scope  于是这一行也就不能当作为声明变量讲了,需要有分号啦、a、b、sum“未被声明”啦之类的错误,接踵而来。  注意到int写对时,是蓝色的,这叫为语言本身的成份进行的“语法着色”。imt没有这样的特点,这也是待积累的经验。&&=================== 迂者 贺利坚 CSDN博客专栏=================
|==   ==|
|==    ==|
|== 我写的书——《》    ==|
=====&为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4466860次
积分:72799
积分:72799
排名:第14名
原创:1969篇
转载:10篇
评论:6400条
难度:初级
类型:技术教程
难度:中级
类型:技术教程
难度:中级
类型:技术教程
文章:453篇
阅读:1328868
文章:483篇
阅读:1457903
文章:15篇
阅读:40963
迂者自勉:
※能取得一点点突破,就是进步
※并肩学生与不良学风坚决斗争
※甘为草根,仰慕草根之力量
※还原大学和大学学习之本色
∞心系教育,热爱生活
∞我的专栏-
∞给我写信
∞不用QQ-它会谋杀整段的时间
友情链接:周兆熊为IT学子解惑、C++初学者需要看什么书,你正在看什么书?
[问题点数:20分]
C++初学者需要看什么书,你正在看什么书?
[问题点数:20分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2012年11月 挨踢职涯大版内专家分月排行榜第二2011年9月 Linux/Unix社区大版内专家分月排行榜第二
2012年1月 Linux/Unix社区大版内专家分月排行榜第三2011年8月 C/C++大版内专家分月排行榜第三2011年8月 Linux/Unix社区大版内专家分月排行榜第三2010年4月 C/C++大版内专家分月排行榜第三
2012年8月 C/C++大版内专家分月排行榜第三2012年7月 C/C++大版内专家分月排行榜第三
2011年9月 C/C++大版内专家分月排行榜第二2011年4月 C/C++大版内专家分月排行榜第二2010年11月 C/C++大版内专家分月排行榜第二
2011年6月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 c语言程序改错题 的文章

 

随机推荐