1. 输出以下代码的输出结果 #include <stdio.h> #define N 5 int* func(int* x, int* y) { static int t = 0; if (*x < *y) { t += *x; printf("%d/n", t); return x; } else { t += *y; printf("%d/n", t); return x; } } int main() { int i; int x = 3; int*p, *q, *r; q = &x; for (i = 1; i <= N; i++ ) { p = &i; r = func(p, q); } // i跳出循环时的值为6 printf("%d, %d, %d/n", *p, *q, *r); return 0; } 2. #include <stdio.h> /* 法国数学家梅齐亚克在他著名的《数字组合游戏》(1962)中提出了一个问题: 一位商人有一个重40磅的砝码,一天不小心将砝码摔成了四块。后来商人称得每块的重量都是整磅数,而且发现这四块碎片 可以在天平上称1至40磅之间的任意重量。请问这四块碎片各重多少? --- 问题分析与算法设计 题目中给出的条件是“在天平上”,这意味着:同一砝码既可以放在天平的左侧,也可以放在天平的右侧。 若规定重物只能放在天平的左侧,则当天平平衡时有:重物重量+左侧砝码重量总和=右侧砝码重量总和 由此可得:重物重量 = 右侧砝码重量总和 - 左侧砝码重量总和 编程时只要根据以上公式,使“右侧砝码重量总和-左侧砝码重量总和”可以表示1到40之间的全部重量即可。 编程中要注意的是:怎样采用一种简单的方法来表示一个砝码是在天平的左侧还是在天平的右侧,或是根本没有使用。 以下程序采用1、 -1和0分别表示上述三种情况,请注意理解。 */ int const maxWt = 40; // 最大的重量 int const num = 4; // 四块砝码 int d[num]; // 砝码的位置(左、右、没用,分别为-1, 1, 0) /*重物放在天平左边,重物的重量 = 右端砝码 + (-1)* 左端砝码 + 0 * 没用到的砝码*/ bool test(int w[]); void func(int w[]) { // for (w[0] = 1; w[0] < maxWt; ++w[0] ) { for (w[1] = w[0]+1; w[1] < maxWt; ++w[1] ) { for (w[2] = w[1] + 1; w[2] < maxWt; ++w[2]) { if (w[3] = maxWt - w[0] - w[1] - w[2], w[3] >= w[2]) { // 进行测试,能不能计算所有从1-40的重量 bool flag = test(w); if (flag) { return; } } } } } } bool test(int w[]) { bool flag = false; for (int x = 1; x <= maxWt; ++x ) { flag = false; for (d[0] = -1; d[0] < 2 && !flag; ++d[0]) { for (d[1] = -1; d[1] < 2 && !flag; ++d[1]) { for (d[2] = -1; d[2] < 2 && !flag; ++d[2]) { for (d[3] = -1; d[3] < 2 && !flag; ++d[3]) { if (x == d[0] * w[0] + d[1] * w[1] + d[2] * w[2] + d[3] * w[3]) { flag = true; } } } } } if (flag == false) { break; } } return flag; } int main() { int w[num]; // 砝码的重量 func(w); for (int index = 0; index < num; ++index) { printf("%d/t", w[index]); } printf("/n"); return 0; } 3. 后缀表达式 不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:2 1 + 3 *,即(2 + 1) * 3