Ex2.{1,2,3}: Copied and extended code from Intro CPP repo,
Working on Ex2.4
This commit is contained in:
parent
4c31b5a287
commit
82260a45db
11 changed files with 409 additions and 0 deletions
90
ex2/ex2.1/bubble_sort_int.cpp
Normal file
90
ex2/ex2.1/bubble_sort_int.cpp
Normal file
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* Bubble sort a list of 10 integers
|
||||
*
|
||||
* I'd rather have the method without pointers.
|
||||
* As a user of the function, I don't have to think about passing pointers, which is also nice
|
||||
*/
|
||||
#include <iostream>
|
||||
|
||||
|
||||
#define LIST_SIZE 10
|
||||
#define USE_PTR 1
|
||||
|
||||
void sort( int* A, const int size );
|
||||
#if !USE_PTR
|
||||
void order( int& a, int& b );
|
||||
#else
|
||||
void orderptr( int* a, int* b );
|
||||
#endif
|
||||
|
||||
|
||||
int main() {
|
||||
int list[LIST_SIZE] = { 2295, 14500, 9127, 23079, 20612, 5571, 21959, 10032, 18339, 16673 };
|
||||
|
||||
// Print the original
|
||||
std::cout << "Original: ";
|
||||
|
||||
for( int i = 0; i < LIST_SIZE ; i++ )
|
||||
{
|
||||
if ( i != 0 )
|
||||
{
|
||||
std::cout << ", ";
|
||||
}
|
||||
|
||||
std::cout << list[i];
|
||||
}
|
||||
std::cout << std::endl;
|
||||
|
||||
// sort it
|
||||
sort( list, LIST_SIZE );
|
||||
|
||||
// Print it
|
||||
std::cout << "Sorted: ";
|
||||
for( int i = 0; i < LIST_SIZE ; i++ )
|
||||
{
|
||||
if ( i != 0 )
|
||||
{
|
||||
std::cout << ", ";
|
||||
}
|
||||
|
||||
std::cout << list[i];
|
||||
}
|
||||
std::cout << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sort( int* A, const int size ) {
|
||||
for (int i = 0 ; i < size ; i++ ) {
|
||||
for (int j = 0 ; j < size - 1 ; j++) {
|
||||
#if !USE_PTR
|
||||
order( A[ i ], A[ j ] );
|
||||
#else
|
||||
orderptr( &A[ i ], &A[ j ] );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if !USE_PTR
|
||||
void order( int& a, int& b ) {
|
||||
// b is greater or equal to a, do nothing
|
||||
if ( a < b ) {
|
||||
return;
|
||||
}
|
||||
|
||||
int tmp = a;
|
||||
a = b;
|
||||
b = tmp;
|
||||
}
|
||||
#else
|
||||
void orderptr( int* a, int* b ) {
|
||||
if ( *a < *b ) {
|
||||
return;
|
||||
}
|
||||
|
||||
int* tmp = a;
|
||||
a = b;
|
||||
b = tmp;
|
||||
}
|
||||
#endif
|
126
ex2/ex2.1/bubble_sort_str.cpp
Normal file
126
ex2/ex2.1/bubble_sort_str.cpp
Normal file
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
* Bubble sort a list of 10 strings
|
||||
*
|
||||
* We want the strings to persist in memory, that is why we use a 'const char*'.
|
||||
*
|
||||
*/
|
||||
#include <iostream>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
#define LIST_SIZE 10
|
||||
#define USE_PTR 1
|
||||
|
||||
#define VERBOSE 0
|
||||
|
||||
void sort( const char** A, const int size );
|
||||
#if !USE_PTR
|
||||
void order( const char* a, const char* b );
|
||||
#else
|
||||
void orderptr( const char* &a, const char* &b );
|
||||
#endif
|
||||
|
||||
|
||||
int main() {
|
||||
const char* list[LIST_SIZE] = {
|
||||
"b",
|
||||
"cccccccccc",
|
||||
"aaabcd",
|
||||
"axefsaf",
|
||||
"poqkud",
|
||||
"6xnj439yu",
|
||||
"nullieksj",
|
||||
"bell",
|
||||
"uuisdjk",
|
||||
"aaaaaaa",
|
||||
};
|
||||
|
||||
// Print the original
|
||||
std::cout << "Original: ";
|
||||
|
||||
for( int i = 0; i < LIST_SIZE ; i++ )
|
||||
{
|
||||
if ( i != 0 )
|
||||
{
|
||||
std::cout << ", ";
|
||||
}
|
||||
|
||||
std::cout << list[i];
|
||||
}
|
||||
std::cout << std::endl;
|
||||
|
||||
// sort it
|
||||
sort( list, LIST_SIZE );
|
||||
|
||||
// Print it
|
||||
std::cout << "Sorted: ";
|
||||
for( int i = 0; i < LIST_SIZE ; i++ )
|
||||
{
|
||||
if ( i != 0 )
|
||||
{
|
||||
std::cout << ", ";
|
||||
}
|
||||
|
||||
std::cout << list[i];
|
||||
}
|
||||
std::cout << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sort( const char** A, const int size ) {
|
||||
for ( int i = 0 ; i < size ; i++ ) {
|
||||
for ( int j = 0 ; j < size - 1 ; j++ ) {
|
||||
#if VERBOSE
|
||||
std::cout << "SORT: " << A[i] << ", " << A[j]<< std::endl;
|
||||
#endif
|
||||
|
||||
#if !USE_PTR
|
||||
order( A[ i ], A[ j ] );
|
||||
#else
|
||||
orderptr( A[ i ], A[ j ] );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if !USE_PTR
|
||||
void order( const char* a, const char* b ) {
|
||||
#if VERBOSE
|
||||
std::cout << "Order: " << a << std::endl;
|
||||
#endif
|
||||
// b is greater or equal to a, do nothing
|
||||
if ( strcmp(a, b) > 0) {
|
||||
#if VERBOSE
|
||||
std::cout << "Ordering OK" << std::endl;
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
#if VERBOSE
|
||||
std::cout << "Ordering ToDo" << std::endl;
|
||||
#endif
|
||||
|
||||
const char* tmp = a;
|
||||
a = b;
|
||||
b = tmp;
|
||||
}
|
||||
#else
|
||||
void orderptr( const char* &a, const char* &b ) {
|
||||
#if VERBOSE
|
||||
std::cout << "Order: " << a << ", " << b << std::endl;
|
||||
#endif
|
||||
if ( strcmp( a, b ) > 0 ) {
|
||||
#if VERBOSE
|
||||
std::cout << "Ordering OK" << std::endl;
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
#if VERBOSE
|
||||
std::cout << "Ordering ToDo" << std::endl;
|
||||
#endif
|
||||
|
||||
const char* tmp = a;
|
||||
a = b;
|
||||
b = tmp;
|
||||
}
|
||||
#endif
|
55
ex2/ex2.2/overloading.cpp
Normal file
55
ex2/ex2.2/overloading.cpp
Normal file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* Function Overloading
|
||||
*
|
||||
* generalisation of type is possible
|
||||
* => not writing an int implementation means always use the double
|
||||
* => => even when to ints are supplied, they are generalised to doubles
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
|
||||
//int min( int a, int b );
|
||||
double min( double a, double b );
|
||||
|
||||
int min( int a[], int size);
|
||||
|
||||
|
||||
|
||||
int main() {
|
||||
|
||||
const int size = 5;
|
||||
int list[size] = { 42, 37, 29, 23, 19 };
|
||||
|
||||
std::cout << "min(5, 1) = " << min(5,1) << std::endl;
|
||||
std::cout << "min([42,37,29,23,19],5) = " << min(list,size) << std::endl;
|
||||
|
||||
std::cout << "min( 3.12345, 3.15432 ) = " << min(3.12345, 3.15432) << std::endl;
|
||||
|
||||
|
||||
std::cout << "min( 3.12345, 4 ) = " << min(3.12345, 4) << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//int min( int a, int b ) {
|
||||
// if ( a < b ) {
|
||||
// return a;
|
||||
// }
|
||||
// return b;
|
||||
//}
|
||||
|
||||
double min( double a, double b ) {
|
||||
if ( a < b ) {
|
||||
return a;
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
int min( int a[], int size ) {
|
||||
int m = a[0];
|
||||
|
||||
for( int i = 1; i < size ; ++i ) {
|
||||
m = min(a[i], m);
|
||||
}
|
||||
|
||||
return m;
|
||||
}
|
34
ex2/ex2.3/namespacing.cpp
Normal file
34
ex2/ex2.3/namespacing.cpp
Normal file
|
@ -0,0 +1,34 @@
|
|||
#include <iostream>
|
||||
|
||||
namespace Black {
|
||||
void print(int k) {
|
||||
std::cout << "Black print" << std::endl;
|
||||
};
|
||||
}
|
||||
|
||||
namespace White {
|
||||
void print(int k) {
|
||||
std::cout << "White print" << std::endl;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
void sub1() {
|
||||
using White::print ;
|
||||
print(5);
|
||||
}
|
||||
|
||||
void print(int k) {
|
||||
if ( k > 0 )
|
||||
{
|
||||
print(k-1);
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
sub1();
|
||||
|
||||
print(7);
|
||||
|
||||
return 0;
|
||||
}
|
11
ex2/ex2.3/namespacing.txt
Normal file
11
ex2/ex2.3/namespacing.txt
Normal file
|
@ -0,0 +1,11 @@
|
|||
a)
|
||||
the `print(5)` line calls White::print
|
||||
the `print(k-1)` line calls itself
|
||||
|
||||
b)
|
||||
the line is allowed by itself,
|
||||
however since we define a `void print(int k)` function
|
||||
there is no way to distinguish which one is called.
|
||||
thus it becomes illegal.
|
||||
|
||||
Including it in main would be OK
|
8
ex2/ex2.4/build.txt
Normal file
8
ex2/ex2.4/build.txt
Normal file
|
@ -0,0 +1,8 @@
|
|||
d)
|
||||
g++ -c max.cc;
|
||||
g++ -c min.cc;
|
||||
|
||||
ar q libMinMax.a max.o min.o
|
||||
|
||||
g++ test.cpp -L. -llibMinMax.a
|
||||
|
20
ex2/ex2.4/max.cc
Executable file
20
ex2/ex2.4/max.cc
Executable file
|
@ -0,0 +1,20 @@
|
|||
//max.cc
|
||||
namespace mylib {
|
||||
double max( double a, double b ) {
|
||||
if ( a < b ) {
|
||||
return b;
|
||||
}
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
int max( int a[], int size ) {
|
||||
int m = a[0];
|
||||
|
||||
for( int i = 1; i < size ; ++i ) {
|
||||
m = max(a[i], m);
|
||||
}
|
||||
|
||||
return m;
|
||||
}
|
||||
}
|
8
ex2/ex2.4/max.hh
Executable file
8
ex2/ex2.4/max.hh
Executable file
|
@ -0,0 +1,8 @@
|
|||
//max.hh
|
||||
#ifndef MAX_HH
|
||||
#define MAX_HH
|
||||
namespace mylib {
|
||||
double max( double a, double b );
|
||||
int max( int a[], int size);
|
||||
}
|
||||
#endif
|
19
ex2/ex2.4/min.cc
Executable file
19
ex2/ex2.4/min.cc
Executable file
|
@ -0,0 +1,19 @@
|
|||
//min.cc
|
||||
namespace mylib {
|
||||
double min( double a, double b ) {
|
||||
if ( a < b ) {
|
||||
return a;
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
int min( int a[], int size ) {
|
||||
int m = a[0];
|
||||
|
||||
for( int i = 1; i < size ; ++i ) {
|
||||
m = min(a[i], m);
|
||||
}
|
||||
|
||||
return m;
|
||||
}
|
||||
}
|
8
ex2/ex2.4/min.hh
Executable file
8
ex2/ex2.4/min.hh
Executable file
|
@ -0,0 +1,8 @@
|
|||
//min.hh
|
||||
#ifndef MIN_HH
|
||||
#define MIN_HH
|
||||
namespace mylib {
|
||||
double min( double a, double b );
|
||||
int min( int a[], int size);
|
||||
}
|
||||
#endif
|
30
ex2/ex2.4/test.cpp
Normal file
30
ex2/ex2.4/test.cpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
#include <iostream>
|
||||
|
||||
#include "max.hh"
|
||||
#include "min.hh"
|
||||
|
||||
#define LIST_SIZE 5
|
||||
int main() {
|
||||
double dbl_a = 2.31233;
|
||||
double dbl_b = 91.3239;
|
||||
|
||||
int list[ LIST_SIZE ] = { 0, 2 ,4 , 6, -9 };
|
||||
|
||||
|
||||
std::cout << "Doubles" << std::endl;
|
||||
std::cout << "max(" << dbl_a << ", " << dbl_b << ") = " << mylib::max(dbl_a, dbl_b ) << std::endl;
|
||||
std::cout << "min(" << dbl_a << ", " << dbl_b << ") = " << mylib::min(dbl_a, dbl_b ) << std::endl;
|
||||
std::cout << std::endl;
|
||||
/*
|
||||
std::cout << "Int & Doubles" << std::endl;
|
||||
std::cout << "max(" << list[4] << ", " << dbl_b << ") = " << mylib::max(list[4], dbl_b ) << std::endl;
|
||||
std::cout << "min(" << list[4] << ", " << dbl_b << ") = " << mylib::min(list[4], dbl_b ) << std::endl;
|
||||
std::cout << std::endl;
|
||||
*/
|
||||
|
||||
std::cout << "List" << std::endl;
|
||||
//std::cout << "max( list, " << LIST_SIZE << ") = " << mylib::max ) << std::endl;
|
||||
//std::cout << "min( list, " << dbl_a << ", " << dbl_b << ") = " << mylib::max(dbl_a, dbl_b ) << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
Reference in a new issue