Step 2 of 7
Structs in functions
A struct is a value, like an int. You can pass it to a function, return it from one, and assign one struct to another with =, which copies every member.
#include <stdio.h>
struct Rect {
double w;
double h;
};
double area(struct Rect r) {
return r.w * r.h;
}
struct Rect scaled(struct Rect r, double k) {
r.w *= k;
r.h *= k;
return r;
}
int main(void) {
struct Rect a = {2.0, 3.0};
struct Rect b = scaled(a, 2.0);
printf("%.1f %.1f\n", area(a), area(b));
return 0;
}
6.0 24.0
Copies again
Passing a struct copies it, just like an int. scaled changes its own copy r and returns it; a in main is untouched. That's often exactly what you want for small structs like points or rectangles: functions that take values and return new values are easy to reason about.
For large structs, copying every member on every call costs time, and a function that needs to modify the caller's struct can't do it through a copy. Both problems are solved with pointers, which is the next step.
Guarding a division
A ratio like kills per death needs care when the bottom is 0: dividing an int by zero is undefined behavior and usually crashes, and dividing a double by zero gives infinity (or "not a number" for 0.0 / 0.0). Check for the special case first and return the fallback the task asks for. Remember to convert to double before dividing, or the fraction is lost.
Your task
Write double kd(struct Player p) that returns kills divided by deaths as a double. If deaths is 0, return the kills.
Challenge 2
Write int score(struct Player p) that returns kills * 2 - deaths, but never less than 0.
Challenge 3
Write struct Player better(struct Player a, struct Player b) that returns whichever player has the bigger kills minus deaths. On a tie, return a. A function can return a whole struct.