C program, struct and functions help

  • Thread starter Thread starter jam12
  • Start date Start date
  • Tags Tags
    Functions Program
Click For Summary
SUMMARY

The discussion focuses on writing a C function, float estM(Planet *body);, to calculate the value of radius^3/period^2 for the planet Earth using a structure to hold planetary data. The initial implementation resulted in a -NaN error due to the use of an uninitialized Earth structure. The solution provided involves directly using the plist[2] array element for Earth, along with the corrected function definition that utilizes pointer notation for accessing structure members.

PREREQUISITES
  • Understanding of C programming language
  • Familiarity with structures in C
  • Knowledge of pointer usage in C
  • Basic mathematical functions in C, specifically pow()
NEXT STEPS
  • Learn about C structures and their memory management
  • Explore pointer arithmetic and its applications in C
  • Study the use of mathematical functions in C, including math.h
  • Investigate debugging techniques for identifying and resolving NaN errors in C programs
USEFUL FOR

C programmers, software developers working with scientific calculations, and students learning about data structures and pointers in C.

jam12
Messages
37
Reaction score
0
Hello, i want to write a function in the form of "float estM( Planet *body);" to calculate radius^3/period^2 for the planet earth, where i have an array of values for radius and period of different planets.
Here is the program so far, i am getting a -NaN error:

#include <stdio.h>
#include <math.h>

typedef struct pt {
char *name;
float period; /* orbital period in years */
float radius; /* orbital radius in ast units */
} Planet;

main() {

float estM( Planet *body); /* Have been told that the function is of this form to calculate radius^3/period^2 for earth*/

Planet Earth;
Planet plist[6];
int n, i;
Planet *body;
body=&Earth;

char nameMe[]="Mercury", nameV[]="Venus", nameE[]="Earth", nameMa[]="Mars", nameJ[]="Jupiter", nameS[]="Saturn";


plist[0].name = nameMe;
plist[0].period = 0.241;
plist[0].radius = 0.387;

plist[1].name = nameV;
plist[1].period = 0.615;
plist[1].radius = 0.723;

plist[2].name = nameE; /*Here is info for Earth */
plist[2].period = 1.0;
plist[2].radius = 1.0;

plist[3].name = nameMa;
plist[3].period = 1.881;
plist[3].radius = 1.524;

plist[4].name = nameJ;
plist[4].period = 11.86;
plist[4].radius = 5.203;

plist[5].name = nameS;
plist[5].period = 29.46;
plist[5].radius = 9.540;


n=6;
printf("Planet name\t period\t radius\n");

for (i=0;i<n;i++) {

printf("%s\t\t %.3f\t %.3f\n",plist.name, plist.period, plist.radius);

}

printf("%f\n",estM(body)); /* I want to calculate radius^3/period^2 for Earth */


}

float estM( Planet *body) { /*function to caculate radius^3/period^2 for Earth */

float m;
Planet Earth;
body=&Earth;
m=pow((*body).radius,3)/pow((*body).period,2);
return m;
}
 
Technology news on Phys.org
jam12 said:
Hello, i want to write a function in the form of "float estM( Planet *body);" to calculate radius^3/period^2 for the planet earth, where i have an array of values for radius and period of different planets.
Here is the program so far, i am getting a -NaN error:

Code:
float estM( Planet *body) {		/*function to caculate radius^3/period^2 for Earth */

float m;
Planet Earth;
body=&Earth;
m=pow((*body).radius,3)/pow((*body).period,2);
return m;
}

Looks like you accidentally left a non-initialized Earth structure in which you point the body pointer to (non-initialized floating point numbers are very likely to give a NaN). You should probably leave out the Earth variable, like

Code:
float estM( Planet *body) {		/*function to caculate radius^3/period^2 for Earth */
  return pow(body->radius,3)/pow(body->period,2);
}

where I have also replaced the (*pointer).member notation with pointer->member. You should then call this function with something sensible, like

Code:
printf("%f\n",estM(plist[2])); /* I want to calculate radius^3/period^2 for Earth */

Note, that in your code, the Earth variable in main is again non-initialized and will contain garbage, so either use plist[2] directly to refer to the values for Earth (as I did in the above snippet), or declare, say, Earth as "Planet *earth = plist[2];" after the plist declaration and then use "estM(earth)" later. If you want to call estM in your loop you will probably want to call with "estM(plist)".
 
Thanks just did it now, the code i used is:
in main:

Planet plist[6];
Planet *earth;
int n, i;
earth=&plist[2];

Here i didnt know that i could use a pointer to point to a member in the array, but it makes sense since all the members in the array are of type Planet.

then my function definition is just:

float estM( Planet *body) { /*function to caculate radius^3/period^2 for Earth */

return pow(body->radius,3)/pow(body->period,2);
}

Thanks again
 

Similar threads

  • · Replies 2 ·
Replies
2
Views
2K
Replies
7
Views
2K
  • · Replies 89 ·
3
Replies
89
Views
6K
  • · Replies 75 ·
3
Replies
75
Views
7K
  • · Replies 2 ·
Replies
2
Views
1K
  • · Replies 11 ·
Replies
11
Views
2K
  • · Replies 5 ·
Replies
5
Views
4K
  • · Replies 36 ·
2
Replies
36
Views
5K
  • · Replies 21 ·
Replies
21
Views
9K
Replies
3
Views
2K