c语言中用函数交换两个变量的值方法是先将变量赋值给中间变量,然后中间变量再赋值给另外一个变量,程序如下:
目前成都创新互联公司已为上千余家的企业提供了网站建设、域名、虚拟主机、网站运营、企业网站设计、乌拉特后网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
#include "Stdio.h"
#include "Conio.h"
void swap(int x,int y)
{
int t,m;
t=x; //变量x赋值给中间变量t
m=y; //变量y赋值给中间变量m
x=m; //中间变量m赋值给变量x,将y的值赋值给了x。
y=t; //中间变量t赋值给变量y,将x的值赋值给了y。
}
main()
{
int a,b;
a=1,b=2;
swap(a,b); //调用交换函数
printf("%d,%d",a,b);
getch();
}
扩展资料:
C语言的语法结构:
1、顺序结构
顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。
例如:a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子里面的水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为:c = a; a = b; b = c;执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b =c;则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。
顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算、输出三步曲的程序就是顺序结构。
2、选择结构
对于要先做判断再选择的问题就要使用选择结构。选择结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。选择结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的选择语句。
选择结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。
3、循环结构
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do while循环和for循环。
四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误。
参考资料来源:百度百科-C语言
交换函数很好写。
比较难的读文件。文件格式 与 读语句要 相配。 特别是 多余 的 空行和回车键。
调试时用 printf 语句 检查 读得对不对。
fgets() 函数可用来读整行的字符串,含回车键。
#include stdio.h
#includestdlib.h
void jh(char *a, char *b){
char x[100];
strcpy(x,a),strcpy(a,b),strcpy(b,x);
}
int main(){
FILE *fp;
int n,i,j;
char a[100];
char b[100];
char ch;
if((fp=fopen("2.2.txt","r"))==NULL){
printf("Error");
exit(0);
}
fgets(a,100,fp);
sscanf(a,"%d",n);
//printf("n=%d\n",n);
for(j=1;j=n;j++){
fgets(a[0],100,fp);
//printf("read a: %s",a);
fgets(b[0],100,fp);
// printf("read b: %s",b);
printf("Case %d\n",j);
jh(a,b);
printf("%s",a);
printf("%s",b);
fgets(a[0],100,fp); // 假定2组数间只有一个空白行,则用它跳过。
}
fclose(fp);
return 0;
}
#includestdio.h
int fun1(int x)//素数判断函数
{
if(x2)
return 0;
for(int i=2;ix;i++)
if(x%i==0)
return 0;
return 1;
}
int fun2(int x)//完数判断函数
{
int sum=0;
for(int i=1;ix;i++)
if(x%i==0)
sum+=i;
if(sum==x)
return 1;
return 0;
}
int fun3(int *x,int *y)//两个数,交换地址函数
{
int t;
t=*x;
*x=*y;
*y=t;
}
int main()
{
int x,a=55,b=66;
scanf("%d",x);
if(fun1(x)==1)//引用 函数
printf("是素数\n");
else
printf("不是素数\n");
if(fun2(x)==1)//引用 函数
printf("是完数\n");
else
printf("不是完数\n");
printf("起始:a=55,b==66\n");
fun3(a,b);//引用函数
printf("a=%d b=%d",a,b);
return 0;
}
上面是素数,完数,交换地址,常用函数的定义与引用;
#include stdio.h
#define N 10
void Swap ( int *a, int *b, int n);
int main(void)
{
int *a, *b;
int num1[N], num2[N];
for (a = num1; a num1 + N; a++)
scanf ("%d", a);
for (b = num2; b num2 + N; b++)
scanf ("%d", b);
a = num1;//重新指向首地址
b = num2;//重新指向首地址
Swap (a, b, N);
printf ("*********交换后**********\n");
for (a = num1; a num1 + N; a++)
printf ("%3d", *a);
printf ("\n");
for (b = num2; b num2 + N; b++)
printf ("%3d", *b);
return 0;
}
void Swap (int *a, int *b, int n)
{
int temp;
int i;
for (i = 0; i n; i++)
{
temp = *(a + i);
*(a + i) = *(b + i);
*(b + i) = temp;
}
}
A函数的源码可控吗?如果可控,把对B函数的调用改成对新实现的调用就行了。
如果A函数不是自己写的(源码不可控),会麻烦一些。例如,在支持指针的语言上,可以修改B函数入口部分的汇编代码,jmp到自己的新实现。要求B函数和你的实现原型必须完全相同。
如何调用C语言写的库,如a.lib等,有对应的库头文件a.h。假设a.h中定义了函数:
int
WhyCoding(int
a,
float
b);
做法是,
/*
cpp_a.h
*/
extern
"C"
{
#include
"a.h"
}
或
/*
cpp_a.h
*/
extern
"C"
{
int
WhyCoding(int
a,
float
b);
/*
重定义所有的C函数
*/
}
从上面可以看出,extern
"C"
是用在C和C++之间的桥梁。之所以需要这个桥梁是因为C编译器编译函数时不带
函数的类型信息,只包含函数符号名字,如C编译器把函数int
a(float
x)编译成类似_a这样的符号,C连接器只要
找到了调用函数的符号,就可以连接成功,它假设参数类型信息是正确的,这是C编译连接器的缺点。而C++
编译器为了实现函数重载,编译时会带上函数的类型信息,如他把上面的a函数可能编译成_a_float这样的
符号为了实现重载,注意它还是没有带返回值得信息,这也是为什么C++不支持采用函数返回值来区别函数
重载的原因之一,当然,函数的使用者对函数返回值的处理方式(如忽略)也是重要原因。
基于以上,C调用C++,首先需要用封装函数把对C++的类等的调用封装成C函数以便C调用,于是extern
"C"
的
作用是:让编译器知道这件事,然后以C语言的方式编译和连接封装函数.(通常是把封装函数用C++编译器按C++
方式编译,用了extern
"C"
后,编译器便依C的方式编译封装接口,当然接口函数里面的C++语法还是按C++方式
编译;对于C语言部分--调用者,还是按C语言编译;分别对C++接口部分和C部分编译后,再连接就可以实现C
调用C++了).
相反,C++调用C函数,extern
"C"
的作用是:让C++连接器找调用函数的符号时采用C的方式,即使用_a而不是
_a_float来找调用函数。