Solution to question 11
#include <stdio.h>
int numOdds(int i, int j) {
int tmp;
// Swap i and j if necessary to ensure that i <= j.
if (j < i) {
tmp = i; i = j; j = tmp;
}
// Make i the largest odd number <= the original i.
if (i % 2 == 0) i--;
// Make j the smallest odd number >= the original j.
if (j % 2 == 0) j++;
// Allow for the special case that the original i and j were equal and odd.
if (i == j) j += 2;
// Finally, calculate the result.
return (j - i)/2 - 1;
}
int main(void) {
printf("%d %d %d\n", 3, 7, numOdds(3,7));
printf("%d %d %d\n", 2, 4, numOdds(2,4));
printf("%d %d %d\n", 4, 2, numOdds(4,2));
printf("%d %d %d\n", 0,10, numOdds(0,10));
printf("%d %d %d\n",-1, 0, numOdds(-1,0));
printf("%d %d %d\n", 1, 1, numOdds(1,1));
printf("%d %d %d\n", 1,-1, numOdds(1,-1));
printf("%d %d %d\n", 1,-2, numOdds(1,-2));
return 0;
}
Solution to question 12
#include <stdio.h>
#include <assert.h>
typedef struct {
int hour;
int minute;
float second;
} time;
void addTimesAndPrint(time t1, time t2) {
time t;
// Verify that t1 and t2 are valid times.
assert(t1.hour >= 0 &&
t1.hour < 24 &&
t1.minute >= 0 &&
t1.minute < 60 &&
t1.second >= 0.0F &&
t1.second < 60.0F);
assert(t2.hour >= 0 &&
t2.hour < 24 &&
t2.minute >= 0 &&
t2.minute < 60 &&
t2.second >= 0.0F &&
t2.second < 60.0F);
// Now add them, without worrying about overflow.
t.hour = t1.hour + t2.hour;
t.minute = t1.minute + t2.minute;
t.second = t1.second + t2.second;
// Now correct for possible overflows.
if (t.second >= 60.0F) {
t.minute++;
t.second -= 60.0F;
}
if (t.minute >= 60) {
t.hour++;
t.minute -= 60;
}
printf("%02d:%02d:%04.1f\n", t.hour, t.minute,t.second);
}
// A main program to test our function.
int main(void) {
time t1 = {1, 30, 10.0};
time t2 = {2, 30, 51.1};
addTimesAndPrint(t1,t2);
time t3 = {23, 59, 59.9};
time t4 = {23, 59, 59.9};
addTimesAndPrint(t3,t4);
time t5 = {1, 30, 10.0};
time t6 = {-1, 30, 61.0};
addTimesAndPrint(t5,t6);
return 0;
}
Solution to question 13
#include <stdio.h>
char *strcat(char *dest, char *src) {
char *p;
// Start at the first byte of the "dest" string.
p = dest;
// Increment our way through the string until we hit a
// zero (i.e, the terminating null byte).
while (*dest) {
dest++;
}
// Now increment our way through the "src" string, until
// we reach the end of it, copying bytes to "dest" as we go.
while (*src) {
*dest++ = *src++;
}
// Null-terminate the "dest" string.
*dest = 0;
// Return a pointer to the first byte of "dest".
return p;
}
int main(void) {
char dest[100] = "one";
char src[] = "two";
printf("the result is \"%s\"\n", strcat(dest, src));
return 0;
}