C++第三次作业3-1(Accelerated C++第五章)


(一)單詞分類

1.       題意描述:編寫一個程序對以空白符(注意:包括回車換行符,也就是輸入可能爲多行)爲間隔的單詞序列輸入流進行轉換後輸出,輸出格式為:先輸出全部的小寫單詞,然後輸出首字母大寫的單詞,最後輸出大寫單詞(假設只有這三種形式的單詞);且同一類的單詞以與出現順序相反的順序輸出,也就是後出現的先輸出。

譬如輸入:

Write Aprogram

 That COUNTS          how

 MANY               Times

       應該輸出:

小寫單詞:how program

首字母大寫單詞:Times ThatWrite

大寫單詞:MANY COUNTSA

逆度迭代器解析(点击):

c.begin() 返回一个迭代器,它指向容器c的第一个元素

c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置

c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素

c.rend() 返回一个逆序迭代器,它指向容器c的第一个元素前面的位置

#include <iostream>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
int main()
{
	vector<string> vec1;//小写
	vector<string> vec2;//首字母大写
	vector<string> vec3;//大写
	string str;
	while (cin >> str)
	{
		if (isupper(str[0]) && islower(str[1]))
			vec2.push_back(str);
		else if (islower(str[0]))
			vec1.push_back(str);
		else
			vec3.push_back(str);
		//这里注意考虑到只有单个大写字母的情况,所以直接用else就可以了
		//不要判断第一和第二个同时都是大写,不然A进不去vec3
	}
	vector<string>::reverse_iterator r_it; 
	cout << endl << "小写单词: ";
	for (r_it = vec1.rbegin(); r_it != vec1.rend(); r_it++)
		cout << *r_it << " ";
	
	cout << endl << "首字母大写: ";
	for (r_it = vec2.rbegin(); r_it != vec2.rend(); r_it++)
		cout << *r_it << " ";

	cout << endl << "大写单词: ";
	for (r_it = vec3.rbegin(); r_it != vec3.rend(); r_it++)
		cout << *r_it << " ";

	system("pause");
	return 0;
}


(二)程序的性能

1.          題意描述:練習5-6。

說明:

l 作業成績采用中位數作爲代表。

l resize函數爲vector的一個成員函數,具體用法請參考C++手册。

l  比較你編寫的,課本中基于vector的(5.1.1節),基于list的(5.5節)三個extrac_fails函數的時間性能。也就是讀入所有的學生記錄之後,分別運行這三個函數,記錄各自的運行時間(無需後續的對學生名字排序及輸出的過程)。記錄函數運行時間的方法請參閱網頁:

http://www.cnblogs.com/lshguang89/archive/2008/10/07/1305430.html

 

注意:因爲如今的操作系統均爲多任務系統,爲避免其他程序影響此處所做的比較,你應該儘量關閉其他正在運行的程序,特別是消耗資源的大型程序。幷且爲避免偶爾的系統負載波動對比較結果的干擾,你應該反復運行比較程序多次(至少10次),取平均值作爲最終結果。

l 請使用教師提供的樣本數據文件作爲比較時的輸入數據,一共三個文件,分別含有1000,10000,100000條學生記錄。



注意先引用三个头文件median.h   grade.h   student_info.h

在 C++第二次作业(Accelerated C++第四章)的第四个作业放了那三个头文件了


resize用法见 http://www.cplusplus.com/reference/vector/vector/resize/

resize(n);

resize(n,val);   (使得容器剩下n个数)

1.n<size;直接截掉后面的

2.n=size;不变,但是会换内存空间

3.n>size;在原来的后面补上val,直到n个数满


这个还有一个需要注意的就是要在vector的前面插入数据,一开始想的是vec.rend(),然后迭代器用逆序的添加,后来发现直接有一个insert函数,所以就不用那么麻烦了

eg: 用vec.insert(vec.begin(),val); 可以直接从vec最开始插入val


计算程序运行时间的方法

clock_t start, end;
start = clock();
**********
end = clock();
double duration = (double)(end - start) / CLOCKS_PER_SEC;



完整代码

#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <ctime>
#include "grade.h"

using namespace std;
bool fgrade(const student_info& s)
{
	return grade(s) < 60;
}

//用vector储存学生成绩
vector<student_info> extratct_fails_vector(vector<student_info>& students)
{
	vector<student_info> pass, fail;
	vector<student_info>::iterator it;
	for (it = students.begin(); it != students.end(); it++)
	{
		if (fgrade(*it))
			fail.push_back(*it);
		else
			pass.push_back(*it);
	}
	students = pass;
	return fail;
}

//用vector,改进版
vector<student_info> extratct_fails_vector_change(vector<student_info>& students)
{
	vector<student_info> fail;
	vector<student_info>::iterator it = students.begin();
	while (it != students.end())
	{
		if (fgrade(*it))
		{
			fail.push_back(*it);
			it = students.erase(it);
		}
		//erase里面直接用迭代器就好,返回的也是迭代器,不要用*it
		else
			it++;
	}
	return fail;
}

//用list储存学生成绩
list<student_info> extratct_fails_list(list<student_info> students)
{
	list<student_info> fail;
	list<student_info>::iterator it=students.begin();
	while (it != students.end())
	{
		if (fgrade(*it))
		{
			fail.push_back(*it);
			it = students.erase(it);
		}
		else
			it++;
	}
	return fail;
}


//自己写的
vector<student_info> extratct_fails_mine(vector<student_info> students)
{
	vector<student_info> fail;
	int cnt = 0;//及格学生数
	vector<student_info>::iterator it = students.begin();
	while (it != students.end())
	{
		if (fgrade(*it))//不及格
		{
			fail.push_back(*it);
			it++;
		}
		else
		{
			students.insert(students.begin(), *it);
			cnt++;
			it++;
		}
	}
	students.resize(cnt);
	return fail;
}
int main()
{
	clock_t start, end;
	struct student_info s;
	double x;//
	double duration;


	
//the first time
	vector<student_info> stu_vec1;
	freopen("scores-10000.txt", "r", stdin);
	freopen("out1.txt", "w", stdout);
	stu_vec1.clear();
	while (cin >> s.name)
	{
		cin >> s.midterm >> s.final;
		for (int i = 0; i < 5; i++)
		{
			cin >> x;
			s.homework.push_back(x);
		}
		//read(cin,s);???
		stu_vec1.push_back(s);
	}
	start = clock();
	extratct_fails_vector(stu_vec1);
	end = clock();
	duration = (double)(end - start) / CLOCKS_PER_SEC;
	cout << "3.1.1用vector输出的办法的时间为 " << duration << "seconds" << endl;
	fclose(stdin);
	fclose(stdout);
	

//the second time
	list<student_info> stu_list;
	freopen("scores-10000.txt", "r", stdin);
	freopen("out2.txt", "w", stdout);
	stu_list.clear();
	while (cin >> s.name)
	{
		cin >> s.midterm >> s.final;
		for (int i = 0; i < 5; i++)
		{
			cin >> x;
			s.homework.push_back(x);
		}
		//read(cin,s);???
		stu_list.push_back(s);
	}
	start = clock();
	extratct_fails_list(stu_list);
	end = clock();
	duration = (double)(end - start) / CLOCKS_PER_SEC;
	cout << "3.1.1用list输出的办法的时间为 " << duration << "seconds" << endl;
	fclose(stdin);
	fclose(stdout);


//the third times
	vector<student_info> stu_vec2;
	freopen("scores-1000.txt", "r", stdin);
	freopen("out3.txt", "w", stdout);
	stu_vec2.clear();
	while (cin >> s.name)
	{
		cin >> s.midterm >> s.final;
		for (int i = 0; i < 5; i++)
		{
			cin >> x;
			s.homework.push_back(x);
		}
		//read(cin,s);???
		stu_vec2.push_back(s);
	}
	start = clock();
	extratct_fails_vector(stu_vec2);
	end = clock();
	duration = (double)(end - start) / CLOCKS_PER_SEC;
	cout << "3.1.1用list输出的办法的时间为 " << duration << " seconds" << endl;
	fclose(stdin);
	fclose(stdout);

	system("pause");
	return 0;
}







(三)

1.      題意描述:練習5-11。

說明:本題的意思是首先寫一個函數判斷一個單詞是否包含上行字母或者下行字母,然後再以此爲基礎,編寫程序找出輸入的單詞集合中既不包含上行字母也不包含下行字母的最長單詞。













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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值