1.思维导图及学习体会

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

1.2 学习体会

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

2.大作业作业内容

2.1 设计日期的ADT类型

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

2.2.数据抽象:头文件

date.h

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

common.h

  1. #pragma once
  2. #define Ok 1;
  3. #define Error 0;
  4. #define Yes 1;
  5. #define No -1;
  6. #define O 0
  7. typedef int Status;

2.3数据封装说明

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

  1. Status InitDATE(DATE &date, int year, int mounth, int day)
  2. {
  3. int result=Ok;
  4. date = new int [3];//动态分配
  5. if (!date) exit(OVERFLOW);//防止运算上溢
  6. date[0] = year; date[1] = mounth; date[2] = day;
  7. if (year < 0) {
  8. result = Error;
  9. }
  10. else {
  11. if (mounth < 1 || mounth>12)
  12. {
  13. result = Error;
  14. }
  15. else {
  16. if (leepYear(date) == 0)
  17. {
  18. if (day > 28 || day < 0) {
  19. result = Error;
  20. }
  21. }
  22. else if (leepYear(date) == 1)
  23. {
  24. if (day < 0 || day>29)
  25. result = 0;
  26. }
  27. }
  28. }
  29. return result;
  30. }

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

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

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

  1. Status leepYear(DATE &date)
  2. {
  3. Status result;
  4. if (date[0] % 4 == 0 && date[0] % 100 != 0 || date[0] % 400 == 0)
  5. {
  6. result = Ok;
  7. }
  8. else {
  9. result = Error;
  10. }
  11. return result;
  12. }

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

  1. string week(DATE &date)
  2. {
  3. int year = date[0];
  4. int mounth = date[1];
  5. int day = date[2];
  6. if (mounth == 1 || mounth == 2) {
  7. mounth += 12;
  8. year--;
  9. }
  10. int iWeek = (day + 2 * mounth + 3 * (mounth + 1) / 5 + year + year/ 4 - year / 100 + year / 400) % 7;
  11. switch (iWeek)
  12. {
  13. case 0: return "这个星期是星期一";
  14. case 1: return "这个星期是星期二";
  15. case 2: return "这个星期是星期三";
  16. case 3: return "这个星期是星期四";
  17. case 4: return "这个星期是星期五";
  18. case 5: return "这个星期是星期六";
  19. case 6: return "这个星期是星期日";
  20. }
  21. }

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

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

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

  1. string AddDay(DATE date, int addDay)
  2. {
  3. int leepYear1[13] = {31,29,31,30,31,30,31,31,30,31,30,31,0};
  4. int ordinaryYear1[13]= { 31,28,31,30,31,30,31,31,30,31,30,31,0 };
  5. if(leepYear(date)) {
  6. do {
  7. date[2]++;
  8. if (date[2] > leepYear1[date[1] - 1])
  9. {
  10. date[1]++;
  11. date[2] = 1;
  12. if (date[1] > 12)//月满十二,年进一
  13. {
  14. date[0]++;
  15. date[1] = 1;//月归1
  16. }
  17. }
  18. addDay--;//递减
  19. } while (addDay);
  20. }
  21. else {
  22. do {
  23. date[2]++;
  24. if (date[2] > ordinaryYear1[date[1] - 1])
  25. {
  26. date[1]++;
  27. date[2] = 1;
  28. if (date[1] > 12)
  29. {
  30. date[0]++;
  31. date[1] = 1;
  32. }
  33. }
  34. addDay--;
  35. } while (addDay);//平年也是如此
  36. }
  37. return outDate(date);
  38. }

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

  1. char Compare(DATE &date, DATE &otherDate)
  2. {
  3. int dayOne = date[0] * 10000 + date[1] * 100 + date[2];
  4. int dayTwo = otherDate[0] * 10000 + otherDate[1] * 100 + otherDate[2];
  5. if (dayOne == dayTwo)
  6. {
  7. return '=';
  8. }
  9. else if (dayOne > dayTwo) {
  10. return '>';
  11. }else {
  12. return '<';
  13. }
  14. }

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

  1. int main()
  2. {
  3. DATE date, otherDate;
  4. int year, mounth, day;
  5. int otherYear, otherMounth, otherDay;
  6. int addDay;
  7. ifstream readFile;以读的方式
  8. ofstream writeFile;以写的方式
  9. readFile.open("input.txt", ios::in);
  10. writeFile.open("output.txt",ios::out||ios::trunc);
  11. do {
  12. readFile >> year >> mounth >> day;//读取文件内容
  13. if (InitDATE(date, year, mounth, day)) {
  14. cout << outDate(date) << endl;
  15. writeFile << outDate(date) << endl;
  16. }
  17. else {
  18. cout << "日期不存在!" << endl;
  19. }
  20. if (leepYear(date) == 1)//判断闰平年
  21. {
  22. cout << "是闰年" << endl;
  23. }
  24. else {
  25. cout << "不是闰年" << endl;
  26. }
  27. cout << week(date) << endl;;
  28. cout << "你所要比较的日期:";
  29. cin >> otherYear >> otherMounth >> otherDay;//输入比较的日期
  30. if (InitDATE(otherDate, otherYear, otherMounth, otherDay))
  31. cout << outDate(date) << Compare(date, otherDate) << outDate(otherDate) << endl;//输出比较结果
  32. else {
  33. cout << "比较的日期不合法呢" << endl;
  34. }
  35. cout << "你所要增加的天数是:";
  36. cin >> addDay;
  37. cout<<AddDay(date, addDay)<<endl;//输出添加日子后的日期
  38. cout << endl;
  39. } while (!readFile.eof());
  40. readFile.close();//关文件
  41. writeFile.close();//关文件
  42. }

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. 在表单提交之前做校验-利用jQuery的submit方法

    点击表单中的提交按钮,默认就会提交表单,如果要在表单提交之前做一些校验,那么就可以用jQuery的submit方法. 也就是jQuery的submit的方法执行顺序,在表单的提交之前.用法如下: $( ...

  2. EclipseAndroid打包签名发布安装失败闪退运行不了

    EclipseAndroid打包签名发布安装失败闪退运行不了 本来没怎么用过用Eclipse写安卓,可是有人有需要必须用Eclipse写,那就写呗. 可在签名打包的时候,发到手机上安装,提示安装成功. ...

  3. Android,View转换bitmap,bitmap转换drawable

    Android View转换Bitmap,Bitmap转换Drawable //测试设置bitmap View view1 = ViewGroup.inflate(context, R.layout. ...

  4. Python笔记-IO编程

    IO在计算机中是指input和output(数据输入与输出),涉及到数据交换(磁盘.网络)的地方就需要IO接口. 输入流input stream是指数据从外面(磁盘.网络服务器)流入内存:输出流out ...

  5. Linux安装配置Mariadb

    一.安装数据库Mariadb 参考:http://blog.51cto.com/12173069/2047746 从最新版本的linux系统开始,默认的是 Mariadb而不是mysql! 使用系统自 ...

  6. Jmeter Beanshell 用法

    Beanshell 的用法 什么是beanshell Beanshell是一种完全符合java语法的脚本语言,并且拥有自己的内置对象和语法 Beanshell是用java写的,一个小型嵌入式java源 ...

  7. 【记录】垃圾清理软件 便携版CleanMyPC破解版

    摘要 使用CleanMyPC保持您的PC清洁并像新的一样运行.它扫描整个计算机以清理垃圾文件,加速您的PC并提高其性能.CleanMyPC不仅仅是一台PC清洁工 - 它是关注计算机的必备工具.[有能力 ...

  8. RabbitMQ框架构建系列(一)——AMPQ协议

    一.MQ 在介绍RabbitMq之前,先来说一下MQ.什么是MQ?MQ全称为Message Queue即消息队列,就是一个消息的容器, MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入 ...

  9. CDH集成Kafka,两种方式:离线、在线

    1.离线 先下载相应版本的kafka http://archive.cloudera.com/kafka/parcels/ 然后放置相应目录,如下图: 然后直接添加组件即可 2.在线 配置相应的kaf ...

  10. 随心测试_软测基础_005 <测试人员工作内容>

    接上篇:清楚了_测试人员的工作职责范围,那每项 测试活动的具体工作内容有哪些呢? Q1:如何理解测试工程师的工作内容? A1:SX的观点:综合一体化 现如今互联网行业如何哪达,每一项IT职业的工作职责 ...