1 of 36

CS 225

Lab_intro

Worksheet on Website

2 of 36

Intro

G Carl Evans

gcevans@illinois.edu

Professor

Brad Solomon

bradsol@illinois.edu

Professor

3 of 36

Logistics

10 points each lab.

120 total.

Attendance starts week 3 for a possibility of up to 40 points extra credit.

4 of 36

Survival Guide:

  1. Learn C++ on time!
  2. Code, a lot
  3. Attend Lectures and Labs
  4. Start working early
  5. Use Google or even Bing
  6. Ask questions!
  7. Work in pairs
  8. Always test your code on EWS machines!

5 of 36

Learn C++ on time

6 of 36

  1. Intro/Review
  2. Worksheet
  3. Lab assignment
  4. Attendance (not today)

Lab sessions:

7 of 36

Topics covered in the lecture

Variables in C++:

  • Type
  • Name

  • Primitive variables
  • User defined / complex variables

  • Value
  • Memory location

8 of 36

Topics covered in the lecture

  • Encapsulation
  • Classes
  • Namespaces
  • Constructor
  • Reference Variable

9 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

10 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

11 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#pragma once is a non-standard but widely supported preprocessor directive designed to cause the current  file to be included only once in a single compilation.

Wikipedia

12 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

13 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

14 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

7

8

9

10

11

int main() {

Cube c;

cout << c.getVolume()<< c.length_;

return 0;

}

15 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

16 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

...

double Cube::getVolume(){

...}

:: - scope resolution operator

17 of 36

Constuctor

A constructor is a special member function that initializes the object.

  • If (and only if!) no constructor is provided the compiler will declare a default constructor
  • We can have more than one constructor in the class

18 of 36

#pragma once

class Cube {

public:

double getVolume();

double getSurfaceArea();�� private:� double length_;�� };

Cube.h

1

2

3

4

5

6

7

8

9

10

11

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

int main() {

Cube c;

cout << c.getVolume();

return 0;

}

Cube.cpp

19 of 36

#pragma once

class Cube {

public:

Cube();

double getVolume();

double getSurfaceArea();�� private:� double length_;�� };

Cube.h

1

2

3

4

5

6

7

8

9

10

11

#include "Cube.h"

namespace cs225 {

Cube::Cube(){

length_=1;

}

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

int main() {

Cube c;

Cube c2(5);

cout << c.getArea();

return 0;

}

Cube.cpp

20 of 36

#pragma once

class Cube {

public:

Cube();

Cube(double w);

double getVolume();

double getSurfaceArea();�� private:� double length_;�� };

Cube.h

1

2

3

4

5

6

7

8

9

10

11

#include "Cube.h"

namespace cs225 {�

Cube::Cube(){

length_=1;

}

Cube::Cube(double w){

length_=w;

}�

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Cube.cpp

21 of 36

#pragma once

class Cube {

public:

Cube();

Cube(double w);

double getVolume();

double getSurfaceArea();�� private:� double length_;�� };

Cube.h

1

2

3

4

5

6

7

8

9

10

11

#include "Cube.h"

namespace cs225 {�

Cube::Cube(){

length_=1;

}

Cube::Cube(double w){

length_=w;

}�

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

int main() {

Cube c;

Cube c2(5);

cout << c.getVolume()<< c2.getVolume();

return 0;

}

22 of 36

#pragma once

class Cube {

public:

Cube();

Cube(double w);

double getVolume();

double getSurfaceArea();�� private:� double length_;�� };

Cube.h

1

2

3

4

5

6

7

8

9

10

11

#include "Cube.h"

namespace cs225 {�

Cube::Cube(){

length_=1;

}

Cube::Cube(double w){

length_=w;

}�

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

int main() {

Cube c;

Cube c2(5);

cout << c.getVolume()<< c2.getVolume();

return 0;

}

23 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

24 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

A namespace is a declarative region that provides a scope to the identifiers (names of the types, function, variables etc) inside it.

25 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

...

namespace cs225 {

double Cube::getVolume(){

}

...

26 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

namespace cs225 {

double Cube::getVolume(){

}

using cs225::Cube;

double getVolume(){

}

27 of 36

#pragma once

namespace cs225 {

class Cube {

public:

double getVolume();

double getSurfaceArea();����� private:� double length_;�� };

}

Cube.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include "Cube.h"

namespace cs225 {

double Cube::getVolume() {

return length_ * length_ *� length_;

}

double� Cube::getSurfaceArea() {

return 6 * length_ *

length_;

}

}

Cube.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

double cs225::Cube::getVolume(){

}

namespace cs225 {

double Cube::getVolume(){

}

using cs225::Cube;

double getVolume(){

}

28 of 36

Write your first class: HSLAPixel

  • First read - “Understanding the HSL Color Space”
  • Create HSLAPixel class inside CS225 namespace.
  • Place class definition in a file - cs225/HSLAPixel.h
  • Place member function implementations in a file - cs225/HSLAPixel.cpp.

Specification

The class HSLAPixel contains four public member variables:

  • h - the hue of the pixel - double from [0, 360).
  • s - the saturation of the pixel - double from [0, 1].
  • l -the luminance of the pixel - double from [0, 1].
  • a - the alpha channel, how transparent the pixel is - double from [0, 1].

Additionally, you will need to complete three constructors defined in the doxygen;

29 of 36

CS 225’s PNG Class

Inside of your cs225 directory, you have: PNG.h and PNG.cpp.

We have provided an already complete PNG class that saves and loads PNG files and exposes a simple API for you to modify PNG files.

In C++, the scope resolution operator, ::, denotes a function or variable is a member of a class. The API for the PNG class includes:

  • Loading/Saving PNG files:
    • bool PNG::readFromFile(const std::string & fileName), loads an image based on the provided file name
    • bool PNG::writeToFile(const std::string & fileName), writes the current image to the provided file name (overwriting existing files)
  • Retrieving image and pixel information:
    • unsigned int PNG::width() const, returns the width of the image
    • unsigned int PNG::height() const, returns the height of the image
    • HSLAPixel & getPixel(unsigned int x, unsigned int y), returns a reference to a pixel at a provided location
  • Methods to create empty PNGs, resizing an image, etc.

Open the doxygen for PNG;

30 of 36

Example Usage

Suppose we want to transform an image to grayscale. A pixel with a saturation set to 0% will be a gray pixel. Here’s this transformation applied to the Alma Mater:

31 of 36

The code fragment:

1

2

3

4

5

6

7

8

9

10

11

12

13

PNG grayscale(PNG image) {

for (unsigned x = 0; x < image.width(); x++) {

for (unsigned y = 0; y < image.height(); y++) {� // Get a reference to the pixel at (x, y):

HSLAPixel & pixel = image.getPixel(x, y);

// Set the pixel's saturation to 0:

pixel.s = 0;

}

}

return image;

}

32 of 36

Reference Variable

A reference variable is an alias to an existing variable.

Key Idea: They are the same variable!

Modifying the reference variable also modifies the original variable being aliased.

33 of 36

Reference Variable

A reference variable is an alias to an existing variable.

1

2

3

4

5

6

7

8

9

10

11

12

13

PNG grayscale(PNG image) {

for (unsigned x = 0; x < image.width(); x++) {

for (unsigned y = 0; y < image.height(); y++) {�

HSLAPixel & pixel = image.getPixel(x, y);

pixel.s = 0;

}

}

return image;

}

34 of 36

Reference Variable

A reference variable is an alias to an existing variable.

1

2

3

4

5

6

7

8

9

10

11

12

13

PNG grayscale(PNG image) {

for (unsigned x = 0; x < image.width(); x++) {

for (unsigned y = 0; y < image.height(); y++) {�

HSLAPixel & pixel = image.getPixel(x, y);

pixel.s = 0;

}

}

return image;

}

35 of 36

lab_intro:

  • Complete the worksheet;�
  • Set up the environment - go over the instructions in Resources;

  • Review the HSLAPixel class;�
  • Modify the PNG in three new ways:

complete the functions:

  • illinify
  • spotlight
  • watermark
  • Test your program using the VM!

36 of 36