# Thread: New to C Programming - College Course (first assignment)

1. ## New to C Programming - College Course (first assignment)

Hi all,

I'm new to programming and so naturally am new to the C programming language. I'm taking a college course (Intro to C Programming) and am working through my first assignment. I thought I had a good handle on what was being taught and feel for the most part that that is true. However, in this assignment I've clearly misunderstood something fundamental in regard to if statements.

Here are the instructions from my professor:
"Write a program that asks the user to enter an object's weight in pounds and to select the name of a planet from a menu. The program then outputs how much the object would weigh on that planet."

Here's my code so far:

Code:
```#include <stdio.h>

int main()
{
float objectWeight; //declare the variable for the object's weight
int planet; //declare the variable for the planet number

printf("Enter an object's weight in pounds.\n");
scanf_s("%f", &objectWeight); //read the value from the end user

//Print the below menu to the screen
printf("\n");
printf("Please choose from the following menu one of the bodies found in our solar\n");
printf("system by entering it's corresponding number (using 1 through 10).\n");
printf("1. Mercury\n");
printf("2. Venus\n");
printf("3. Earth\n");
printf("4. Earth's Moon\n");
printf("5. Mars\n");
printf("6. Jupiter\n");
printf("7. Saturn\n");
printf("8. Uranus\n");
printf("9. Neptune\n");
printf("10. Pluto\n\n");

scanf_s("%d", &planet); //read the planet number from the user
printf("\n");

//Start of the if statements that will assign the multiplier for the objectWeight based on the planet selected
if (planet = 1) {
printf("The weight of this object on the planet Mercury is %f.\n", objectWeight * 0.4155);
}
if (planet = 2) {
printf("The weight of this object on the planet Venus is %f.\n", objectWeight * 0.8975);
}
if (planet = 3) {
printf("The weight of this object on the planet Earth is %f.\n", objectWeight * 1.0);
}
if (planet = 4) {
printf("The weight of this object on the the Earth's moon is %f.\n", objectWeight * 0.166);
}
if (planet = 5) {
printf("The weight of this object on the planet Mars is %f.\n", objectWeight * 0.3507);
}
if (planet = 6) {
printf("The weight of this object on the planet Jupiter is %f.\n", objectWeight * 2.5374);
}
if (planet = 7) {
printf("The weight of this object on the planet Saturn is %f.\n", objectWeight * 1.0677);
}
if (planet = 8) {
printf("The weight of this object on the planet Uranus is %f.\n", objectWeight * 0.8947);
}
if (planet = 9) {
printf("The weight of this object on the planet Neptune is %f.\n", objectWeight * 1.1794);
}
if (planet = 10) {
printf("The weight of this object on the planet Pluto is %f.\n", objectWeight * 0.0899);
}

return 0;
}```
For example, if the user enters a weight of 100 pounds, and then selects the planet Saturn, the program should output a weight of 106.77 pounds (100 * 1.0677).

What I was hoping to see is a single line returned that showed the printf statement that corresponded to the number of the planet and then the new object weight. Instead I'm getting all 10 lines returned that have performed the right calculation but I was expecting to see just 1 line so I'm not sure where I've gone wrong.

Is the error in my if statement/s?

Here's what the program looks like when it executes.  2. Do you realize that there is a difference between the comparison operator== and the assignment operator=? You appear to be using the assignment operator in places where the comparison operator would be more appropriate, assignments always evaluate to true.

Also you may want to consider using a switch statement.

Jim 3. Originally Posted by jimblumberg Do you realize that there is a difference between the comparison operator== and the assignment operator=? You appear to be using the assignment operator in places where the comparison operator would be more appropriate, assignments always evaluate to true.

Also you may want to consider using a switch statement.

Jim
This was exactly what I was overlooking. When I replace all the assignment operators with comparison operators the program returns just the one line that corresponds to the entry from the end user. Thank you very much for you help.  4. I'd write it like this:
Code:
```#include <stdio.h>

int main()
{
float objectWeight; //declare the variable for the object's weight
int planet; //declare the variable for the planet number

printf("Enter an object's weight in pounds.\n");
//scanf_s("%f", &objectWeight); //read the value from the end user
scanf("%f", &objectWeight); //read the value from the end user

//Print the below menu to the screen
printf("\n"
"Please choose from the following menu one of the bodies found in our solar\n"
"system by entering it's corresponding number (using 1 through 10).\n"
"1. Mercury\n"
"2. Venus\n"
"3. Earth\n"
"4. Earth's Moon\n"
"5. Mars\n"
"6. Jupiter\n"
"7. Saturn\n"
"8. Uranus\n"
"9. Neptune\n"
"10. Pluto\n\n");

// scanf_s("%d", &planet); //read the planet number from the user
scanf("%d", &planet); //read the planet number from the user
printf("\n");

switch(planet)
{

case 1:
printf("The weight of this object on the planet Mercury is %f.\n", objectWeight * 0.4155);
break;
case 2:
printf("The weight of this object on the planet Venus is %f.\n", objectWeight * 0.8975);
break;
case 3:
printf("The weight of this object on the planet Earth is %f.\n", objectWeight * 1.0);
break;
case 4:
printf("The weight of this object on the the Earth's moon is %f.\n", objectWeight * 0.166);
break;
case 5:
printf("The weight of this object on the planet Mars is %f.\n", objectWeight * 0.3507);
break;
case 6:
printf("The weight of this object on the planet Jupiter is %f.\n", objectWeight * 2.5374);
break;
case 7:
printf("The weight of this object on the planet Saturn is %f.\n", objectWeight * 1.0677);
break;
case 8:
printf("The weight of this object on the planet Uranus is %f.\n", objectWeight * 0.8947);
break;
case 9:
printf("The weight of this object on the planet Neptune is %f.\n", objectWeight * 1.1794);
break;
case 10:
printf("The weight of this object on the planet Pluto is %f.\n", objectWeight * 0.0899);
break;
default:
break;
}

return 0;
}```
I used scanf instead of scanf_s to comply with Linux C gcc my system, and limited knowledge of what I am doing.
out put is this:
Code:
```userx@~/bin <> ./a.out
Enter an object's weight in pounds.
10

Please choose from the following menu one of the bodies found in our solar
system by entering it's corresponding number (using 1 through 10).
1. Mercury
2. Venus
3. Earth
4. Earth's Moon
5. Mars
6. Jupiter
7. Saturn
8. Uranus
9. Neptune
10. Pluto

2

The weight of this object on the planet Venus is 8.975000.
userx@~/bin <>```
For your if statements along with that = vs == you might want to try ' if else if else block '

if you by chance use that, you can just tell him if he asks how do you know how that works?

just maybe say something like, it works off an int value. gezzzz 5. Message to PhantomJoe: Don't use other people's code unless you understand how it works, professors can easily spot the cheaters by asking some questions about the program they supposedly wrote.

That said, as long as we propose improvements, I would go for an array to hold all the different planet values, and index it with the value the user gives. I'm not going for efficiency, I genuinely think this implementation is easier to read and to be understood, as well as easily modifiable:
Code:
```#include <stdio.h>

int main()
{
float objectWeight; //declare the variable for the object's weight
int planet; //declare the variable for the planet number
int i;

const char* planetNames[] = {
"Mercury", "Venus", "Earth", "Earth's Moon", "Mars",
"Jupiter", "Saturn", "Uranus", "Neptune", "Pluto"
};
const double planetRatios[] = {
0.4155, 0.8975, 1.0, 0.166, 0.3507,
2.5374, 1.0677, 0.8947, 1.1794, 0.0899
};

printf("Enter an object's weight in pounds.\n");
scanf("%f", &objectWeight); //read the value from the end user

//Print the below menu to the screen
printf("\n"
"Please choose from the following menu one of the bodies found in our solar\n"
"system by entering it's corresponding number.\n");

// Print all available planets
for (i = 0; i < sizeof(planetRatios)/sizeof(planetRatios); ++i) {
printf("%d. %s\n", i+1, planetNames[i]);
}
putchar('\n');

scanf("%d", &planet); //read the planet number from the user
printf("\n");

if (planet > 0 && planet <= sizeof(planetRatios)/sizeof(planetRatios)) {
printf("The weight of this object on %s is %f.\n", planetNames[planet-1], objectWeight * planetRatios[planet-1]);
}

return 0;
}``` 6. Originally Posted by GReaper Message to PhantomJoe: Don't use other people's code unless you understand how it works, professors can easily spot the cheaters by asking some questions about the program they supposedly wrote.

That said, as long as we propose improvements, I would go for an array to hold all the different planet values, and index it with the value the user gives. I'm not going for efficiency, I genuinely think this implementation is easier to read and to be understood, as well as easily modifiable:
Code:
```#include <stdio.h>

int main()
{
float objectWeight; //declare the variable for the object's weight
int planet; //declare the variable for the planet number
int i;

const char* planetNames[] = {
"Mercury", "Venus", "Earth", "Earth's Moon", "Mars",
"Jupiter", "Saturn", "Uranus", "Neptune", "Pluto"
};
const double planetRatios[] = {
0.4155, 0.8975, 1.0, 0.166, 0.3507,
2.5374, 1.0677, 0.8947, 1.1794, 0.0899
};

printf("Enter an object's weight in pounds.\n");
scanf("%f", &objectWeight); //read the value from the end user

//Print the below menu to the screen
printf("\n"
"Please choose from the following menu one of the bodies found in our solar\n"
"system by entering it's corresponding number.\n");

// Print all available planets
for (i = 0; i < sizeof(planetRatios)/sizeof(planetRatios); ++i) {
printf("%d. %s\n", i+1 , planetNames[i]);
}
putchar('\n');

scanf("%d", &planet); //read the planet number from the user
printf("\n");

if (planet > 0 && planet <= sizeof(planetRatios)/sizeof(planetRatios)) {
printf("The weight of this object on %s is %f.\n", planetNames[planet-1], objectWeight * planetRatios[planet-1]);
}

return 0;
}```
question before even running this, why dived the two if you're just printing out that first array size 10 - zero based. would not this also work?
Code:
``` for (i = 1; i < sizeof(planetNames); ++i) {
printf("%d. %s\n", i , planetNames[i]);

}```
that would run it up 0 thru 9 = 10 then stop right? or do they both have to be used in tandem to get the names out of the planetNames array?
because i+1 is printing the numbers, and then the array names.

just wondering.

and yeah OP read up on switch first if you use that one

mod:
don't fully understand it yet, but this is what I got after blowing it up.
Code:
```        printf ( "  sizeof(planetRatios)/sizeof(planetRatios) %lu \n",  (sizeof(planetRatios)/sizeof(planetRatios) )  );
sizeof(planetRatios)/sizeof(planetRatios) 10

printf("sizeof(planetRatios) %lu \n",  (sizeof(planetRatios) ) );
sizeof(planetRatios) 80

printf ( " sizeof(planetRatios) %lu \n", sizeof(planetRatios)  );
sizeof(planetRatios) 8

printf("sizeof(planetNames) %lu \n", sizeof(planetNames ) );
sizeof(planetNames) 80```
80 / 8 = 10

where would I read up on that? as adding one more results with the array = 8 and that array = 88

never mind:
To determine the size of your array in bytes, you can use the sizeof
operator: int a; int n = sizeof(a); On my computer, ints are 4 bytes
long, so n is 68. To determine the number of elements in the array, we
can divide the total size of the array by the size of the array
element. 7. Originally Posted by userxbw question before even running this, why dived the two if you're just printing out that first array size 10 - zero based.
By coding it like this you only need to add, change or remove elements from planetNames and planetRatios, leaving everything else exactly the same. Originally Posted by userxbw would not this also work?
That wouldn't work because sizeof returns the size in bytes, not the amount of elements. That is why I divide by the size of its first element. 8. Originally Posted by GReaper By coding it like this you only need to add, change or remove elements from planetNames and planetRatios, leaving everything else exactly the same.

That wouldn't work because sizeof returns the size in bytes, not the amount of elements. That is why I divide by the size of its first element.
yes that part I know they both are working together, that sizeof I didn't have a full understanding of, I never read up on it, until just now, due to what you did. I just thought it returned the sizeof being the number of elements used, not bytes as I posted in a mod, and you stated.

I understand the rest of it, that one ( sizeof ) caught me, now I know more! thanks for sharing that code.

that saves a lot of typing. Popular pages Recent additions #### Tags for this Thread

object, objectweight, planet, printfthe, weight 