C.Primer.Plus(第六版)第16章 编程练习

//16.1
#include <iostream>
#include <string>
using namespace std;
bool isPalindrome(const string &);
int main(){
	cout<<"Please enter a string type data:";
	string str1;
	while(cin>>str1 && str1 != "quit"){
		for(int i=0;i<str1.length();++i){
			if(!islower(str1[i])){
				cout<<"The input must be a lowercase character,bye!"<<endl;
				return 0;
			}
		}
		isPalindrome(str1);
		cout<<"Please enter a string type data:";
	}
}
bool isPalindrome(const string & str){
	for(int i = 0,j = str.length()-1; i<=j;++i,--j)
		if(str[i] != str[j]){
			cout<<"the string dont't match Palindrome type,bye!"<<endl;
			return 0;
		}
	cout<<"Input string is a Palindrome number."<<endl;
	return 1;
}
//16.2
#include <iostream>
#include <string>
using namespace std;
bool isPalindrome(const string &);
int main(){
	cout<<"Please enter a string type data:";
	string str1;
	while(cin>>str1 && str1 != "quit"){
		string temp;
		for(int i=0;i<str1.length();++i){
			if(isalpha(str1[i]))
				temp.push_back(tolower(str1[i]));
		}
		str1 =temp;
		isPalindrome(str1);
		cout<<"Please enter a string type data:";
	}
}
bool isPalindrome(const string & str){
	for(int i = 0,j = str.length()-1; i<=j;++i,--j)
		if(str[i] != str[j]){
			cout<<"the string dont't match Palindrome type,bye!"<<endl;
			return 0;
		}
	cout<<"Input string is a Palindrome number."<<endl;
	return 1;
}
//16.3
// hangman.cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cctype>
using std::string;
const int NUM = 26;
int main()
{
	using namespace std;
	std::srand(std::time(0));
	vector<std::string> str_arr;
	string temp;
	ifstream fopen;
	fopen.open("data.txt");
	if(!fopen.is_open())
	{
		cout<<"Could not open the data file"<<endl;
		exit(EXIT_FAILURE);
	}
	fopen>>temp;
	while(fopen.good())
	{
		str_arr.push_back(temp);
		fopen>>temp;
	}
	char play;
	cout<<"Will you play a word game? <y/n> ";
	cin>>play;
	play = tolower(play);
	while(play == 'y')
	{
		string target = str_arr[std::rand() % str_arr.size()];
		int length = target.length();
		string attempt(length,'-');
		string badchars;
		int guesses = 6;
		cout<<"Guess my secret word. It has "<<length
			<<" length, and you guess\n"
			<<"one letter at a time.You get "<<guesses
			<<" wrong guesses.\n";
		cout<<"Your word: "<<attempt<<endl;
		while(guesses > 0 && attempt != target)
		{
			char letter;
			cout<<"Guess a letter: ";
			cin>>letter;
			if(badchars.find(letter) != string::npos || attempt.find(letter) !=string::npos)
			{
				cout<<"You already guessed that. Try again.\n";
				continue;
			}
			int loc = target.find(letter);
			if(loc == string::npos)
			{
				cout<<"Oh,bad guess!\n";
				--guesses;
				badchars += letter;
			}
			else
			{
				cout<<"Good guess!\n";
				attempt[loc] = letter;
				loc = target.find(letter,loc+1);
				while(loc != string::npos)
				{
					attempt[loc] = letter;
					loc = target.find(letter,loc+1);
				}
			}
			cout<<"Your word: "<<attempt<<endl;
			if(attempt != target)
			{
				if(badchars.length()>0)
					cout<<"Bad choices:"<<badchars<<endl;
				cout<<guesses<<"bad guesses left\n";
			}
		}
		if(guesses > 0)
			cout<<"That's right!\n";
		else
			cout<<"Sorry,the word is "<<target<<".\n";
		cout<<"Will you plat another? <y/n>";
		cin>>play;
		play = tolower(play);
	}
	cout<<"Bye\n";
	return 0;
}
//16.4
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int reduce(long ar[],int n);
bool compare(long a,long b)
{
	return a<b;//increase
	//return a>b;//decrease
}
int main()
{
	long lo[6] = {2,3,44,3,3,2};
	int count = reduce(lo,6);
	for(int i = 0;i<count;++i)
		cout<<lo[i]<<" ";
	cout<<endl;
}

int reduce(long ar[],int n)
{
	vector<long> arr;
	for(int i = 0;i<n;i++)
		arr.push_back(ar[i]);
	sort(arr.begin(),arr.end(),compare);
	vector<long>::iterator new_end = unique(arr.begin(),arr.end());//将有效数据排序,将有效结尾存储下来
	arr.erase(new_end,arr.end());//删除多余的数据
	int count = 0;
	for(vector<long>::iterator temp = arr.begin();temp != arr.end();++temp)
		ar[count++] = (*temp);
	return count;
}
//16.5
#include <iostream>
#include <string> //忘记定义string类...
#include <vector>
#include <algorithm>
using namespace std;

template <class T>
int reduce(T ar[],int n);
int main()
{
	string test[6] = {"just","different","amazing","MDF","Magic","amazing"};
	int count = reduce(test,6);
	for(int i = 0;i<count;++i)
		cout<<test[i].c_str()<<" ";
	cout<<endl;
	long lo[6] = {2,3,44,3,3,2};
	int size = reduce(lo,6);
	for(int i = 0;i<size;++i)
		cout<<lo[i]<<" ";
	cout<<endl;
	return 0;
}
template <class T>
int reduce(T ar[],int n)
{
	vector<T> arr;
	for(int i = 0;i<n;i++)
		arr.push_back(ar[i]);
	sort(arr.begin(),arr.end());
	vector<T>::iterator new_end = unique(arr.begin(),arr.end());//将有效数据排序,将有效结尾存储下来
	arr.erase(new_end,arr.end());//删除多余的数据
	int count = 0;
	for(vector<T>::iterator temp = arr.begin();temp != arr.end();++temp)
		ar[count++] = (*temp);
	return count;
}
// 16.6  仅仅是简单的使用queue模板类的方法
#include <iostream>
#include <queue>
#include <cstdlib>
#include <ctime>

const int MIN_PER_HR = 60;
bool newcustomer(double x);

class Customer
{
private:
	long arrive;// arrival time for customer
	int processtime;//processing time for customer 交易时间
public:
	Customer(){arrive = processtime = 0;}
	void set(long when)
	{
		processtime = std::rand() % 3 + 1;
		arrive = when;
	}
	long when() const {return arrive;}
	int ptime() const {return processtime;}
};

typedef Customer Item;
int main()
{
	using namespace std;
	std::srand(std::time(0));
	cout<<"Case Study:Bank of Heather Automatic Teller\n";
	cout<<"Enter maximum size of queue:";
	int qs;
	cin>>qs;
	queue<Item> line;//
	cout<<"Enter the number of simulation hours: ";
	int hours;
	cin>>hours;//测试时间
	// simulation will run 1 cycle per minute
	long cyclelimit = MIN_PER_HR * hours;//循环次数
	cout<<"Enter the average number of customer per hour: ";
	double perhour;
	cin>>perhour;//一小时多少客户
	double min_per_cust;
	min_per_cust = MIN_PER_HR / perhour;//每分钟多少客户

	Item temp;// new customer data 
	long turnaways = 0;//turned away by full queue 被拒绝的客户
	long customers = 0;//joined the queue
	long served = 0;//served during the simulation  服务人数
	long sum_line = 0;//cumulative line lentgth 累计长度
	int wait_time = 0;//time until autoteller is free
	long line_wait = 0;//cumulative time in line
	for(int cycle = 0;cycle<cyclelimit;cycle++)
	{
		if(newcustomer(min_per_cust))//有客户访问
		{
			if(line.size() == qs)//队列是否满员//
				turnaways++;
			else
			{
				customers++;
				temp.set(cycle);//将进队时的时间记录下来,用于记录在队列中的时间,以及操作时间
				line.push(temp);//入队//
			}
		}
		if(wait_time<=0 && !line.empty())//如果客户操作完成
		{
			line.pop();//出队并将指针指向新的头结点
			wait_time = temp.ptime();//得到被释放头结点的操作时间
			line_wait += cycle - temp.when();//从排队到开始操作的时间
			served++;
		}
		
		if(wait_time>0)
			wait_time--;
		sum_line += line.size();//
	}
	if(customers>0)
	{
		cout<<"customers accepted: "<<customers<<endl;
		cout<<" customers served: "<<served<<endl;
		cout<<"    turnaways:"<<turnaways<<endl;
		cout<<"average queue size:";
		cout.precision(2);
		cout.setf(ios_base::fixed,ios_base::floatfield);
		cout<<(double)sum_line/cyclelimit <<endl;
		cout<<"average wait time: "
			<<(double)line_wait /served <<" minutes\n";
	}
	else
		cout<<"No customers!\n";
	cout<<"Done!\n";
	return 0;
}
bool newcustomer(double x)
{
	return (std::rand() * x / RAND_MAX <1);
}  

//16.7
#include <iostream>
#include <ctime>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> lotto(int x,int y);

int main()
{
	srand(time(0));
	vector<int> winners;
	winners = lotto(51,6);
	for(int i =0;i<winners.size();i++)
		cout<<winners[i]<<" ";
	cout<<endl;
}

vector<int> lotto(int x, int y)
{
	vector<int> temp;
	vector<int> output;
	for(int i =0;i<x;++i)
		temp.push_back(i+1);
	for(int i =0;i<y;++i)
	{
		random_shuffle(temp.begin(),temp.end());
		output.push_back(temp[0]);
	}
	return output;
}
//16.8
#include <iostream>
#include <string>
#include <list>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
	using namespace std;
	list<string> mat,pat;
	cout<<"please enter mat's friend list(\"quit\" to end):";
	string temp;
	while(cin>>temp && temp != "quit"){
		mat.push_back(temp);
		cout<<"please enter mat's friend list:";
	}
	cout<<"please enter pat's friend list(\"quit\" to end):";
	while(cin>>temp && temp != "quit"){
		pat.push_back(temp);
		cout<<"please enter pat's friend list(\"quit\" to end):";
	}
	mat.sort(),mat.unique();
	pat.sort(),pat.unique();
	for(list<string>::iterator it = mat.begin();it != mat.end();++it)
		cout<<(*it)<<" , ";
	cout<<endl;
	for(list<string>::iterator it = pat.begin();it != pat.end();++it)
		cout<<(*it)<<" , ";
	cout<<endl;
	vector<string> sum(pat.size()+mat.size());
	copy(mat.begin(),mat.end(),sum.begin());
	copy(pat.begin(),pat.end(),(sum.begin()+mat.size()));
	sort(sum.begin(),sum.end());
	vector<string>::iterator new_end = unique(sum.begin(),sum.end());
	sum.erase(new_end,sum.end());
	copy(sum.begin(),sum.end(),ostream_iterator<string>(cout," "));
	cout<<endl;
	return 0;
}
//16.9
#include <iostream>
#include <vector>
#include <list>
#include <ctime>
#include <algorithm>
const int NUM = 100000;
int main()
{
	using namespace std;
	srand(time(0));
	vector<int> vi0(NUM);
	for(int i =0;i<vi0.size();++i)
		vi0[i]= rand() % 100 + 1;
	vector<int> vi(vi0);
	list<int> li(vi0.begin(),vi0.end());

	clock_t start = clock();
	sort(vi.begin(),vi.end());
	clock_t end = clock();
	cout<<"STL algorithm time cost is "<<(double)(end-start)/CLOCKS_PER_SEC<<endl;
	start = clock();
	li.sort();
	end = clock();
	cout<<"list member function time cost is"<<(double)(end-start)/CLOCKS_PER_SEC<<endl;

	copy(vi0.begin(),vi0.end(),li.begin());
	start = clock();
	copy(li.begin(),li.end(),vi.begin());
	sort(vi.begin(),vi.end());
	copy(vi.begin(),vi.end(),li.begin());
	end = clock();
	cout<<"Compromise method time cost is"<<(double)(end-start)/CLOCKS_PER_SEC<<endl;
	return 0;
}
//16.10
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <memory>
struct Review{
	std::string title;
	int rating;
	double price;
};

bool FillReview(Review & rr);
bool operator<( const std::shared_ptr<Review> & r1,const std::shared_ptr<Review> & r2);
bool showRating(const std::shared_ptr<Review> & r1, const std::shared_ptr<Review> & r2);
bool showPrice(const std::shared_ptr<Review> & r1, const std::shared_ptr<Review> & r2);
void ShowReview(const std::shared_ptr<Review> & rr);
void Showmenu(); 

int main()
{
	using namespace std;
	vector<shared_ptr<Review>> books;
	Review temp;
	while(FillReview(temp))
		books.push_back(shared_ptr<Review>(new Review(temp)));
	vector<shared_ptr<Review>> new_ord(books); //按照题目要求分别创建对应的shared_ptr对象
	sort(new_ord.begin(),new_ord.end()); //按字母排序
	vector<shared_ptr<Review>> new_pri(books);//按价格排序对象
	sort(new_pri.begin(),new_pri.end(),showPrice);
	vector<shared_ptr<Review>> new_rat(books);//按评分排序的对象
	sort(new_rat.begin(),new_rat.end(),showRating);
	
	if(books.size() > 0)
	{
		cout<< "Thank you,You entered the following "  
            << books.size() << " ratings.\n";
		Showmenu();  
		char key;
		cin>>key;
		while(key != 'q')
		{
			cout<<"title\t"<<"rating\t"<<"price\n";
			switch(key)
			{
			case'1':for_each(books.begin(),books.end(), ShowReview); 
				break;  
            case'2': for_each(new_ord.begin(),new_ord.end(), ShowReview); 
				break;  
            case'3':for_each(new_pri.begin(), new_pri.end(), ShowReview); 
				break;  
            case'4':for_each(new_rat.begin(), new_rat.end(), ShowReview); 
				break;  
            case'5':for_each(new_pri.rbegin(), new_pri.rend(), ShowReview);//反向输出
				break;  
            case'6':for_each(new_rat.rbegin(), new_rat.rend(), ShowReview);
				break;  
            case 'q':break;  
            default: std::cout << "Error input,please enter the true type:\n";  
                break;  
			}
			Showmenu();  
            cin >> key;  
		}
	}
	else
		cout<<"books is empty,end!\n";
	return 0;
}
bool FillReview(Review & rr)
{
	std::cout<<"Enter book title (quit to quit): ";
	std::getline(std::cin,rr.title);
	if(rr.title == "quit")
		return false;
	std::cout<<"Enter book rating: ";
	std::cin>>rr.rating;
	if(!std::cin)
		return false;
	while(std::cin.get() != '\n')
		continue;
	std::cout<<"Enter book price: ";
	std::cin>>rr.price;
	if(!std::cin)
		return false;
	while(std::cin.get() != '\n')
		continue;
	return true;
}
bool operator<( const std::shared_ptr<Review> & r1,const std::shared_ptr<Review> & r2)
{
	if (r1->title < r2->title)  
        return true;       
    else  
        return false;  
}

bool showRating(const std::shared_ptr<Review> & r1, const std::shared_ptr<Review> & r2) //默认升序
{  
    if (r1->rating < r2->rating)  
        return true;  
    else  
        return false;  
}  
bool showPrice(const std::shared_ptr<Review> & r1, const std::shared_ptr<Review> & r2) 
{  
    if (r1->price < r2->price)  
        return true;  
    else  
        return false;  
}  
void ShowReview(const std::shared_ptr<Review> & rr)  
{  
    std::cout<<rr->title<<"\t"<<rr->rating<<"\t"<<rr->price<<std::endl;
}  
void Showmenu()  
{  
    std::cout<<"display by different choice:\n"
		<<"1:ordinary order        "<<"2:Alphabetical order\t"<<"        3:Ascending price\n"<<"4:Ascending rating\t"
		<<"5:Descending order price\t"<<"6:Descending order rating\n"<<"q:quit\n";
}  










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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值