190 likes | 319 Views
浙 江 广 播 电 视 大 学 计算机应用专业(开放专科). 《 程序设计语言 》 作业 3 分析. 1. 编写函数 inteferPower(base,exponent), 返回 base 的 exponent 次幂 。例如, integerPower(3,4)=3*3*3*3. 假定 exponent 是非 0 整数, base 是一个整数。 用 for 循环控制函数的计算过程,不使用任何数学函数。. 分析: 保证 exponent 非 0 ,返回结果。. int integerPower(int base,int exponent) {int result=1,n;
E N D
浙 江 广 播 电 视 大 学 计算机应用专业(开放专科) 《程序设计语言》作业3分析
1.编写函数inteferPower(base,exponent),返回base的exponent次幂。例如,integerPower(3,4)=3*3*3*3.假定exponent是非0整数,base是一个整数。用for循环控制函数的计算过程,不使用任何数学函数。1.编写函数inteferPower(base,exponent),返回base的exponent次幂。例如,integerPower(3,4)=3*3*3*3.假定exponent是非0整数,base是一个整数。用for循环控制函数的计算过程,不使用任何数学函数。 分析: 保证exponent非0,返回结果。
int integerPower(int base,int exponent) {int result=1,n; while(exponent<0) { printf(“invalid !input again:\n”); scanf(“%d”,&exponent);} for(n=0;n<exponent;n++) result*=base; return result;/*包含exponent为1*/ } main() { int base,exponent; scanf(“%d,%d”,&base,&exponent); printf(“%d”,integerPower(base,exponent)); }
2.编写有两个整数参数的函数multiple,用该函数确定一对整数中的第二个整数是否是第一个整数的整数倍。如果第二个参数是第一个参数的整数倍,函数返回1,否则返回0。把该函数用在程序中,并在程序中输入一系列整数对。2.编写有两个整数参数的函数multiple,用该函数确定一对整数中的第二个整数是否是第一个整数的整数倍。如果第二个参数是第一个参数的整数倍,函数返回1,否则返回0。把该函数用在程序中,并在程序中输入一系列整数对。 分析: 判断 是否整数倍,可通过求余运算实现。
int multiple(int f1,int f2) { if(f2%f1==0) return 1; else return 0; } main() { int first,second; scanf(“%d,%d”,&first,&second); printf(“%d”,multiple(first,second)); }
3. 编写一个函数,绘制正方形,正方形边长由参数side指定,绘制的字符由参数fillCharacter指定,例如:参数side为2,fillCharacer为“*”,则打印出: ** ** 分析: 绘制的行数由side确定(外循环); 每一行绘制的列数由side确定(内循环),绘制的符号由fillCharacter确定。
void draw_square(int side,char fillCharacter) { int i,j; for(i=0;i<side;i++) { for(j=0;j<side;j++) printf(“%c”,fillCharater); printf(“\n”);} } main() { int s,ch; scanf(“%d,%c”,&s,&ch); while(s<0){ printf(“invalid!input again:\n”): scanf(“%d”,&s);} draw_square(s,ch);}
4. 编写一个函数, 确定一个整数是否为素数;将该函数用在程序中,计算并打印出1到1000之间所有的素数。 分析: 素数:仅能被1和自身整除的整数; 整除:若m%n==0,则m能被n整除。 测试所有数(即从2到自身),若都不能被整除则该数为素数;只要有一个能整除则退出测试;
int is_primenumber(int n) { int i; for(i=2;i<n;i++) if(n%i==0) break; if(i==n) return 1; else return 0; }
main() { int k,n=0; for(k=2;k<=1000;k++) if(is_primenumber(k)) { printf(“%d”,k); n++; if(n%5==0) printf(“\n”); } }
/*改进的算法*/ for(i=2;i<n/2;i++) if(n%i==0) break; /*改进的算法*/ for(i=2;i<sqrt(n);i++) if(n%i==0) break;
5. 编写一个模拟投掷硬币程序。每投掷一次硬币,程序都要打印出正面或反面。让程序投掷硬币100次,计算硬币每一面出现的次数并打印结果。程序调用函数flip 模拟硬币投掷,该函数不带参数,在出现反面时返回0,在出现正面时返回1.注:如果程序真实地模拟了硬币投掷,那么出现正面和反面的次数大致相等。 分析:模拟一次投掷flip函数,返回1或0; 在主调函数中多次调用flip并根据返回值统计出现正面或反面的次数。
int flip(void) { return (rand()%2);} main() { int k,n1=0,n2=0; srand(time(NULL)); for(k=0;k<100;k++) if(flip()) n1++; else n2++; printf(“coin head:%d\n”,n1); printf(“coin tail:%d\n”,n2);}
6. Fibonacci数列 0,1,1,2,3,5,8,13,21…… 的开始两项是0和1,其后的每一项都是它前两项之和。编写一个非递归函数fibonacci(n)计算第n项的Fibonacci数。 分析:F1=1 (n=1) F2=1 (n=2) Fn=Fn-1+Fn-2 (n>=3)
月数 小兔子数 中兔子数 老兔子数 总数 1 1 0 0 1 2 0 1 0 1 3 1 0 1 2 4 1 1 1 3 5 2 1 2 5 … .. .. .. … 古典数学问题:有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有的兔子不死,问每个月兔子的总数为多少?
long fibonacci(int n) { long int f1,f2; int i,t; if(n==0||n==1) return n; else {f1=0;f2=1; for(i=3;i<=n;i++) { t=f2; f2=f1+f2; f1=t;} return f2; } }
/*递归的fibonacci函数*/ long fibonacci(int n) { if(n==1||n==0) return 1; else return fibonacci(n-1)+fibonacci(n-2); }
7.输入一个在1到32767之间的整数,打印出组成它的一系列数字,数字之间用两个空格分开。例如,输入整数1234则输出1 2 3 4。 分析: 个位数:x%10 十位数:x/10%10 …… 多少位?
/*递归的f函数*/ void f(int x) { if(x/10==0) printf(“%d\t”,x); else { f(x/10); printf(“%d\t”,x%10);} }