程序:
#include { printf(“this is a c program.\n”); return 0; } 2. 求两个整数之 程序, #include { int a,b,sum; a=122; b=234; sum=a+b; printf(“sum is %d\n”,sum); return 0; } 3. 求两个整数之间的 程序, #include int main() { int max(int x,int y); int a,b,c; scanf("%d,%d",&a,&b); c=max(a,b); printf("max=%d\n",c); return 0; } int max(int x,int y) { int z; if(x>y)z=x; else z=y; return(z); } 4. 人用温度计测量出华氏发表示的温度,如69?F,,今要把她转换摄氏法表示的温 公式,c=5,f-32,/9. 其中f代表华氏温度,c代表摄 程序, #include int main() { float f,c; f=64.0; c=(5.0/9)*(f-32); printf("f=%f\nc=%f\n",f,c); return 0; } 5. 计算款利息。有1000元,想一年。有一下三种方法可选,,1,活期,年利率为r1,,2,一年定期,年利率r2,,3,存两次年期,年利率为r3。分别计算 程序, #include int main() { float p0=1000,r1=0.0036,r2=0.0225,r3=0.0198,p1,p2,p3; p1=p0*(1+r1); p2=p0*(1+r2); p3=p0*(1+r3/2)*(1+r3/2); printf("p1=%f\np2=%f\np3=%f\n",p1,p2,p3); return 0; } 6. 给定一个大写字母,要求以小写字母输出。 程序, #include int main() { char c1,c2; c1=’A’; c2=c1+32; printf(“%c\n”,c2); printf(“%d\n”,c2); return 0; } 7. 出三角形的三边长,求三角形的面积。 公式,若给三角形的三长,且任意两 则, ,,,,area=,,,,,,,,,,,, , 其中s=(a+b+C)/2. 程序, #include #include int main() { double a,b,c,area; a=3.67; b=5.43; c=6.21; s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(“a=%f\tb=%f\tc=%f\n”,a,b,c); printf(“area=%f\n”,area); return 0; } 228. 求ax+bx+c=0方程的根。a,b,c由键盘 程序, #include #include int main() { double a,b,c,disc,x1,x2,p,q; scanf(“%lf%lf%lf”,&a,&b,&c); disc=b*b-4*a*c; if(disc<0)>0)> printf(“This question has no real roots\n”); else { p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“x1=%7.2f\nx2=%7.2f\n”,x1,x2); } return 0; } 9. 先后输出BOY三个 程序, #include { char a=’B’,b=’O’,c=’Y’; putchar(a); putchar(b); putchar(c); putchar(‘\n’); return 0; } 10. 用三个getchar函数先后向计算机输入BOY三 putchar函数输 程序, #include int main() { char a,b,c; a=getchar(); b=getchar(); c=getchar(); putchar(a); putchar(b); putchar(c); putchar(‘\n’); return 0; } 或 #include int main() { putchar(getchar()); putchar(getchar()); putchar(getchar()); putchar(‘\n’); return 0; } 11. 用getchar函数从键盘读入一个大写母,把它 母, #include { char c1,c2; c1=getchar(); c2=c1+32; putchar(c2); putchar(‘\n’); return 0; } 12. 输入两个实数,按代数值由小到大的顺输出这两 将两 #include { float a,b,t; scanf(“%f,%f”,&a,&b); if(a>b) { t=a; a=b; b=t; } printf(“%5.2f,%5.2f\n”,a,b); return 0; } 13. 输入a,b,c三个数,要求由小到大的 程序, #include int main() { float a,b,c,t; scanf("%f,%f,%f",&a,&b,&c); if(a>b); { t=a; a=b; b=t; } if(a>c) { t=a; a=c; c=t; } if(b>c) { t=b; b=c; c=t; } printf("%5.2f,%5.2f,%5.2f\n",a,b,c); return 0; } 14,输入一个字符,判断它是否为大写字母,如果是,将它转换成 小写母,如果不是,不转换。然后输出最后得 程序, #include { char ch; scanf(“%c”,&ch); ch=(ch>=’A’&&ch<=’z’)?(ch+32):ch; printf(“%c\n”,ch);="">=’z’)?(ch+32):ch;> return 0; } 或 #include { char ch; scanf("%c",&ch); if(ch>='A'&&ch<='z')>='z')> printf("%c\n",ch+32); else printf("%c\n",ch); return 0; } ,, ,,,,, , ,,,,,15.有一个函数:y= , ,, , ,,, 编一 #include int main() { int x,y; scanf("%d",&x); if(x<0)>0)> y=-1; else if(x==0) y=0; else y=1; printf("x=%d\ny=%d\n",x,y); return 0; } 16.要求按照考试成绩的等级输出百分制分数段,A等为85分 以上,B等为70-84分。C等为60-69分,D等为60分以下。成 绩的等级由键盘 程序, #include int main() { char grade; scanf("%c",grade); printf("You score:\n"); switch(grade) { case'A':printf("85~100\n");break; case'B':printf("70~84\n");break; case'C':printf("60~69\n");break; case'D':printf("<60\n");break;>60\n");break;> default:printf("enter date error\n"); } return 0; } 17.写一程序,判断某一年是否为 程序: #include int main() { int leap,year; printf("please enter year:"); scanf("%d",&year); if(year%4==0) { if (year%100==0) { if(year%400==0) leap=1; else leap=0; } else leap=1; } else leap=0; if(leap) printf("%d is a leap year\n",year); else printf("%d is not a leap year\n",year); return 0; } 或 #include int main() { int leap,year; printf("please enter year:"); scanf("%d",&year); if(year%4!=0) leap=0; else if(year%100!=0) leap=1; else if(year%400!=0) leap=0; else leap=1; if(leap==1) printf("%d is a leap year\n",year); else printf("%d is not a leap year\n",year); return 0; } 或 #include int main() { int leap,year; printf("please enter year:"); scanf("%d",&year); if((year%4==0&&year%100!=0)||(year%400==0)) leap=1; else leap=0; if(leap==1) printf("%d is a leap year\n",year); else printf("%d is not a leap year\n",year); return 0; } 218. 求ax+bx+c=0方程的根。a,b,c 程序, #include #include int main() { double a,b,c,disc,x1,x2,x3,realpart,imagepart; scanf("%lf,%lf,%lf",&a,&b,&c); printf("The equation"); if(fabs(a)<=1e-6)>=1e-6)> printf("is not a quadratic"); else { disc=b*b-4*a*c; if(fabs(disc)<=1e-6)>=1e-6)> printf("has two equal roots %8.4f\n",-b/2*a); else if(disc>1e-6) { printf("has two distinct real roots\n%8.4f,%8.4f",x1,x2); x1=(-b+sqrt(disc))/2*a; x2=(-b-sqrt(disc))/2*a; } else { realpart=-b/2*a; imagepart=sqrt(-disc)/2*a; printf("has two complex roots:\n"); printf("%8.4f+%8.4fi\n",realpart,imagepart); printf("%8.4f-%8.4fi\n",realpart,imagepart); } } return 0; } //注,由于b*b-4*a*c,disc,是实数,而实数在计算和存时会一些的误差,因此不能 //“if,disc==0,",因为这样可能出现本来是零的量,由于上述误判别为不等于 //所采取的办法是判别disc的绝对值,fabs,disc,,是否小于个很的数,例 19.给出一个不多出5位的正整数, ,1,,求出它是几位 ,2,,分别输出每一位 ,3,,按逆序输出各位数字,例如原数为321,输 程序, #include { int num,indiv,ten,hundred,thousand,ten_thousand,place; printf("请输入一个正整数(0~99999),"); scanf("%d",&num); if(num>9999) place=5; else if(num>999) place=4; else if(num>99) place=3; else if(num>9) place=2; else place=1; printf("位数为:%d\n",place); ten_thousand=num/10000; thousand=(num-ten_thousand*10000)/1000; hundred=(num-ten_thousand*10000-thousand*1000)/100; ten=(num-ten_thousand*10000-thousand*1000-hundred*100)/10; indiv=(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10); printf("每一个数字分别为,"); printf("%d,%d,%d,%d,%d\n",ten_thousand,thousand,hundred,ten,indiv); switch(place) { case 5:printf(" 为,%d%d%d%d%d\n",indiv,ten,hundred,thousand,ten_thousand);break; case 4:printf(" 为,%d%d%d%d\n",indiv,ten,hundred,thousand);break; case 3:printf(" 为,%d%d%d\n",indiv,ten,hundred);break; case 2:printf("反序数字为,%d%d\n",indiv,ten);break; case 1:printf("反序数字为,%d\n",indiv);break; } return 0; } 20.求1+2+3+4+5+……+100。 程序, #include { int i=1,sum=0; while(i<=100)>=100)> { sum=sum+i; i++; } printf("sum=%d\n",sum); return 0; } 或 #include { int i=1,sum=0; do { sum=sum+i; i++; } while(i<=100);>=100);> printf("sum=%d\n",sum); return 0; } 21.输出1-100,100 程序, #include { int i=1; do { printf("%d\n",i++); } while(i<=100);>=100);> return 0; } 22. 以代码亲自运行成功,可黏贴到vc gets和puts #include"stdio.h" void main() { charstr[20]; gets(str);//输入 puts(str);//输出 } 整型、字符、字符串、一维数组的初始化、输入和输出 #include"stdio.h" #include"string.h" void main() { inti = 2; printf("%d\n请输入一个int型",i); int ii; scanf("%d",&ii); printf("%d\n",ii); //字符类型 char c = 'x'; printf("%c\n请输入一个char型",c); char cc; scanf("%c",&cc); //cc = getchar(); printf("%c\n",cc); //putchar(cc); //字符串型 char str[] = "xuxunxun"; printf("%s\n请输入一个字符串 char strr[100];//必须 //scanf("%s",strr);//字数组名就 gets(strr);//字符串 //printf("%s\n",strr); puts(strr); //一维数组 int a[5] = {1,2,3,4,5}; for(int j = 0;j < 5;j=""> printf("%d\n",a[j]); int b[3]; printf("请输入三个数字\n"); for(int k = 0;k < 3;k="" ++)=""> { scanf("%d",&b[k]); } printf("输入三个数字是:\n"); for(k = 0;k < 3;k="" ++)=""> printf("%d\n",b[k]); } //结构体 struct student { char name[9]; int score[3];//存放3 }; student stu[2];//定义两个 for(inti = 0;i < 2;i="" ++)=""> { printf("请输入第%d个学生的信息:\n",i + 1); printf("姓名:"); scanf("%s",&stu[i].name); for(int j = 0;j < 3;j="" ++)=""> { printf("成绩%d:",j + 1); scanf("%d",&stu[i].score[j]); } } 字符串输出 void main() { char str[]= "abcd"; inti; char c; for(i = 0;i { printf("%c\n",str[i]);//输 } for(i = 0;(c = str[i]) != '\0';i++) { printf("#\n");//输 } } 单个输出整数的每个 #include"stdio.h" void main() { int a = 12342139; inti; do { i = a%10 ; printf("%d\n",i); a = a / 10; }while(a); } 整型,字 int *p; void main() { /* char *str = "vxzz";// str++; printf("%s\n",str);//出后面的 int a[3] = {1,2,3}; p=a;//最初指 p++;//移动一个, printf("%d",*p); */ char * month[3] = {"january","february","march"}; month[0]++; printf("%s",month[0]);//输 } 各数值类型所占字 #include"stdio.h" void main() { printf("int %d\n",sizeof(int));//4 printf("char %d\n",sizeof(char));//1 printf("short %d\n",sizeof(short));//2 printf("long %d\n",sizeof(long));//4 printf("float %d\n",sizeof(float));//4 printf("double %d\n",sizeof(double));//8 } 字符串和指针 #include"stdio.h" #include"string.h" #include"stdlib.h" void main() { char *str = "vxzz";// str++;//后来 str++;//变成 printf("%c\n",*str1);//输出 printf("%s\n",str);//出后面的 } 递增操作符 #include"stdio.h" void main() { int a = 2; int b = 0; int c = 0; b = a++;//2,先赋值 c = ++a;//4,先加1后赋值 printf("b=%d,c=%d\n",b,c); } 函数判断最大值 int max(inta,intb,int c) { int temp; temp = a > b ? a : b; temp = temp > c ? temp : c; return temp; } 输入字符,如果是大写变 #include"stdio.h" void main() { char ch; printf("请输入一个字母\n"); scanf("%c",&ch); ch = (ch>= 'A' &&ch<= 'z')?(ch="" +="">=> printf("%c\n",ch); } 输入行字符,判断其中的英文字母,空格,数和其他 char ch; while((ch = getchar()) != '\n') { if((ch>= 'A' &&ch<= 'z')||(ch="">= 'a' &&ch<= 'z')="">=> letters ++; else if(ch == ' ') space ++; else if(ch>= '0' &&ch<= '9')="">=> digit ++; else others ++; } 猜数字 #include"stdio.h" #include"stdlib.h"//rand void main() { int count = 0;// int number;//随机被 int guess;//you number printf("\n number = rand() % 100 + 1;// while(guess != number) { do { printf("\n请输入1到100之间的 scanf("%d",&guess); }while(!(guess >= 1&& guess <=>=> 间,否则重新输入 if(guess > number) printf("大了~\n"); if(guess < number)=""> printf("小了~\n"); count ++; } printf("猜对了,花了%d次\n",count); } 输入年月日,判断一年第 #include"stdio.h" void main() { intday,month,year,sum,leap; printf("请输入年,月,日\n"); scanf("%d,%d,%d",&year,&month,&day); switch(month) { case 1:sum = 0;break; case 2:sum = 31;break; case 3:sum = 59;break; case 4:sum = 90;break; case 5:sum = 120;break; case 6:sum = 151;break; case 7:sum = 181;break; case 8:sum = 212;break; case 9:sum = 243;break; case 10:sum = 273;break; case 11:sum = 304;break; case 12:sum = 334;break; } sum += day; if(year % 400 == 0 ||(year % 4 == 0 && year % 100 != 0))//闰年 leap = 1; else leap = 0; if(leap == 1 && month > 2)//润 sum++; printf("是这一年的%d天\n",sum); } 判断素数 #include"stdio.h" #include"math.h" void main() { intm,i,k; printf("请输入一个数字\n"); scanf("%d",&m); k = sqrt(m);// for(i = 2;i <= k;i="" ++)="">=> { if(m % i == 0) break; } if(i> k) printf("是素数\n"); else printf("bu是素数\n"); } 输出菱形上三角 #include"stdio.h" #include"math.h" void main() { inti,j,k; for(i = 0;i <= 3;i="" ++)//共四行="">=> { for(j = 0;j <= 2="" -="" i;j="">=> printf(" "); for(k = 0;k <= 2="" *="" i;k="">=> 别为0、1、2、3 printf("*"); printf("\n");//每输出一 } } 冒泡排序 #include"stdio.h" #include"math.h" void main() { int a[10]; inti,j,temp; int flag = 0; printf("输入十个数字:\n"); for(i = 0;i < 10;i="" ++)=""> scanf("%d",&a[i]); for(i = 0;i < 9;i="" ++)=""> { for(j = 0;j < 9="" -="" i;j="" ++)=""> { flag = 0; if(a[j] > a[j + 1]) { temp = a[j + 1]; a[j + 1] = a[j]; a[j] = temp; flag = 1; } } if(0 == flag) break; } printf("排序后为:\n"); for(i = 0;i < 10;i++)=""> printf("%5d\n",a[i]); } 选择排序 #include"stdio.h" #include"math.h" void sort(int x[],int n) { inti,j,k,temp; for(i = 0;i < n="" -="" 1;i++)=""> { k = i; for(j = i + 1;j { if(x[j] > x[k]) k = j; }//从a【0】开始和a【1】到a【10】比,把于a【0】 k if(k != i)//如果k和相比的不 { temp = x[i]; x[i] = x[k]; x[k] = temp; } } } void main() { int a[10]; inti; int flag = 0; printf("输入十个数字:\n"); for(i = 0;i < 10;i="" ++)=""> scanf("%d",&a[i]); sort(a,10); printf("排序后为:\n"); for(i = 0;i < 10;i++)=""> printf("%5d\n",a[i]); } 字符串复制 char * mystrcpy(char *dest,char *src) { char *d = dest; char *s = src; int count = 0; if(src == dest)//两 return src; count = strlen(src) + 1; if(count <=>=> return 0; else//(dest { while(count --) { *d++ = *s++; } } return dest; } 字符串2复制到字符串1 void main() { char s1[80],s2[80]; inti = 0,j = 0;如果没有初始化赋 gets(s1); gets(s2); while(s1[i] != 0) i ++; while(s2[j] != 0) s1[i++] = s2[j++]; s1[i] = '\0'; puts(s1); } 字符串反序存放 void inverse(char str[]) { char temp; inti,j; for(i = 0,j = strlen(str) - 1;i < (="" strlen(str)="" 2);="" i++,j--)=""> { temp = str[i]; str[i] = str[j]; str[j] = temp; } puts(str); } 汉诺 让我们先看看代码吧 #include int hj(int a,int b, int c,int i) { int t; if(i==1) printf( else {t=c; c=b; b=t; hj(a,b,c,i-1); printf( t=a; a=c; c=t; t=b; b=c; c=t; hj(a,b,c,i-1); return 0; } } main() { int a,b,c,i; a=1; b=2; c=3; printf( scanf( hj(a,b,c,i); return 0; } 以上是汉塔的代码,该程序主要是用了递归的思想,比如数学中的 f(x)=f(x-1)+f(x-2), 在本程序中 { int t; if(i==1) printf( else {t=c; c=b; b=t; hj(a,b,c,i-1); 也就是说, 我们在这个函数中再次调用这个数, 相当于一个循环, 而在再次调用的过程, i 的值变成 i-1,就类于 f (x-1) ,样层层用,终就变成当 i=1的时候的值, 汉诺塔的数值分析: 我们可发现,当只有一个盘的时候,我们只需要做 1->3(就是把第一柱子上最端 的盘移动到第三 当有 三个 分析一下可以得出以下 初始值 a=1 b=2 c=3 一个盘子就是 a->c 两个盘子与一个盘子的关 第 第二步:打印 a->b 第三:a 与 c 交换值, b 与 c 换值,打 进一步分析,便可以得出 只要子数量为 i (i 大于 1) ,那么 第部分, b 与 c 交换值,然后运 第二部分,打印 a->b 第三分, a 与 c 交换值, b 与 c 交值,然 程序表示便是: if(i==1) printf( else {t=c; c=b;(交换值) b=t; hj(a,b,c,i-1); printf( t=a; a=c; c=t;(a c t=b; b=c; c=t;(b c hj(a,b,c,i-1); 不加 QQ765233918(请 Matlab 调用 c 程序 方法: 第一:要先在 matlab 中安装 c 键入命令:mex -setup; 选择 c/c++编 选择 c/c++编译器 确认。 第二步:键入:mex *.c 实例介绍:【转】 如果有一个用 C 语言写的函数,实现了一个功,如一个 double add(double x, double y) { return x + y; } 现我想要在 Matlab 中使用它, >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎 解决方法之是要通过使用 MEX 件, MEX 文件使得调用 C 函数调用 Matlab 的内置数一样便。 MEX 文件由 C 代码加上 MEX 文 可以这样理解, MEX 文件实现种接口,它把在 Matlab 中调用函数时输入的 自量通过特定的接口调入了 C 函数,得出的果再通过该接口调回 Matlab 。 该特定接口的操作,包含在 mexFunction 这个函数中,使用者具体设。 所以现在我们要写一个包含 add 和 mexFunction 的 C 文件, Matlab 调用函数, 把函数中的自变(如上例中的 1.1和 2.2)传 mexFunction 的一个参数, mexFunction 把该值传给 add , 把得出的结果传给 mexFunction 的另一个参数, Matlab 通过该数来给出在 Matlab 语句中调函时的输值 (如上中的 a ) 。 比如该 C 文件已写,名为 add.c 。那 >> mex add.c 就能把 add.c 编译为 MEX 文件 (编译器的设置使用指 mex -setup ) , 在 Windows 中, MEX 文类型为 mexw32,即现在我们得 add.mexw32文件。现,我们 可以像调用 M 函数那样用 MEX 文件, 如上面说到的例子。 所以, 通过 MEX 文件, 使用 C 函数就和使用 M 函数 我 mexFunction 的 void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { } 可以看到, mexFunction 是没返回的,它不是通过返回值把结果传回 Matlab ,而通过对参数 plhs 的赋。 mexFunction 的四个数皆 >> b = 1.1; c = 2.2; >> a = add(b, c) mexFunction 四个参数的 nlhs = 1,说明调用语句左手面(lhs -left hand side)有个变,即 a 。 nrhs = 2,说调用语句右 plhs 是一个数, 其内容为指针, 该指针指向数据类型 mxArray 。 因为现在左手 面只有一个变量,该数组只一个指针, plhs[0]指向结果会赋值给 a 。 prhs 和 plhs 似,因为右手面两个自量,即该数组有个指针, prhs[0]向了 b , prhs[1]指向了 c 。要注意 prhs 是 const 的指针数组,即不能改 因为 Matlab 基本的单元为 array ,无论是什么类型也好,如有 double array 、 cell array、 struct array……所以 a,b,c 都是 array , b = 1.1便是一个 1x1的 double array。而在 C 语言中, Matlab 的 array 使用 mxArray 类型来表。 所以就不难明白为什 plhs 和 prhs 都是指向 mxArray 完整的 add.c // add.c #include // 执行具体工作的 C 函数 double add(double x, double y) { return x + y; } // MEX文件接 void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { double *a; double b, c; plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); a = mxGetPr(plhs[0]); b = *(mxGetPr(prhs[0])); c = *(mxGetPr(prhs[1])); *a = add(b, c); } mexFunction 的内容是什么意思呢?我们知,如果这 >> output = add(1.1, 2.2); 在未涉及体的计算时, output 的值是未知的,是未赋值的。所以在体的程 序中,我们建立一个 1x1实 double 矩 其返回指向刚建立的 mxArray 的指针),然后令 plhs[0]指向它。着令指针 a 指向 plhs[0]所向的 mxArray 的第一个元素(使用 mxGetPr 函数,返回指 mxArray 的首元素的针)。同样地,我们把 prhs[0]和 prhs[1]所指向的素 (即 1.1和 2.2)取出来赋给 b 和 c 。于我们可以把 b c 作变量传给函 add ,得出给果赋给指针 a 所指向的 mxArray 中的元素。因 a 是指向 plhs[0]所指向的 mxArray 的元素,所以后作输出时, plhs[0]所指向的 mxArray 赋值 给 output ,则 output 上面说一大堆指向这指向那,什么 mxArray ,初学者肯定都会被弄到头晕花 了。很歉,要搞清楚这些乱糟 实际上 mexFunction 是没有这么简单的, 我们要对户的输入量的个数和类 输入正确。如在 add 函数的例子中,用户输入 char array便是一种误了。 从上面的讲述中我们总结出, MEX 件实现了一接口,把 C 语言中的计结 适地返回给 Matlab 罢了。当们已经有用 C 写的大型程序时,大不必在 Matlab 里写,只写个接口,做成 MEX 文件就成了。另外,在 Matlab 程序中的 部份计算瓶(如循环),可通过 MEX 文件用 C 语言实现,以 ********************************************************************* ********************************************************************* *** mex 的目的 , 通过 C/C++语言编写代码 , 在 Matlab 中将其编成 mex 件主要可以做 1、快程序的执行速度 . Matlab在 for 上如老拉车的速度 2、 Matlab 作为 C++的开发调试环境 . 尤其是有大量数据需处理时 , Matlab 观察 3、称可以弥补 Matlab 硬件设备接口的 今天写了第一个使用 MEX. 一个单的对 Matlab 普通数值矩阵 其中 Matlab 规定的与操作系统版本有关的 mwSize,mwIndex, size_t 32位系 统上其实本 一律用 int 代 #include #include void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) { int i,j,k; int index; double* pr=NULL; double* pi=NULL; int M,N; int ndim; int dims[2]; for (i=0;i<> { if ((mxIsDouble(prhs[i]))&&(mxGetNumberOfDimensions(prhs[i])==2)) { pr=mxGetPr(prhs[i]); pi=mxGetPi(prhs[i]); M=mxGetM(prhs[i]); N=mxGetN(prhs[i]); ndim=mxGetNumberOfDimensions(prhs[i]); mexPrintf( for (j=0;j<> { dims[0]=j; for (k=0;k<> { dims[1]=k; index=mxCalcSingleSubscript(prhs[i],ndim,dims); if (pi==NULL) { mexPrintf( } else{ mexPrintf( } } mexPrintf( } } else{ mexPrintf( array\n } } } Result: >>mex test.cpp >> test(a,b,c) 变量 0: 0.35 0.62 0.83 0.20 0.47 0.59 0.25 0.35 0.55 变量 1: 0.92 0.38 0.53 0.57 0.29 0.57 0.78 0.47 0.76 0.08 0.93 0.01 0.75 0.05 0.13 0.34 变量 2: 0.16+ 0.87j 0.60+ 0.43j 0.45+ 0.14j 0.83+ 0.85j 0.11+ 0.08j 0.79+ 0.08j 0.26+ 0.91j 0.08+ 0.87j 0.54+ 0.62j 0.96+ 0.24j 0.31+ 0.40j 0.65+ 0.18j 0.23+ 0.58j 1.00+ 0.35j 0.00+ 0.12j 0.53+ 0.26j 0.69+ 0.26j 0.91+ 0.55j 0.08+ 0.51j 0.77+ 0.18j 0.17+ 0.80j 0.75+ 0.15j 0.15+ 0.14j 0.44+ 0.40j 0.82+ 0.24j >> help test 本序用于调试 mx______ Matlab 调用 c 程序 方法: 第一:要先在 matlab 中安装 c 键入命令:mex -setup; 选择 c/c++编 选择 c/c++编译器 确认。 第二步:键入:mex *.c 实例介绍:【转】 如果我 return x + y; } 现我想要在 Matlab 中使用它, >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎 解决方法之是要通过使用 MEX 件, MEX 文件使得调用 C 函数调用 Matlab 的内置数一样便。 MEX 文件由 C 代码加上 MEX 文 可以这样理解, MEX 文件实现种接口,它把在 Matlab 中调用函数时输入的 自量通过特定的接口调入了 C 函数,得出的果再通过该接口调回 Matlab 。 该特定接口的操作,包含在 mexFunction 这个函数中,使用者具体设。 所以现在我们要写一个包含 add 和 mexFunction 的 C 文件, Matlab 调用函数, 把函数中的自变(如上例中的 1.1和 2.2)传 mexFunction 的一个参数, mexFunction 把该值传给 add , 把得出的结果传给 mexFunction 的另一个参数, Matlab 通过该数来给出在 Matlab 语句中调函时的输值 (如上中的 a ) 。 比如该 C 文件已写,名为 add.c 。那 >> mex add.c 就能把 add.c 编译为 MEX 文件 (编译器的设置使用指 mex -setup ) , 在 Windows 中, MEX 文类型为 mexw32,即现在我们得 add.mexw32文件。现,我们 可以像调用 M 函数那样用 MEX 文件, 如上面说到的例子。 所以, 通过 MEX 文件, 使用 C 函数就和使用 M 函数 我 mexFunction 的 void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { } 可以看到, mexFunction 是没返回的,它不是通过返回值把结果传回 Matlab ,而通过对参数 plhs 的赋。 mexFunction 的四个数皆 >> b = 1.1; c = 2.2; >> a = add(b, c) mexFunction 四个参数的 nlhs = 1,说明调用语句左手面(lhs -left hand side)有个变,即 a 。 nrhs = 2,说调用语句右 plhs 是一个数, 其内容为指针, 该指针指向数据类型 mxArray 。 因为现在左手 面只有一个变量,该数组只一个指针, plhs[0]指向结果会赋值给 a 。 prhs 和 plhs 似,因为右手面两个自量,即该数组有个指针, prhs[0]向了 b , prhs[1]指向了 c 。要注意 prhs 是 const 的指针数组,即不能改 因为 Matlab 基本的单元为 array ,无论是什么类型也好,如有 double array 、 cell array、 struct array……所以 a,b,c 都是 array , b = 1.1便是一个 1x1的 double array。而在 C 语言中, Matlab 的 array 使用 mxArray 类型来表。 所以就不难明白为什 plhs 和 prhs 都是指向 mxArray 完整的 add.c // add.c #include // 执行具体工作的 C 函数 double add(double x, double y) { return x + y; } // MEX文件接 void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { double *a; double b, c; plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); a = mxGetPr(plhs[0]); b = *(mxGetPr(prhs[0])); c = *(mxGetPr(prhs[1])); *a = add(b, c); } mexFunction 的内容是什么意思呢?我们知,如果这 >> output = add(1.1, 2.2); 在未涉及具体的计算, output 的是未知的,是未赋值的。所以在体的程 序中,我们建立一个 1x1的实 double 矩阵(使用 mxCreateDoubleMatrix 函数, 其返回指向刚建立的 mxArray 的指针),然后令 plhs[0]指向它。接着令指针 a 向 plhs[0]所指向 mxArray 的第一个素(使用 mxGetPr 函,返指向 mxArray 的首素的指针)。同样地,们把 prhs[0]和 prhs[1]指向的元素 (即 1.1和 2.2)取出来赋给 b 和 c 。于我们可以把 b 和 c 作自变量给函数 add ,得出果赋给指针 a 所指向的 mxArray 中的元素。因为 a 是指向 plhs[0]所指的 mxArray 的元,所以后作输出时, plhs[0] 上面说一大堆指向这指向那,什么 mxArray ,初学者肯定都会被弄到头晕花 了。很歉,要搞清楚这些乱糟 实际上 mexFunction 是没有这么简单的, 我们要对户的输入量的个数和类 输入正确。如在 add 函数的例子中,用户输入 char array便是一种错误了。 从上面的讲述中们总结, MEX 文件实现一种接,把 C 语言中的计算结 适当地返回给 Matlab 了。我们已经有用 C 编写的大程序时,可不必在 Matlab 里重写,只写个接口,做 部份算瓶颈(如循环),可通过 MEX 文件用 C 言实现,以 ********************************************************************* ********************************************************************* *** mex 的目的 , 通过 C/C++语言编写代码 , 在 Matlab 中将其编成 mex 件主要可以做 1、快程序的执行速度 . Matlab在 for 上如老拉车的速度 2、 Matlab 作为 C++的开发调试环境 . 尤其是有大量数据需处理时 , Matlab 观察 3、称可以弥补 Matlab 硬件设备接口的 今天写了第一个使用 MEX. 一个单的对 Matlab 普通数值矩阵 其中 Matlab 规定的与操作系统版本有关的 mwSize,mwIndex, size_t 32位系 统上其实本 一律用 int 代 #include #include void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) { int i,j,k; int index; double* pr=NULL; double* pi=NULL; int M,N; int ndim; int dims[2]; for (i=0;i<> { if ((mxIsDouble(prhs[i]))&&(mxGetNumberOfDimensions(prhs[i])==2)) { pr=mxGetPr(prhs[i]); pi=mxGetPi(prhs[i]); M=mxGetM(prhs[i]); N=mxGetN(prhs[i]); ndim=mxGetNumberOfDimensions(prhs[i]); mexPrintf( for (j=0;j<> { dims[0]=j; for (k=0;k<> { dims[1]=k; index=mxCalcSingleSubscript(prhs[i],ndim,dims); if (pi==NULL) { mexPrintf( } else{ mexPrintf( } } mexPrintf( } } else{ mexPrintf( } } } Result: >>mex test.cpp >> test(a,b,c) 变量 0: 0.35 0.62 0.83 0.20 0.47 0.59 0.25 0.35 0.55 变量 1: 0.92 0.38 0.53 0.57 0.29 0.57 0.78 0.47 0.76 0.08 0.93 0.01 0.75 0.05 0.13 0.34 变量 2: 0.16+ 0.87j 0.60+ 0.43j 0.45+ 0.14j 0.83+ 0.85j 0.11+ 0.08j 0.79+ 0.08j 0.26+ 0.91j 0.08+ 0.87j 0.54+ 0.62j 0.96+ 0.24j 0.31+ 0.40j 0.65+ 0.18j 0.23+ 0.58j 1.00+ 0.35j 0.00+ 0.12j 0.53+ 0.26j 0.69+ 0.26j 0.91+ 0.55j 0.08+ 0.51j 0.77+ 0.18j 0.17+ 0.80j 0.75+ 0.15j 0.15+ 0.14j 0.44+ 0.40j 0.82+ 0.24j >> help test 本程序用于调试 mx______函数 . #include #include #include #include #define Map_list 6 #define Map_line 6 void map_printf(int x,int y,int b[][Map_list]) { int i,j; for(i=0;i<> { for (j=0;j<> { if(b[i][j]==10||b[i][j]==11) printf( if(b[i][j]==12) printf( else if(b[i][j]==0) printf( else if(b[i][j]==13) printf( else if(b[i][j]>0&&b[i][j]<> printf( } printf( } } void Move(int x,int y) { HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); COORD pos= {x, y}; SetConsoleCursorPosition(hOut, pos); } int kb_cursor() { int a=getch(); char input[2]; if(a<> { input[0]=a; input[1]=getch(); } else { input[1]=a; } return input[1]; } void HideCursor() { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } void printf_0(int b[][Map_list],int x,int y) { int i,j,n; if(x==0&&y==0) { n=0; for(i=0;i<> for(j=0;j<> if(b[x+i][y+j]==11) n++; if(n==0) { for(i=0;i<> for(j=0;j<> { if(b[x+i][x+j]==10) { b[x+i][y+j]=0; printf_0(b,x+i,y+j); } } } else b[x][y]=n; } else if(x==0&&y { n=0; for(i=0;i<> for(j=-1;j<> if(b[x+i][y+j]==11) n++; if(n!=0) b[x][y]=n; else for(i=0;i<> { if(b[x+i][y+j]==10) { b[x+i][y+j]=0; printf_0(b,x+i,y+j); } } } else if(x==0&&y==Map_list-1) { n=0; for(i=0;i<> for(j=-1;j<> if(b[x+i][y+j]==11) n++; if(n!=0) b[x][y]=n; else for(i=0;i<> for(j=-1;j<> { if(b[x+i][y+j]==10) { b[x+i][y+j]=0; printf_0(b,x+i,y+j); } } } else if(y==Map_list-1&&x!=0&x!=Map_line-1) { n=0; for(i=-1;i<> for(j=-1;j<> if(b[x+i][y+j]==11) n++; if(n!=0) b[x][y]=n; else for(i=-1;i<> for(j=-1;j<> { if(b[x+i][y+j]==10) { printf_0(b,x+i,y+j); } } } else if(y==Map_list-1&&x==Map_line-1) { n=0; for(i=-1;i<> for(j=-1;j<> if(b[x+i][y+j]==11) n++; if(n!=0) b[x][y]=n; else for(i=-1;i<> for(j=-1;j<> { if(b[x+i][y+j]==10) { b[x+i][y+j]=0; printf_0(b,x+i,y+j); } } } else if(x==Map_line-1&&y>0&&y n=0; for(i=-1;i<> for(j=-1;j<> if(b[x+i][y+j]==11) n++; if(n!=0) b[x][y]=n; else for(i=-1;i<> for(j=-1;j<> { if(b[x+i][y+j]==10) { b[x+i][y+j]=0; printf_0(b,x+i,y+j); } }else if(x==Map_line-1&&y==0) { n=0; for(i=-1;i<> for(j=0;j<> if(b[x+i][y+j]==11) n++; if(n!=0) b[x][y]=n; else for(i=-1;i<> for(j=0;j<> { if(b[x+i][y+j]==11) { b[x+i][y+j]=0; printf_0(b,x+i,y+j); } } } else if(x>0&&x n=0; for(i=-1;i<> for(j=0;j<> if(b[x+i][y+j]==11) n++; if(n!=0) b[x][y]=n; else for(i=-1;i<> for(j=0;j<> { if(b[x+i][y+j]==10) { b[x+i][y+j]=0; printf_0(b,x+i,y+j); } } } else { n=0; for(i=-1;i<> for(j=-1;j<> if(b[x+i][y+j]==11) n++; if(n!=0) b[x][y]=n; else for(i=-1;i<> for(j=-1;j<> { if(b[x+i][y+j]==10) { b[x+i][y+j]=0; printf_0(b,x+i,y+j); } } } } int main() { int kb,x=0,y=0; int old_value; int end; int a[Map_line][Map_list]= { {10,10,10,10,10,10}, {10,10,11,10,11,10}, {11,10,10,10,10,10}, {10,10,10,11,10,10}, {10,10,10,10,10,10}, {10,10,10,10,10,10} }; HideCursor(); old_value=a[0][0]; while (1) { map_printf(Map_line,Map_list,a); kb=kb_cursor(); switch(kb) { case 's':if(x<> a[x][y]=old_value; x++; old_value=a[x][y]; a[x][y]=13; } break; case 'w':if(x>0){ a[x][y]=old_value; x--; old_value=a[x][y]; a[x][y]=13;} break; case 'd':if(y<> a[x][y]=old_value; y++; old_value=a[x][y]; a[x][y]=13;} break; case 'a':if(y>0){ a[x][y]=old_value; y--; old_value=a[x][y]; a[x][y]=13;} break; case 13: if(old_value==10) { a[x][y]=0; printf_0(a,x,y); old_value=a[x][y]; } if(old_value==11) { a[x][y]=12; end=-1;} break; } system( if(end==-1) { map_printf(Map_line,Map_list,a); printf( break; } } system( 修改数组来改变地图 图大c语言简单程序代码
汉诺塔c语言程序代码
Matlab调用c语言程序代码
c语言扫雷程序代码