实验四 张珂瑜
实验四
(一)task 1
思考:在这个实验中,一元二次方程的根是否能设计成通过函数返回值的方式传递回主函数?
不可以;函数的返回值只有一个,而一元二次方程的解可能会出现两个,这样无法同时传递。但是可以通过指针的方式传递。
(二)task 2
(ex1的源代码)
#include <stdio.h> long long fac(int n); int main() { int i,n; printf("Enter n: "); scanf("%d", &n); for(i=1; i<=n; ++i) printf("%d! = %lld\n", i, fac(i)); return 0; } long long fac(int n) { static long long p = 1; printf("p=%lld\n",p); p = p*n; return p; }
(增加一行代码之后的测试结果截图)
(ex2的源代码)
#include<stdio.h> int func(int, int); int main() { int k=4,m=1,p1,p2; p1 = func(k,m) ; p2 = func(k,m) ; printf("%d,%d\n",p1,p2) ; return 0; } int func(int a,int b) { static int m=0,i=2; i += m+1; m = i+a+b; return (m); }
(理论分析结果)
调用第一次func时,k=4,m=1.这两个数在函数内部对应的是a、b ,即a=4,b=1。在函数内部,m=0,i=2被定义成了静态变量。经过计算,i=i+m+1=3,m=i+a+b=8,返回m的值给p1,即原函数中p1=8.然而由于m和i仅仅是func域内部的静态变量,所以保留上一次运行的结果,m=8,i=3.第二次调用func,a=4,b=1,经过计算,i=i+m+1=12,m=i+a+b=17。函数返回m的值给p2,p2=17.屏幕上会打印出p1,p2的值,所以最终结果为“8 17”。
(实验运行结果)
(总结其一致性)
结果与分析一致。
(三)task 3
(补全后完整程序源代码)
//输出(n,m)之间的所有素数 #include <stdio.h> #define N 1000 int fun(int n,int m,int bb[N]); int main(){ int n=0,m=0,i,k,bb[N-1]; scanf("%d",&n); scanf("%d",&m); for(i=0;i<m-n;i++) bb[i]=0; k=fun(n,m,bb); for(i=0;i<k;i++) printf("%4d",bb[i]); printf("\n"); return 0; } int fun(int n,int m,int bb[N]) { int i,j,k=0,flag; for(j=n;j<=m;j++) { flag=1; for(i=2;i<j;i++) if(j%i==0) { flag=0; break; } if(flag==1) bb[k++]=j; } return k; }
(程序运行测试结果截图)
(四)task 4
*必做
(程序源代码)
//f(n)=2^n-1 #include <stdio.h> long long fun(int n); int main() { int n; long long f; while(scanf("%d", &n) != EOF) { f = fun(n)-1;//其实我通过在这里-1来实现了,也就是说我的函数事实上是求2^n的结果 printf("n = %d, f = %lld\n", n, f); } return 0; } long long fun(int n){// 函数定义 long long ret=1; if (n==1) { ret=2; }else{ ret=2*fun(n-1); } return ret; }// 补足
(程序测试结果截图)
*选做(暂时还不会,留着以后来补)
(算法思路的文字表述)
(程序源代码)
(程序运行结果截图)
(五)task 5
(程序源代码)
#include <stdio.h> void draw(char symbol ,int line); int main(int argc, const char * argv[]) { char symbol; int line; printf("input symbol and line:"); while(scanf(" %c %d",&symbol,&line)!=EOF) { draw(symbol, line); printf("\n"); printf("input symbol and line:"); } return 0; } void draw(char symbol,int line){ int i,t; for (i=1; i<=line; i++) { for(t=line-i;t>0;t--){ printf("\t"); } for (t=0; t<2*i-1; t++) { printf("%c\t",symbol); } printf("\n"); } } //好巧我之前自己写过这个程序,所以就没有用老师的源代码
(程序运行测试结果截图)
(六)实验总结
1.本次实验中踩过的坑:在task3中,我在引用函数时在函数内部写了bb[N],然后给2个warning下标问题和数据类型问题,我改成bb[N-2]后只剩下1个数据类型问题warning,我强制编译,由于mac下的xcode检查严格,编译成功无法运行。提问了一个专业人员之后立马查错,问题在bb[N-2]是一个特定的数字,而bb是一个数组。此处应该引入数组。
2.尚存的问题:在task4中,我利用迭代思想只能在新函数func中实现2^n的迭代,最后的-1只能在main函数中实现。但是老师给的源代码中main函数中不可修改,所以事实上我并没有实现要求。而是强制用我自己的思路编写了程序。