zoukankan      html  css  js  c++  java
  • 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的值:
    ");
    26     scanf("%lf",&x);
    27     printf("请输入分母的值:
    ");
    28     scanf("%d",&b);
    29     if(b%2 == 0){
    30         printf("输入的不是基数,请重新输入!
    ");
    31         goto begin; 
    32     }else{
    33         printf("结果为:
    ");
    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
     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("
    ");
    24     }
    25     printf("
    ");
    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("
    ");
    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("
    ");
    53 }
    54 int main(){
    55     int a[3][3]; 
    56     int i,j;
    57     printf("输出3 x 3矩阵各元素:
    ");
    58     for(i = 0;i < 3;i++){
    59         for(j = 0;j < 3;j++)
    60             scanf("%d",&a[i][j]);
    61     }
    62     printf("转置后的矩阵为:
    ");
    63     transposition(a,3); 
    64     printf("矩阵平均值为:
    ");
    65     mean(a,3); 
    66     printf("对角线元素之和为:
    ");
    67     sumDig(a,3);
    68     return 0; 
    69 }

      代码不是很难,关于逻辑方面就是简单的使用for循环,只要理解二维数组存在的方式,相信仔细看就会看懂的.下面就着重说一下关于c或c++中二维数组的定义方式及初始化.

      二维数组的定义方式:

        二维数组的一般定义形式是:

    数据类型 数组名 [行的常数变量][列的常数变量]

        例如:定义一个3x3的二维数组,也就是我们常说的矩阵

    int a[3][3];

        在C语言中,二维数组是按行排列的。也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;然后再在每一列进行存储,先是a[0][0],也就是第一行第一列,接着是a[0][1],第一行第二列.也就是在循环的时候,都将每一行看作是一维数组(整体的思想很重要).比如下面的代码:

    1  int a[3][3]; 
    2  int i,j;
    3  printf("输入3 x 3矩阵各元素:
    ");
    4  for(i = 0;i < 3;i++){
    5      for(j = 0;j < 3;j++){
    6         scanf("%d",&a[i][j]);
    7      }
    8   }             

      二维数组的赋值:

        二维数组的初始化可以按行分段赋值,也可按行连续赋值。具体的赋值方法有:

        按行看做一维数组进行分段:

    1 int a[3][3] = {{1,2,3,},{4,5,6},{2,2,5}]};

          另外,在赋值的过程中,还可以对局部元素进行赋值,如:

    1 int a[3][3] = {{1,2},{2}{8,5,7}};

        赋值的结果是:    1   2   0

                 2   0   0 

                 8   5   7

        确定元素个数连续进行赋值:

    1 int a[3][3] = {1,2,3,4,5,6,7,8,9};

        当清楚知道元素个数时,还可以将第一维度的常数进行省略,如:

    1 int a[][3] = {1,2,3,4,5,6,7,8,9};

       

      先就这么多,有什么问题再加吧.

       我们都在进京赶考的路上.                   

        

       

      

      

     

  • 相关阅读:
    前端总结数据结构与算法基础
    Linux 常用命令
    mariadb下载二进制包源码包地址(使用清华)
    centos7添加永久静态路由
    登录普通用户会报错-bash: ulimit: open files: cannot modify limit: Operation not permitted
    编写二进制安装mariadb10.2的ansible-playbook剧本
    su
    URL后面加不加“/”有区别吗?
    RocketMQ在面试中那些常见问题及答案+汇总
    通过实现网站访问计数器带你理解 轻量级锁CAS原理,还学不会算我输!!!
  • 原文地址:https://www.cnblogs.com/yandashan666/p/10947224.html
Copyright © 2011-2022 走看看