C语言函数例题解析
C语言函数解析
- C语言函数例题解析
-
- 值传递
-
- 自定义函数求解一元二次方程
- 自定义函数计算给定日期是该年的第几天
- 地址传递
-
值传递
自定义函数求解一元二次方程
- 为了便于直接调用,采用了自定义函数在前,主函数在后的方法。
- 自定义函数分别对应三种根的情况
- 主函数中判别根的0正负
- 注意:运用到fabs()取绝对值与sqrt(开根号),要添加math头文件
- 整体代码
#include
#include
void fun1(int a, int b)
{
float x1;
x1=-b/(2.0*a);
printf("x1=x2=%f",x1);
}
void fun2(int a, int b, int c, float d)
{
float x1,x2;
printf("x1=%f\n",x1=(-b+sqrt(d))/(2.0*a));
printf("x2=%f\n",x2=(-b-sqrt(d))/(2.0*a));
}
void fun3(int a, int b, int c, float d)
{
float x1,x2,i1,i2;
printf("x1=%f+i%f\n",-b/(2.0*a),sqrt(-d)/(2.0*a));
printf("x2=%f-i%f\n",-b/(2.0*a),sqrt(-d)/(2.0*a));
}
int main()
{
int a,b,c;
float d;
printf("请依次输入一元二次方程的系数a,b,c:");
scanf("%d,%d,%d",&a,&b,&c);
d=b*b-4.0*a*c;
if(fabs(d)<1.0e-6)
{fun1(a,b);}
else if(d>0)
{fun2(a,b,c,d);}
else
{fun3(a,b,c,d);}
return 0;
}
自定义函数计算给定日期是该年的第几天
- 采用了主函数在前,自定义函数在后的方式,所以需要在主函数中对自定义函数进行声明——int fun(int a, int b, int c)
- 主函数输入年月日、调用自定义函数、输出天数
- 自定义函数 外层对月进行循环,要注意循环变量i要从1开始,否则就会是多计算一个月的天数。内层分支语句对日进行累加,(判断是否为闰二月)。
- 应注意:d累加需要赋初始值为0,在写完这道题测试时竟然没有结果,看了好久才发现在主函数的一开始scanf中没有写&使得用户输入的值根本就没有储存!!!说明做题时还是要耐心,最基本的语句不能再出错了。
- 整体代码
#include
int main()
{
int year,month,day;
printf("请依次输入年/月/日:");
scanf("%d/%d/%d",&year,&month,&day);
int fun(int a, int b, int c);
day=fun(year,month,day);
printf("该日期是该年的第%d天",day);
return 0;
}
int fun(int a, int b, int c)
{
int i,d=0;
for(i=1;i<b;i++)
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
d=d+31;
else if(i==2)
{
if ((a%4==0&&a%100!=0)||(a%400==0))
d=d+29;
else
d=d+28;
}
else
d=d+30;
}
c=d+c;
return c;
}
地址传递
自定义函数对N个数排序
- 自定义函数中利用选择排序,外层对轮次循环,内层对比较次数循环
- 主函数中要求要有输入、输出、调用、打印最终结果的语句
- 由于两个函数都将用户输入的数字定义为float型,所以导致在打印输入数字与比较后的数字时,带小数的数字有的会发生变化,例如输入52.8最后却输出52.799999,把用户一开始输入的值进行了更改。于是将最终打印的结果的精度设定为小数点后两位,解决了该问题。
- 整体代码
#include
void bijiao(float b[100], int c)
{
int j,k;
float t;
for (j=0;j<c-1;j++)
{
for (k=j+1;k<c;k++)
{
if(b[k]<b[j])
{
t=b[j];b[j]=b[k];b[k]=t;
}
}
}
}
int main()
{
int n,i;
float a[100];
printf("请输入参与比较的数的个数:");
scanf("%d",&n);
printf("请输入参与比较的数字:");
for (i=0;i<n;i++)
scanf("%f,",&a[i]);
for (i=0;i<n;i++)
printf("%.2f ",a[i]);
printf("\n");
bijiao(a,n);
for (i=0;i<n;i++)
printf("%.2f ",a[i]);
return 0;
}
自定义函数对字符串的处理
- 主函数中输入主串和子串,由于数组的长度必须是常量,于是各给一个50长度,然后调用两个自定义函数即可。
- 自定义函数中一个通过“外层循环遍历主串,内层将主串与子串挨个比较,当元素相同时进行循环,且当达到子串的结束符时将次数加一”来计算s1中出现s2的次数,另一个通过判断子串在主串中是否为空来打印NO!或者利用指针(上一节实验中的代码)来删除出现在主串中的子串字符。
- 整体代码
#include
#include
int main()
{
char s1[50],s2[50];
printf("请输入s1=");
gets(s1);
printf("请输入s2=");
gets(s2);
int num;
int fun1(char a[50], char b[50]);
int fun2(char a[50], char b[50]);
num=fun1(s1,s2);
printf("子串s2在主串s1中出现的次数num=%d\n",num);
fun2(s1,s2);
return 0;
}
int fun1(char a[50], char b[50])
{
int i,j,k;
int sum;
for(i=0;a[i]!='\0';i++)
for(j=i,k=0;a[j]==b[k];j++,k++)
{
if(b[k+1]=='\0')
sum++;
}
return sum;
}
int fun2(char a[50], char b[50])
{
char *p;
if (strstr(a,b)==NULL)
printf("NO!");
else
{
while(strstr(a,b)!=NULL)
{
p=strstr(a,b);
while(*p!='\0')
{
*p=*(p+strlen(b));
p++;
}
}
printf("s1=%s\n",a);
}
}