求c++高人!

#include "iostream.h"
#include "math.h"
void main()
{
double a,b;
cout<<"请输入两直角边长:"<<endl;
cin>>a>>b;
double c=sprt(a*a+b*b)
cout<<"斜边长="<<c<<endl;
}
求这个程序怎么不对了

序是怎么回事
第1处错误:
main函数里的while语句,往处面移出一个大括号
第2处错误
修改重载的+操作符和-操作符的形参
DateFormatter operator + (int&);
改为DateFormatter operator + (const int&);
加个const这样的话,+操作符才能接受A+1这样的常量相加,因为1是常量,所以要加个const
同样DateFormatter operator - (int&);
也改为DateFormatter operator - (const int&);
注意,同时修改在类外定义的这两个操作符函数的形参。
第3处
在类中声明的另一个减操作符的形参错误
int operator - (DateFormatter df);
改为int operator - (DateFormatter& df);
因为你在类外定义的这个操作符中的形参有个引用符号。
第4处
修改Submon函数的反回类型
把void Submon(int mons);
改为DateFormatter Submon(int mons); 并在定义该函数的最后加上return *this;
因为你在main函数中有语句dft2=dft1.Submon(m);为满足这个要求就必须使Submon反回一个对象,因为只有对象才能把值赋给dft2,不能把void的反回类型赋值。
第5处
修改if里面的条件语句,在函数FindDaysInMonth(t.mon)的前面加上调用这个函数的对象,改为t.FindDaysInMonth(t.mon)

修改istream& operator>>(istream& in,DateFormatter& dft)这个函数中的内容
方法如下:
1、把char *tmp;改为char *tmp=new char;因为指针没初始化不能使用,会出错
2、在do的外面多声明一个对象比如DateFormatter s;
3、在if语句中加上s=t;
4、把dft=t改为dft=s;
原因:因为t是在do-while内声明的,而dft=t又在do-while外,因此在do-while看不到在其内声明的局部变量t,因此要声明一个范围大一点的变量s来满足要求。

第6处
main函数中的case3语句dft3=dft1-dft2;因为重载的-操作符反回的是int型,因此不能赋给dft3,把dft3修改为一个int型的变量,比如int i3=dft1-dft2

现在可以运行了,但运行有错(指的是计算方法不对),有待偶继续研究。

以下是本人的修改,其中主要修改了重载+运算符函数,和第3个构造函数,因为这两个函数存在重大算法错误,本人重新设计了算法,因为工程量实在太大,其他的操作符重载函数留给楼主自已完成,希望本人的程序可以起到一个抛砖引玉的作用。而且编程序也不能全靠别人,楼主的程序总体设计得不错,只是有些地方有些误解

class DateFormatter
{
private:
int day;
int mon;
int year;
public:
DateFormatter();
DateFormatter(int day,int mon,int year);
DateFormatter(char* date);
inline int GetDay() // 返回日期
inline int GetMonth() // 返回月份
inline int GetYear() // 返回年份
inline void SetDay(int d) // 设置日期
inline void SetMonth(int m) // 设置月份
inline void SetYear(int y) // 设置年份
inline bool IsLeapYear() // 查看是否是闰年
{float rem = year%4;
if(rem == 0.0) else }
DateFormatter Submon(int mons); // 在日期上减去月份
void IncrementMonth();// 在日期上加上一个月份
char* GetDate();
int FindDifferenceInMonths(DateFormatter);//返回两个日期间月份的差值

/* Static function that returns system date in format DD-MON-YYYY */
static char* Today() {
const time_t curr = time(0);
tm *dt = localtime(&curr);
int d = dt->tm_mday;
int y = (dt->tm_year+1900);
int m = dt->tm_mon;
char mn[4];
strcpy(mn,FindMonth(m));
char ret[25];
strcpy(ret,FormatDate(d,mn,y));
return ret;
}
/**/
char* GetFormattedDate();
DateFormatter operator + (const int&); //在形参前面加上const
DateFormatter operator - (const int&); //在形参前面加上const
DateFormatter operator ++ (int);
DateFormatter operator -- (int);
int operator < (DateFormatter df);
int operator > (DateFormatter df);
int operator == (DateFormatter df);
int operator - (DateFormatter& df); //在形参前加上&运算符
friend ostream& operator<<(ostream&,DateFormatter&);
friend istream& operator>>(istream&,DateFormatter&);
private:

//修改了这个函数,让m月分可以等于12,为什么不能让月分等于12偶实在没想明白。
static char* FindMonth(int m) {
if(m ==1)
else if(m == 2)
else if(m == 3)
else if(m == 4)
else if(m == 5)
else if(m == 6)
else if(m == 7)
else if(m == 8)
else if(m == 9)
else if(m == 10)
else if(m == 11)
else if(m == 12)
else
}
int FindMonthInNumber(string m);
static char* FormatDate(int d,char* m,int y) {
char* dy = new char[25];
char* yr = new char[25];
dy = itoa(d,dy,10);
yr = itoa(y,yr,10);
strcat(dy,"-");
strcat(dy,m);
strcat(dy,"-");
strcat(dy,yr);
return dy;
}
string to_lower(string s);

//同样,也修改了这个函数,让m可以等于12,以减少程序的复杂性。
int FindDaysInMonth(int m) {
if(m == 1)
else if(m == 2) else }
else if(m == 3)
else if(m == 4)
else if(m == 5)
else if(m == 6)
else if(m == 7)
else if(m == 8)
else if(m == 9)
else if(m == 10)
else if(m == 11)
else if(m == 12)
else return -1;
}
};
//类的声明结束
//三个构造函数
DateFormatter::DateFormatter()//这个函数没有动
{
const time_t curr = time(0);
tm *dt = localtime(&curr);
this->day = dt->tm_mday;
this->mon = dt->tm_mon;
this->year = (dt->tm_year+1900);
}
DateFormatter::DateFormatter(int day,int mon,int year)//这个也没动
{
this->day = day;
this->mon = mon;
this->year = year;
}
DateFormatter::DateFormatter(char* date)//这个构造函数大换血了。
{
if(strlen(date) > 8) {//strlen反回的是字符串实际的字符个数,也就是说2008-1-1会反回8
string s1 = date;
int p = s1.find_first_of('-'); //注意,这个函数的作用是查找'-'第一次出现的位置,你对这个函数的使用有大大的错误,因此本人重新修改了从这函数之后的所有内容
int p1=s1.find_last_of('-'); //反向查找字符'-'第一次出现的位置,这个位置就是日期前面的'-'字符
string day;
string month;
string year;
int len=strlen(date);
if(len-p1==3) //判断,如果字符串的总长度与反向查找的'-'第一次出现的位置如果为3就表示输出的日期有2位数,比如2008-1-11则p1的值是6字符串的长度是9,因此9-6就乘下3个字符,也就是胜下-11
day = s1.substr(p1+1,2); //substr的意思是,复制从p1+1位置开始的2个字符到s1中,因为p1是指向的最后一个'-'的,因此p1+1就指向了最后的日期了,因为日期有2个字符,所以读入2个字符。
else day=s1.substr(p1+1,1); //否则日期是一位字符,读入一位字符到s1中。
if(p1-p==3) //p1-p==3的作用是判断输入的月分是否是3位数,比如2008-11-2因为p是2008后面的那个'-'也就是4,而p1是最后一个'-'的位也就是7因此7-4之后就胜下-11这三个字符了。
month=s1.substr(p1-2,2); //把p1的位置向后移2位,也就是指向了月分的开始处,然后读入2位的月分到s1中。
else month=s1.substr(p1-1,1);
year=s1.substr(p-4,4); //年分是p-4的位置开始的,因此从这里读入4位数,就是年分的数字。

//下面一段基本上没改,只是修改了你的错误算法
char cday[5];
strcpy(cday,day.c_str());
char cyear[5];
strcpy(cyear,year.c_str());
this->day = atoi(cday);
month=FindMonth(atoi(month.c_str())); //在调用FindMonthInNumber之前,应把month转换为月分的英文字母表示之一。
this->mon = FindMonthInNumber(month);
this->year = atoi(cyear);

}
//以下部分也做了大的修改,但原理基本上同上面的if部分。
else if(strlen(date) == 8 || strlen(date) == 7 || strlen(date) == 6) {
int len = strlen(date);
string str = date;
string day;
string month;
string year;
int p1 = str.find_first_of('-');
if(p1 <= 0) p1 = str.find_first_of('/');
int p2 = str.find_last_of('-');
if(p2 <= 0) p2 = str.find_last_of('/');
if(len == 8) { //主要修改了这个if语句里的内容。
day = str.substr(p2+1,1);
month = str.substr(p2-1,1);
year = str.substr(p1-4,4);
}
//本构造函数,从这里起,以下就没有修改了,工程量实在太大,留给你做了。
else if(len == 7) {
if(p1 == 1) {
day = str.substr(0,1);
if(p2 == 3) {
month = str.substr(2,1);
year = str.substr(4,2);
}else {
month = str.substr(2,2);
year = str.substr(5,2);
}
}else {
day = str.substr(0,2);
if(p2 == 3) {
month = str.substr(2,1);
year = str.substr(4,2);
}else {
month = str.substr(3,2);
year = str.substr(5,2);
}
}
}else if(len == 6) {
day = str.substr(0,1);
month = str.substr(2,1);
year = str.substr(4,2);
}
int m = atoi((month.c_str()));
int yr = atoi((year.c_str()));
this->day = atoi((day.c_str()));
this->mon = m;
this->year = atoi(year.c_str());

}
}
//把这个函数中的月分改到12了,这样可以方便计算,因为月分本来就可以是12
int DateFormatter::FindMonthInNumber(string m) //识别月份的英文形式,还原成整数
{
if(to_lower(m)=="jan") {
return 1;
}else if(to_lower(m)=="feb") {
return 2;
}else if(to_lower(m)=="mar") {
return 3;
}else if(to_lower(m)=="apr") {
return 4;
}else if(to_lower(m)=="may") {
return 5;
}else if(to_lower(m)=="jun") {
return 6;
}else if(to_lower(m)=="jul") {
return 7;
}else if(to_lower(m)=="aug") {
return 8;
}else if(to_lower(m)=="sep") {
return 9;
}else if(to_lower(m)=="oct") {
return 10;
}else if(to_lower(m)=="nov") {
return 11;
}else if(to_lower(m)=="dec") {
return 12;
}else {
return -1;
}
}
string DateFormatter::to_lower(string s) //这个函数没有问题,所以没改
{
int len = s.length();
for(int i=0;i<len;i++) {
if(s[i] >= 'A' && s[i] <= 'Z') {
s[i] = tolower(s[i]);
}
}
return s;
}
char* DateFormatter::GetDate() //因为我把月分设到了12,因此这个函数把mon+1改为了mon,其他地方没有问题,所以没改。
{
char* d = new char[25];
char* m = new char[5];
char* y = new char[5];
d = itoa(day,d,10);
m = itoa(mon,m,10);
y = itoa(year,y,10);
strcat(d,"/");
strcat(d,m);
strcat(d,"/");
strcat(d,y);
char ret[25];
strcpy(ret,d);
delete[] d;
delete[] m;
delete[] y;
return ret;
}
char* DateFormatter::GetFormattedDate()//这个函数没问题,没改
{
char mn[5];
strcpy(mn,FindMonth(mon));
char ret[25];
strcpy(ret,FormatDate(day,mn,year));
return ret;
}
DateFormatter DateFormatter::Submon(int mons)
{
int M,Y,a;
M=this->mon;
Y=this->year;
for(a=0;12*a+M+1-mons<1;a++)

this->mon=12*a+M-mons;
this->year=Y-a;
if(this->day>FindDaysInMonth(this->mon))
this->day=FindDaysInMonth(this->mon);
return *this;
}
DateFormatter DateFormatter::operator + (const int &days)//这个函数大换血了,主要是加入了新算法,因为你的算法有问题。
{
if(days <= 0)
int curr_mon=this->mon;
int d=this->day+days; //把当前日期加上输入的天数赋给另一个变量保存起来
int days_in_mon = FindDaysInMonth(curr_mon);
//下面是输入的天数加上当前日期大于当前月数的天数的算法
if(d>days_in_mon) //如果大于本月的最大天数,则按下面计算月分和年月还有日期
{ //以下是循环增加月数,因为每月的日期天数不一样

while(d/days_in_mon>=1) //很明显,如果当天数大于当前月数最大天数月分应增加
{
d=d-days_in_mon; //月分增加后应减掉本月的最大天数。
if(d==0) //判断d是否为0,如果为0,则当月的日期为当月的最大天数。
this->mon=this->mon+1;
days_in_mon = FindDaysInMonth(this->mon); //重新计算下一个月的最大天数。
if(this->mon>12)
}
this->day=d;
}
else this->day=d;
//举例进行上面循环的计算方法:比如输入日期为2007-1-1输入天数730因为07年有365天,08年有366天,因此应该输出2008-12-31,首先把731加上当前日期1,得到732,很明显大于第1月分的31天,
//因此执行循环,372/31大于1,然后执行d=372-31=341,然后月分加1,然后重新计算本月分的最大天数,再循环....一直到第13个月,这时月分大于12,执行if语句,年分加1,
//重新计算月分为this->mon%12等于1月,然后再重新计算1月分的最大天数,然后再循环...一直到d=31,这时d/31=1,其中31为12月分的天数,d=d-31=0;因此执行if(d==0)把日期设为设为
//当前月分的最大天数31,然后跳出循环,执行while之外的this->day=d这时就得到日期为31。因此程序最后输出2008-12-31

if(this->mon>12) //这一个语句可能无法执行到,除非直接使月分大于12。月分的计算相对简单一些,因为月分是固定的12个月,不像日期,每个月的日期天数不一样。
{this->year=this->year+this->mon/12; //月分大于12,则年加上相应的月增加数,比如为25月,则25/12就应该加2年。
this->mon=this->mon%12; //重设月分为当前月分的余数,比如月分为15,则年分加一年之后月分应为3,因此15%12=3正确。
if(this->mon==0) this->mon=12;} //如果月分等于0,则表示月分是12月,比如月分为24月,则24%12=0,很明显24月是第二年的12月,因此正确。

return *this;

}
DateFormatter DateFormatter::operator - (const int &days)//未改,工程量太大,留给楼主了。
{
if(days<=0)
{
cout<<"天数不为正,错误\n";
return *this;
}
int curr_day=this->day;
int curr_mon=this->mon;
int days_in_mon=FindDaysInMonth(curr_mon);
if(this->mon==0&&curr_day==1)

if(curr_day==1)
{
this->mon--;
if(this->mon<0)

this->day=FindDaysInMonth(this->mon)+1;
days_in_mon=FindDaysInMonth(this->mon);
}
if(days<=FindDaysInMonth(this->mon-1))
{
this->day-=days;
if(this->day<1)
{
this->mon--;
if(this->mon<0)

this->day+=FindDaysInMonth(this->mon);
}
return *this;
}
else
{
int days_to_sub=curr_day;
this->day-=days_to_sub;
if(this->day<1)

int rem_days=days-days_to_sub;
*this-rem_days;
return *this;
}
}

//从这里一直到main函数都没有改动,其算法留给楼主了,工程量实在太大。
void DateFormatter::IncrementMonth()
{
mon++;
if(mon > 11) {
mon = 0;
year++;
}
}
int DateFormatter::FindDifferenceInMonths(DateFormatter dft)//未改动
{
int diff = 0;
if(dft > *this) {
return -1;
}else if(dft == *this) {
return 0;
}else {
while(1) {
dft.IncrementMonth();
diff++;
if((dft.GetYear() == this->year) && (dft.GetMonth() == this->mon)) {
break;
}
}
}
if(this->GetDay() < dft.GetDay()) {
diff--;
}
return diff;
}
int DateFormatter::operator - (DateFormatter &dft) //未改动
{
if(*this < dft)
{
cout<<"参数时间大于对象时间,无法相减\n";
return -1;
}else if(*this == dft) {
return 0;
}else {
int ret = 0;
while(1) {
if(dft == *this) {
break;
}
dft+1;
ret++;
}
return ret;
}
}
DateFormatter DateFormatter::operator ++ (int)

DateFormatter DateFormatter::operator -- (int)

istream& operator>>(istream& in,DateFormatter& dft)
{
cout<<"请输入一个日期:"<<endl;
char *tmp=new char;
DateFormatter s;
do
{
in>>tmp;
DateFormatter t(tmp);
if(t.mon!=-1&&t.day>0&&t.day<=t.FindDaysInMonth(t.mon))

cout<<"输入的日期有错误,请重新输入:\n";
}while(1);
dft=s;
return in;
}
ostream& operator<<(ostream& out,DateFormatter &dft)
{
char tmp[25];
strcpy(tmp,dft.GetDate());
out<<"得到的日期用第一种格式表示为:\n"<<tmp<<endl;
strcpy(tmp,dft.GetFormattedDate());
out<<"得到的日期用第二种格式表示为:\n"<<tmp<<endl;
return out;
}
int DateFormatter::operator < (DateFormatter df) //重载<运算符,对象时间大于参数时间返回1
{
if(df.year > this->year) {
return 1;
}else if(df.year == this->year && df.mon > this->mon) {
return 1;
}else if(df.year == this->year && df.mon == this->mon && df.day > this->day) {
return 1;
}else {
return 0;
}
}
int DateFormatter::operator > (DateFormatter df) //重载>运算符,对象时间小于参数时间返回1
{
if(df.year < this->year) {
return 1;
}else if(df.year == this->year && df.mon < this->mon) {
return 1;
}else if(df.year == this->year && df.mon == this->mon && df.day < this->day) {
return 1;
}else {
return 0;
}
}
int DateFormatter::operator == (DateFormatter df) //重载=运算符,对象时间等于参数时间返回1
{
if( (df.year == this->year)
&& (df.mon == this->mon) && (df.day == this->day)) {
return 1;
}else {
return 0;
}
}
void main() //主要修改了一些错误。
{
DateFormatter dft1,dft2,dft3;
char tm[25];
strcpy(tm,dft1.Today());
cout<<"Today is:"<<tm<<endl;
cout<<'\t'<<"日期格式处理选单:"<<endl;
cout<<"1.日期加天数"<<endl;
cout<<"2.日期减天数"<<endl;
cout<<"3.日期减日期"<<endl;
cout<<"4.日期减月份"<<endl;
cout<<"5.日期自加"<<endl;
cout<<"6.日期自减"<<endl;
cout<<"0.退出"<<endl;
do
{
cout<<"请输入数字,选择相应的功能\n";
int n,m;
cin>>n;
switch(n)
{ case 0:exit(0);
case 1: {cin>>dft1; cout<<"请输入增加的天数:\n"; cin>>m;
dft2=dft1+m; cout<<dft2<<endl; break; }
case 2:{cin>>dft1; cout<<"请输入减少的天数:\n"; cin>>m;
dft2=dft1-m; cout<<dft2<<endl; break; }
case 3:
case 4:{cin>>dft1; cout<<"请输入减少的月份:"<<endl; cin>>m;
dft2=dft1.Submon(m); cout<<dft2<<endl; break; }
case 5:
case 6:
default:
}
}while(1); //while应放到这个位置。

system("pause");

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-03-02
double c=sprt(a*a+b*b)后面加个分号
sprt 改为sqrt,就可以了
第2个回答  2011-03-02
#include <math.h> #include <stdio.h> int main(void) { double x = 4.0, result; result = sqrt(x); //result*result = x printf("The square root of %lf is %lf\n", x, result); return 0; }
第3个回答  2011-03-02
是sqrt不是sprt !追问

不对还是错的

本回答被提问者采纳

求c++高人帮忙解答下17 18 19 20 我一个会计怎会写。。。急急,要交上 ...
17、类名,冒号 18、初始化列表,函数体(不确定)19、公有,保护,私有 20、int fa(),int fb()

我要学c c++,高人指点
我也认为应该从C语言开始学起,先将基本的语法学会,先明白什么是面向过程,然后再去理解C++,也就是面向对象的程序设计。总之,要一步一步,慢慢来。。因为你有PHP的基础,学C C++,应该都不怎么困难,因为你已经有了编程思想

c++初学,高人指教
c++初学时,找到一位经验丰富的导师确实能极大加速学习进程并避免许多常见错误。面对编程,尤其在掌握一门新语言如C++时,常常会遇到概念理解、代码编写、调试与优化等问题。一位高人能提供宝贵的指导和建议,帮助初学者建立起稳固的基础。首先,导师能解释C++的核心概念,如面向对象编程、指针、模板、异常处...

关于c++作用域问题,求高人
最好的方法是自己去试一试,对自己认识作用域很有帮助。在全局作用域中,定义x=1;在main中,定义x=2。试一试,你就会很好的了解作用域!求人不如求己,学会了才对你好!

求c++高人!
求c++高人! #include"iostream.h"#include"math.h"voidmain(){doublea,b;cout<<"请输入两直角边长:"<<endl;cin>>a>>b;doublec=sprt(a*a+b*b)cout<<"斜边长="<<c<<endl;}求这个程序怎么不对了... #include "iostream.h" #include "math.h" void main(){ double a,b; cout<<"请输入两...

C++取整问题,急求高人
比如:{double a=0.01; cout<<a*a-0.0001<<" "<<endl;}的输出结果就不是0 解决办法:int main(){ double error=1e-10; \/\/设定一个容许误差 double operand;cin>>operand;while(operand>0){ int b=(int)(operand*10);cout<<"b="<<b;double c=(double)(operand*10);cout<...

求助高人。。。新人学习C++又不懂的地方请指教为什么这个程序结果为 1...
ra=a;应该改为:int & ra = a;因为引用必须在声明的时候初始化。那么什么是引用呢?说白了就是别名。给变量 ra 起个别名叫 a,所以 ra 和 a 都是对同一个变量的称呼,对应同一份内存。因此:ra==a\/\/ 对应同一份内存 &ra==&a\/\/ 对应同一个地址 sizeof(ra)==sizeof(a)\/\/ 同样的...

ACM 题目 求高人解答 (C C++)
include<string.h> int main(){ int n;int max_,min_;int p;while(scanf("%d",&n)!=EOF&&n>0){ n--;scanf("%d",&max_);min_=max_;while(n--){ scanf("%d",&p);if(p<min_){ min_=p;} if(p>max_){ max_=p;} } printf("%d\\n",(max_-min_)*2);} return 0;...

求助高人C++输出超限什么意思
你的代码基本可以,亲测没有错,只是没有终止循环 应该为while(ch!='\\n') \\n表示回车的 你所说的错误可能是配置文件的问题,建议新建工程再试

C++编程中这个ERROR是什么意思。。求高人解答。。
类型定义不当,除数为0,指针使用错误。error命令是C++语言的预处理命令之一,当预处理器预处理到error命令时将停止编译并输出用户自定义的错误消息。int*re(){ int*a;a=newint[10];for(inti=0;i<10;i++)a[i]=i;returna;}

相似回答
大家正在搜