第12周 上机报告 1之练习3 回文日

题目:很诱人的一个题目:2011年11月02日是一个回文日:2011 1102,我们刚刚度过!请列出近80年和近60年还有多少个回文日(假如我们能活到百岁,你和我的……)。注意:一年只有12个月。

2012年11月30日新发的程序:

#include <iostream>
using namespace std;
int main( )
{
	int year,month,day,y,anothery;
	bool is_cycle;
	int count=0;
	for(year = 2012; year < 2092; year++)
	{
		month=year%100; //month取到的是年的后两位
		month = (month%10)*10 + month/10; //将后两位倒过来,确定月份
		day=year/100;   //day取到的是年的前两位
		day=(day%10)*10+day/10; //将前两位倒过来,确定日期
		is_cycle =false;
		switch(month) //12个月份,各自对应合法的日期范围
		{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12: if(day<=31) is_cycle =true; break;
		case 4:
		case 6:
		case 9:
		case 11: if(day<=30) is_cycle=true; break;
		case 2: if((year%4==0&&year%100!=0)||year%400==0) //闰年
				{
					if(day<=29) is_cycle =true;
				}
			else
				if(day<=28) is_cycle =true; break;
		default: continue; //后两位倒过来根本构不成月份
		}
		if(is_cycle) //能构成回文日
		{
			y=year;
			anothery=year;
			while(y>0)
			{
				anothery=anothery*10+y%10;
				y=y/10;
			}
			cout<<anothery<<endl;
			count++;
		}
	}
	cout<<"共有 "<< count <<"个回文日。"<<endl;
	return 0;
}

一楼质疑的程序

/* 程序头部注释开始
 * 程序的版权和版本声明部分
 * Copyright (c) 2011, 烟台大学计算机学院
 * All rights reserved.
 * 文件名称:  cycledate.cpp
 * 作    者:      贺利坚
 * 完成日期:    2011 年11月9日
 * 版本号:     v1.0    

 * 对任务及求解方法的描述部分
 * 输入描述:无
 * 问题描述:很诱人的一个题目:2011年11月02日是一个回文日:2011 1102,我们刚刚度过!列出近80年还有多少个回文日
 * 程序输出:
 * 问题分析:在近80年中,年份确定后,将其从最低位开始倒着取出,每两位组成一个单位,分别对应月份和日期部分。
 *          分别判断这些月份和日期的取值范围是否合乎要求,如果符合则输出……
 * 程序头部的注释结束
 */
#include <iostream>
using namespace std;
int main( )
{
 int year,month,day,y,anothery;
 bool is_cycle;
 int count=0;
 for(year = 2012; year < 2092; year++)
 {
  y =year;  //后面直接用year不行吗?
  month=y;
  y=y/10;
  month = month*10 + y; //将后两位倒过来,确定月份
  y=y/10;
  day=y;
  y=y/10;
  day=day*10+y; //将前两位倒过来,确定日期
  is_cycle =false;
  switch(month) //12个月份,各自对应合法的日期范围
  {
  case 1:
  case 3:
  case 5:
  case 7:
  case 8:
  case 10:
  case 12: if(day<=31) is_cycle =true; break;
  case 4:
  case 6:
  case 9:
  case 11: if(day<=30) is_cycle=true; break;
  case 2: if((year%4==0&&year0!=0)||year@0==0) //闰年
    {
     if(day<=29) is_cycle =true;
    }
    else
     if(day<=28) is_cycle =true; break;
  default: continue; //后两位倒过来根本构不成月份
  }
  if(is_cycle) //能构成回文日
  {
   y=year;
   anothery=year;
   while(y>0)
   {
    anothery=anothery*10+y;
    y=y/10;
   }
   cout<<anothery<<endl;
   count++;
  }
 }
 cout<<"共有 "<< count <<"个回文日。"<<endl;
 return 0;
}

运行结果

经验积累:

1. 各方面要考虑周详

2. 在for循环中,用于表示年份的year只能在year++处变化,程序中再要用年份值,用其他变量临时替换

3. 变量用有意义的名称,编程过程中不会将意思搞乱

上机感言:

1. 我在程序中使用的while, for, if, switch还是很规矩的,请体会

2. 突然意识到这是个练习程序结构的好题,我做一份给大家参考吧

3. 人生苦短,你还能过9个回文日,我能过7个,这样想想,20111102多么珍贵。

时间: 2024-09-06 19:09:37

第12周 上机报告 1之练习3 回文日的相关文章

C++第11周项目3(10)——回文日

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目3- 有趣的数字]先阅读例题,体会处理数字的一般方法,然后自行选题进行解决,掌握这种类型程序设计的一般方法. 任务:解决下面的问题(选做一道即算完成任务) (10)很有趣的一个题目:2011年11月02日是一个回文日:2011 1102,在2011级同学做这道题时我们刚刚度过这一天!请列出近80年和近60年还有多少个回文日(假如我们能活到百岁,你和我的--).注意:

第11周 上机报告 1:累加

上机题目:用各种方法求f=1-1/2!+1/3!-...+1/9!,并且要写在一个程序中. 目的在于锻炼各种循环. 提倡大家优先用for循环.计数型循环很方便,要习惯. 看题目,有点难度.题目显然将大家难住了.老师有责任,给大家跨度大了.大家要快进步,中间的招数你都领教过了,只不过现在要综合起来. 我带着大家把这个问题分解一下,由易到难解出来. *********************问题的解决************************ (一)先做一个简单程序:f=1+2+...+9 太

第11周 上机报告 2:英尺到米的转换表

题目要求:编程序生成一张从英尺到米的转换表(1米大约等于3.28英尺),以方便工厂里工人师傅使用.输出形式如下图所示,第i行第j列的值vij代表i*10+j英尺对应的米数.每输出10英尺的转换表后,另起一行输出. I2M 0 1 2 3 j 5 6 7 8 9 0 0 0.3 0.61 0.91 1.22 1.52 1.83 2.13 2.44 2.74 1 3.05 3.35 3.66 3.96 4.27 4.57 4.88 5.18 5.49 5.79 2                  

C02-程序设计基础提高班(C++)第4周上机任务

第4周:下载并阅读 C++程序设计入门同步实践宝典(v0.5)中的1.2节及第3章的内容(下载积分不足的同学可以通过校园网到我的BB平台下载,账号2009helijian),在程序调试技术.解题方法方面加深理解 (回到C02-程序设计基础提高班(C++)学习安排) 1.分别用3种循环(while~.for(;;)~.do~while)计算下式 要求用单重循环完成,以强化关注效率的意识. 2.在下面的加法算式中,不同的符号代表不同的数字,相同的符号代表相同的数字.请设计程序求出"都.要.学.C&q

C++程序设计-第12周函数序设计上机实践项目

回到课程主页,链接:C++程序设计课程主页-2012级 本次上机对应的教学内容:第4章   函数 [项目1-调用函数输出星号图] 这一组的练习意在通过调用函数输出星号图,体会与理解函数的工作过程,并为其后编制自定义函数实现特定功能,打下基础. 任务1:补充完下面的程序,使程序输出上面的两个星号图,要求在main()函数中调用自定义函数printstars(). 给出的程序如下: //while循环中调用函数printstars的程序 #include <iostream> using name

C++程序设计-第七周上机实践项目

回到课程主页,链接:C++程序设计课程主页-2012级 本周教学内容:第1章   C++的初步知识.通过两个典型的程序(求大值和输出星号图),获得分支和循环结构程序设计的直接体验,使学生能够通过模仿,编写出类似的程序. 上机目的:初步体验分支结构和循环结构的程序设计 上机内容:(1)求两个正整数的正差值:(2)输出四个整数中的最大值:(3)输出各大式星号图. 项目1:分支结构程序设计体验 (1)阅读课件中"给两个数,求两数中的大者"例子,结合对课堂讲授内容的理解,仔细领会让计算机进行判

C02-程序设计基础提高班(C++)第9周上机任务-类和对象

第9周:阅读教材第8章(p231-262),主要内容是类和对象,学会定义类和对象解决问题,完成第9周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 实践任务: [任务1]阅读.运行下面的程序后,按要求编制新的成员函数,并增加类的功能 #include <iostream> using namespace std; class Time { public: void set_time( ); void show_time( ); private: bool is_time(in

C02-程序设计基础提高班(C++)第10周上机任务-类和对象之二

第10周:阅读教材第9章(p263-313),主要内容是构造和析构函数.对象数组.对象指针.共用数据的保护等,完成第10周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 实践任务: [任务1]设计三角形类,通过增加构造函数,使对象在定义时能够进行初始化 #include<iostream> using namespace std; class Triangle {public: float perimeter(void);//计算三角形的周长 float area(void)

C02-程序设计基础提高班(C++)第8周上机任务-结构体

第8周:阅读教材第7章(p201-230),主要内容是结构体与自定义类型,同时也希望将同学们将第3-7章的内容整理一下,完成第8周上机任务,本周任务将增加一些对用结构化程序设计技术解决问题的综合性题目: (回到C02-程序设计基础提高班(C++)学习安排) 实践任务(需要的数据文件score.txt在本文后,自行复制后,用记事本保存为score.txt): [任务1]结构体数据组 score.txt中是一些同学的学号.姓名.C++.高数.英语成绩,定义一个学生成绩的结构体数组,其中的成员包括学号