练习10-1
编写函数adjust point,如果n指向的值小于0,就将其改为0;如果值大于100,就将其改为100(如果是0~100的值,则不修改)。
void adjust point(int n){/…*/}
#include <stdio.h>
void adjust_point(int *n) {
if (*n > 100)
*n = 100;
else if (*n < 0)
*n = 0;
}
int main(void) {
int n = 150;
printf("%d\n", n);
adjust_point(&n);
printf("%d\n", n);
return 0;
}
练习10-2
编写如下函数,将y年m月*d日的日期,修改为其前一天或后一天的日期。
void decrement date (int *y, int m,int d)(/…/ )
void increment date (int * y,int m, int d){/…/)
注意计算时要考虑到闰年的问题。
#include <stdio.h>
#include "my_util.h"
// 判断是否是闰年的宏函数
#define is_leap_year(year) (((year) % 4 == 0 && (year) % 100 != 0) || ((year) % 400 == 0))
// 返回当月天数(未进行闰年判断)
int days_of_the_month(int month) {
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
return 31;
case 2:
return 28;
default:
return 30;
}
}
void decrement_date(int *year, int *month, int *day) {
// 除了1号其他日期只需要减1
if (*day != 1) {
--*day;
return;
}
// 处理其他情况
switch (*month) {
case 1:
--*year;
*month = 12;
*day = 31;
break;
case 3:
*day = is_leap_year(*year) ? 29 : 28;
*month -= 1;
break;
default:
*day = days_of_the_month(--*month);
}
}
void increment_date(int *year, int *month, int *day) {
// 注意小于等于跳过处理闰年29号的情况
if (*day <= days_of_the_month(*month)) {
++*day;
return;
}
// 处理其他情况
switch (*month) {
case 12:
++*year;
*month = *day = 1;
break;
case 2:
if (*day == 29 || !is_leap_year(*year)) {
*month = 3;
*day = 1;
}
break;
default:
++*month;
*day = 1;
}
}
// 方便显示日期
void print_date(int year, int month, int day) {
println("现在是%4d年%02d月%02d日。", year, month, day);
}
int main(void) {
int year = 2004, month = 3, day = 1;
print_date(year, month, day);
decrement_date(&year, &month, &day);
print_date(year, month, day);
decrement_date(&year, &month, &day);
print_date(year, month, day);
increment_date(&year, &month, &day);
print_date(year, month, day);
increment_date(&year, &month, &day);
print_date(year, month, day);
increment_date(&year, &month, &day);
print_date(year, month, day);
return 0;
}
练习10-3
编写如下函数,将nl、n2、n3指向的三个int型整数按升序排列。
void sort3(int *n1, int n2,int n3){/…/}
#include <stdio.h>
void swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
void sort3(int *n1, int *n2, int *n3) {
if (*n1 > *n2) swap(n1, n2);
if (*n2 > *n3) swap(n2, n3);
if (*n1 > *n2) swap(n1, n2);
}
int main(void) {
int a = 3, b = 2, c = 1;
printf("%d %d %d\n", a, b, c);
sort3(&a, &b, &c);
printf("%d %d %d\n", a, b, c);
return 0;
}
练习10-4
编写如下set idx函数,接收元素类型为int型、元素个数为n的数组,并为所有元素赋上和下标相同的值。
void set idx (int v,int n){/…*/}
#include <stdio.h>
void set_idx(int *v, int n) {
while (--n >= 0)
v[n] = n;
}
int main(void) {
int v[20];
set_idx(v, 20);
for (int i = 0; i < 20; ++i)
printf("%d ", v[i]);
putchar('\n');
return 0;
}
练习10-5
如果用ary set (&a[2],2,99)调用代码清单10-11中的ary set函数会怎样呢?请试着执行一下并探讨其结果。
#include <stdio.h>
void ary_set(int v[], int n, int val) {
int i;
for (i = 0; i < n; ++i)
v[i] = val;
}
int main(void) {
int a[] = {1, 2, 3, 4, 5};
ary_set(&a[2], 2, 99);
for (int i = 0; i < 5; ++i)
printf("%d ", a[i]);
putchar('\n');
return 0;
}