Search

4.7 — Structs


There are many instances in programming where we need more than one variable in order to represent something. For example, to represent yourself, you might want to store your name, your birthday, your height, your weight, or any other number of characteristics about yourself. You could do so like this:

However, you now have 6 independent variables that are not grouped in any way. If you wanted to pass information about yourself to a function, you’d have to pass each variable individually. Furthermore, if you wanted to store information about more people, you’d have to declare 6 more variables for each additional person! As you can see, this can quickly get out of control.

Fortunately, C++ allows us to create our own user-defined aggregate data types. An aggregate data type is a data type that groups multiple individual variables together. One of the simplest aggregate data type is the struct. A struct (short for structure) allows us to group variables of mixed data types together into a single unit.

Because structs are user-defined, we first have to tell the compiler what our struct looks like before we can begin using it. To do this, we declare our struct using the struct keyword. Here is an example of a struct declaration:

This tells the compiler that we are defining a struct named Employee. The Employee struct contains 3 variables inside of it: two ints and a float. These variables are called members (or fields). Keep in mind that the above is just a declaration — even though we are telling the compiler that the struct will have variables, no memory is allocated at this time.

Warning: One of the easiest mistakes to make in C++ is to forget the semicolon at the end of a struct declaration. This will cause a compiler error on the next line of code. Modern compilers like Visual Studio 2010 will give you an indication that you may have forgotten a semicolon, but older or less sophisticated compilers may not, which can make the actual error hard to find.

In order to use the Employee struct, we simply declare a variable of type Employee:

sJoe is a variable of type Employee. As with normal variables, declaring a variable allocates memory for that variable. Typically, the size of a struct is the sum of the size of all it’s members. In this case, since each integer is 4 bytes and a float is 4 bytes, Employee would be 12 bytes. However, some platforms have specific rules about how variables must be laid out in memory — consequently, the compiler may leave gaps between the variables. As a result, we can say the struct will be at minimum 12 bytes.

To find out the exact size of Employee, we can use the sizeof operator:

On the author’s Pentium 4, this prints The size of Employee is 12.

When we declare a variable such as Employee sJoe, sJoe refers to the entire struct (which contains the member variables). In order to access the individual members, we use the member selection operator (which is a period). As with normal variables, struct member variables are not initialized, and will typically contain junk. We must initialize them manually. Here is an example of using the member selection operator to initialize each member variable:

It is possible to declare multiple variables of the same struct type:

In the above example, it is very easy to tell which member variables belong to Joe and which belong to Frank. This provides a much higher level of organization than individual variables would. Furthermore, because the members all have the same name, this provides consistency across multiple variables of the same type.

Struct member variables act just like normal variables, so it is possible to do normal operations on them:

Another big advantage of using structs over individual variables is that we can pass the entire struct to a function that needs to work with the members:

In the above example, we pass an entire Employee struct to PrintInformation(). This prevents us from having to pass each variable individually. Furthermore, if we ever decide to add new members to our Employee struct, we will not have to change the function declaration or function call!

PrintInformation() uses the Employee struct passed to it to print out employee information to the screen. The above program outputs:

ID:   14
Age:  32
Wage: 24.15

ID:   15
Age:  28
Wage: 18.27

Structs can contain other structs. For example:

In this case, if we wanted to know what the CEO’s salary was, we simply use the member selection operator twice: sMyCompany.sCEO.fWage;

This selects the sCEO member from sMyCompany, and then selects the fWage member from within sCEO.

Initializer lists

Initializing structs member by member is a little cumbersome, so C++ supports a faster way to initialize structs using an initializer list. This allows you to initialize some or all the members of a struct at declaration time.

You can use nested initializer lists for nested structs:

A few final notes on structs

The “m_” Hungarian Notation prefix for members is typically not used for structs, even though structs contain members. This is (in part) because all variables in a struct are members! Consequently, labeling them with a “m_” prefix is somewhat redundant.

It is common to declare structs in a header file, so they can be accessed by multiple source files.

The class aggregate data type builds on top of the functionality offered by structs. Classes are at the heart of C++ object-oriented programming. Understanding structs is the first step towards object-oriented programming!

Quiz

1) You are running a website, and you are trying to keep track of how much money you make per day from advertising. Declare an advertising struct that keeps track of how many ads you’ve shown to readers, what percentage of users clicked on ads (as a floating point number between 0 and 1), and how much you earned on average from each ad that was clicked. Read in values for each of these fields from the user. Pass the advertising struct to a function that prints each of the values, and then calculates how much you made for that day (multiply all 3 fields together).

2) Write a struct to hold a fraction. The struct should have a integer numerator and a integer denominator member. Declare 2 fraction variables and read them in from the user. Write a function called multiply that takes both fractions, multiplies them together, and prints the result out as a decimal number.

Quiz Answers

1) Show Solution

2) Show Solution

5.1 — Control flow introduction
Index
4.6 — Typedefs

90 comments to 4.7 — Structs

  • Skylark

    Is there a ‘with’ keyword that allows you to edit variables of a structure without having to re-type the name repeatedly [like in Visual Basic]?


    Employee sFrank //a variable of the Employee type

    with sFrank
    .nEmployeeID = 15
    .nAge = 28
    [end with statement]

    // or something like that?

    Not that I’m lazy or anything…

    PS: I think there are some unwanted borders/shading on this page.

    Bye!

  • Mitul Golakiya

    /* Program of Structure Exerice 1 */

    #include <iostream.h>
    #include <conio.h>

    struct web
    {
    int adv;
    float rate;
    float click;
    };

    float money(int adv,float rate,float click)
    {
    float totalearning;
    totalearning = (adv * rate * click);
    return totalearning;
    }

    web mny;

    void main()
    {
    float res;

    clrscr();

    cout << "n How many advertise was shown: ";
    cin >> mny.adv;

    cout << "n What was rate of click : ";
    cin >> mny.rate;

    cout << "n Average of earning per click : ";
    cin >> mny.click;

    res = money(mny.adv , mny.rate , mny.click);

    cout << "n The Total earning is " << res;

    getch();
    }

    /* End of Program */

  • Astro

    We can pass a structure to a function.

    But can a function return a structure of data?

    Cheers.

  • siku

    Is there such a thing like typedef pointers? I got into trouble to initialize PCOORD. Finally I figured it out but I am not sure that am I doing the right thing? I thought it would be good to put this code example here since the mechanism is used in many places.

    For example (code):

    typedef struct Coordinate
    {
    short X;
    short Y;
    } COORD, *PCOORD;

    int main()
    {
    COORD pos;
    pos.X = 0;
    pos.Y = 0;
    PCOORD pPos = &pos;
    }

    At the beginning my main function looked like the main() below:

    int main()
    {
    //this is the wrong way to do things
    PCOORD pPos;
    pPos->X = 0;
    pPos->Y = 0;
    //if you use pPos now in somewhere compiler gives you warning that pPos is not initialized and my program crashed if I run that.
    // Why is it so? Why I cant initialize?
    }

    • Yes, you can do this — PCOORD is a typedef’s poniter to a Coordinate struct. You can’t initialize your pPos because pPos is a pointer, and you haven’t set it to point at anything.

  • som shekhar

    When i print the score i got junk , i understood since initially s1 was not initialised, and
    when it is passed to function ReadScore s1 now become a local scope for that function and
    value got destroyed after the function ends and dats y i got junk value.
    But When i am doing like this

    i m still getting junk.Well i have created another structure variable s2, and then i assigned
    s2 to s1, so it will be copying the score, Correct??? then y the value is getting destroyed after the f
    the function ends

    • Quinn

      This is probably old but I’ll answer it anyway, for future reference.

      ReadScore doesn’t return the s1 struct. Since s1 is declared locally in both the main function and the ReadScore function, it’s two separate Score structs. Therefore, when you called ReadScore, it didn’t change the value of main()s s1 Score struct. To change that code to work right, you’d either need to use pointers, or you could return the struct from ReadScore. The following examples exclude your other perfectly fine function and struct declaration.

      Returning struct:

      Or you could use pointers:

      Hope that helps!

  • som shekhar

    Okay i understood what can go wrong in the above problem???correct me if i am wrong!!
    when i declare Score s1; memory has been allocated lets say its address is 123.
    Now when i am passing this s1 to the function ReadScore, this function will create a copy of s1
    which will have different memory,(let say its address is 125) so it does everything right,
    but doesnt touch at all the address 123..which is still junk. SO i m getting junk correct?

    the above problem i overcame ,when i send the reference of the s1!!!
    Or else i can call the PrintScore inside the ReadScore function..this will also eliminates the problem.

    • Chris Walker

      Exactly! This is a pass-parameter-by-value-or-reference issue. As a general rule: if you need to modify the struct/obj and keep changes in the previous scope, pass by reference, not by value. Your description of what was happening in your code is spot on.

  • Kinten

    I have see that some people define structs this way

    What I dont understand is, why they write “something” two times?

    • It’s easier to understand when you use different labels:

      In this case, something is the name of the struct itself. It’s like naming a function, it’s just a label to reference it by later. This doesn’t actually create a struct object, it just lays out what a struct looks like.

      somethingelse declares an actual struct object. It is a variable that takes up memory.

      So when you see something like this:

      It basically means you’re defining a struct named something, and then also defining a local variable with the same name. In my opinion, this is bad coding style since you’re using the same name for two different things.

      Usually when I see this, it’s because people want a “one off” struct — something that’s only used once. In that case, you can just use an anonymous struct:

      This struct has no name and the type can never be referenced directly. However, something is a variable of that type.

  • Shai

    I believe you have a mistake in your PrintInformation() example. The function tries to print the variable nID within sEmployee, but the ID variable was declared as nEmployeeID in the Employee struct.

    Extremely helpful tutorials, thanks!

    [ Fixed! Thanks for letting me know. -Alex ]

  • Alfreda

    This example does not work for me :S

    I get a lot of errors, first of which says “error: variable or field ‘PrintInformation’ declared void”

    And then a bunch of scope errors… :S I’m using Code::Blocks. Any idea why this is happening?

    • 1) you need #include

      2) you need to include struct then define Employee

      3) you need to include a void for each employee, so replace ‘sEmployee’ with the employee’s names and include both in the one void to make it simpler.

      4) I’m guessing alex didn’t want to make this example one of those “do it with me’s” he also has two void calls for each employee, while you could include both in one, this is what it would be like if you included both in one void…

      #include

      using namespace std;

      struct Employee //this is where you forgot to include the struct and define “Employee
      {
      int nID;
      int nAge;
      float fWage;
      };

      void PrintInformation(Employee sFrank, Employee sJoe) //both employees are in one void.
      {
      using namespace std;
      cout << “ID: ” << sFrank.nID << endl; //Frank starts here.
      cout << “Age: ” << sFrank.nAge << endl;
      cout << “Wage: ” << sFrank.fWage << endl << endl;
      cout << “ID: ” << sJoe.nID << endl; //Joe stats here.
      cout << “Age: ” << sJoe.nAge << endl;
      cout << “Wage: ” << sJoe.fWage << endl << endl;

      }

      int main()
      {
      Employee sJoe;
      sJoe.nID = 14;
      sJoe.nAge = 32;
      sJoe.fWage = 24.15;

      Employee sFrank;
      sFrank.nID = 15;
      sFrank.nAge = 28;
      sFrank.fWage = 18.27;

      PrintInformation(sFrank, sJoe); // The void is called here.

      return 0;
      }

      It would probably be a better idea to void the two separately because they’re different subjects, but for the sake if it being an example I just decided to explain both.
      And I also use Code Blocks, its a great IDE!
      Hope this cleared it up for you.

      • Imaad

        Hello can any body debug following code.Its not running for me… having lot of errors..
        thanks in advance

        #include
        #include “stdafx.h”

        void PrintInformation(Employee sFrank, Employee sJoe)
        {
        using namespace std;
        cout << “ID: ” << sFrank.nID << endl;
        cout << “Age: ” << sFrank.nAge << endl;
        cout << “Wage: ” << sFrank.fWage << endl << endl;
        cout << “ID: ” << sJoe.nID << endl;
        cout << “Age: ” << sJoe.nAge << endl;
        cout << “Wage: ” << sJoe.fWage << endl << endl;

        }

        int main()
        {
        using namespace std;
        struct Employee
        {
        int nID;
        int nAge;
        float fWage;
        };
        Employee sJoe;
        sJoe.nID = 14;
        sJoe.nAge = 32;
        sJoe.fWage = 24.15;

        Employee sFrank;
        sFrank.nID = 15;
        sFrank.nAge = 28;
        sFrank.fWage = 18.27;

        PrintInformation(sFrank, sJoe);
        return 0;
        }

  • surua

    why can’t I print the CEO’s data this way. I think I am doing some silly mistake…

    • manju

      U are actually passing the structure sCEO which is not declared . So the compiler gives u an error . Since the sCEO is a member of sMyCompany. U should use sMyCompany.sCEO in order to access the structure of Employee sCEO .

      The following line would fix ur problem
      PrintInformation(sMyCompany.sCEO);
      instead of
      PrintInformation(sCEO);

  • Matt B.

    Is it possible to create multiple structs using a for loop?

    • Matt B.

      Nevermind about that last comment. I realized that there was a following article in this tutorial that explains how to accomplish this.

  • MusicDave

    My code prints out “e” for the name of the football player. I want it to print “Jake”.
    Notice that I use cName[15] to allow enough space for the name. This is probably my mistake.
    Everything else prints correctly. Below are the pertinent chunks of code:

    [code]
    struct FootballPlayer
    {
    char cName[15];
    int nVertLeap;
    int nBenchPress;
    float fFortyDash;
    };

    void PrintStats(FootballPlayer sPlayer)
    {
    cout << “Player’s Name is ” << sPlayer.cName[15] << endl;
    cout << “Vertical Leap = ” << sPlayer.nVertLeap << ” inches” << endl;
    cout << “225lb Bench Press = ” << sPlayer.nBenchPress << ” presses” << endl;
    cout << “Forty Yard Dash = ” << sPlayer.fFortyDash << ” seconds” << endl;
    }

    FootballPlayer sJake;
    sJake.cName[15] = ‘Jake';
    sJake.nVertLeap = 30;
    sJake.nBenchPress = 28;
    sJake.fFortyDash = 4.4;

    • twilight

      you’ve got one problem I see in your code there:

      in the method “PrintStats”, the first cout-line: You are printing out cName[15]. Why? first of all, you want the name and not just one character that would reside in “slot” 15. Second: Your array of chars “cName” only has “slots” up to number 14. You created it with a [15], so you have to access the slots with the numbers 0 – 14. That makes 15 slots. (i.e. Chars in that Array)

  • twilight

    When I understand the solution for 1) right, this is showing us a style of coding this tutorial itself said we should not do.

    The method PrintAdvertising() get’s passed a struct named sAd, while the main-function declares a struct with the name sAd.
    So while in the PrintAdvertising() method, the local sAd is hiding the main()-sAd.

    Am I right or did I understand something wrong? Thx!

  • Shawn

    Alex

    for the quiz 2 how-come the same result is not produced?

    the correct answer is printed in the above code

    but it just prints 0, in the next code, i know i am doing something wrong with type casting, but what exactly am i doing wrong

    thanks

  • Hello Alex,

    I have trouble understanding the following situation, where a struct consisting of int, float and bool types shows a complete size as 12. Whereas, if I display the size of each data-type, it shows 4(int), 4(float), 1(bool).

    Please explain.

    The code:

    The Output:

    Regards,
    Mayur

    • Ole

      Let me quote Alex and highligth the important bit that you wonder about:

      “Typically, the size of a struct is the sum of the size of all it’s members. In this case, since each integer is 4 bytes and a float is 4 bytes, Employee would be 12 bytes. However, some platforms have specific rules about how variables must be laid out in memory — consequently, the compiler may leave gaps between the variables. As a result, we can say the struct will be at minimum 12 bytes.”

      Cheers
      Ole

  • Carter

    struct Fractions
    {
    int nNumerator;
    int nDenominator;
    };

    int multiply(int x, int y)
    {
    return x * y;
    }

    float produceValue(Fractions sAny)
    {
    using namespace std;
    cout << "Enter a Numerator " <> sAny.nNumerator;
    cout << "Enter a Denominator " <> sAny.nDenominator;
    return (float)sAny.nNumerator / sAny.nDenominator;
    }
    int main()
    {
    using namespace std;
    cout << "Now, we are going to multiply two fractions. First: " << endl;
    float x = produceValue;
    cout << "Now, once again " << endl;
    float y = produceValue;

    cout << "The answer is " << multiply(float x, float y);

    return 0;
    }

    didnt work though, does anyone know why?

    • mirondanro

      Try this:

      #include
      #include

      struct Fractions
      {
      int nNumerator;
      int nDenominator;
      };

      float multiply(float x, float y)
      {
      return x * y;
      }

      float produceValue()
      {
      using namespace std;
      Fractions sAny;
      cout <> sAny.nNumerator;
      cout <> sAny.nDenominator;
      float result = (float)sAny.nNumerator / sAny.nDenominator;
      return (result);
      }

      int main()
      {
      using namespace std;
      cout << "Now, we are going to multiply two fractions. First: " << endl;
      float x = produceValue();
      cout << "Now, once again " << endl;
      float y = produceValue();
      cout << "The answer is " << multiply(x, y);
      cin.clear();
      cin.ignore(255, '\n');
      cin.get();
      return 0;
      }

  • Carter

    sorry i know didt put the brackets. It says that produceValue does not take 0 arguments

  • BX

    Shouldn’t structure alignment be mentioned in this chapter?

    BTW, great free tutorials. Thanks for your effort.

  • drow

    #include “stdafx.h”

    #include

    struct advertising
    {
    int nAds_shown;
    float percentThatclicked;
    float averageEarned;
    };

    void read()
    {
    using namespace std;
    advertising scompany;
    cin >> scompany.nAds_shown;
    cin >> scompany.percentThatclicked;
    cin >> scompany.averageEarned;
    }

    int main(advertising scompany)
    {
    using namespace std;
    read();
    cout << scompany.nAds_shown << endl;
    cout << scompany.percentThatclicked << endl;
    cout << scompany.averageEarned << endl;
    cout << scompany.nAds_shown*scompany.percentThatclicked * scompany.averageEarned << endl;
    return 0;
    }

    This code compiles and links without a problem, but when I actually run it it returns very odd numbers.
    Can anyone help?

    • Kiasta

      Try making the void Read() function return the struct advertisementy like so:

      What happens is that when you run through the function Read() it stores the data in the SCOPE, and than is destroyed after the function ends. So when you return scompany and store it into scompany on int main(), it passes the values to the main() scope. There might be a little more to it but basically the values are destroyed when Read() ends so you have to pass it on to main() which I have done. BTW I am unsure as to why you included stdafx.h when you have nothing in your program that needs that header, whats even more curious is the way you included it (with “” instead of ) and that it compiled at all.

  • Kiasta

    In your “Quiz 1 Answer” You did not divide the percentage, or at least turn it into a decimal, so the output will be wrong.

    For example:

    5000 * 50 * $.15 = $37,500
    5000 * (50 / 100) * $.15 = $375

    The two are very different. The user will not know to put a decimal instead of a whole number (in fact they might even put a modulus after the number which is bad). I guess I am just a little nit-picky. BTW here is my answer if you are interested:

  • rami

    k i have problem i tried to make a lot of programs but i get to the same point and get stuck. my problem is i have to codes they work fine, they have been tested.
    i need something to execute one of the code
    if the user entered a keyword.
    so if the user entered c to f i want the
    int nCtoF();.. execute but the other one dont.

  • rehman

    hi, i am trying to write a program, using classes and structs and inheritence…

    the program kind of represents a university system where tutors teach only specific modules and students are only enrolled on specific modules.

    To store information about students and their modules.

    the user is prompted to enter the number of modules they undertake and then according to the number they enter they get the option to store information about these modules.

    for example if user enters 1 module only 1 struct is called to store the information

    but if user enters 3 modules, the program should allow three struct objects to be entered..

    i can’t get three structs to come if the user enters three….

    and is using classes and struct the best option to solve this problem?

    any help please….

    • Elqno

      I think that the most optimal way to do (using the less RAM space) would be as you said, using inheritance, and learn polymorphism might help you a lot ;) so you will actually will need classes, you can just avoid structs ;) but if it is about speed, then structs are better than classes…so think what do you want ;)

  • Rafael

    This is my answer for exercise 1 and 2 :

    Exercise 1 :

    And Exercise 2 :

  • Elqno

    Hello Alex, I have a qst:

    From your code:

    when you made the declaration of this:

    shouldn’t be like this:

    or making the struct a typedef?? :

    I think it should be like that, so then you can declare sJoe as you did…
    I hope that if you reply I will get to my inbox that you did it ;) so I can check what you wrote ;)

  • linus

    why does this give negative result?
    // fraction.cpp : Defines the entry point for the console application.
    //

    #include “stdafx.h”
    # include

    struct sFraction
    {
    int nNumerator;
    int nDenominator;
    };

    float Product( sFraction s1, sFraction s2)
    {
    float fResult;
    fResult= static_cast (s1.nNumerator*s2.nNumerator)/static_cast (s1.nDenominator*s1.nDenominator);
    return fResult;
    }

    int main()
    {using namespace std;
    sFraction sF1,sF2;
    cout<<"input first nummerator"<> sF1.nNumerator;
    cout << "input first denominator"<> sF1.nDenominator;

    cout<<"input second numerator"<> sF2.nDenominator;

    cout<< "input second denomirator"<> sF2.nDenominator;

    cout << "the result is "<<Product (sF1,sF2)<<endl;
    return 0;
    }

  • Sudheer

    Thanks a lot Alex

    Really very useful tutorial on web. Thanks again for the effort :)

  • Would someone mind telling me why this is rounding down my answer? I’m not sure what i’m doing wrong.

    It’s giving me the answer 0, but i want 0.75.

    I take it i accidently read over one of the earlier lessons which is really confusing me now.

    • JD

      I kinda doubt you’re still wondering this 2 months later, but in case you haven’t figured it out:

      Because the / operator is in the parenthesis, the division is performed first. Both inputs are integers, so it is performed as an integer operation (and rounded to 0). Only after the division is complete does it convert the result to float. You want the division to be a float operation, so you should cast one of the inputs *before* the division, as follows:

      This will make it a float operation, and it will not be rounded.

  • youjay

    For the Example in the post, I tried the following
    ……
    …….
    int main()
    {
    struct Employee
    {
    int nID, nAge;
    float fWage;
    };
    ….
    …..

    As you can see, I defined struct inside main(). This failed. However, defining Struct outside main() worked? Any reason?

    J

  • WCoaster

    The variables inside the structure are treated as local variables inside main(). When you declare it outside main() they become global variables (evil) ;-)

    It should work if you initialize your variables before calling a function.

  • SWEngineer

    Simply well explained tutorial. Thanks.

  • anas.s

    Alex,

    You’ve shown that we can pass struct to functions, but here is a question :

    Can a function return result of type struct?

  • Groovychicken

    cout << "Wage: " << sEmployee.fWage << endl << endl;

    is there a reason for 2 endl's? or is it just a typo :)

  • JMan

    why my code always produce interger output?Can anyone please help me?:(

    // Enumeraor.cpp : Defines the entry point for the console application.
    //

    #include “stdafx.h”
    #include

    struct Fraction
    {
    int nNumerator;
    int nDenomintor;
    };

    double Input()
    {
    using namespace std;
    Fraction sFrac;
    cout<<"Enter the numerator of fraction :"<>sFrac.nNumerator;
    cout<<"Enter the denominator of fraction :"<>sFrac.nDenomintor;
    return static_cast(sFrac.nNumerator/sFrac.nDenomintor);
    }

    int main()
    {
    using namespace std;
    double dFracA=Input();
    double dFracB=Input();
    double dResult;
    static_cast(dResult=dFracA*dFracB);
    cout<<"The result is :"<<dResult<<endl;
    return 0;
    }

  • Eddyboy18

    @Jman try this
    first ur struct is an integer,and the function double, does that make sense?
    Try something like this:
    struct fraction
    {
    int nNumerator;
    int nDenominator;
    };
    void input(fraction obj,int nNum,int nDenom)
    {
    obj.nNumerator=nNum;
    obj.nDenominator=nDenom;
    cout<<"the numerator "<<obj.nNumerato<<endl;
    cout<<"the denominator"<<obj.nDenominator<<endl;
    }
    int main()
    {
    fraction objm;
    int nNum1,nDenom1;
    cout<<"enter the numerator"<>nNum1;
    cout<<"enter the denominator"<>nDenom1;
    //call to the function
    input(objm,nNum1,nDenom1);
    return 0;
    }

  • ranjbar

    hi
    in quiz 2 i wrote the program :

    #include

    struct Fraction
    {
    float x;
    float y;
    float frac;

    };

    void Multiply(Fraction f1, Fraction f2)
    {
    using namespace std;

    // Don’t forget the static cast, otherwise the compiler will do integer division!
    cout << f1.frac*f2.frac ;
    }
    int main()
    {
    using namespace std;

    // Allocate our first fraction
    Fraction f1;
    cout <> f1.x;
    cout <> f1.y;

    // Allocate our second fraction
    Fraction f2;
    cout <> f2.x;
    cout <> f2.y;
    f1.frac = f1.x/f1.y;
    f2.frac =f2.x/f1.y;
    Multiply(f1,f2);

    return 0;
    }

    but my program has less accuracy than yours.
    is this has a relation to this fact that i declare my variables first in float but u declare them first in int and then convert them to float?

  • ayahsabbah

    Hi, I have to write code to do the following task:
    –define a simple structs to store common information. In particular, write definitions for a struct called Point to store the X, Y and Z coordinates of a point.
    I have this:
    struct Point{
    double xcoord;
    double y coord;
    };
    Then Having defined a struct in the previous section, I need to write two simple functions to use this struct. First, write a function to prompt the user to enter the coordinates of a point, read the coordinates from the keyboard and store them a struct of type Point. The function prototype is as follows
    Point ReadPoint();
    Second, write a function to determine the Cartesian distance between two points. The function prototype is as follows
    double DistanceBetweenPoints( const Point& pt1, const Point& pt2 );

    I have:
    Point ReadPoint(){
    double x;
    double y;
    cout<<"enter the x and y coordinate of the point: "<>x>>y;
    }
    and
    double DistanceBetweenPoints( const Point& pt1, const Point& pt2 ){
    double distance;
    distance= sqrt (pow((x1-x2),2)+pow((y1-y2),2));//i dont know what variables I should add in here
    return double;
    }
    ..Please help and respond ASAP because I need to have this assignment done soon..thanks!

  • Proper

    Why can’t i use endline when asking for user input for the struct ?? It took me forever to figure out that’t the problem but why is it so please ?

  • Ollie999

    This is such a great website. Thanks very much for these tutorials. They’re absolutely spot on.

    Just one quick question. What would be the best way to make a struct declaration visible throughout the entire project. ie if you declared the struct type in one file and then wanted to create an instance of it in another.

    Would it be good practice to use a separate file for creating all struct and then use an #include in each file where you need to use it?

  • Mindstormscreator

    Just thought I’d share my code like some people are:

    First exercise, in main.cpp:
    #include <iostream>
    #include "main.h"

    using namespace std;

    int main()
    {
    cout << "Hi there! Um, please enter the following:\n" <<
    "-- Total ads shown to users\n" <<
    "-- Percent of ads clicked\n" <<
    "-- Average profit per ad" << endl;
    Advertising sAds;
    cin >> sAds.nAdsShown >>
    sAds.fPercentClicked >>
    sAds.fAverageProfit;
    sAds.fPercentClicked /= 100; // Convert from percent to decimal so next calculation can occur
    cout << "Total profit today: $" <<
    (
    sAds.nAdsShown *
    sAds.fPercentClicked *
    sAds.fAverageProfit
    ) << endl;

    }

    First exercise, main.h:
    #ifndef MAIN_H
    #define MAIN_H

    struct Advertising
    {
    int nAdsShown;
    float fPercentClicked;
    float fAverageProfit;
    };

    #endif

    Second exercise, main.cpp:
    #include <iostream>
    #include "main.h"

    using namespace std;

    int main()
    {
    Fraction sMyFrac, sYourFrac;
    cin >> sMyFrac.nNumer >> sMyFrac.nDenom;
    cin >> sYourFrac.nNumer >> sYourFrac.nDenom;
    Fraction sProduct = multFractions(sMyFrac, sYourFrac);
    printFraction(sProduct);
    }

    Fraction multFractions(Fraction sX, Fraction sY)
    {
    Fraction sProduct;
    sProduct.nNumer = sX.nNumer * sY.nNumer;
    sProduct.nDenom = sX.nDenom * sY.nDenom;
    return sProduct;
    //return (new Fraction{sX.nNumer * sY.nNumer, sX.nDenom * sY.nDenom}); // one-liner?
    }

    void printFraction(Fraction sFrac)
    {
    cout << static_cast<double>(sFrac.nNumer) / sFrac.nDenom;
    }

    Second exercise, main.h:
    #ifndef MAIN_H
    #define MAIN_H

    struct Fraction
    {
    int nNumer;
    int nDenom;
    };

    Fraction multFractions(Fraction sX, Fraction sY);
    void printFraction(Fraction sFrac);

    #endif

  • marine00

    something is wrong with my code, I try to modify the code, and here’s what i got, but then again, after typing the age, the program skip the Address and i don’t know what’s wrong with this code.

    #include

    using namespace std;

    struct EmpInfo {
    string sName;
    int iEmpNo;
    short iAge;
    string sAddress;
    float fWage;
    } Emp;

    void EmpPrint() {
    cout <<"Name : " << Emp.sName << endl;
    cout <<"Emp No : " << Emp.iEmpNo << endl;
    cout <<"Age : " << Emp.iAge << endl;
    cout <<"Address: " << Emp.sAddress << endl;
    cout <<"Wage : " << Emp.fWage << endl;
    }

    int main()
    {
    cout <<"Size of Emp is : " << sizeof(Emp) <<endl <<endl;

    cout <<"Enter name : "; getline(cin,Emp.sName);
    cout <> Emp.iEmpNo;
    cout <> Emp.iAge;
    cout <<"Enter Address : "; getline(cin, Emp.sAddress);
    cout <> Emp.fWage ;

    cout << endl << endl;

    EmpPrint();

    return 0;
    }

  • Knight

    I am using Code::Blocks IDE. I have this code

    1.cpp
    —————-
    #include
    using namespace std;
    void printEmployeeInfo(Employee ra) {
    cout << "age is : " << ra.age << endl;
    cout << "height is : " << ra.height << endl;
    cout << "sal is : " << ra.sal << endl;
    }

    2.cpp
    —————

    #include
    #include
    #ifndef STRUCT_H
    #define STRUCT_H

    #include “struct.h”

    #endif

    using namespace std;
    int main() {
    Employee r = {1,2,3.0f};
    printEmployeeInfo(r);
    return 0;
    }

    struct.h
    ————————
    struct Employee {
    int age;
    int height;
    float sal;
    };

    I am getting following compilation/linking error when i execute it

    mingw32-g++.exe -Wall -g -c C:\Users\rawat\Documents\CPP\cpp\2.cpp -o obj\Debug\2.o
    C:\Users\rawat\Documents\CPP\cpp\2.cpp: In function ‘int main()':
    C:\Users\rawat\Documents\CPP\cpp\2.cpp:71: error: parameter 1 of ‘void printEmployeeInfo(r)’ has incomplete type ‘r’
    C:\Users\rawat\Documents\CPP\cpp\2.cpp:61: warning: unused variable ‘g_nX’
    Process terminated with status 1 (0 minutes, 4 seconds)
    1 errors, 1 warnings

    But, If i move printEmployeeInfo function from 1.cpp to 2.cpp, it works fine. Can some help me with this.

  • Knight

    Never mind, i fount the issue.

  • DrSuse

    I had trouble with :

    void Multiply(Fraction sF1, Fraction sF2)

    because in section 2.1 Basic Addressing and Variable Declaration, it states:

    “The first mistake is declaring each variable as int (or whatever type it is) in sequence. This is not a bad mistake because the compiler will complain and ask you to fix it.

    int nValue1, int nValue2; // wrong (compiler error)

    int nValue1, nValue2; // correct”

    where instead I typed (something like) :
    void Multiply(Fraction sF1, sF2)
    and got compiler errors all over the pace.

    Am I to assume it’s different for function parameters?

    • codeez

      “Am I to assume it’s different for function parameters?”.

      Up to this point in the lessons, I’ve also noticed this hasn’t been explained, but you are right about it for sure!

  • KanedaSyndrome

    My results:

    main.cpp

    #include <iostream>
    #include "functions2.h"
    using namespace std;

    advertising campaign1;
    fraction frac1, frac2;

    int main()
    {
    campaign1 = getData(campaign1);
    printResults(campaign1);

    cout << endl << "NEXT PART OF THE EXERCISE!" << endl;

    cout << "First fraction" << endl;
    frac1 = getFrac(frac1);
    cout << "Second fraction" << endl;
    frac2 = getFrac(frac2);
    fracProduct(frac1, frac2);

    cin.get(); //for halting the program
    cin.ignore(); //for halting the program
    return 0;
    }

    functions2.cpp

    #include <iostream>
    #include "functions2.h"
    using namespace std;

    advertising getData(advertising x)
    {
    cout << "Input the number of adds in the campaign: ";
    cin >> x.numberAdds;
    cout << "Input the hit rate of the campaign: ";
    cin >> x.hitRatio;
    cout << "Input the average revenue per hit: ";
    cin >> x.avgRevenuePerHit;
    return x;
    }

    void printResults(advertising x)
    {
    float result = x.numberAdds*x.hitRatio*x.avgRevenuePerHit;
    cout << endl << "The campaign has resulted in a total revenue of: " << result << endl;
    }

    fraction getFrac(fraction x)
    {
    cout << "Input a numerator: ";
    cin >> x.numerator;
    cout << "Input a denominator: ";
    cin >> x.denominator;

    return x;
    }

    void fracProduct(fraction x, fraction y)
    {
    float result = static_cast<float>(x.numerator*y.numerator)/(x.denominator*y.denominator);

    cout << "Multiplying the two fractions yields: " << result << endl;
    }

    functions2.h

    #ifndef FUNCTIONS2_H
    #define FUNCTIONS2_H

    struct advertising
    {
    int numberAdds;
    float hitRatio;
    float avgRevenuePerHit;
    };

    struct fraction
    {
    int numerator;
    int denominator;
    };

    advertising getData(advertising x);
    void printResults(advertising x);
    fraction getFrac(fraction x);
    void fracProduct(fraction x, fraction y);

    #endif

    ~KanedaSyndrome

  • ZazaParkadze

    #include

    using namespace std;
    const float PERCENTT = 0.2;

    struct Adcompany
    {
    int nNumberOfAds;
    double nNumberOfVizitors;
    };

    // calculates and prints the income per day

    void adrevenue(Adcompany anyDay)
    {
    static int nday=1;
    float sum;
    const float fPricePerClick = 0.05;
    const float fPricePerAdSeen = 0.0;
    float nNumberOfClicks= PERCENTT * anyDay.nNumberOfVizitors;
    sum = fPricePerClick * nNumberOfClicks + fPricePerAdSeen * anyDay.nNumberOfAds * anyDay.nNumberOfVizitors;
    cout << "I've made easy " << sum <<" dollars "<< nday <<"th day" << endl;
    nday++;

    }

    int main()
    {
    Adcompany firstDay;
    cout << "enter number of Ads: " <> firstDay.nNumberOfAds ;
    cout << "enter number of vizitors: " <> firstDay.nNumberOfVizitors ;
    adrevenue (firstDay); // calculates and prints the income of first day

    // we may print out the earnings of second day and so on ..

    Adcompany secondDay = {2,1000.0};
    Adcompany thirdDay = {3,2000.0};
    Adcompany fourthDay = {4,3000.0};
    adrevenue(secondDay);
    adrevenue(thirdDay);
    adrevenue(fourthDay);
    return 0;
    }

  • Blackout

    This is what I did, I didn’t use structs because I wasn’t sure how, but it works.

  • Speeds03

    This is how I did it. It worked perfectly. But correct me if I should have done it another way. By the way, I pre-set the values for the variables because we aren’t really getting any user data to actually calculate a result.

    #include “stdafx.h”
    #include

    using namespace std;

    struct MoneyPerDay
    {
    int nAdShown; // 45 Ads shown each month
    long float fAdsClicked; // Amount of Ads clicked by users
    long float fAmountPerClick; // Each Ad click revenue is $.10
    long float nUsersPerDay;

    };

    void PrintMoneyEarnedPerDay(MoneyPerDay sMoneyPerDay)
    {
    cout << "Number of users per day: " << sMoneyPerDay.nUsersPerDay << endl;
    cout << "Number of Ads shown: " << sMoneyPerDay.nAdShown << endl;
    cout << "Number of Ads clicked: " << sMoneyPerDay.fAdsClicked << endl;
    cout << "Amount of money per Ad click: " << sMoneyPerDay.fAmountPerClick << endl;
    }

    int main()
    {
    MoneyPerDay sMonday;
    sMonday.nUsersPerDay = 10780;
    sMonday.nAdShown = 45;
    sMonday.fAdsClicked = 20;
    sMonday.fAmountPerClick = .10;

    MoneyPerDay sTuesday;
    sTuesday.nUsersPerDay = 20678;
    sTuesday.nAdShown = 45;
    sTuesday.fAdsClicked = 20;
    sTuesday.fAmountPerClick = .10;

    // Prints stats for monday
    cout << "Monday stats— " << endl;
    PrintMoneyEarnedPerDay(sMonday);
    cout << "The result is: $" << sMonday.nUsersPerDay / sMonday.fAdsClicked * sMonday.fAmountPerClick << endl;

    cout << " " << endl;

    // Prints stats for tuesday
    cout << "Tuesday stats— " << endl;
    PrintMoneyEarnedPerDay(sTuesday);
    cout << "The result is: $" << sTuesday.nUsersPerDay / sTuesday.fAdsClicked * sTuesday.fAmountPerClick << endl;

    cout << " " << endl;

    return 0;
    }

  • codeez

    Long float is kind of an oxymoron I think? VS2012 gives warnings:

    nonstandard extension used : long float c:user

    If you meant double the size of float then use ‘double’, but seeing as your data doesn’t exceed a float though, just the float would’ve done. :)

    You didn’t need the blanks here: cout << " " << endl; // just do: cout << endl;

    Keep coding. :)

  • hmm. I can’t get it to print out the detritus.


    cout << "Joe takes up " << sideof(Joe) << " bytes." << endl;
    cout << Joe.age << endl;

    only prints out “Joe takes up 12 bytes.”

    This is on EC2 Ubuntu 12.04 default g++ install from repository.

  • stevenhall

    Can anybody please help? I can’t for the life of me work out why my code doesn’t work properly. I can’t see any significant difference (apart from names chosen) between this and the model code given.

    #include <iostream>

    struct AdRevenue {
    int nAds; // number of ads shown to users
    float fPercentClicked; // percent of ads that were clicked
    float fAverageEarned; // average earned per ad
    };

    void printAdRevenue(AdRevenue sAdRev)
    { using namespace std;
    cout << "Number of ads: " << sAdRev.nAds << endl;
    cout << "Percentage of ads clicked:\t\t" << sAdRev.fPercentClicked << endl;
    cout << "Average earned per ad:\t\t" << sAdRev.fAverageEarned << endl;
    cout << "Revenue is:\t\t" << (sAdRev.nAds*sAdRev.fPercentClicked*sAdRev.fAverageEarned);
    }

    int main()
    { using namespace std;
    cout << "Please enter the number of ads shown to users: ";
    AdRevenue sUser_struct;
    cin >> sUser_struct.nAds;
    cout << "Please enter the percentage of ads clicked (between 0 and 1): ";
    cin >> sUser_struct.fPercentClicked;
    cout << "Please enter the average earned per ad: ";
    cin >> sUser_struct.fAverageEarned;
    printAdRevenue(sUser_struct);
    return 0;
    }

    It builds and runs as far as the call to printAdRevenue then just prints ‘(lldb)’ in blue. I’m using XCode.

  • Zidane

    //This is how I did it. Please comment ;)

    #include
    using namespace std;

    struct Adverts
    {
    unsigned short nAdsShown;
    float fClickRate;
    float fAveEarnPerClick;
    };

    Adverts GetAdsData()
    {
    Adverts Ads;
    cout<>Ads.nAdsShown;
    cout<>Ads.fClickRate;
    cout<>Ads.fAveEarnPerClick;
    return Ads;
    }

    void PrintAdsResult(Adverts Ads)
    {
    cout<<"Total of adverts shown:\t\t"<<Ads.nAdsShown<<endl;
    cout<<"Click through rate:\t\t"<<Ads.fClickRate<<endl;
    cout<<"Average earnings per click:\t"<<Ads.fAveEarnPerClick<<endl;
    cout<<"Total earnings for the day:\t$"<<Ads.nAdsShown * Ads.fClickRate * Ads.fAveEarnPerClick<<endl;
    }

    int main()
    {
    PrintAdsResult(GetAdsData());
    return 0;

    }

  • Zidane

    Ofcourse, what you see may sometimes not make sense for WordPress omits many fractions of words such as for example cin, iostrea(m), etc. But you get the idea.

  • Zidane

    #include
    using namespace std;

    struct Fraction
    {
    unsigned short nNumerator;
    unsigned short nDenominator;
    };

    Fraction GetFractionData()
    {
    Fraction Fra;
    static int c=1; // ‘c’ is a Fraction Identifier
    cout<<"Fraction "<<c++<<endl;
    cout<>Fra.nNumerator;
    cout<>Fra.nDenominator;

    return Fra;
    }

    void PrintMultiplyFractions(Fraction x, Fraction y)
    {
    cout<<x.nNumerator<<"/"<<x.nDenominator<<
    " * "<<
    y.nNumerator<<"/"<<y.nDenominator<<
    " = "<<
    (static_cast(x.nNumerator * y.nNumerator)/(x.nDenominator * y.nDenominator))<<
    endl;
    }

    int main()
    {
    PrintMultiplyFractions(GetFractionData(),GetFractionData());
    return 0;

    }

  • Arthur_

    Why do you (for the second question) declare the numerator and denominators as integers when you know you are going to need them as floats later? Wouldn’t it be more logical to declare them as floats or longs and then you don’t have to static_cast them later?

  • Leolas

    Hi, this is my code for the question 2; i made it slightly different, so i would like to your opinions/corrections :) . However, i forget the cast for the float, so i think that my code is doing integer division :s, well, i would very appreciate your advices or something :)

    #include
    using namespace std;

    struct Fraction
    {
    int nNumerator1;
    int nDenominator1;
    int nNumerator2;
    int nDenominator2;
    };

    void Multiply(Fraction Elements)
    {
    cout << "The product of the two fractions is: " << Elements.nNumerator1 / Elements.nDenominator1 * Elements.nNumerator2 / Elements.nDenominator2;
    }

    int main()
    {
    Fraction Elements;
    cout <> Elements.nNumerator1;
    cout <> Elements.nDenominator1;
    cout <> Elements.nNumerator2;
    cout <> Elements.nDenominator2;

    Multiply(Elements);
    return 0;
    }

  • LLoydR

    Hello.

    I have done the second part of the test and it works fine. I just have a question. I will add my code first:


    STRUCTFUNCTIONS.H

    #ifndef STRUCTFUNCTIONS_H
    #define STRUCTFUNCTIONS_H

    struct Fractions
    {
    int nNumerator;
    int nDenominator;
    };

    #endif


    STRUCTFUNCTIONS.CPP

    #include "stdafx.h"
    #include "stuctFunctions.h"
    #include
    using namespace std;

    void MultiplyFractions (Fractions sFraction1, Fractions sFraction2)
    {
    cout << "Your total value is: " <<
    static_cast (sFraction1.nNumerator * sFraction1.nDenominator)
    / (sFraction2.nNumerator * sFraction2.nNumerator) << endl;

    }


    STRUCTTESTP4.CPP

    #include "stdafx.h"
    #include "stuctFunctions.h"
    #include
    using namespace std;

    void MultiplyFractions (Fractions sFraction1, Fractions sFraction2);

    int main()
    {
    Fractions sFraction1;
    cout << "Insert the first numerator Number: " <> sFraction1.nNumerator;
    cout << "Insert the first Denominator Number: " <> sFraction1.nDenominator;

    Fractions sFraction2;
    cout << "Insert the second numerator Number: " <> sFraction2.nNumerator;
    cout << "Insert the second Denominator Number: " <> sFraction2.nDenominator;

    MultiplyFractions(sFraction1, sFraction2);

    return 0;
    }

    my question is: is there anyway that I can call my struct in a different .cpp file instead of having it in a .h file?

    I know that it would be a lot better to have it in a .h file, but I am just being curious, lol.

  • Amorbust

    Currently my code is working fine, but I am not sure how to get the “Press any key to continue” line to be on the line after my end result.
    I must just be missing something stupid and small!

    #include “stdafx.h”
    #include

    struct Fraction
    {
    int Numerator;
    int Deniminator;
    };
    void Multiply(Fraction Fa, Fraction Fb)
    {
    using namespace std;

    cout << static_cast(Fa.Numerator * Fa.Deniminator) /
    (Fb.Numerator * Fb.Deniminator);
    }
    int main()
    {
    using namespace std;
    Fraction Fa;
    cout << "What is the numerator on fraction A? " <> Fa.Numerator;
    cout << "What is the denominator on fraction A?" <> Fa.Deniminator;

    Fraction Fb;
    cout << "What is the numerator on fraction A? " <> Fb.Numerator;
    cout << "What is the denominator on fraction A?" <> Fb.Deniminator;

    Multiply(Fa, Fb);
    ;

    return 0;
    }

  • Edward

    I managed to get my solution to question 2 correct. Initially though I had this code inside my multiply function.

    cout << static_cast((sF1.numerator)/(sF1.denominator))*((sF2.numerator)/(sF2.denominator));

    The program ran and compiled fine but performed integer division when I entered 1/5 * 1/1 in order to test the program, giving an answer of 0 instead of 0.2.

    When I re-ordered that line of code to

    cout << static_cast((sF1.numerator)*(sF2.numerator))/((sF1.denominator)*(sF2.denominator));

    the program works fine and performs the division properly, giving the correct answer (0.2).

    Why is this, to me the functions perform the same operations, am I missing something obvious?

  • Ty Ler

    yes its because your dividing with intergers. When you use 1/5 you will get 0 and with 1/1 you get 1 then when it was multiplied it gave 0. Add .0 for one of the fractions then it will work. 1.05 or 15.0 will give you a fraction. And if your wondering why the second way worked its because in your first way the division took place before the casting could change it so when in your second attempt you had division become the last step. If that makes any sence if not ill explain if you reply

  • Sind

    Can C++ structures include functions inside structure declaration?

  • Janez

    Why is struct Employee declaration (and thus allocates no memory before declaration of a var of type Employee), but enum Color is definition (beginning of chapter 4.5) (also doesn’t allocate memory before var declaration of that type)?

  • Josh

    I'm having a bit of trouble with this.

    Stats sVortex = {0, 0, 0, 0, 0};

    i've typed this in, making sure to set sVortext to struct Stats (yes, i have already declared Stats as a struct in my header). This doesn't bring up any problems/compiler errors. However, once I try to reference it: Stats.sVortex.nDex; it says that: class "Stats" has no member "sVortex". No matter what I do, nothing seems to fix it.

    Please help,
    -Josh

  • Adi

    Struct in c++?

    Aren't we supposed to be using Classes.  Doesn't Class supercede Struct?

  • Kevin

    I completed question 2 slightly differently, it works fine and gives the correct results. Have I done anything that would be considered bad practice or is this OK?  

    [#include "stdafx.h"
    #include <iostream>

    struct FRACTION
    {
        int numer_one;
        int numer_two;
        int denom_one;
        int denom_two;
    };

    void fractionMultiplied(FRACTION fraction)
    {
        using namespace std;
        // fraction multiplication
        float numer_sum = fraction.numer_one * fraction.numer_two;
        float denom_sum = fraction.denom_one * fraction.denom_two;
        float decemal_output = numer_sum / denom_sum;

        cout << "The decimal value of the sum of both of your fractions is: " << decemal_output;
    }

    int main()
    {
        using namespace std;
        FRACTION fraction;
        
        cout << "Enter two fractions to have them multiplied together:" << endl;
        // get fraction numerators and denominators
        cin >> fraction.numer_one;

        cout << " / ";

        cin >> fraction.denom_one;

        cout << " nAnd the other: n";

        cin >> fraction.numer_two;

        cout << " / ";

        cin >> fraction.denom_two;
        // call a function to output the sum of both fractions
        fractionMultiplied(fraction);

        return 0;

    }

    /* END OF PROGRAMME */]

  • Jeremy

    Are structure types generally defined outside all blocks (like a global variable)? This is the only thing I can’t seem to find an answer to. You obviously can declare them in blocks or functions, but is that bad style?

Leave a Comment (Note: put C++ code inside [code][/code] brackets)

  

  

  

seventeen + 10 =

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">