c语⾔函数的嵌套使⽤和矩阵运算
   这段时间,听刚刚学习c的同学说函数嵌套运⽤不太熟练,想做⼀个简单的程序进⾏练习,我也就当练练⼿了,哈哈.虽然说是⽐较简单,但是其中的思维也是值得思考的.
⼀、函数的嵌套使⽤
  简单说明题⽬:对于等式 y=x-x^3/3!+x^5/5!+.... 输⼊任意的x和分母,求得上等式
  当然可以规律,⽐如分母是(2*n-1)的阶乘,但是我在这⾥只是介绍最直⽩的⽅法
  看代码:
1 #include<stdio.h>
2 #include<math.h>
3
4int factorial(int a){//求阶乘
5int sum = 1,i;
6for(i = 1;i <= a;i++){
7        sum *= i;
8    }
9return sum;
10 }
11double sum(double x,int b){//求等式的和
12double sum = 0;
13int i ;
14int a = 2;
15for(i = 1; i <= b; i=i+2){
16        sum += (pow(-1,a)*pow(x,i))/factorial(i);
17        a++;
18    }
19return sum;
20 }
21int main(){
22double x;
23int b;
24    begin:
25    printf("请输⼊x的值:\n");
26    scanf("%lf",&x);
27    printf("请输⼊分母的值:\n");
28    scanf("%d",&b);
29if(b%2 == 0){
30        printf("输⼊的不是基数,请重新输⼊!\n");
31goto 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++ 11 lambda后goto存在的意义就不⼤, 统⼀的错误处理和资源管理可以交给RAII来进⾏管理.但是在性能⽅⾯,goto语句可以⼤⼤减少如switch,while等这些控制语句上的性能消耗.本⼈习惯于在调试⽅⾯进⾏适当的使⽤,保证调试的流畅性.
⼆、矩阵运算
  简单说明题⽬:定义三个函数,transposition  矩阵转置,mean  求平均值,sumDig  对⾓线元素之和,实⽤主函数进⾏调⽤.
  说到矩阵问题肯定是要使⽤数组了,定义⼆维数组的⽅式有很多,先看代码:
1 #include<stdio.h>
2#define M 3
3void transposition(int a[][M],int n);//矩阵的转置
4void mean(int a[][M],int n);//求平均值
5void sumDig(int a[][M],int n);//求对⾓线元素之和
6
7void transposition(int a[][M],int n){//矩阵的转置
8int c,d = 0;
9int i,j,k,t;
10for(i = 0;i < M;i++){
11for(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    }
18for(k = 0;k < 3;k++){
19for(t = 0;t < 3;t++){
20            printf("%d",a[k][t]);
21            printf("");
22        }
23        printf("\n");
24    }
25    printf("\n");
26 }
27
28void mean(int a[][M],int n){//求平均值
29int sum = 0;
30int i,j;
31for(i = 0;i < M;i++){
32for(j = 0;j < n;j++){
33            sum += a[i][j];
34        }
35    }
35    }
36    printf("%d",sum/(3*3));
37    printf("\n");
38 }
39
40void sumDig(int a[][M],int n){//求对⾓线元素之和
41int sumDig = 0;
42int i;
43for(i = 0,j = 0;i < M;i++,j++){
44        sumDig += a[i][j];
45    }
46for(i = 0,j = 2;i < M;i++,j--){
47if(i != 2){//出去对⾓线交点元素
48            sumDig += a[i][j];
49        }
50    }
51    printf("%d",sumDig);
52    printf("\n");
53 }
54int main(){
55int a[3][3];
56int i,j;
57    printf("输出3 x 3矩阵各元素:\n");
58for(i = 0;i < 3;i++){
59for(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);
68return0;
69 }
  代码不是很难,关于逻辑⽅⾯就是简单的使⽤for循环,只要理解⼆维数组存在的⽅式,相信仔细看就会看懂的.下⾯就着重说⼀下关于c或
c++中⼆维数组的定义⽅式及初始化.
  ⼆维数组的定义⽅式:
    ⼆维数组的⼀般定义形式是:
数据类型数组名 [⾏的常数变量][列的常数变量]
    例如:定义⼀个3x3的⼆维数组,也就是我们常说的矩阵
int a[3][3];
    在C语⾔中,⼆维数组是按⾏排列的。也就是先存放 a[0] ⾏,再存放 a[1] ⾏,最后存放 a[2] ⾏;然后再在每⼀列进⾏存储,先是a[0][0],也就是第⼀⾏第⼀列,接着是a[0][1],第⼀⾏第⼆列.也就是在循环的时候,都将每⼀⾏看作是⼀维数组(整体的思想很重要).⽐如下⾯的代码:
1int a[3][3];
2int i,j;
3  printf("输⼊3 x 3矩阵各元素:\n");
4for(i = 0;i < 3;i++){
5for(j = 0;j < 3;j++){
6        scanf("%d",&a[i][j]);
7      }
8  }
  ⼆维数组的赋值:
    ⼆维数组的初始化可以按⾏分段赋值,也可按⾏连续赋值。具体的赋值⽅法有:
    按⾏看做⼀维数组进⾏分段:
1int a[3][3] = {{1,2,3,},{4,5,6},{2,2,5}]};
      另外,在赋值的过程中,还可以对局部元素进⾏赋值,如:
1int a[3][3] = {{1,2},{2}{8,5,7}};
    赋值的结果是:    1  2  0
怎么定义二维数组c语言            2  0  0
            8  5  7
    确定元素个数连续进⾏赋值:
1int a[3][3] = {1,2,3,4,5,6,7,8,9};
    当清楚知道元素个数时,还可以将第⼀维度的常数进⾏省略,如:
1int a[][3] = {1,2,3,4,5,6,7,8,9};
  先就这么多,有什么问题再加吧.
  我们都在进京赶考的路上.                       

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。