Effective Analysis Programming Part 2: Difference between revisions
From Gridkaschool
Jump to navigationJump to search
mNo edit summary |
mNo edit summary |
||
Line 2: | Line 2: | ||
* Tools: [[media:GKS2013EffectiveAnalysisTools.pdf|GKS2013EffectiveAnalysisTools.pdf]] |
* Tools: [[media:GKS2013EffectiveAnalysisTools.pdf|GKS2013EffectiveAnalysisTools.pdf]] |
||
* Templates: [[media:GKS2013EffectiveAnalysisTemplates.pdf|GKS2013EffectiveAnalysisTemplates.pdf]] |
* Templates: [[media:GKS2013EffectiveAnalysisTemplates.pdf|GKS2013EffectiveAnalysisTemplates.pdf]] |
||
===Polymorphism=== |
|||
<source lang="cpp"> |
|||
#include<iostream> |
|||
#include<cmath> |
|||
#include<vector> |
|||
using namespace std; |
|||
class Shape { |
|||
public: |
|||
virtual double getArea() const =0; |
|||
}; |
|||
class Circle: public Shape { |
|||
public: |
|||
Circle() : radius(1.) { |
|||
} |
|||
explicit Circle(double r) : radius(r) { |
|||
} |
|||
virtual double getArea() const { |
|||
cout<<"Circle::getArea"<<endl; |
|||
return M_PI*radius*radius; |
|||
} |
|||
private: |
|||
double radius; |
|||
}; |
|||
class Square: public Shape { |
|||
public: |
|||
Square() : length(1.) { |
|||
} |
|||
explicit Square(double l) : length(l) { |
|||
} |
|||
virtual double getArea() const { |
|||
cout<<"Square::getArea"<<endl; |
|||
return length*length; |
|||
} |
|||
private: |
|||
double length; |
|||
}; |
|||
int main() { |
|||
vector<Shape*> myShapes; |
|||
myShapes.push_back(new Circle(2.)); |
|||
myShapes.push_back(new Square(3.)); |
|||
cout<<myShapes[0]->getArea()<<endl; |
|||
cout<<myShapes[1]->getArea()<<endl; |
|||
delete myShapes[0]; |
|||
delete myShapes[1]; |
|||
} |
|||
</source> |
|||
==C++ Templates== |
==C++ Templates== |
||
====exercise 1: pair==== |
====exercise 1: pair==== |
Revision as of 10:18, 28 August 2013
Gridka School slides
- Tools: GKS2013EffectiveAnalysisTools.pdf
- Templates: GKS2013EffectiveAnalysisTemplates.pdf
Polymorphism
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
class Shape {
public:
virtual double getArea() const =0;
};
class Circle: public Shape {
public:
Circle() : radius(1.) {
}
explicit Circle(double r) : radius(r) {
}
virtual double getArea() const {
cout<<"Circle::getArea"<<endl;
return M_PI*radius*radius;
}
private:
double radius;
};
class Square: public Shape {
public:
Square() : length(1.) {
}
explicit Square(double l) : length(l) {
}
virtual double getArea() const {
cout<<"Square::getArea"<<endl;
return length*length;
}
private:
double length;
};
int main() {
vector<Shape*> myShapes;
myShapes.push_back(new Circle(2.));
myShapes.push_back(new Square(3.));
cout<<myShapes[0]->getArea()<<endl;
cout<<myShapes[1]->getArea()<<endl;
delete myShapes[0];
delete myShapes[1];
}
C++ Templates
exercise 1: pair
std::pair is a simple template class to store a pair of values.
- Familiarize yourself with the interface of std::pair: http://www.cplusplus.com/reference/utility/pair/
- Implement your own version: gks::pair with the same members and operators.
- Give examples for the usage of std::pair.
exercise 2: read paramerters
The library readparamertes can be used to read values from a text file like:
# GKS 2013
answer 42
parser_test "\\\"" "#" #should result in \" and #
useful yes
The following code is an example how to use readparameters:
#define MAIN_CPP
#include <iostream>
#include <exception>
#include "readparameters.h"
using namespace std;
int main(int argc,char **argv){
//check arguments
if (argc!=2) {
cerr<<"Usage: ./params <paramfile>"<<endl;
return 1;
}
//get input filename from parameter file
int answer;
vector<string> v;
try {
readparameters rp(argv[1]);
answer = rp.get<int>("answer");
v=rp.get_vector<string>("parser_test");
cout<<answer<<endl;
rp.print_tabular(); //debug output
rp.get<long>("Atlantis"); //exception
}
catch (exception& e) {
cerr<<e.what()<<endl;
return 1;
}
return 0;
}
- Run the code, add more parameters to the text file, read a boolean parameter.
- Read the code of the class readparamerters (you may skip the parsing part in the constructor).
- get and get_vector are template functions. Why are there specializations for bool and string?
- Why is the map tabular mutual?
- What are the requirements for types to work with readparameters?
- Why is the default constructor privat?