【C语言】自定义函数例题解析

C语言函数例题解析

C语言函数解析

  • C语言函数例题解析
    • 值传递
      • 自定义函数求解一元二次方程
      • 自定义函数计算给定日期是该年的第几天
    • 地址传递
      • 自定义函数对N个数排序
      • 自定义函数对字符串的处理

值传递

自定义函数求解一元二次方程

【C语言】自定义函数例题解析_第1张图片

  • 为了便于直接调用,采用了自定义函数在前,主函数在后的方法。
  • 自定义函数分别对应三种根的情况
  • 主函数中判别根的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;
	//printf("%f\n",d);
	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个数排序

【C语言】自定义函数例题解析_第2张图片

  • 自定义函数中利用选择排序,外层对轮次循环,内层对比较次数循环
  • 主函数中要求要有输入、输出、调用、打印最终结果的语句
  • 由于两个函数都将用户输入的数字定义为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;
} 

【C语言】自定义函数例题解析_第3张图片

自定义函数对字符串的处理

  • 主函数中输入主串和子串,由于数组的长度必须是常量,于是各给一个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);
	}
}

你可能感兴趣的:(C/C++,c语言)