C++面向对象程序设计 第七周 输入输出与文件操作

一、Week7_01简单的SumArray

输入

输出
TomJackMaryJohn
10

#include "stdafx.h"

#include <iostream>
#include <string>
using namespace std;
template <class T>
T SumArray(
        // 在此处补充你的代码
        T *begin,T* end)  
{
        T * tmp = begin;
        // T tmp =*begin;
        ++begin;
        for (; begin!=end; ++begin)  //如何完美解决参数是数组的两个指针的问题,太神了!!!自己怎么也想不出来呀
        {
               *tmp += *begin;
               //tmp+=*begin;
        }
        return *tmp;
        // 在此处补充你的代码
}
int main() {
        string array[4] = { "Tom","Jack","Mary","John" };
        cout << SumArray(array, array + 4) << endl;
        int a[4] = { 1, 2, 3, 4 };  //提示:1+2+3+4 = 10
        cout << SumArray(a, a + 4) << endl;
        return 0;
}

二、Week7_02 简单的foreach

编写MyForeach模板,使程序按要求输出
不得编写 MyForeach函数

输入:
多组数据
每组数据第一行是两个整数 m 和 n ,都不超过 50
第二行是m个不带空格的字符串
第三行是 n个整数

输出:
对每组数据
第一行输出所有输入字符串连在一起的结果
第二行输出输入中的每个整数加1的结果

样例输入:
3 4
Tom Mike Jack
1 2 3 4
1 2
Peking
100 200

样例输出:
TomMikeJack
2,3,4,5,
Peking
101,201,

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

// 在此处补充你的代码
template<typename T,typename pred>
void MyForeach(T begin, T end, pred op) {//T : String *, op: void (* op)(string)函数指针
        for (; begin!= end; ++begin)
        {
               op(*begin);//void (*op)(string)
        }
}
// 在此处补充你的代码
void Print(string s)
{
        cout << s;
}
void Inc(int & n)
{
        ++n;
}

//string array[100];
//int a[100];
int main() {
        string array[100];
        int a[100];
        int m, n;
        while (cin >> m >> n) {
               for (int i = 0; i < m; ++i)
                       cin >> array[i];
               for (int j = 0; j < n; ++j)
                       cin >> a[j];
               MyForeach(array, array + m, Print);
               cout << endl;
               MyForeach(a, a + n, Inc);
               for (int i = 0; i < n; ++i)
                       cout << a[i] << ",";
               cout << endl;
        }
        return 0;
}

三、Week7_03 简单的Filter

编写Filter模板,使得程序产生指定输出
不得编写 Filter函数
输入

输出
MikeJackLucy
3,4,5,
输入样例

输出样例
MikeJackLucy
3,4,5,

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
// 在此处补充你的代码
template <typename T,typename pred>
T Filter(T begin,T end,T x,pred op) {//T: string *, op: bool * op(int)
        for  (; begin != end; ++begin){
               if (op(*begin)) {//判断
                       *x = *begin; //太神奇了!!!!
                       ++x;
               }
        }
        return x;
}
// 在此处补充你的代码
bool LargerThan2(int n)
{
        return n > 2;
}

bool LongerThan3(string s)
{
        return s.length() > 3;
}

string as1[5] = { "Tom","Mike","Jack","Ted","Lucy" };
string as2[5];
int  a1[5] = { 1,2,3,4,5 };
int a2[5];
int main() {
        string * p = Filter(as1, as1 + 5, as2, LongerThan3);
        for (int i = 0; i < p - as2; ++i)
               cout << as2[i];
        cout << endl;
        int * p2 = Filter(a1, a1 + 5, a2, LargerThan2);
        for (int i = 0; i < p2 - a2; ++i)//指针可以相减!!!
               cout << a2[i] << ",";
        return 0;
}

四、Week7_04 你真的搞清楚为啥 while(cin >> n) 能成立了吗?

读入两个整数,输出两个整数 ,直到碰到-1
输入
多组数据,每组一行,是两个整数
输出
对每组数据,原样输出
当碰到输入中出现-1 时,程序结束
输入中保证会有 -1
样例输入
12 44
344 555
-1
2 3
样例输出
12 44
344 555

#include "stdafx.h"
#include <iostream>
using namespace std;
class MyCin
{
        // 在此处补充你的代码
public:
        istream & operator >>(int & n) {//将 >> 重载成MyCin的一个函数
               return cin >> n;//cin 的返回值是 istream &
        }
        // 在此处补充你的代码
};
int main()
{
        MyCin m;
        int n1, n2;
        while (m >> n1 >> n2)//m.(函数名)
               cout << n1 << " " << n2 << endl;
        return 0;
}

五、Week7_05 山寨版istream_iterator

模仿C++标准模板库istream_iterator用法,实现CMyistream_iterator使得程序按要求输出
输入
第一行是整数t,表示有t组数据
每组数据一行,三个整数加两个字符串。字符串是不含空格的
输出
对每组数据,输出二行
在第一行输出第一个数
第二行原样输出输入的内容
样例输入
2
79 90 20 hello me
12 34 19 take up
样例输出
79
79 90 20 hello me
12
12 34 19 take up
提示
C++标准模板库 istream_iterator模版使用说明:
其构造函数执行过程中就会要求输入,执行 * 则返回上次从输入流中读取的项目,
然后每次执行++,则读取输入流中的下一个项目

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
template <class T>
class CMyistream_iterator
{
        // 在此处补充你的代码
public:
        istream & r;
        T tmp;
        CMyistream_iterator(istream & in):r(in) {// 实际代码比我想的要简单地多,自己思考地复杂但无解
               r >> tmp;
        }
        T operator *() {
               return tmp;
        }
        void operator ++(int) {//后置++ 参数里多一个int
               r >> tmp;
        }
        // 在此处补充你的代码
};


int main()
{
        int t;
        cin >> t;
        while (t--) {
               CMyistream_iterator<int> inputInt(cin);
               int n1, n2, n3;
               n1 = *inputInt; //读入 n1
               int tmp = *inputInt;
               cout << tmp << endl;
               inputInt++;
               n2 = *inputInt; //读入 n2
               inputInt++;                //其实这里也是读入,相当于换了一块地方读入,这里的++误导了我
               n3 = *inputInt; //读入 n3
               cout << n1 << " " << n2 << " " << n3 << " ";
               CMyistream_iterator<string> inputStr(cin);
               string s1, s2;
               s1 = *inputStr;
               inputStr++;
               s2 = *inputStr;
               cout << s1 << " " << s2 << endl;
        }
        return 0;
}
/*
提示:
C++标准模板库 istream_iterator模版使用说明:

其构造函数执行过程中就会要求输入,然后每次执行++,则读取输入流中的下一个项目,
执行 * 则返回上次从输入流中读取的项目。例如,下面程序运行时,就会等待用户输入数据,输入数据后程序才会结束:

#include
#include
using namespace std;
int main() {
        istream_iterator inputInt(cin);
        return 0;
}

下面程序运行时,如果输入 12 34 程序输出结果是: 12, 12
#include
#include
using namespace std;
int main()
{
        istream_iterator inputInt(cin);
        cout << *inputInt << "," << *inputInt << endl;
        return 0;
}

下面程序运行时,如果输入 12 34 56程序输出结果是: 12, 56
#include
#include
using namespace std;
int main()
{
        istream_iterator inputInt(cin);
        cout << *inputInt << ",";
        inputInt++;
        inputInt++;
        cout << *inputInt;
        return 0;
}
*/

六、Week7_06 这个模板并不难

程序填空,输出指定结果
输入
多组数据。每组第一行是一个不含空格的字符串
第二行是整数n
第三行是n个整数
输出
对每组数据,先依次输出输入字符串的每个字母,并且在每个字母后面加逗号
然后依次再输出输入的n个整数 ,在每个整数后面加逗号
样例输入
Tom
3
3 4 5
Jack
4
1 2 3 4
样例输出
T,o,m,
3,4,5,
J,a,c,k,
1,2,3,4,

#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
template <class T>

class myclass {
        // 在此处补充你的代码
public:
        T * p;
        int size;
        myclass(T * str, int s) {//这里还可以加条件判断,还是不要弄得那么复杂的好
               p = new T[s];
               size = s;
               memcpy(p, str,sizeof(T)*s);
        }
        // 在此处补充你的代码
        ~myclass() {
               delete[] p;
        }
        void Show()
        {
               for (int i = 0; i < size; i++) {
                       cout << p[i] << ",";
               }
               cout << endl;
        }
};
int a[100];
int main() {
        char line[100];
        while (cin >> line) {
               myclass<char> obj(line, strlen(line));;
               obj.Show();
               int n;
               cin >> n;
               for (int i = 0; i < n; ++i)
                       cin >> a[i];
               myclass<int> obj2(a, n);
               obj2.Show();
        }
        return 0;
}

七、Week7_07 排序,又见排序!

自己编写一个能对任何类型的数组进行排序的mysort函数模版。只能写一个mysort模板,不能写mysort函数!
输入

输出
4,8,10,11,123,
123,11,10,8,4,
1.4,1.2,1.8,3.1,3.2,2.1,
样例输入

样例输出
4,8,10,11,123,
123,11,10,8,4,
1.4,1.2,1.8,3.1,3.2,2.1,

#include "stdafx.h"
#include <iostream>
using namespace std;

bool Greater2(int n1, int n2)
{
        return n1 > n2;
}
bool Greater1(int n1, int n2)
{
        return n1 < n2;
}
bool Greater3(double d1, double d2)
{
        return d1 < d2;
}

template <class T1, class T2>
void mysort(
        // 在此处补充你的代码
        T1 * start, T1 * end, T2 myless)
{
        int size = end - start;
        for (int i = size - 1; i >= 0; --i) {
               for (int j = 0; j < i; ++j) {
                       if (myless(start[j + 1], start[j])) {//调用Great x 函数,只要成立就行,所以可以进行多种排列
                              T1 tmp = start[j];   //指针的下标,需要多注意一下。
                              start[j] = start[j + 1];
                              start[j + 1] = tmp;
                       }
               }
        }
}

/*
答案2:
template<class T>
void Swap(T & a, T & b)
{
        T tmp;
        tmp = a;
        a = b;
        b = tmp;
}

template <class T1, class T2>
void mysort(T1  start, T1  end, T2 myless)
{
        int size = end - start;
        for (int i = size - 1; i >= 0; --i) {
               for (int j = 0; j < i; ++j) {
                       if (myless(*(start + j + 1), *(start + j))) { //多写了一个函数。
                              Swap(*(start + j + 1), *(start + j));
                       }
               }
        }
}

答案 3:

template <class T1, class T2>
void mysort(T1  start, T1  end, T2 myless)
{
        int size = end - start;
        for (int i = size - 1; i >= 0; --i) {
               for (int j = 0; j < i; ++j) {
                       if (myless(*(start + j + 1), *(start + j))) { //这里不用下标的形式去控制指针
                              auto tmp = *(start + j);
                              *(start + j) = *(start + j + 1);
                              *(start + j + 1) = tmp;
                       }
               }
        }
}
*/
        // 在此处补充你的代码
#define NUM 5
        int main()
{
        int an[NUM] = { 8,123,11,10,4 };
        mysort(an, an + NUM, Greater1); //从小到大排序
        for (int i = 0; i < NUM; i++)
               cout << an[i] << ",";
        mysort(an, an + NUM, Greater2); //从大到小排序
        cout << endl;
        for (int i = 0; i < NUM; i++)
               cout << an[i] << ",";
        cout << endl;
        double d[6] = { 1.4,1.8,3.2,1.2,3.1,2.1 };
        mysort(d + 1, d + 5, Greater3); //将数组从下标1到下标4从小到大排序
        for (int i = 0; i < 6; i++)
               cout << d[i] << ",";
        return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《C面向对象程序设计第三版答案》是由谭浩强编写的一本与C语言相关的教材辅导答案。C面向对象程序设计是计算机科学中的一门重要课程,谭浩强作为资深教授和编程专家,他撰写的书籍在编程领域拥有很高的权威性。 这本教材答案为学习者提供了对应教材《C面向对象程序设计第三版》的习题答案和思考指导。习题是帮助学生巩固所学知识和提升编程能力的重要方式,通过对答案的学习,学生可以更好地理解并运用相关知识。学习者可以通过对比答案,分析解题思路、吸收优秀的编程风格和技巧,从而提高编程水平。 《C面向对象程序设计第三版答案》按照教材的章节顺序,详细解答了各个章节的习题,包括程序设计题、思考题、应用题等,涵盖了从基础的语法使用到复杂的程序设计技巧,旨在帮助学生全面理解并掌握C语言的面向对象编程思想和方法。 除了提供答案,这本教材还包括了一些习题的思考指导,指导学生如何分析问题、拆解问题、确定解决步骤等。这些思考指导帮助学生培养编程思维和解决问题的能力,使他们能够独立思考和解决实际编程任务。 总之,《C面向对象程序设计第三版答案》是一本为学习C语言面向对象程序设计的学生提供的辅助资料,它不仅提供了习题答案,还包括了思考指导,帮助学生提高编程水平和解决实际问题的能力。 ### 回答2: 《C++面向对象程序设计(第3版)》是计算机科学与技术专业学生的主要教材之一,由谭浩强编写。这本书全面介绍了C++编程语言的面向对象编程思想和相关的概念、原则与技巧。 该教材内容分为15章,首先从C++的基本概念和语法入手,然后逐渐介绍了面向对象编程的思想和实现。每章的结尾都提供了习题和答案,帮助学生巩固所学知识。 《C++面向对象程序设计(第3版)》的答案是谭浩强根据书中习题所提供的参考答案。这些答案精确明确,清晰易懂,配有详细的解释和示范代码。通过阅读和理解这些答案,学生可以加深对所学知识的理解,提高自己的编程技能。 同时,这本书还提供了大量的示例代码和实践案例,帮助学生将理论知识应用于实际的编程项目中。通过实践,学生可以更好地理解面向对象编程的思想和方法,并培养自己的分析和解决问题的能力。 总之,《C++面向对象程序设计(第3版)》是一本权威性、系统性和实用性并存的教材。通过学习这本书,学生可以全面掌握C++编程语言和面向对象编程的相关知识,提高自己的编程能力,并为将来的实际工作打下坚实的基础。 ### 回答3: 《C++面向对象程序设计》(第三版)是谭浩强所著的一本教材,该教材主要介绍了C++面向对象程序设计的基本概念、语法和技巧。全书共分为10个章节,涵盖了面向对象程序设计的各个方面。 第一章介绍了C++的发展历程以及面向对象程序设计的基本概念和特点。第二章详细讲解了C++的基本语法和常用数据类型。第三章重点介绍了C++中的类和对象的概念,并通过具体的示例演示了如何定义和使用类。 第四章讲解了C++的继承和派生,介绍了单继承和多继承的概念以及如何定义和使用派生类。第五章介绍了C++中的多态性,包括静态多态和动态多态的概念以及如何使用虚函数实现动态绑定。 第六章讲解了C++中的运算符重载和类型转换,通过实例说明了如何重载运算符和类型转换函数。第七章介绍了C++中的异常处理机制,讲解了异常的概念和处理方法。 第八章讲解了C++中的文件操作,包括输入输出流、文件读写以及文件指针的相关知识。第九章介绍了C++的模板和泛型编程,包括函数模板和类模板的定义和使用。 第十章介绍了C++中的标准模板库(STL),包括容器、迭代器、算法和函数对象等的使用方法。 《C++面向对象程序设计》(第三版)通过简明扼要的语言和生动具体的示例,全面而深入地介绍了C++面向对象程序设计的基本概念和技巧,适合初学者学习和参考。同时,该教材也提供了丰富的练习题和案例,供读者巩固和应用所学知识。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值