关于C++的一个日期类的代码问题
我需要编一个程序以实现以下功能:(1)输入一个日期,格式为:year/month/day(2)创立一个类,以实现在该日期的基础上再加一天(3)主函数输出加一天后的正确日期...
我需要编一个程序以实现以下功能:
(1)输入一个日期,格式为:year/month/day
(2)创立一个类,以实现在该日期的基础上再加一天
(3)主函数输出加一天后的正确日期
我自己编的程序代码如下,但是总是出现if 与else不匹配的问题,但是我找不出问题的缘由。请高手们帮一下忙!
#include<iostream.h>
class date
{private:
int year,month,day;
public:
date(int x,int y,int z)
{year=x;month=y;day=z;}
int fun1(int a);
void fun2();
int fun3()
{return year;}
int fun4()
{return month;}
int fun5()
{return day;}
};
int date::fun1(int a)
{int leap;
leap=(a%4==0&&a%100!=0||a%100==0&&a%400==0)?1:0;
return leap;
}
void date::fun2()
{
if(day<=27)day++;
else
{
switch(day)
{case 28:
if(month==2)
{if(fun1(year)==1) day++;else {month++;day++;};};
else day++;
break;
case 29:
if(fun1(year)==1)
{if(month==2) {month++;day=1;};else day++;};
else {if(month==2){cout<<"您输入了错误日期!"<<endl;break;};else day++;};
break;
case 30:
if(month==2){cout<<"您输入了错误日期!"<<endl;break;};
else
{
if(month==4||month==6||month==9||month==11)
{month++;day=1;};
else day;};
break;
case 31:
if(month==2||month==4||month==6||month==9||month==11)
{cout<<"您输入了错误日期!"<<endl;break;};
else
{
if(month==1||month==3||month==5||month==7||month==8||month==10)
{month++;day=1;};
else if(month==12){year++;month++;day=1;};
};
break;
default:cout<<"您输入了错误日期!"<<endl;
};
};
}
void main()
{
int a,b,c;
cout<<"请依次输入正确的年、月、日(该程序将显示第二天的日期):"<<endl;
cin>>a;
cout<<"/";
cin>>b;
cout<<"/";
cin>>c;
date date1(a,b,c);
date1.fun2();
if(date1.fun5!=c)
cout<<endl<<date1.fun3<<"/"<<date1.fun4<<"/"<<date1.fun5<<endl;
}
编译错误如下:
--------------------Configuration: yearmonthday - Win32 Debug--------------------
Compiling...
yearmonthday.cpp
C:\Documents and Settings\Administrator\桌面\新建文件夹\年月日\yearmonthday.cpp(37) : error C2181: illegal else without matching if
C:\Documents and Settings\Administrator\桌面\新建文件夹\年月日\yearmonthday.cpp(41) : error C2181: illegal else without matching if
C:\Documents and Settings\Administrator\桌面\新建文件夹\年月日\yearmonthday.cpp(42) : error C2181: illegal else without matching if
C:\Documents and Settings\Administrator\桌面\新建文件夹\年月日\yearmonthday.cpp(42) : error C2181: illegal else without matching if 还有其他的一些错误 因为字数限制 所以粘贴不过来 麻烦您自己编译一下吧! 展开
(1)输入一个日期,格式为:year/month/day
(2)创立一个类,以实现在该日期的基础上再加一天
(3)主函数输出加一天后的正确日期
我自己编的程序代码如下,但是总是出现if 与else不匹配的问题,但是我找不出问题的缘由。请高手们帮一下忙!
#include<iostream.h>
class date
{private:
int year,month,day;
public:
date(int x,int y,int z)
{year=x;month=y;day=z;}
int fun1(int a);
void fun2();
int fun3()
{return year;}
int fun4()
{return month;}
int fun5()
{return day;}
};
int date::fun1(int a)
{int leap;
leap=(a%4==0&&a%100!=0||a%100==0&&a%400==0)?1:0;
return leap;
}
void date::fun2()
{
if(day<=27)day++;
else
{
switch(day)
{case 28:
if(month==2)
{if(fun1(year)==1) day++;else {month++;day++;};};
else day++;
break;
case 29:
if(fun1(year)==1)
{if(month==2) {month++;day=1;};else day++;};
else {if(month==2){cout<<"您输入了错误日期!"<<endl;break;};else day++;};
break;
case 30:
if(month==2){cout<<"您输入了错误日期!"<<endl;break;};
else
{
if(month==4||month==6||month==9||month==11)
{month++;day=1;};
else day;};
break;
case 31:
if(month==2||month==4||month==6||month==9||month==11)
{cout<<"您输入了错误日期!"<<endl;break;};
else
{
if(month==1||month==3||month==5||month==7||month==8||month==10)
{month++;day=1;};
else if(month==12){year++;month++;day=1;};
};
break;
default:cout<<"您输入了错误日期!"<<endl;
};
};
}
void main()
{
int a,b,c;
cout<<"请依次输入正确的年、月、日(该程序将显示第二天的日期):"<<endl;
cin>>a;
cout<<"/";
cin>>b;
cout<<"/";
cin>>c;
date date1(a,b,c);
date1.fun2();
if(date1.fun5!=c)
cout<<endl<<date1.fun3<<"/"<<date1.fun4<<"/"<<date1.fun5<<endl;
}
编译错误如下:
--------------------Configuration: yearmonthday - Win32 Debug--------------------
Compiling...
yearmonthday.cpp
C:\Documents and Settings\Administrator\桌面\新建文件夹\年月日\yearmonthday.cpp(37) : error C2181: illegal else without matching if
C:\Documents and Settings\Administrator\桌面\新建文件夹\年月日\yearmonthday.cpp(41) : error C2181: illegal else without matching if
C:\Documents and Settings\Administrator\桌面\新建文件夹\年月日\yearmonthday.cpp(42) : error C2181: illegal else without matching if
C:\Documents and Settings\Administrator\桌面\新建文件夹\年月日\yearmonthday.cpp(42) : error C2181: illegal else without matching if 还有其他的一些错误 因为字数限制 所以粘贴不过来 麻烦您自己编译一下吧! 展开
3个回答
展开全部
LZ 的逻辑没问题,但很多地方不够简练
先集中说几个严重的错误
1. LZ 对 if else 语法不够熟悉,每个选择分支如果是 {} 那么它就代表一个完整的语句,不用加“;”了,这个不像定义类,此时的{}后面加“;”是另有它意的。乱加“;”也是造成 LZ 的 if 嵌套混乱的重要原因之一
2. LZ 讲的 if 嵌套混乱由两个原因引起
第一个,从 LZ 贴出来的代码看,LZ 没有养成的规范编写格式的习惯,规范代码格式细节很多,LZ 用 VS 一类的 IDE 编写的时候 IDE 能自动帮 LZ 做一定的缩进,以使代码规范。我下面帮 LZ 改了,这样代码结构清晰,易读。 if 嵌套关系就更容易理解。
第二个,关于避免 if 中 else 的匹配换乱,LZ 养成不管多么简单的 if 语句,不要用 if(condition)statement; 格式,即不用简单格式。坚持使用带 {} 的完整格式,这样 else 的遗漏很容易被发现。
3. 标准库中的名称如果没有 using 声明,都得加 std:: 以表示 cout cin endl 之类的名称在 标准库里定义,这样编译器才知道在哪里参考他们。
4. 使用合适类型存储年月日,这里 unsigned 比 int 更加适合
下面是修改后的代码,修改之处做了注释
以下代码在 VS2010 编译通过,运行成功!
#include<iostream> // 标准的不带 .h
#include <string>
#include <sstream>
class date
{
private:
unsigned year,month,day;
public:
date(unsigned x,unsigned y,unsigned z) {year=x;month=y;day=z;}
bool fun1(unsigned a); // 建议直接使用内置的 bool 类型,避免转化错误
void fun2();
unsigned fun3()
{return year;}
unsigned fun4()
{return month;}
unsigned fun5()
{return day;}
};
bool date::fun1(unsigned a) // 建议直接使用内置的 bool 类型,避免转化错误
{
// 直接返回结果就行了,不用定义局部变量
return (a%4==0&&a%100!=0||a%100==0&&a%400==0)?true:false;
}
void date::fun2()
{
if(day<=27)
{
day++;
}
else
{
switch(day)
{
case 28:
if(month==2)
{
if(fun1(year)) // if 条件做相应修改,更加简洁
{
day++;
}
else
{
month++;
day = 1; // 非闰月2月28日的后一天是3月1日
}
}
else
{
day++;
}
break;
case 29:
if(fun1(year)) // 修改理由参见上方修改
{
if(month==2)
{
month++;
day=1;
}
else
{
day++;
}
}
else
{
if(month==2)
{
std::cout<<"您输入了错误日期!"<< std::endl; // 没有使用using 声明就得加 “std::”
break;
}
else
{
day++;
}
}
break;
case 30:
if(month==2)
{
std::cout<<"您输入了错误日期!"<<std::endl; // 没有使用using 声明就得加 “std::”
break;
}
else
{
if(month==4||month==6||month==9||month==11)
{
month++;day=1;
}
else
{
day++; // 少了 “++”运算符
}
}
break;
case 31:
if(month==2||month==4||month==6||month==9||month==11)
{
std::cout<<"您输入了错误日期!"<<std::endl;
break;
}
else
{
if(month==1||month==3||month==5||month==7||month==8||month==10)
{
month++;
day=1;
}
else if(month==12)
{
year++;
month++;
day=1;
};
}
break;
default:
std::cout<<"您输入了错误日期!"<<std::endl;
}
}
}
void main()
{
std::cout<<"请依次输入正确的年/月/日(可以以任意非数字符号间隔,该程序将显示第二天的日期):"<<std::endl;
std::string inputstr; // C++ 字符串用来保存用户的输入(如 1998-12-12,1999/12/23 …)
std::cin >> inputstr;
std::istringstream instr(inputstr); // instr 用于将年月日信息抽取出来
char dump; // dump 用于将“/ -”之类的分隔符过滤掉
unsigned a,b,c; // 年月日没有负数,所以 unsigned 更加适合
instr >> a >> dump >> b >> dump >> c;
date date1(a,b,c);
date1.fun2();
if(date1.fun5()!=c) // 调用成员函数别忘了“()”
std::cout<<std::endl<<date1.fun3()
<<"/"<<date1.fun4()<<"/"<<date1.fun5()
<<std::endl; // 调用成员函数别忘了“()”
}
==================
运行结果
请依次输入正确的年/月/日(可以以任意非数字符号间隔,该程序将显示第二天的日期):
1998-2-28
1998/3/1
Press any key to continue . . .
先集中说几个严重的错误
1. LZ 对 if else 语法不够熟悉,每个选择分支如果是 {} 那么它就代表一个完整的语句,不用加“;”了,这个不像定义类,此时的{}后面加“;”是另有它意的。乱加“;”也是造成 LZ 的 if 嵌套混乱的重要原因之一
2. LZ 讲的 if 嵌套混乱由两个原因引起
第一个,从 LZ 贴出来的代码看,LZ 没有养成的规范编写格式的习惯,规范代码格式细节很多,LZ 用 VS 一类的 IDE 编写的时候 IDE 能自动帮 LZ 做一定的缩进,以使代码规范。我下面帮 LZ 改了,这样代码结构清晰,易读。 if 嵌套关系就更容易理解。
第二个,关于避免 if 中 else 的匹配换乱,LZ 养成不管多么简单的 if 语句,不要用 if(condition)statement; 格式,即不用简单格式。坚持使用带 {} 的完整格式,这样 else 的遗漏很容易被发现。
3. 标准库中的名称如果没有 using 声明,都得加 std:: 以表示 cout cin endl 之类的名称在 标准库里定义,这样编译器才知道在哪里参考他们。
4. 使用合适类型存储年月日,这里 unsigned 比 int 更加适合
下面是修改后的代码,修改之处做了注释
以下代码在 VS2010 编译通过,运行成功!
#include<iostream> // 标准的不带 .h
#include <string>
#include <sstream>
class date
{
private:
unsigned year,month,day;
public:
date(unsigned x,unsigned y,unsigned z) {year=x;month=y;day=z;}
bool fun1(unsigned a); // 建议直接使用内置的 bool 类型,避免转化错误
void fun2();
unsigned fun3()
{return year;}
unsigned fun4()
{return month;}
unsigned fun5()
{return day;}
};
bool date::fun1(unsigned a) // 建议直接使用内置的 bool 类型,避免转化错误
{
// 直接返回结果就行了,不用定义局部变量
return (a%4==0&&a%100!=0||a%100==0&&a%400==0)?true:false;
}
void date::fun2()
{
if(day<=27)
{
day++;
}
else
{
switch(day)
{
case 28:
if(month==2)
{
if(fun1(year)) // if 条件做相应修改,更加简洁
{
day++;
}
else
{
month++;
day = 1; // 非闰月2月28日的后一天是3月1日
}
}
else
{
day++;
}
break;
case 29:
if(fun1(year)) // 修改理由参见上方修改
{
if(month==2)
{
month++;
day=1;
}
else
{
day++;
}
}
else
{
if(month==2)
{
std::cout<<"您输入了错误日期!"<< std::endl; // 没有使用using 声明就得加 “std::”
break;
}
else
{
day++;
}
}
break;
case 30:
if(month==2)
{
std::cout<<"您输入了错误日期!"<<std::endl; // 没有使用using 声明就得加 “std::”
break;
}
else
{
if(month==4||month==6||month==9||month==11)
{
month++;day=1;
}
else
{
day++; // 少了 “++”运算符
}
}
break;
case 31:
if(month==2||month==4||month==6||month==9||month==11)
{
std::cout<<"您输入了错误日期!"<<std::endl;
break;
}
else
{
if(month==1||month==3||month==5||month==7||month==8||month==10)
{
month++;
day=1;
}
else if(month==12)
{
year++;
month++;
day=1;
};
}
break;
default:
std::cout<<"您输入了错误日期!"<<std::endl;
}
}
}
void main()
{
std::cout<<"请依次输入正确的年/月/日(可以以任意非数字符号间隔,该程序将显示第二天的日期):"<<std::endl;
std::string inputstr; // C++ 字符串用来保存用户的输入(如 1998-12-12,1999/12/23 …)
std::cin >> inputstr;
std::istringstream instr(inputstr); // instr 用于将年月日信息抽取出来
char dump; // dump 用于将“/ -”之类的分隔符过滤掉
unsigned a,b,c; // 年月日没有负数,所以 unsigned 更加适合
instr >> a >> dump >> b >> dump >> c;
date date1(a,b,c);
date1.fun2();
if(date1.fun5()!=c) // 调用成员函数别忘了“()”
std::cout<<std::endl<<date1.fun3()
<<"/"<<date1.fun4()<<"/"<<date1.fun5()
<<std::endl; // 调用成员函数别忘了“()”
}
==================
运行结果
请依次输入正确的年/月/日(可以以任意非数字符号间隔,该程序将显示第二天的日期):
1998-2-28
1998/3/1
Press any key to continue . . .
展开全部
if 和else的{}后面是不加;的啊。
if(month==2) {month++;day=1;};else day++;
改成if(month==2) {month++;day=1;}else day++;
还有 建议你最好把if 和else都用{}包起来,结构清晰
直译就是这个else没有if
你的问题都是if和else不匹配。你写的这句
if(month==2) {month++;day=1;};//在这里if已经结束了,注意最后一个“;”符号
else day++;//编译器认为这个一个单独的else 所以出错
if(month==2) {month++;day=1;};else day++;
改成if(month==2) {month++;day=1;}else day++;
还有 建议你最好把if 和else都用{}包起来,结构清晰
直译就是这个else没有if
你的问题都是if和else不匹配。你写的这句
if(month==2) {month++;day=1;};//在这里if已经结束了,注意最后一个“;”符号
else day++;//编译器认为这个一个单独的else 所以出错
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
乱加 分号
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询