1.思维导图及学习体会

1.1第一章绪论知识点思维导图

1.2 学习体会

这次博客园和大作业是我在编程学习中的有意义的进步,第一次尝试使用vs,并且通过同学的一些网站的推荐,和热心同学的帮忙,简单学会用c++,并且在大作业中更好地掌握抽象数据类型。算是对数据结构学习良好的开端!

2.大作业作业内容

2.1 设计日期的ADT类型

ADT Date{
数据对象:
D = {year,month,day | year,month,day属于int类型}
数据关系:
R = {<year,month>,<month,day>}
数据操作:
Status InitDate(Date &date, int year, int month, int day);//构造三元组
string OutDate(Date date);//使时间以string类型输出
Status leepYear(DATE &date);//闰年判断
string week(DATE &date);//星期几
string englishName(DATE &date);//英文
string AddDay(DATE date,int addDay);//添加日期
char Compare(DATE &date, DATE &otherDate)//比较日期
}ADT Date

2.2.数据抽象:头文件

date.h

#include "common.h"
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <fstream>
using namespace std;
typedef int * DATE;
Status InitDATE(DATE &date, int year, int mounth, int day);//操作结果:构造了三元组T,判断日期的合法性
string outDate(DATE &date);//字符型
Status leepYear(DATE &date);//闰年判断
string week(DATE &date);//星期几
string englishName(DATE &date);//英文
string AddDay(DATE date,int addDay);//添加日期
char Compare(DATE &date, DATE &otherDate);//比较

common.h

#pragma once
#define Ok 1;
#define Error 0;
#define Yes 1;
#define No -1;
#define O 0
typedef int Status;

2.3数据封装说明

(1)构造三元组:判断日期的合法性,记得要new一个。

Status InitDATE(DATE &date, int year, int mounth, int day)
{
int result=Ok;
date = new int [3];//动态分配
if (!date) exit(OVERFLOW);//防止运算上溢
date[0] = year; date[1] = mounth; date[2] = day;
if (year < 0) {
result = Error;
}
else {
if (mounth < 1 || mounth>12)
{
result = Error;
}
else {
if (leepYear(date) == 0)
{
if (day > 28 || day < 0) {
result = Error;
}
}
else if (leepYear(date) == 1)
{
if (day < 0 || day>29)
result = 0;
}
}
}
return result;
}

(2)以string形式输出时间:使用c++里面的语法,sprintf来连接成字符串然后输出

string outDate(DATE &date)
{
char str[50];
sprintf(str, "%d/%d/%d", date[0], date[1], date[2]);
return str;
}

(3)判断闰年:c语言那时候的题目

Status leepYear(DATE &date)
{
Status result;
if (date[0] % 4 == 0 && date[0] % 100 != 0 || date[0] % 400 == 0)
{
result = Ok;
}
else {
result = Error;
}
return result;
}

(4)判断周几:使用了公式,不然还真的是毫无头绪

string week(DATE &date)
{
int year = date[0];
int mounth = date[1];
int day = date[2];
if (mounth == 1 || mounth == 2) {
mounth += 12;
year--;
}
int iWeek = (day + 2 * mounth + 3 * (mounth + 1) / 5 + year + year/ 4 - year / 100 + year / 400) % 7;
switch (iWeek)
{
case 0: return "这个星期是星期一";
case 1: return "这个星期是星期二";
case 2: return "这个星期是星期三";
case 3: return "这个星期是星期四";
case 4: return "这个星期是星期五";
case 5: return "这个星期是星期六";
case 6: return "这个星期是星期日";
}
}

(5)英文字母:简单的switch

string englishName(DATE &date)
{
switch (date[1])
{
case 1:return "January";
case 2:return "February";
case 3:return "March";
case 4:return "April";
case 5:return "May";
case 6:return "June";
case 7:return "July";
case 8:return "Augest";
case 9:return "Septemper";
case 10:return "October";
case 11:return "November";
case 12:return "December";
}
}

(6)增加日期:设用两个数组,首先判断是否为闰年,二月份是两个数组不同的地方,然后通过要加的日子递减,来使日期递增,不要忘记每个月满日子,要归回1,并且月份增加,年也是同样的思想,月份记得只有十二个。

string AddDay(DATE date, int addDay)
{
int leepYear1[13] = {31,29,31,30,31,30,31,31,30,31,30,31,0};
int ordinaryYear1[13]= { 31,28,31,30,31,30,31,31,30,31,30,31,0 };
if(leepYear(date)) {
do {
date[2]++;
if (date[2] > leepYear1[date[1] - 1])
{
date[1]++;
date[2] = 1;
if (date[1] > 12)//月满十二,年进一
{
date[0]++;
date[1] = 1;//月归1
}
}
addDay--;//递减
} while (addDay);
}
else {
do {
date[2]++;
if (date[2] > ordinaryYear1[date[1] - 1])
{
date[1]++;
date[2] = 1;
if (date[1] > 12)
{
date[0]++;
date[1] = 1;
}
}
addDay--;
} while (addDay);//平年也是如此
}
return outDate(date);
}

(7)比较日期:直接乘再加,让年月日的大小已经到达无法影响的时候,然后对比大小即可

char Compare(DATE &date, DATE &otherDate)
{
int dayOne = date[0] * 10000 + date[1] * 100 + date[2];
int dayTwo = otherDate[0] * 10000 + otherDate[1] * 100 + otherDate[2];
if (dayOne == dayTwo)
{
return '=';
}
else if (dayOne > dayTwo) {
return '>';
}else {
return '<';
}
}

(8)主函数:用c++读写文件,一定要记得关文件

int main()
{
DATE date, otherDate;
int year, mounth, day;
int otherYear, otherMounth, otherDay;
int addDay;
ifstream readFile;以读的方式
ofstream writeFile;以写的方式
readFile.open("input.txt", ios::in);
writeFile.open("output.txt",ios::out||ios::trunc);
do {
readFile >> year >> mounth >> day;//读取文件内容
if (InitDATE(date, year, mounth, day)) {
cout << outDate(date) << endl;
writeFile << outDate(date) << endl;
}
else {
cout << "日期不存在!" << endl;
}
if (leepYear(date) == 1)//判断闰平年
{
cout << "是闰年" << endl;
}
else {
cout << "不是闰年" << endl;
}
cout << week(date) << endl;;
cout << "你所要比较的日期:";
cin >> otherYear >> otherMounth >> otherDay;//输入比较的日期
if (InitDATE(otherDate, otherYear, otherMounth, otherDay))
cout << outDate(date) << Compare(date, otherDate) << outDate(otherDate) << endl;//输出比较结果
else {
cout << "比较的日期不合法呢" << endl;
}
cout << "你所要增加的天数是:";
cin >> addDay;
cout<<AddDay(date, addDay)<<endl;//输出添加日子后的日期
cout << endl;
} while (!readFile.eof());
readFile.close();//关文件
writeFile.close();//关文件
}

3.结果展示

4.调试碰到问题

1.没有动态分配,导致后面出现的时间是乱码

2.在vs中的文本文件放错地方,导致一直无法出现正确的文本日期

3.误以为<string.h>和是一样的,其实不然,cin和cout都必须是要有头文件

4.最重要的是vs还不会很熟练的使用,c++语法还是很陌生。

DS博客作业01--日期抽象数据类型设计与实现的更多相关文章

  1. DS博客作业01—日期抽象数据类型设计与实现

    1.本章学习总结 1.1 思维导图 1.2学习体会 开学就来了个大作业,还要求用的是c++语法,作为一个只听过没学过的未知语法,靠着CSDN和寝室大佬的帮助下渐渐地了解了一些c++的使用,现在也可以使 ...

  2. DS博客作业01-日期抽象数据类型设计和实现

    1.思维导图及学习体会 1.1第一章绪论知识点思维导图 1.2 学习体会 这周刚刚学习了数据结构绪论和一部分线性表的知识,因为寒假提前预习了一会儿,在课堂上可以较快理解老师讲的内容.但是在c++语法上 ...

  3. DS博客作业01--日期抽象数据类型设计与实验

    1.思维导图及学习体会(2分) 1.1第一章绪论知识点思维导图 1.2 学习体会 2.大作业作业内容 (6分) 2.1 设计日期的ADT类型(1分) ADT DATE{ 数据对象:D={year,mo ...

  4. DS博客作业01--日期抽象数据类型

    1.思维导图及学习体会(2分) 1.1第一章绪论知识点思维导图 1.2学习体会 从暑假看视频到开学的预习,我感觉数据结构与c语言比起来更加抽象,更加难理解,那些概念也只能理解一些字面意思,对时间复杂度 ...

  5. DS博客作业01-日期抽象数据类型的设计与实现

    1.思维导图和学习体会 1.1绪论知识思维导图 1.2学习体会 通过这几节课数据结构的新学习,让我感到了难度,很多概念性的东西,不是很好理解,老师在讲内容的时候,很容易跟不上节奏,我发现这门课的学习一 ...

  6. DS博客作业05--查找

    这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业05--查找 这个作业的目标 学习查找的相关结构 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1.1 ...

  7. C博客作业01——分支,顺序结构

    C博客作业01--分支,顺序结构 0.展示PTA总分 1本章学习内容 1.1学习内容总结 1)格式化输出函数printf(),scanf(). 它是什么? 对于初学者而言,一开始了解接触它们,只是被硬 ...

  8. DS博客作业03--树

    这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业03--树 这个作业的目标 学习树结构设计及运算操作 姓名 黄静 目录 0. PTA得分截图 1. 本周学习总结 ...

  9. DS博客作业——树

    DS博客作业--树 1.本周学习总结 1.思维导图 2.谈谈你对树结构的认识及学习体会. 在树这一章节,我们学习的是二叉树的算法. 树的构建:一种是直接给树的顺序存储结构的字符串,一种是通过先序遍历和 ...

随机推荐

  1. 【我们一起写框架】MVVM的WPF框架(三)—数据控件

    这世上,没人能一次性写出完美无缺的框架:因为,任何一个框架都需要项目的淬炼,然后才能升华,趋近完美. 所以,框架是个反复修改的东西,最终形成的东西. 如果你学了一点技术,觉得自己可以写出框架了,觉得自 ...

  2. Asp.net MVC 中 CodeFirst 开发模式实例

    昨天写的这篇博客因为下班时间到了忘记保存了,好郁闷,得重新写一遍.实习所在公司使用的是CodeFirst开发模式,最近开始参与到公司的项目里面来了,发现这个模式特别好用,建库建表改变字段属性添加删除字 ...

  3. javascript 倒计数功能

    最近在项目中遇到一个倒计时功能,在网上没有找到合适的,就自己写了个方法.贴在这里,权且当个记录. export const timeRun = (timeStr, callBack) => { ...

  4. 我爱Java系列之《JavaEE面试宝典》---【IO流面试总结】

    1.什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别 答案 Bit最小的二进制单位 ,是计算机的操作部分 取值0或者1 Byte是计算机操作数据的最小 ...

  5. Spring Cloud项目之断路器集群监控Hystrix Dashboard

    微服务(Microservices Architecture)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完 ...

  6. 基础概念PHP-FPM、FastCGI和CGI

    在搭建 LAMP/LNMP 服务器时,会经常遇到 PHP-FPM.FastCGI和CGI 这几个概念.如果对它们一知半解,很难搭建出高性能的服务器.接下来我们就以图形方式,解释这些概念之间的关系. 基 ...

  7. java:数据结构复习(二)数组栈

    import java.util.Arrays;import java.util.Scanner; /** * @author 李正阳 */public class MyArraysStack< ...

  8. SQL Server 取日期时间格式 日期与字符串之间的转换

    SQL Server 取日期时间部分   在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate()  用DateName()就可以获得相应的 ...

  9. DVWA-暴力破解学习笔记

    DVWA-暴力破解 1.暴力破解 2.burp安装证书 3.万能密码 一.暴力破解 burp四种暴力破解类型: sniper   一个字典,两个参数,先匹配第一项再匹配第二项 Battering ra ...

  10. composer包(发布到github上)同步到Packagist

    在上一篇文章里面,探讨了如何一步步建立composer包–创建你的一个composer包 创建完成后,我们需要做的就是讲自建的包发布到Packagist上.至于说什么是Packagist,这个就不用我 ...