实验编程题答案
实验一
1、输入日期的年份和月份,求该月有多少天。提示:对于月份为1、3、5、7、8、10、12的月份天数为31,月份为4、6、9、11的月份天数为30,月份为2时要结合年份考虑闰年的情况。#include
using namespace std;
int main()
{
int y,m;
cin>>y>>m;
if(1900<=y&&y<3000&&0 { if(y%4==0&&y%100!=0||y%400==0) { switch(m) { case 1:cout<<"31";break; case 2:cout<<"29";break; case 3:cout<<"31";break; case 4:cout<<"30";break; case 5:cout<<"31";break; case 6:cout<<"30";break; case 7:cout<<"31";break; case 8:cout<<"31";break; case 9:cout<<"30";break; case 10:cout<<"31";break; case 11:cout<<"30";break; case 12:cout<<"31";break; } } else { switch(m) { case 1:cout<<"31";break; case 2:cout<<"28";break; case 3:cout<<"31";break; case 4:cout<<"30";break; case 5:cout<<"31";break; case 6:cout<<"30";break; case 7:cout<<"31";break; case 8:cout<<"31";break; case 9:cout<<"30";break; case 10:cout<<"31";break; case 11:cout<<"30";break; case 12:cout<<"31";break; } } } else cout<<"Input error!"; return 0; } 2、某高校录取研究生的要求是,新生的每门课成绩不低于60分,总成绩不低于340分,370分以下为自费。编一程序实现输入一个学生的四门课成绩,试判断该生为该校录取的情况(“没有录取”、“自费”、“公费”三种情况)。 #include using namespace std; int main() { int a,b,c,d,s; cin>>a>>b>>c>>d; s=a+b+c+d; if(a>=60&&b>=60&&c>=60&&d>=60&&s>=340) { if(s>=370) cout<<"公费"< else cout<<"自费"< } else cout<<"没有录取"< return 0; } 3、 在华农校园里,没有自行车,上课办事会很不方便。但实际上,并非去办任何事情都是骑车快,因为骑车总要找车、开锁、停车、锁车等,这要耽误一些时间。假设找到自行车,开锁并骑上自行车的时间为27秒;停车锁车的时间为23秒;步行每秒行走1.2米,骑车每秒行走3.0米。请判断走不同的距离去办事,是骑车快还是走路快。 #include using namespace std; int main() { double tb,tw,s; cin>>s; tb=s/3+50; tw=s/1.2; if(tb>tw) cout<<"Walk"< else if(tb else cout<<"All"< return 0; } 4、 一个停车场的标准收费是3小时之内收5元,超过3小时,每增加1小时加收2元;如果时间不是整数,按比例收取,例如:如果输入为3.6小时,则费用为5 + (3.6-3)*2 = 6.2 元。最高收费为40元。假设任何车辆的停车时间都不超过24小时。编写程序,计算每辆车的停车费。 【提示】 要输出浮点数、双精度数小数点后2位数字,可以用下面这种形式: cout< 按上面的形式控制输出格式时,需在源程序最开始加上一行:#include #include #include using namespace std; int main() { double t,cost; cin>>t; if(t<=3) cout<<"5.00"< else if(t<=20.5) { cost=(t-3)*2+5; cout< } else cout<<"40.00"< return 0; } 5、 模拟计算器的功能,能根据用户输入的两个运算数和运算符(’+’、‘-’、‘*’或‘/ ’),对两个数进行相应的运算,输出运算结果。注意:除法运算‘/ ’的除数不能为0。 #include using namespace std; int main() { double a,b,n; char c; cin>>a>>b>>c; if(c=='/'&&b==0) cout<<"除数为0!"< else if(c!='+'&&c!='-'&&c!='*'&&c!='/') cout<<"运算符号错误!"; else if(c=='+') { n=a+b; cout< } if(c=='-') { n=a-b; cout< } if(c=='*') { n=a*b; cout< } if(c=='/') { n=a/b; cout< } return 0; } 实验二 1、 给定一个正整数a,以及另外的5个正整数,问题是:这5个整数中,小于a的整数的和是多少?#include using namespace std; int main() { int a,b,c,d,e,f,x=0; cin>>a>>b>>c>>d>>e>>f; if(a<=100) if(b if(c if(d if(e if(f cout< return 0; } 2 一球从某一高度落下(整数,单位米),每次落地后反跳回原来高度的一半,再落下。编程计算气球在第5次落地时,共经过多少米? 第5次反弹多高? #include using namespace std; int main() { int h0; double s,h; cin>>h0; h=h0/32.0; s=h0+2*(h0/2.0+h0/4.0+h0/8.0+h0/16.0); cout< return 0; } 3 有一个分数序列2/1,3/2,5/3,8/5,13/8,21/13,.... 求这个分数序列的前n项之和。 #include #include using namespace std; int main() { double i,n,x,y,z; double s; cin>>n; x=2;y=1;s=2; for(i=1;i { z=x;x=y+z;y=z;s=s+x/y; } cout< return 0; } 4 在平面坐标系中,有一个正方形,四个角的坐标(x,y)分别是(1,-1),(1,1),(-1,-1),(-1,1),x是横轴,y是纵轴。写一个程序,判断给定的多个点是否在这个正方形内。 #include using namespace std; void main() { float x,y; for( ; ; ) { cin>>x>>y; if(x==0&&y==0) { cout<<"yes"< break; } if(x<=1&&x>=-1&&y<=1&&y>=-1) cout<<"yes"< else cout<<"no"< } } 5 一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号所构成的数字正好等于某一个整数的平方。请根据以上线索求出车号。 #include using namespace std; #include void main() {int a,b,c,d,m,n; for(a=0;a<10;a++) {for(b=0;b<10;b++) {for(c=0;c<10;c++) {for(d=0;d<10;d++) {if(a==b&&c==d) {m=a*1000+b*100+c*10+d; {for(n=32;n<100;n++) if(n*n==m) cout< { } } } } } } } } 实验三 1 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。 #include using namespace std; int main() { int a[100]; int m,sum=0; for(int i=1;i<=10;i++) cin>>a[i]; cin>>m; for(i=1;i<=10;i++) { if(m>=a[i]||(m=a[i])) sum=sum+1; } cout< return 0; } 2 歌唱大赛选手成绩这样计算:去掉一个最高分,去掉一个最低分,将剩下分数的平均值作为选手的最后得分。现假设共有6位评委,都是按百分制打分,请编程计算选手的成绩。 提示:将6个评分存入score数组中。关键是求出其中的最大值max(即最高分)和最小值min(即最低分)。 #include using namespace std; int main() { double score[100]; double m=0; double g=0; for(int i=1;i<=6;i++) cin>>score[i]; double big=score[1]; double small=score[1]; for(int j=1;j<=6;j++) { if(score[j]>big) big=score[j]; } for(int k=1;k<=6;k++) { if(score[k] small=score[k]; } for(int n=1;n<=6;n++) g+=score[n]; m=(g-big-small)/4; cout< return 0; } 3 插入式加密法是信息加密中一种简单的加密技术,其方法是在明文字符中插入一些无意义的字母来形成密文单词。例如,对于明文:China,在间隔为1的位置依次插入一个字母而形成密文:Coheifnia。因此,其解密过程与加密过程相反,即从密文中首字符开始取,每间隔1个位置依次取出字符,就得到原始的明文。请编程实现插入式加密法所对应的解密算法,将密文翻译成明文。提示:定义两个字符数组ci和pl,分别存放密文字符串和明文字符串。解密过程即在字符串ci 中,从下标0的字符(首字符)开始,将偶数下标的字符(’\0’之前的)依次取出赋值到字符 数组pl中,最后即得到明文字符串。 #include using namespace std; int main() { char ci[100]; char pl[100]; int m=0; cin.getline(ci,100); for(int i=0;ci[i]!='\0';i++) { if(i%2==0) { pl[m]=ci[i]; m=m+1; } } pl[m]='\0'; cout< return 0; } 4 输入一个长度小于20的不含空格的字符串,然后对该字符串做如下处理:对字符串中的每个字符,如果是大写字母,将其转化为小写;如果是小写字母,将其转化为大写,最后将处理后的字符串输出。 要求用指针对字符串进行处理。 #include using namespace std; int main() { char s[21],*p; cin>>s; p=s; while(*p) { if(*p>='a'&&*p<='z') *p=*p-32; else if(*p>='A'&&*p<='Z') *p=*p+32; p++; } cout< return 0; } 5 在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数,或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。 注意:数组中的第一个数(下标为0)只要和第二个数(下标为1)不相等,第一个数(下标为0)就是极值点;同理,数组中的最后一个数只要和倒数第二个数不相等,最后一个数也是极值点。#include using namespace std; void main() { int n; cin>>n; cout< int*p=new int[n]; int j=0; for(int i=0;i cin>>p[i]; while(j { if(n>=2&&j==0&&p[0]!=p[1]) cout<<"0"<<' '< if(j!=n-1&&j!=0) { if((p[j]>p[j+1]&&p[j]>p[j-1])||(p[j] cout< } if(j==n-1&&p[n-1]!=p[n-2]) cout< j++; } delete []p; } 实验四 1 判断正整数n是否为完数。已知一个数如果恰好等于除它本身外的所有因子之和,这个数就称为完数。此程序要求编写函数bool wanshu(int n),判断n是否为完数,若n是,则函数返回true;否则返回false。然后主函数通过该函数的返回值,在屏幕上输出判断结果。 #include using namespace std; int number (int); int main() { int n; cin>>n; int result=number(n); if(result==-1) cout<<"no"< else cout<<"yes"< return 0; } int number (int a) { int total=0,re=0; for(int i=0;i { total+=i; if(a==total) { re=a; break; } else re=-1; } return re; } 2 假定现在已是2012年,请编写程序,计算2012年伦敦奥运会倒计时的天数并输出。已知伦敦奥运会的开幕日期是2012年7月27日。用户输入日期的范围必须是2012年1月1日— 2012年7月26日。要求程序中编写函数int CountDown(int year,int month,int day),来计算从用户输入的日期year-month-day到伦敦奥运会开幕日之间的倒数天数。 提示:所求天数= month这个月的总天数-day+(month+1到6月所有这些月份天数之和)+27。#include using namespace std; int main() { int y,m,d,x; cin>>y>>m>>d; if(y!=2012||(m>7||m==0)||(m==7&&d>27)) cout< else if(m==7) { x=27-d; cout< } else { switch(m) { case 1:x=31-d+29+31+30+31+30+27;break; case 2:x=29-d+31+30+31+30+27;break; case 3:x=31-d+30+31+30+27;break; case 4:x=30-d+31+30+27;break; case 5:x=31-d+30+27;break; case 6:x=30-d+27;break; } cout< } return 0; } 3 许多英语单词无论是顺读还是倒读,其词形完全一样,都是同一个单词,如dad(爸爸)、noon (中午)、level(水平)等,这样的词称为回文词。在最权威的《牛津英语大词典》里,最长的回文词是tattarrattat,是个象声词,表示敲门的声音。英语的回文句更有趣味(忽略其中的标点符号)。最着名的一句为:“Madam,I’m Adam.”(小姐,我是亚当。)据说,这是亚当在伊甸园里初见夏娃作自我介绍时说的话。 现要求编写一个函数bool huiwen(char *p),判断输入的一个单词是否为回文词。p是指向要输入的字符串的指针,如果是返回true,否则返回false。 #include using namespace std; bool huiwen(char *p) { char *q=p+strlen(p)-1; for(int i=0;i if(*p!=*q) return false; return true; } void main() { char ch[100]; cin>>ch; if(huiwen(ch)) cout<<"yes"; else cout<<"no"; cin.get(); cin.get(); } 4 编写一个函数,用于生成一个由若干个指定字符构成的字符串,其原型为: void mystr(char c,int n, char *p);其中,参数c是构造字符串的字符,n是字符串中字符的个数,p是生成的字符串的首地址。 要求:编写主函数,在主函数中进行字符和字符个数的输入,然后再调用mystr函数生成字符串,最后在主函数中将生成的字符串输出。 #include using namespace std; void mystr(char c,int n,char *p) { for(int i=1;i<=n;i++) cout< return; } int main() { char c; char *p; p=&c; int n; cin>>c; cin>>n; mystr(c,n,p); return 0; } 5 有一个有趣的古典数学问题:有一对兔子,从出生后第3个月起每个月都生1对兔子,小兔子长到第3个月后每个月又生1对兔子。假设所有兔子都不死,问每个月兔子的总对数为多少? 提示:不满1个月的为小兔子,满1个月不满2个月的为中兔子,满3个月以上的为老兔子。每对老兔子每个月会生1对小兔子。因此,每个月的兔子总数依次为1,1,2,3,5,8,13,…。这就是Fibonacci 数列。该数列的递归定义如下:f(n)=1 (n等于1或2);f(n)= f(n-1)+ f(n-2) (n>2) 请编写递归函数int fib(int n),求出第n个月兔子的总对数。 #include using namespace std; void fib(int s) { int d=1,f=1,sum=0,n=1,t=0; while(n { n++; t=f; f=d; d+=t; sum=d+f; } cout<<"第"< } int main() { int s; cin>>s; if(s!=1) fib(s); else cout<<"第1个月兔子的总对数为1"< return 0; } 实验五 1 仿照本次实验预习的程序填空题1,将以上Distance函数定义为类piont的友元函数,实现程序的功能。并在主函数中增加输入两点作为友元函数的实参。 #include #include using namespace std; class point { public: point(float a,float b) { x=a; y=b; } friend float Distance(point p1,point p2) { float dx=p1.x-p2.x; float dy=p1.y-p2.y; return (float)sqrt(dx*dx+dy*dy); } private: float x,y; }; int main() { float p1_x,p1_y,p2_x,p2_y; //输入四个点 cin>>p1_x>>p1_y>>p2_x>>p2_y; point p1(p1_x,p1_y),p2(p2_x,p2_y); cout< return 0; } 2 根据以下主函数的功能来设计日期类CDateInfo,使其能正确运行。类CDateInfo中应该具有描述年、月、日的三个数据成员和相应的成员函数。 #include using namespace std; class CDateInfo { int year,month,day; public: CDateInfo(){}; CDateInfo(int y,int m,int d) {year=y,month=m,day=d;}; void SetDate(int y,int m,int d); void GetDate(); }; void CDateInfo::SetDate(int y=2011,int m=10,int d=10) { year=y; month=m; day=d; } void CDateInfo::GetDate() { cout< } int main() { CDateInfo data1,data2(2011,10,10); //定义对象data1和data2 //分别调用类的不带参数的构造函数和带3个参数的构造函数对 //其数据成员进行初始化 //date1的数据成员未初始化时,其年月日用默认值2000,1,1来继续初始化。 int y,m,d; cin>>y>>m>>d; //输入年月日值 data1.SetDate(y,m,d); //设置data1的年月日为y,m,d data1.GetDate(); //按year-month-day的格式显示data1的年月日 data2.GetDate(); //按year-month-day的格式显示data2的年月日 return 0; } 3 根据以下主函数的功能来设计日期类Student,使其能正确运行。类Student中应该具有描述学生姓名、性别、年龄的三个数据成员和相应的成员函数。 #include #include using namespace std; class Student { char chOne[100]; int iSex; int iOld; public: void SetName(char *name); void SetGender(int sex); void SetAge(int age) { iOld=age; } int GetAge(){return iOld;} int GetGender(){return iSex;} void GetName(char *name); }; void Student::SetName(char *name) { strcpy(chOne,name); } void Student::SetGender(int sex) { iSex=sex; } void Student::GetName(char *name) { strcpy(chOne,name); } int main() { Student Zhang_San; //创建Student类对象Zhang_San char*chOne; int iSex; unsigned iOld; chOne=new char[11]; //创建动态字符数组用来存放姓名,指针chOne指向该数组 cin>>chOne; //输入姓名,存放在chOne所指向的动态字符数组中 cin>>iSex; //输入性别,输入1表示性别为“男”,输入0表示性别为“女” cin>>iOld; //输入年龄 Zhang_San.SetName(chOne); //用输入的姓名设置对象Zhang_San用来表示姓名的数据成员 Zhang_San.SetGender(iSex); //设置对象Zhang_San用来表示性别的数据成员 Zhang_San.SetAge(iOld); //设置对象Zhang_San用来表示年龄的数据成员 cout< Zhang_San.GetName(chOne); //调用GetName(char *)成员函数将对象Zhang_San表示姓名的数据成员值 //存放到chOne所指向的动态字符数组中 cout<<"Zhang_San's name is "< cout<<"Zhang_San's gender is "< delete []chOne; return 0; } 4 根据以下主函数的功能来设计计算器类Calculator,使其能正确运行。类Calculator中应该具有描述运算数的a和b及其表示a和b运算结果的三个数据成员和相应计算并显示结果的成员函数。#include using namespace std; class Calculator {public: Calculator(float,float); add( ); //计算a+b并显示结果 subtract( ); multiply( ); divide(); private: float a,b,r; }; Calculator::Calculator(float x,float y) { a=x; b=y; } Calculator::add( ) { r=a+b; cout< } Calculator:: subtract( ) { r=a-b; cout< } Calculator::multiply( ) { r=a*b;