c语言函数的嵌套使用和矩阵运算
Posted yandashan666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言函数的嵌套使用和矩阵运算相关的知识,希望对你有一定的参考价值。
这段时间,听刚刚学习c++的同学说函数嵌套运用不太熟练,想做一个简单的程序进行练习,我也就当练练手了,哈哈.虽然说是比较简单,但是其中的思维也是值得思考的.
一、函数的嵌套使用
简单说明题目:对于等式 y=x-x^3/3!+x^5/5!+.... 输入任意的x和分母,求得上等式
当然可以找规律,比如分母是(2*n-1)的阶乘,但是我在这里只是介绍最直白的方法
看代码:
1 #include<stdio.h> 2 #include<math.h> 3 4 int factorial(int a){//求阶乘 5 int sum = 1,i; 6 for(i = 1;i <= a;i++){ 7 sum *= i; 8 } 9 return sum; 10 } 11 double sum(double x,int b){//求等式的和 12 double sum = 0; 13 int i ; 14 int a = 2; 15 for(i = 1; i <= b; i=i+2){ 16 sum += (pow(-1,a)*pow(x,i))/factorial(i); 17 a++; 18 } 19 return sum; 20 } 21 int main(){ 22 double x; 23 int b; 24 begin: 25 printf("请输入x的值:\n"); 26 scanf("%lf",&x); 27 printf("请输入分母的值:\n"); 28 scanf("%d",&b); 29 if(b%2 == 0){ 30 printf("输入的不是基数,请重新输入!\n"); 31 goto begin; 32 }else{ 33 printf("结果为:\n"); 34 printf("%f",sum(x,b)); 35 } 36 37 }
1、首先我在这里使用了一个函数pow(double a,double b),在使用的时候一定要注意他的两个变量都是double型的.
另外,在pow函数使用时,经常会出现一些问题,如:
如果底数 x 为负数并且指数 y 不是整数,将会导致 domain error 错误(域名错误)。
如果底数 x 和指数 y 都是 0,可能会导致 domain error 错误,也可能没有;这跟库的实现有关。
如果底数 x 是 0,指数 y 是负数,可能会导致 domain error 错我,也可能与库有关。
如果返回值太大或者太小,将会导致 range error错误(范围错误,当内存不足时极易出现) 。
所以在使用的过程中,为了代码的完整性和严密性,需要我们去做一些限制来限制这些情况的发生.
2、使用了 goto语句.虽然在c语言中不可以使用goto语句,但应为是用的c++编译环境,所以还是加上了这个.
goto语句是在跳出多层循环时使用的, 还有一个功能是在性能考虑,在其他的应用方面没有什么作用.首先在c++ 11 lambda后goto存在的意义就不大, 统一的错误处理和资源管理可以交给RAII来进行管理.但是在性能方面,goto语句可以大大减少如switch,while等这些控制语句上的性能消耗.本人习惯于在调试方面进行适当的使用,保证调试的流畅性.
二、矩阵运算
简单说明题目:定义三个函数,transposition 矩阵转置,mean 求平均值,sumDig 对角线元素之和,实用主函数进行调用.
说到矩阵问题肯定是要使用数组了,定义二维数组的方式有很多,先看代码:
1 #include<stdio.h> 2 #define M 3 3 void transposition(int a[][M],int n);//矩阵的转置 4 void mean(int a[][M],int n);//求平均值 5 void sumDig(int a[][M],int n);//求对角线元素之和 6 7 void transposition(int a[][M],int n){//矩阵的转置 8 int c,d = 0; 9 int i,j,k,t; 10 for(i = 0;i < M;i++){ 11 for(j = d;j < n;j++){//将关于主对角线对称的元素进行交换 12 c = a[i][j]; 13 a[i][j] = a[j][i]; 14 a[j][i] = c; 15 } 16 d++; 17 } 18 for(k = 0;k < 3;k++){ 19 for(t = 0;t < 3;t++){ 20 printf("%d",a[k][t]); 21 printf(" "); 22 } 23 printf("\n"); 24 } 25 printf("\n"); 26 } 27 28 void mean(int a[][M],int n){//求平均值 29 int sum = 0; 30 int i,j; 31 for(i = 0;i < M;i++){ 32 for(j = 0;j < n;j++){ 33 sum += a[i][j]; 34 } 35 } 36 printf("%d",sum/(3*3)); 37 printf("\n"); 38 } 39 40 void sumDig(int a[][M],int n){//求对角线元素之和 41 int sumDig = 0; 42 int i; 43 for(i = 0,j = 0;i < M;i++,j++){ 44 sumDig += a[i][j]; 45 } 46 for(i = 0,j = 2;i < M;i++,j--){ 47 if(i != 2){//出去对角线交点元素 48 sumDig += a[i][j]; 49 } 50 } 51 printf("%d",sumDig); 52 printf("\n"); 53 } 54 int main(){ 55 int a[3][3]; 56 int i,j; 57 printf("输出3 x 3矩阵各元素:\n"); 58 for(i = 0;i < 3;i++){ 59 for(j = 0;j < 3;j++) 60 scanf("%d",&a[i][j]); 61 } 62 printf("转置后的矩阵为:\n"); 63 transposition(a,3); 64 printf("矩阵平均值为:\n"); 65 mean(a,3); 66 printf("对角线元素之和为:\n"); 67 sumDig(a,3); 68 return 0; 69 }
代码不是很难,关于逻辑方面就是简单的使用for循环,只要理解二维数组存在的方式,相信仔细看就会看懂的.下面就着重说一下关于c或c++中二维数组的定义方式及初始化.
以上是关于c语言函数的嵌套使用和矩阵运算的主要内容,如果未能解决你的问题,请参考以下文章