西电软工oop面向对象程序设计实验二上机报告

  • 实验目的

本次实验通过设计实现几道以自定义函数为主的程序,以熟悉 C++为程序员提供的函数相关机制,加深对命令行参数、参数传递方式、函数形参的特殊形式等知识的感性认识。学会过程式程序设计范型的基本策略,能够灵活运用相应机制,提高学生的编程水平。

  • 实验环境

操作系统:win10

开发工具:Visual Studio2015

  • 实验内容

题目一:

Write a program like ‘‘Hello, world!’’ that takes a name as a command-line argument and writes ‘‘Hello, name!’’. Modify this program to take any number of names as arguments and to say hello to each.

本题要求程序在运行时,可以对若干指定的 name 分别打印形如“Hello, name!”的文本。还要求所有的 name 都是通过命令行参数提供的,而不是来自标准输入设备。也就是说,这些name的值不能通过 cin,scanf 等方式读取,只能通过 main() 函数的参数获取。

题目二:

Consider:

Write a function for entering new words into a tree of Tnodes.

Write a function to write out a tree of Tnodes.

Write a function to write out a tree of Tnodes with the words in alphabetical order.

本题是关于二叉树的应用题。二叉树的结点类型(Tnode)已经给出,其中 leftright分别指向当前结点的左孩子和右孩子(这是树结点的构成要素),wordcount用于存储应用数据,分别存储一个单词的文本、该单词在输入中出现的次数,这就意味着不同结点中存储的 word 值不能相同。

题目三:

Write an error function that takes a printf-style format string containing %s, %c, and %d directives and an arbitrary number of arguments. Don’t use printf(). Look at §21.8 if you don’t know the meaning of %s, %c, and %d. Use <cstdarg>.

本题目要求编制函数

T  error(const char* format, …);

该函数的返回值类型 T 没有要求,可定义为 void,或你自己决定。

        该函数按照(类似于printf风格的)格式描述串” format的要求,打印若干数据。其功能和printf()相同,但仅需支持三种类型的数据即可:”%s”— char*型字符串,“%c”—字符,“%d”—int

题目四:

Write functions to add one day, one month, and one year to a Date as defined in §5.9[13].
Write a function that gives the day of the week for a given Date.

Write a function that gives the Date of the first Monday following a given Date.

本题要求你先根据习题 5.9.13 定义一个可表示日期的结构类型 Date,其中的年、月、日可采用你认为合适的数据类型。然后定义该类型上的几个操作:

  1. 对给定日期递增1天,得到一个新日期;
  2. 对给定日期递增1月,得到一个新日期;
  3. 对给定日期递增1年,得到一个新日期;
  4. 计算给定日期是星期几(这个计算较难);
  5. 计算给定日期之后的第1个星期一的日期。

  • 实验步骤

题目一:

实验思路:main函数传入命令行参数的个数argc和所有参数的数组argv[],用for循环遍历将所有参数输出即可。

数据结构定义和类的接口定义:

实验源码:

西电软工oop上机题目27.10-3-C++文档类资源-CSDN下载

问题和解决方案:程序运行时如何传入命令行参数,VS在项目属性中可以预设命令行参数。

题目二:

实验思路:定义两个头文件,Tree.h用于表示树的生成,Tnode.h表示树每个节点,在Tnode.h中定义该结点的内容和每个节点的左右子节点,并初始化根节点;在Tree.h中包括Tnode.h文件,定义树的建立、树的回收、树的扩展、树的遍历等函数;最后定义测试文件,包括树的插入、树的遍历输出。

数据结构定义和类的接口定义:

struct Tnode

        {

                 std::string word;

                 int count;

                 Tnode* left;

                 Tnode* right;

        };

PTree IniTree(string rootName)

Tnode* InsertLL(PTree pnr, Tnode* pn);

Tnode* InsertLR(PTree pnr, Tnode* pn);

Tnode* InsertRL(PTree pnr, Tnode* pn);

Tnode* Insert(PTree pnr, Tnode* pn);

Tnode* InsertLL(PTree pnr, Tnode* pn);

Tnode* InsertLL(PTree pnr, Tnode* pn);

void PrintTreeLMR(const PTree proot);

void FreeTree(PTree toFree);

实验源码

西电软工oop上机题目27.10-7.rar-C++文档类资源-CSDN下载

问题和解决方案:结点插入时,如何确定插入正确的位置?通过分别定义每个节点的左右子节点的插入函数可以精确到特定的位置;删除回收树能否直接删除即可?从最底层的结点开始删除。

题目三:

实验思路:定义头文件error.h,在里面定义error()函数,函数对传入字符串逐一读取字符,判断是否遇到转义标识,再判断s/c/d相应替换为传入字符串/字符/数字。

数据结构定义和类的接口定义:

实验源码

7.10-11.rar-C++文档类资源-CSDN下载

问题和解决方案:这个程序的error函数的参数个数是不确定的,如何确认这个参数个数并调用error函数,error(const char* format, ...),这个...允许传入不同个数的参数。

题目四:

实验思路:定义类:Date、Month,然后定义函数next_year、next_month、next_week、next_day,分别求出指定日期的下一年、下一月、下一周、下一天的日期,定义is_leapyear函数判断传入的年份是否为闰年,测试函数输入一个日期,分别调用函数,获取下一年、下一月、下一周、下一天的日期,最后输出。

数据结构定义和类的接口定义:

class Date {    

public:

        unsigned day;

        unsigned month;

        int year;

};

class Month {

public:

        enum { Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };

        static int n_days(int m, int y) {

                 return m != Feb ? n_day[m - 1] : (is_leapyear(y) ? 29 : 28);

        }

        static int  n_day[12];

};

实验源码

西电软工oop上机题目27.10-19.cpp-C++文档类资源-CSDN下载

问题和解决方案:计算日期的函数返回值为一个日期,包括年月日三个数,应该使用什么返回类型呢?定义的Date类符合这类返回值。

  • 实验结果

题目一

输入:Amy Stenfan "Mike Smith"(命令参数)

输出:

Hello,Amy

Hello,Stenfan

Hello,Mike Smith

题目二

输入:Tree L1 R1 LL2 RR2 LL2 LL2

输出:RR2 R1 LL2 Tree LL2 L1 LL2

题目三:

调用:

   n = error("helloworld");

        n = error("hellowor%cd", 'l');

        cout << "\t" << n << endl;

        n = error("hello%s", "world");

        cout << "\t" << n << endl;

        n = error("hello%s%c%c","wor", 'l','d');

        cout << "\t" << n << endl;

        n = error("%d%c%c%d%s", 2, '0', '1', 7, "      ");

        cout << "\t" << n << endl;

        n = error("%s", NULL);

输出:

helloworld      10

helloworld      10

helloworld      10

helloworld      10

2017            10

(null)

                6

题目四:

输入:2012 2 28

输出:

下一年:2013-2-28

下一月:2012-3-28

下一周:2012-3-6

下一天:2012-2-29

  • 实验总结

本次实验通过设计几个自定义函数的程序,让我熟悉 C++为程序员提供的函数相关机制,加深对命令行参数、参数传递方式、函数形参的特殊形式等知识的感性认识。学会过程中,也学会了如何编程的思想。这次实验中我也出现过一些比较严重的错误。如在树的插入过程的疑惑,这是我对数据结构基本概念理解的模糊不清造成的。所以我们在学习新知识的时候也需要回顾一下已学知识,巩固基础。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值