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++中二维数组的定义方式及初始化.

  

  

原文地址:https://www.cnblogs.com/yandashan666/p/10947224.html

时间: 2024-10-29 02:00:03

c语言函数的嵌套使用和矩阵运算的相关文章

C语言函数的一些简单总结

C源程序采用是函数模块式的结构,每一个程序都是由很多个函数组成的,函数是C源程序的基本模块,C语言不仅提供了极为丰富的库函数,他还允许用户自己根据需求创建需要的函数,然后用函数调用的方法来使用该函数,正式这种函数模块化的设计,使得程序的层次结构清晰,便于程序的编写.阅读和调试 main 函数在C语言中称为主函数,它可以调用其它函数,而不允许被其它函数调用.因此,C程序的执行总是从main函数开始,完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序.一个C源程序必须有,并且

黑马程序员—C语言函数的学习

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一讲  函数的参数问题以及返回值 在定义函数的参数时要注意以下几点: 1.形式参数:定义函数时函数名后面中的参数,简称形参 2.实际参数:调用函数时传入的具体数据,简称实参 3.实参个数必须等于形参个数 4.如果是基本数据类型作为函数的形参,纯粹是值传递,修改函数内部形参的值,并不会影响外面实参的值 5.一个函数可以没有形参,也可以有无数个 下面通过一个具体的例子来看一下函数的具体使用以及参

05. Go 语言函数

Go 语言函数 函数是组织好的.可重复使用的.用来实现单一或相关联功能的代码段,其可以提高应用的模块性和代码的重复利用率. Go 语言支持普通函数.匿名函数和闭包,从设计上对函数进行了优化和改进,让函数使用起来更加方便. Go 语言的函数属于"一等公民"(first-class),也就是说: 函数本身可以作为值进行传递. 支持匿名函数和闭包(closure). 函数可以满足接口. Go语言函数声明(函数定义) 函数构成了代码执行的逻辑结构,在Go语言中,函数的基本组成为:关键字 fun

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

c 语言 函数的整理 百度脑图版本

下面整理一下C语言函数的知识点 :使用百度脑图进行整理,详情请看上传的图片: 版权声明:本文为博主原创文章,未经博主允许不得转载.

汇编1 ----C语言函数1

构造以下C程序并在合适位置插入breakpoints 在Visual Studio 2015 CTP6对其反汇编. 下面来分析 z = add(1, 2); 009C170E 6A 02 push 2 ????int z; ????z = add(1, 2); 009C1710 6A 01 push 1 009C1712 E8 8D FA FF FF call 009C11A4 009C1717 83 C4 08 add esp,8 009C171A 89 45 F8 mov dword ptr

(转)如何编写有多个返回值的C语言函数

1引言    笔者从事C语言教学多年,在教学中学生们常常会问到如何编写具有多个返回值的C语言函数.编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在实际教学与应用的过程中我们都有可能会遇到这样的问题.有学生也尝试了不少方法:如把多个需要返回的值作相应的处理后变成一个可以用return语句返回的数据,再在主调函数中拆开返回的数据使之变成几个值:或者把需要返回多个值的一个函数分开几个函数去实现多个值的返回.这些方法虽然最终都能实现返回要求的多个值,但从程序算法的合理性与最优化方面去考虑

Linux汇编GAS调用C语言函数实例

Blum的书上只讲了C语言调用汇编,没讲汇编调用C语言.我自己尝试了下. 最终试验成功了,在此写出与大家分享.期间历经无数错误,无数异常,我不是醉了,而是跪了...好在最后好了. 程序实现一个换值功能,在main.s里定义a=10,b=20,然后调用C语言函数把a,b换值. 新建两个文件分别为main.s的汇编文件,还有pro.c的C语言函数文件. main.s的代码如下: .section .data a: .int 10 b: .int 20 .section .text .globl ma

C语言函数sscanf()的用法 (转载

在我的学习过程中,从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... ); 说明: sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)