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小时内删除。
发表评论