北京交通大学c语言课件复习题讲解_1
* 共循环了多少次? 完整程序1:一层for循环(利用自定义函数) #include int sq(int n) {int m,f=0; for (m = 1; m * m <= n; m++) if (m * m == n) f=1; return f; } int main() { int m, n; for(n=1; n <= 200; n++) if(sq(n)) printf("%d ", n); printf("\n"); return 0; } 函数定义 函数调用 * 完整程序2:两重for循环(只有主函数) #include int main() { int m, n; for(n=1; n <= 200; n++) for (m = 1; m * m <= n; m++) if (m * m == n) printf("%d ", n); printf("\n"); return 0; } 内层循环结束的两种情况: 1,找到m使m*m==n(n是完全平方数) 2,试探了所有可能,但都不成功(n不是) 共循环了多少次? * 具有累计循环次数功能的完整程序: #include int main () { int m, n, count = 0; for (n = 1; n <= 200; n++) for (m = 1; m * m <= n; m++) { count++; if (m * m == n) printf("%d ", n); } printf(“%d\n“, count); return 0; } 共循环了1799次 * 方法二:需要打印的一定是从1开始连续几个整数的平方,可从1开始打印到平方大于200为止。 for (n = 1; n * n <= 200; ++n) printf("%d ", n * n); /*注意打印什么*/ 方法一产生所有备选数据(1到200的整数),检查排除不合格的。生成与检查是解决问题的常用方法。 方法二是针对具体问题的特定方法。 * #include int main() { int termn, n; for (n = 1,termn = 1;termn <= 200; n++) { printf("%4d",termn); termn += 2*n+1; } return 0; } 方法三:还可以考虑利用递推公式求平方数程序: * 例2,艰难旅程(浮点误差)。乌龟要去环球。第1秒爬1米,第2秒爬1/2米,第3秒爬1/3米,第4秒爬1/4米,…。问一小时能爬出多远?爬20米需多少秒? 一小时能爬多远算法: 1.d(距离,实数); s(时间,整数); 2. d=0.0;s=1; 3. d=d+1/(实数)s; s=s+1; 4.如果s<=3600,转3; 5.否则,输出d; 爬20m需多少秒算法: d(距离,实数); s(时间,整数); d=0.0,s=1; d=d+1/(实数)s;s=s+1; 如果d<20.0,转3; 否则,输出s-1; 根据数学,乌龟能完成环球,可以爬得任意远。 这里想比较float和double的计算误差情况。 s-1? * n秒能爬x米的函数float distfun(long n) float distfun(long n) { long i; float x = 0.0; for (i = 1; i <= n; ++i) x += 1/(float)i; return x; } 例2,艰难旅程(浮点误差)。乌龟要去环球。第1秒爬1米,第2秒爬1/2米,第3秒爬1/3米,第4秒爬1/4米,…。问一小时能爬出多远?爬20米需多少秒? * 例2,艰难旅程(浮点误差)。乌龟要去环球。第1秒爬1米,第2秒爬1/2米,第3秒爬1/3米,第4秒爬1/4米,…。问一小时能爬出多远?爬20米需多少秒? 20米需要多少时间。写出下面函数: long scndsfun(float d) /*d为爬行距离*/ { long i; float x = 0.0; for (i = 1; x < d; ++i) x += 1/(float)i; return i - 1; } d=20 * 写下面语句,执行时总也不输出: printf("%lds, %fm\n",scndsfun(20.),20.); 修