sp函数c语言,Spc函数

C语言编程:编写一个函数求逆矩阵

#include stdio.h

创新互联是专业的定结网站建设公司,定结接单;提供成都网站设计、网站建设、外贸网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行定结网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

#include stdlib.h

#include malloc.h

void MatrixOpp(double *A, int m, int n, double* invmat);

void MatrixInver(double *A, int m, int n, double* invmat);

double Surplus(double A[], int m, int n);

int matrix_inv(double* p, int num, double* invmat);

void MatrixOpp(double A[], int m, int n, double* invmat)

{

int i, j, x, y, k;

double *SP = NULL, *AB = NULL, *B = NULL, X;

SP = (double *) malloc(m * n * sizeof(double));

AB = (double *) malloc(m * n * sizeof(double));

B = (double *) malloc(m * n * sizeof(double));

X = Surplus(A, m, n);

X = 1 / X;

for (i = 0; i  m; i++)

for (j = 0; j  n; j++)

{

for (k = 0; k  m * n; k++)

B[k] = A[k];

{

for (x = 0; x  n; x++)

B[i * n + x] = 0;

for (y = 0; y  m; y++)

B[m * y + j] = 0;

B[i * n + j] = 1;

SP[i * n + j] = Surplus(B, m, n);

AB[i * n + j] = X * SP[i * n + j];

}

}

MatrixInver(AB, m, n, invmat);

free(SP);

free(AB);

free(B);

}

void MatrixInver(double A[], int m, int n, double* invmat)

{

int i, j;

double *B = invmat;

for (i = 0; i  n; i++)

for (j = 0; j  m; j++)

B[i * m + j] = A[j * n + i];

}

double Surplus(double A[], int m, int n)

{

int i, j, k, p, r;

double X, temp = 1, temp1 = 1, s = 0, s1 = 0;

if (n == 2)

{

for (i = 0; i  m; i++)

for (j = 0; j  n; j++)

if ((i + j) % 2)

temp1 *= A[i * n + j];

else

temp *= A[i * n + j];

X = temp - temp1;

}

else

{

for (k = 0; k  n; k++)

{

for (i = 0, j = k; i  m, j  n; i++, j++)

temp *= A[i * n + j];

if (m - i)

{

for (p = m - i, r = m - 1; p  0; p--, r--)

temp *= A[r * n + p - 1];

}

s += temp;

temp = 1;

}

for (k = n - 1; k = 0; k--)

{

for (i = 0, j = k; i  m, j = 0; i++, j--)

temp1 *= A[i * n + j];

if (m - i)

{

for (p = m - 1, r = i; r  m; p--, r++)

temp1 *= A[r * n + p];

}

s1 += temp1;

temp1 = 1;

}

X = s - s1;

}

return X;

}

int matrix_inv(double* p, int num, double* invmat)

{

if (p == NULL || invmat == NULL)

{

return 1;

}

if (num  10)

{

return 2;

}

MatrixOpp(p, num, num, invmat);

return 0;

}

int main()

{

int i, j;

int num;

double *arr=NULL;

double *result=NULL;

int flag;

printf("请输入矩阵维数:\n");

scanf("%d",num);

arr=(double *)malloc(sizeof(double)*num*num);

result=(double *)malloc(sizeof(double)*num*num);

printf("请输入%d*%d矩阵:\n", num, num);

for (i = 0; i  num; i++)

{

for (j = 0; j  num; j++)

{

scanf("%lf", arr[i * num + j]);

}

}

flag = matrix_inv(arr, num, result);

if(flag==0)

{

printf("逆矩阵为:\n");

for (i = 0; i  num * num; i++)

{

printf("%lf\t ", *(result + i));

if (i % num == (num - 1))

printf("\n");

}

}

else if(flag==1)

{

printf("p/q为空\n");

}

else

{

printf("超过最大维数\n");

}

system("PAUSE");

free(arr);

free(result);

return 0;

}

二级c语言上机题其中sp=sq[0]是赋地址吗?

是的 不过sp指针的值是sq指向的内容。地址和一般类型数据其实都是2进制表示的 没有什么区别

32位pc,地址都是4个字节表示。这里的sq是指针, 指向一个数组,所以*sq表示数组的地址,这个用法和2维数组类似。

C语言函数调用栈

程序的执行过程可看作连续的函数调用。当一个函数执行完毕时,程序要回到调用指令的下一条指令(紧接call指令)处继续执行。函数调用过程通常使用堆栈实现,每个用户态进程对应一个调用栈结构(call stack)。编译器使用堆栈传递函数参数、保存返回地址、临时保存寄存器原有值(即函数调用的上下文)以备恢复以及存储本地局部变量。

不同处理器和编译器的堆栈布局、函数调用方法都可能不同,但堆栈的基本概念是一样的。

寄存器是处理器加工数据或运行程序的重要载体,用于存放程序执行中用到的数据和指令。因此函数调用栈的实现与处理器寄存器组密切相关。

AX(AH、AL):累加器。有些指令约定以AX(或AL)为源或目的寄存器。输入/输出指令必须通过AX或AL实现,例如:端口地址为43H的内容读入CPU的指令为INAL,43H或INAX,43H。目的操作数只能是AL/AX,而不能是其他的寄存器。 [5]

BX(BH、BL): 基址寄存器 。BX可用作间接寻址的地址寄存器和 基地址寄存器 ,BH、BL可用作8位通用数据寄存器。 [5]

CX(CH、CL):计数寄存器。CX在循环和串操作中充当计数器,指令执行后CX内容自动修改,因此称为计数寄存器。 [5]

DX(DH、DL):数据寄存器。除用作通用寄存器外,在 I/O指令 中可用作端口 地址寄存器 ,乘除指令中用作辅助累加器。 [5]

2.指针和 变址寄存器

BP( Base Pointer Register):基址指针寄存器。 [5]

SP( Stack Pointer Register): 堆栈指针寄存器 。 [5]

SI( Source Index Register):源变址寄存器。 [5]

DI( Destination Index Register):目的变址寄存器。 [5]

函数调用栈的典型内存布局如下图所示:

图中给出主调函数(caller)和被调函数(callee)的栈帧布局,"m(%ebp)"表示以EBP为基地址、偏移量为m字节的内存空间(中的内容)。该图基于两个假设:第一,函数返回值不是结构体或联合体,否则第一个参数将位于"12(%ebp)" 处;第二,每个参数都是4字节大小(栈的粒度为4字节)。在本文后续章节将就参数的传递和大小问题做进一步的探讨。 此外,函数可以没有参数和局部变量,故图中“Argument(参数)”和“Local Variable(局部变量)”不是函数栈帧结构的必需部分。

其中,主调函数将参数按照调用约定依次入栈(图中为从右到左),然后将指令指针EIP入栈以保存主调函数的返回地址(下一条待执行指令的地址)。进入被调函数时,被调函数将主调函数的帧基指针EBP入栈,并将主调函数的栈顶指针ESP值赋给被调函数的EBP(作为被调函数的栈底),接着改变ESP值来为函数局部变量预留空间。此时被调函数帧基指针指向被调函数的栈底。以该地址为基准,向上(栈底方向)可获取主调函数的返回地址、参数值,向下(栈顶方向)能获取被调函数的局部变量值,而该地址处又存放着上一层主调函数的帧基指针值。本级调用结束后,将EBP指针值赋给ESP,使ESP再次指向被调函数栈底以释放局部变量;再将已压栈的主调函数帧基指针弹出到EBP,并弹出返回地址到EIP。ESP继续上移越过参数,最终回到函数调用前的状态,即恢复原来主调函数的栈帧。如此递归便形成函数调用栈。

EBP指针在当前函数运行过程中(未调用其他函数时)保持不变。在函数调用前,ESP指针指向栈顶地址,也是栈底地址。在函数完成现场保护之类的初始化工作后,ESP会始终指向当前函数栈帧的栈顶,此时,若

C语言题,急……

4.由if (ab,ac) max=a;

else max=0;

可以判断出max=0;t=(a+3,b+1,++c); /* 有逗号运算符可知道t=++c,得t=2*/

printf("max=%d,t=%d\n",max,t);/*max=0,t=2*/

5.max=a(bc?b:c)? a :(bc?b:c); /* 为三目运算符。根据运输优先级先算括号内的。若bc则取b值否则取C值*/

6.for (n=1;n=9;n=n+1) /*循环九次,每次的循环条件都是前一次N加一 */

{ for (m=1;m=n;m=m+1) /*内部嵌套循环,当外部循环一次,他就循环当前N的取值次 */

7main()

{

char c;

while((c=getchar())!='\n') /* 循环判断条件,输入的不是回车键是继续循环*/

{

if((c='a' c='A' c='Z')) /*判断输入的是不是26个字符 */

{ c=c+4;

if(c'Z' c'z') c=c-26; /*判断条件,当C条件成立是执行c=c-26;进行翻译 */

}

printf("%c",c);

}

}


分享文章:sp函数c语言,Spc函数
网页地址:http://myzitong.com/article/hecspj.html