c++面向对象的程序设计第四版第九章课后作业程序

9-1
array.h

先是头文件

#pragma once
#ifndef ARRAY_H_
#define ARRAY_H_
#include <cassert>

template <class T>
class Array {
private:
	T* list;
	int size;
public:
	Array(int sz = 50);
	Array(const Array<T>& a);
	~Array();
	Array<T>& operator = (const Array<T>& rhs);//返回自己而不是自己的拷贝 所以这里要加&
	T& operator[] (int i);
	const T& operator[] (int i) const;
	operator T* ();
	operator const T* () const;
	int getSize() const;
	void resize(int sz);
};

template <class T>
Array<T>::Array(int sz) {
	assert(sz > 0);
	size = sz;
	list = new T[size];
}

template <class T>
Array<T>::~Array() {
	delete[] list;
}

template <class T>
Array<T>::Array(const Array<T> &a) {
	size = a.size;
	list = new T[size];
	for (int i = 0; i < size; i++)
		list[i] = a.list[i];
}

template <class T>
Array<T>& Array<T>::operator =(const Array<T> &rhs) {
	if (&rhs != this) {
		if (size != rhs.size) {
			delete[]list;
			size = rhs.size;
			list = new T[size];
		}
		for (int i = 0; i < size; i++)
			list[i] = rhs.list[i];
	}
	return *this;
}

template <class T>
T& Array<T>::operator [](int i) {
	assert(i >= 0 && i < size);
	return list[i];
}

template <class T>
const T& Array<T>::operator [](int i) const {
	assert(i >= 0 && i < size);
	return list[i];
}

template <class T>
Array<T>::operator T *() {
	return list;
}

template <class T>
Array<T>::operator const T *() const {
	return list;
}

template <class T>
int Array<T>::getSize() const {
	return size;
}

template <class T>
void Array<T>::resize(int sz) {
	assert(sz >= 0);
	if (sz == size)
		return;
	T* newList = new T[sz];
	int n = (sz < size) ? sz : size;
	for (int i = 0; i < n; i++)
		newList[i] = list[i];
	delete[]list;
	list = newList;
	size = sz;
}

#endif  //ARRAY_H_

限免的

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

//面向对象的程序设计第九章课后习题
//9-1


int main()
{
	int n;
	double average,total = 0;
	cout << "请输入学生人数:";
	cin >> n;
	Array<float>  score(n);
	for (int i=0; i<n; i++)
	{
		cout << "请输入第" << i+1 <<"个学生的课程A成绩(0~100):";
		cin >> score[i];
		total += score[i];
	}
	average = total/n;
	cout << "平均成绩为" <<  average << endl;
	//setprecision(4) 设置输出流显示浮点数的个数
	return 0;
}

}

9-4

//dnode.h
#ifndef DOUBLY_LINKED_NODE_CLASS
#define DOUBLY_LINKED_NODE_CLASS

template <class T>
class DNode
{
    private:
		// circular links to the left and right
        DNode<T> *left;  //左指针
        DNode<T> *right;  //右指针
    public: 
		T data;  //结点数据
        
		// 构造函数
        DNode(void); 
        DNode (const T& item);
        
        
        // 链表修改算法
        void insertRight(DNode<T> *p);
        void insertLeft(DNode<T> *p);
        DNode<T> *deleteNode(void);
        
        
        // 获取左侧和右侧相邻结点的地址
        DNode<T> *nextNodeRight(void) const;
        DNode<T> *nextNodeLeft(void) const;
};

// 构造函数创建一个空结点,不初始化数据成员,用于链表头结点
template <class T>
DNode<T>::DNode(void)
{
	// 初始化结点,使之指向自身
    left = right = this;
}

// 构造函数,创建一个空结点并初始化数据成员
template <class T>
DNode<T>::DNode(const T& item)
{
	// 使结点指针指向自身并初始化数据成员
    left = right = this;
    data = item;
}

// 在当前结点的右侧插入一个结点p
template <class T>
void DNode<T>::insertRight(DNode<T> *p)
{
	// 将p与右结点连接
    p->right = right;
	right->left = p;
	
	// 将当前结点连接到p结点的左侧
    p->left = this;
    right = p;
}

//在当前结点的左侧插入一个结点p
template <class T>
void DNode<T>::insertLeft(DNode<T> *p)
{
	// 将p与左结点连接
    p->left = left;
    left->right = p;
    
	//将当前结点连接到p结点的右侧
    p->right = this;
    left = p;
}

// 断开当前结点与链表的连接,并返回当前结点地址
template <class T>
DNode<T> *DNode<T>::deleteNode(void)
{
	// 使当前结点的左侧结点连接到当前结点的右侧结点
    left->right = right;
    
	// 使当前结点的右侧结点连接到当前结点的左侧结点
    right->left = left;
    
    // 返回当前结点地址
    return this;
}

// 返回指向右结点的指针
template <class T>
DNode<T> *DNode<T>::nextNodeRight(void) const
{
    return right;
}

// 返回指向左结点的指针
template <class T>
DNode<T> *DNode<T>::nextNodeLeft(void) const
{
    return left;
}

#endif	// DOUBLY_LINKED_NODE_CLASS

9-10

#include <iostream>
using namespace std;


template <class T>
void insertSort(T A[], int n)
{
	int i, j;
	T   temp;
	
	// 将下标为1~n-1的元素逐个插入到已排序序列中适当的位置
	for (i = 1; i < n; i++) 
	{
		//从A[i-1]开始向A[0]方向扫描各元素,寻找适当位置插入A[i]
		j = i;
		temp = A[i];
		while (j > 0 && temp < A[j-1]) 
		{   //逐个比较,直到temp>=A[j-1]时,j便是应插入的位置。
			//若达到j==0,则0是应插入的位置。
			A[j] = A[j-1];                    //将元素逐个后移,以便找到插入位置时可立即插入。
			j--;
		}
		// 插入位置已找到,立即插入。
		A[j] = temp;
		
		//输出数据
		for(int k=0;k<n;k++)
			cout << A[k] << "  ";
		cout << endl;
		//结束输出	
	}
}

int main()
{
	int i;
	
	int data1[]={1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20};
	cout << "排序前的数据:" << endl;
	for(i=0;i<20;i++)
		cout << data1[i] << "  ";
	cout << endl;
	cout << "开始排序..." << endl;
	insertSort(data1, 20);
	cout << "排序后的数据:" << endl;
	for(i=0;i<20;i++)
		cout << data1[i] << "  ";
	cout << endl;
	return 0;
}

9-12

#include <iostream>
using namespace std;

// 辅助函数:交换x和y的值
template <class T>
void swapData(T &x, T &y)
{
	T temp;
	
	temp = x;
	x = y;
	y = temp;
}

// 用选择法对数组A的n个元素进行排序
template <class T>
void selectSort(T a[], int n)
{
	int smallIndex;    //每以趟中选出的最小元素之下标
	int i, j;
	
	// sort a[0]..a[n-2], and a[n-1] is in place
	for (i = 0; i < n-1; i++) 
	{
		smallIndex = i;    //最小元素之下标初值设为i
		// 在元素a[i+1]..a[n-1]中逐个比较显出最小值
		for (j = i+1; j < n; j++) 
			// smallIndex始终记录当前找到的最小值的下标
			if (a[j] < a[smallIndex])
				smallIndex = j;
			// 将这一趟找到的最小元素与a[i]交换
			swapData(a[i], a[smallIndex]);
			//输出数据
			for(int k=0;k<n;k++)
				cout << a[k] << "  ";
			cout << endl;
			//结束输出	
			
	}
}

int main()
{
	int i;
	
	int data1[]={1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20};
	cout << "排序前的数据:" << endl;
	for(i=0;i<20;i++)
		cout << data1[i] << "  ";
	cout << endl;
	cout << "开始排序..." << endl;
	selectSort(data1, 20);
	cout << "排序后的数据:" << endl;
	for(i=0;i<20;i++)
		cout << data1[i] << "  ";
	cout << endl;
	return 0;
}

发布了29 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43343116/article/details/103172864