C语言程序设计题题型汇总

题后总结!常看常新!

如有错误,还望指正!

注:题源于未来教育题库

题型一:数组问题

1-1 删除字符

实现fun,其功能是:将s所指字符串中ASCII值为奇数的字符删除,剩余字符形成的新串放在t所指数组中。

例如,若s所指字符串中的内容为: "ABCDEFG12345",其中字符A的ASCII码值为奇数字符1的ASCll码值也为奇数都应当删除,其它依此类推。最后t所指的数组中的内容应是:"BDF24"。

#include <string.h>//说明可以使用strlen(),一般题目未明确说不能使用strlen(),就可以直接使用该函数来计算字符串长度
void  fun(char  *s, char  t[])
{
     int i,j=0;//j作为数组t的数组长度
     for(i=0;i<strlen(s);i++)
     {
         if(!(s[i]%2==1)) t[j++]=s[i];//数组t赋值后,j自增
     }
     t[j]='\0';//设置休止符
}

批注:

(1)ASCII码值为奇数字符满足s[i]%2==1;ASCII码值为偶数字符满足s[i]%2==0

(2)逻辑非!的使用

(3)新数组单独计数t[j++]=s[i];

同类型题1编写函数fun该函数的功能是:将s所指字符串中ASClI码值为偶数的字符删除,串中剩余字符形成一个新串放在t所指的数组中

if(!(s[i]%2==0)) t[j++]=s[i];


同类型题2函数fun的功能是:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删除,s所指串中剩余的字符形成的新串放在t所指的数组中

if(!(i%2==0&&s[i]%2==1)) t[j++]=s[i];

【同类型题3】删除字符串中所有的空格

if(str[i]!=' ')str[j++]=str[i];

【同类型题4】在此程序中,规定输入的字符串中只包含字母和*号。请编写函数fun,其功能是:除了字符串前导的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。【利用指针进行字符的删除】
例如,字符串中的内容为:****A*BC*DEF*G*******,删除后,字符串中的内容应当是: ****ABCDEFG。

void  fun( char *a )
{
	int k=0;
	char *p=a;
	while(*p&&*p=='*')//如果当前内容*p不为空且内容为星号则存入数组a中
	{
		a[k++]=*p++;
	}
	while(*p)//继续遍历
	{
		if(*p!='*') {a[k++]=*p++;}//如果非星号则存入数组a中,并指针向前
		else p++;//如果是星号则指针向前
	}
	a[k]='\0';//设置休止符
}

【同类型题5】 在此程序中,规定输入的字符串中只包含字母和*号。请编写函数fun,其功能是:将字符串尾部的*号全部删除,前面和中间的*号不动。
例如,字符串中的内容为:“****A*BC*DFF*G********",删除后,字符串中的内容应当是:"****A*BC*DEF*G"。在编写函数时,不得使用C语言提供的字符串函数。

void  fun( char *a )
{
	while(*a)//使指针指向休止符的位置
	{
		a++;
	}
	a--;//使指针指向最后一个字符的位置
	while(*a=='*')//如果是*则指针后移
	{
		a--;
	}
	*(a+1)='\0';//设置休止符,意味着在非星号后赋值为休止符,起到删除字母后的所有的星号的作用

}

【同类型题6】在此程序中,规定输入的字符串中只包含字母和*号。请编写函数fun,其功能是︰将字符串中的前导*号全部移到字符串的尾部
例如,字符串中的内容为:"*******A*BC*DEF*G****”,移动后,字符串中的内容应当是:"A*BC*DEF*G***********“。在编写函数时,不得使用C语言提供的字符串函数。

void  fun( char *a )
{
	int n=0,k=0;//n用于记录字母前的星号数量,k表示字符串(数组)a的字符个数
	char *p=a;//使p指针指向字符串a的首地址
	while(*p&&*p=='*')//记录字母前的星号数量
	{
		n++;
		p++;
	}
	while(*p)//从字母开始对数组进行赋值
	{
		a[k++]=*p++;
	}
	while(n--)//数组加上n个星号
	{
		a[k++]='*';
	}
	a[k]='\0';//设置休止符
}

【同类型题7】请编写函数fun,其功能是:只删除字符前导和尾部的*号,串中字母间的*号都不删除。形参n给出了字符串的长度,形参h给出了字符串中前导号的个数,形参e给出了字符串中尾部*号的个数。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为: "****A*BC*DEF******".
删除后,字符串中的内容应当是: "A*BC*DEF*G" 。

void  fun( char *a, int n,int h,int e )//n:字符串的长度,h:字符串中前导号的个数,e :字符串中尾部*号的个数
{
	int i,j=0;
	for(i=h;i<n-e;i++)//截取索引值在[h,n-e-1]的字符
	{
		a[j++]=a[i];
	}
	a[j]='\0';
}

【同类型题8】请编写函数fun,fun的功能是按顺序将形参a所指的字符串中每个单词的第一个字母取出,依次存放到形参b所指的字符串中去。形参a所指的字符串中的单词以一个或多个空格进行分隔,字符串首部和尾部可以有一个或多个空格。

思路:a找到一个单词首字母,就放到b指向的内存空间,b移动到下一个内存空间,a继续找,如果又找到啦,就放到b指向的内存空间,依次类推。就是一个寻找和存放的过程。【或者想象成在所有的班里依次找到各班的第一名,放在一起组成一个新的班级】

 

void fun(char *a,char *b)
{
	while(*a==' ')//找到字符串的第一个单词的首字母
	{
		a++;
	}//结束该循环时,则意味着已经找到了第一个字母
	*b++=*a++;//使b指向a所指的字符(第一个单词的首字母),然后指针a向前,指向下一个字符。
指针b也向前,指向下一个内存空间;
	while(*a)//遍历剩余字符串,若遍历到休止符则结束循环。a有四种指向结果:1.单词首字母。2.非单词首字母。3.空格。4.休止符
	{	
		if(*(a-1)==' '&&*a!=' ')//遍历到单词的首字母(首字母前有空格)
		{
			*b++=*a;//使b指向a所指向的单词的首字母,然后指针b向前,指向下一个内存空间
		}
		a++;//指针后移,继续遍历

	}
	*b='\0';//赋休止符
}

 批注:

(1)*b++=*a++;意味着先赋值,后指针向前

(2)休止符'\0'的ASCII码是0。即printf("%d",'\0');输出为0。

【同类型题9】请编写函数fun,其功能是从一行单词字符串数组a中分别提取每个单词尾部的字母组成一个新的字符串数组b,并通过实参返回。单词分隔是以—个空格或几个空格进行分隔。
例如:This is a C program
输出:ssaCm

方法一:

void fun(char a[], char b[])
{
	while(*a)
	{
		if((*(a+1)==' '||*(a+1)=='\0')&& *a!=' ')
		{
			*b++=*a;
		}
		a++;
	}
	*b='\0';
}

 方法二:

void fun(char a[], char b[])
{
	 int i,j = 0;
    for ( i = 0; a[i]!='\0'; i++)
    {
        if (a[i] != ' ' && (a[i+1]=='\0' || a[i + 1] == ' '))
            b[j++] = a[i];
    }
    b[j] = '\0';

}

1-2 数组去重

编写函数fun,该函数的功能是:删除一维数组中所有相同的数,使之只剩一个数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。
例如,若—维数组中的数据是:2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10删除后,数组中的内容应该是:2 3 4 5 6 7 8 9 10

int fun(int a[], int n)
{
   int i,j;
   for(i=0,j=1;j<n;j++)
   {
		if(a[i]!=a[j]) a[++i]=a[j];//j位置的元素与前一个i的元素不相等,则排在位置i的后面(++i)
   }
   return ++i;//由于i代表的数组a最后一个元素的索引值,而数组元素个数=最后一个元素索引值+1
}

批注:
(1)for(循环变量赋初值;循环条件;循环变量增值)

循环变量赋初值表达式可多个,用逗号“,"隔开。只执行一次。

循环循环变量增值表达式可多个,用逗号“,"隔开。用于调整循环。

循环条件使用逻辑表达式。

(2)区分a[++i]=a[j];与a[i++]=a[j];

当i初始值为0时,a[++i]=a[j]意味着a[j]赋值给a[1],后面的赋值同理i先自增再赋值

当i初始值为0时,a[i++]=a[j]意味着a[j]赋值给a[0],   后面的赋值同理i先赋值再自增

1-3 元素转换

 编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置的字母转换为大写(若该位置上不是字母,则不转换)。
例如,若输入"abc4Efg",则应输出"aBc4EFg"。

#include <string.h>
void fun( char *ss )
{
	int i;
	for(i=0;i<strlen(ss);i++)
	{
		if(i%2==1&&'a'<=ss[i]&&ss[i]<='z')
				ss[i]-=32;
	}
}

批注:小写字母=对应大写字母+32;例如:'a'='A'+32。若忘记这个数量关系,可以在程序中通过printf("%d",'a'-'A');来得到。

【同类型题1】请编写函数fun,其功能是:将形参数组x中的偶数下标位置元素用2求余,奇数下标位置元素用3求余,用求余的结果更新数组原有位置处的元素。函数形参n是数组中的元素个数。
例如:当数组x内容为11,24,16,79,60,2,则程序的输出结果是:1,0,0,1,0,2,

void fun(int x[], int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		if(i%2==0)x[i]=x[i]%2;//偶数下标位置元素用2求余的结果来代替
		else x[i]=x[i]%3;//奇数下标下标位置元素用3求余的结果来代替
	}

}

【同类型题2】请编写函数fun,其功能是将形参s所指的字符串中的数字字符转换为—个整数并返回。形参s所指的字符串中的第一个字符可以为“+”或“-”,字符串中可以包含字母或数字,当碰到第一个字母时,转换过程结束。
例如:当s所指的字符串为“-123”时,返回值为-123;当s所指的字符串为“123”时,返回值为123。

int fun(char *s)
{
	int n=0,flag=1;
	if(*s=='-')    
	{
		flag=-1;
		s++;    //指针后移
	}
	else if(*s=='+')
	{
		s++;
	}

	while(*s>='0'&&*s<='9')//数字字符
	{
		n=n*10+(*s-'0');    //字符转整数
		s++;
	}

	return n*flag;
}

1-4 移动字符

fun的功能是:移动字符串中的内容,移动的规则是把第1~m个字符,平移到字符串的最后,把第m + 1到最后的字符移到字符串的前部。【前移m个字符】
例如,字符串中原有的内容为"ABCDEFGHIJK",m的值为3,移动后,字符串中的内容应该是"DEFGHIJKABC"。
 

void fun (char  *w,int  m)
{
  char a;//用于存储每次移动前的首字符
  int i,j;
  for(i=0;i<m;i++)//移动m次
  {
	  a=w[0];//保存每次移动前的首字符
	  for(j=1;j<strlen(w);j++)
	  {
		  w[j-1]=w[j];//元素前移
	  }
	  w[j-1]=a;//将移动前的首字符赋值给移动后的最后位置
  }
}

批注:退出内循环时,最后一个元素位置为j-1,休止符位置为j

【同类型题1】编写函数fun,函数的功能是:移动一维数组中的内容,若数组中有n个整数,要求把下标从0~p(含p,p小于等于n-1)的数组元素平移到数组的最后。例如,—维数组中的原始内容: 1,2,3.4,5,6,7,8,9,10;p的值为3。移动后,一维数组中的内容应为:5,6,7,8,9,10,1,2,3.4。

void  fun(int  *w, int  p, int  n)
{
	int i,j,t;
	for(i=0;i<=p;i++)
	{
		t=w[0];
		for(j=1;j<n;j++)
		{
			w[j-1]=w[j];
		}
		w[j-1]=t;
	}
}

1-5 计数

编写函数fun,该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放入主函数的age数组中。要求函数把0~9岁年龄段的人数放在d[0]中,把10~19岁年龄段的人数放在d[1]中,把20~29岁年龄段的人数放在d[2]中,依此类推,把100岁(含100岁)以上年龄的人数都放在d[10]中。结果在主函数中输出。
 

# define N  50
# define M  11   // int  age[N], i, d[M];
void fun(int *a,  int *b)  //  fun( age, d);
{
	  int i;
	  for(i=0;i<M;i++)//数组b初始化,M个年龄组
	  {
		  b[i]=0;     //b[0]~b[10]
	  }
	  for(i=0;i<N;i++)//N个年龄
	  {
		  if(a[i]>100) b[10]++;  //年龄大于100的放入b[10],由于年龄大于100进行a[i]/10可能会超出b数组的长度
		  else b[a[i]/10]++;  //其余年龄的年龄组序号=年龄/10
	  }
}

批注:

(1)计数数组记得初始化!否则会报错!

(2)由于年龄大于100进行a[i]/10可能会超出b数组的长度,也会报错!

【同类型题1】在此程序中,编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。字符串在主函数中输入,规定所有单词由小写字母组成,单词之间有若千个空格隔开,一行的开始没有空格。

int  fun( char  *s)
{
	int i,n=0;
	for(i=0;i<strlen(s);i++)
	{
		if(s[i]!=' '&&(s[i+1]==' '||s[i+1]=='\0'))//把每个单词看成一个整体,如果该单词不是空格且后面不是空格或休止符,则算一个单词
		{
			n++;
		}
	}
	return n;//返回单词个数

}

【同类型题2】请编写函数fun,其功能是:找出用1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数然后把这些三位数按从小到大的顺序依次存入相应的数组xxx中,符合条件的个数由函数值返回

int fun(int xxx[])
{
	int i,j=0,a,b,c;
	for(i=123;i<=432;i++)
	{
		a=i/100;//百位数
		b=i/10%10;//十位数
		c=i%10;//个位数
		if(a!=b&&b!=c&&c!=a&&a>0&&a<5&&b>0&&b<5&&c>0&&c<5)//互不相等,且a=[1,4],b=[1,4],c=[1,4]
		{
			xxx[j++]=i;
		}
	}
	return j;

 

【同类型题3】请编写函数fun,其功能是:从一个整数数组中,统计出有重复数字数的个数存于m中,m值由函数值返回。***
例如:2430,3001,1798,199,498,277,229,851,369,1146其中如:3001中有重复的数字0
输出: Total Num=5

方法一:

int fun(int a[], int n)
{
	int i,j,num=0,flag=0;//num用于计数,flag用来判断数字是否重复
	for(i=0;i<n;i++)
	{
		int b[11]={0};//辅助计数数组初始化,每记录一个数,就重新初始化一次,注意!!!
		while(a[i])//依次记录各个位数的数字(对应位置加一)
		{
			b[a[i]%10]++;
			a[i]=a[i]/10;
		}
		b[10]='\0';//计数数组赋休止符
		for(j=0;j<10;j++)
		{
			if(b[j]>1) flag=1;//b[j]>1意味有重复数字出现
		}
		if(flag==1)
		{
			num++;//个数加一
			flag=0;//对flag重新赋值为0,方便判断下一个数是否有重复数字,易错!!!
		}
	}
	return num;
}

 方法二:

int fun(int a[], int n)
{
	int j,k,s,m, b[10],i=0,sum=0,flag=0;
	for(;i<n;i++)
	{
		j=0;//数组b重新赋值
		while(a[i])//把数字的各个位数依次放入数组b中
		{
			b[j++]=a[i]%10;
			a[i]=a[i]/10;	
		}
	
		for(k=0;k<j;k++)//对数组b进行比较操作
		{
			s=b[k];//当前这个数字和后面所有数字依次比较
			for(m=k+1;m<j;m++)
				if(s==b[m]) flag=1;		
		}
			if(flag==1)
			{
				sum++;
				flag=0;//flag标志重新赋值为0,继续判断下一个数
			}
	}
	return sum;   
}

【同类型题4】请编写函数fun(char*sp,int *ct),其功能是,对传给sp的字符串,分别统计两个相连字母“ea”, “ou”和“iu°出现的次数(不能使用函数strstr()),并将统计结果存入ct所指数组中
例如:若字符串的内容为"abeaeafeeaoukgdoouuoiouifwieeotiu",则运行结果为:3,3,1。

方法一:

void fun(char*sp ,int *ct)
{
	char *p1=sp,*p2=sp,*p3=sp;
	ct[0]=0;ct[1]=0;ct[2]=0;//计数数组初始化

	while(*p1)//分组统计
	{
		if(*p1=='e' &&*(p1+1)=='a'){ct[0]+=1;}
		p1++;
	}
	while(*p2)
	{
		if(*p2=='o' &&*(p2+1)=='u'){ct[1]+=1;}
		p2++;
	}
	while(*p3)
	{
		if(*p3=='i' &&*(p3+1)=='u'){ct[2]+=1;}
		p3++;
	}

}

 方法二:

void fun(char*sp ,int *ct)
{
	int i;
	for (i = 0; i < 3; i++)//计数数组初始化
	{
		ct[i] = 0;
	}

	for (i = 0; sp[i]!='\0'; i++)//分三种情况统计
	{
		if (sp[i] == 'e' && sp[i+1] == 'a')
		{
			ct[0]++;
		} 
		else if (sp[i] == 'o' && sp[i+1] == 'u')
		{
				ct[1]++;
		} 
		else if (sp[i] == 'i' && sp[i+1] == 'u')
		{
				ct[2]++;
		}
	}
}

 批注:一般涉及对字符串中的字符的操作,可以使用指针,更为方便。

1-6 字符串分解

请编写函数fun,其功能是:编写函数char *fun(char * s0,char*s1,char *s2, char *s3),要求实现:
将sO所指字符串分解成三个字符串,分别存入s1、s2、s3所指内存中。分解的方法是,s1、s2、s3从sO中依次顺序每隔3个字符取1个。

例如,sO为"abcdefghij"时,分解完成后,s1、s2、s3分别为:"adgj". "beh"、"cfi。

void fun(char * s0,char *s1,char *s2, char *s3)
{   //思路:分组进行赋值     
	int i,n1=0,n2=0,n3=0;
	for(i=0;i<strlen(s0);i=i+3)
	{
		s1[n1++]=s0[i];
	}
	for(i=1;i<strlen(s0);i=i+3)
	{
		s2[n2++]=s0[i];

	}
	for(i=2;i<strlen(s0);i=i+3)
	{
		s3[n3++]=s0[i];

	}
	s1[n1]='\0';//注意设置休止符
	s2[n2]='\0';
	s3[n3]='\0';
}

1-7 字符串合并

请编写函数fun,其功能是:将具有n个元素的形参数组x中的偶数依原顺序输出到字符数组str中,每个数字后面加—个小数点,并生成一个结果字符串str由函数返回
例如,当数组x内容为1,4,19,82,61,2,输出结果是:4.82.2.

/* 函数int_to_str的功能是将参数n中的整数转换成字符串,整数转换成字符串 */
void int_to_str(int n,char *s)
{
    sprintf(s,"%d",n);	
}

char  *fun(int x[], int n)
{
    static char str[200],s[10];
    int i;
    *str = 0;
    /* 请在这里填入你编写的代码*/
	for(i=0;i<n;i++)
	{
		if(x[i]%2==0)//x[i]为偶数
		{
			int_to_str(x[i],s);//把x[i]转换成字符串,整数转换成字符串
			strcat(str,s);//把s加在str的后边
			strcat(str,".");//把小数点加在str的后边
		}
	}

    return str;
}

 批注:常见字符串函数#include <string.h>

(1)strcat函数用于字符串的连接。strcat(str1,str2):把str2加在str1的后边。

注意:strcat(str,".");是双引号,strcat是对两个字符串进行操作。

(2)strcpy函数用于字符串的复制。strcpy(str1,str2):将str2复制到(覆盖)str1。可用于字符串的初始化。

(3)strcmp函数用于字符串的比较。strcmp(str1,str2):自左向右依次比较str1和str2中的字符的ASCII码,直到遇到不同的字符或休止符为止。

strcmp(str1,str2)的三种结果:

  • 0:str1==str2
  • 正数:str1>str2
  • 负数:str1<str2

题型二:数学问题

2-1 长整型

函数fun的功能是:将a、b中的两个正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的十位和千位上, b中的十位和个位数依次放在变量c的个位和百位上。
例如,当a=45, b=12。调用该函数后,c=5241。

void fun(int  a, int  b, long  *c)
{
	*c=(a/10)*10+(a%10)*1000+(b/10)+(b%10)*100;

}

批注:

(1)得到a的十位数:a/10; 得到a的个位数:a%10;

(2)long *c表示指针变量c所指向的内存地址存放long类型的数据,c为指针变量名,表示指针变量所指向的内存地址,*c是指针所指向的地址所存放的内容。

    //&取地址符号,%p输出地址的格式符 
    int i=1;
    int *p=&i;      //使一级指针p指向i的内存地址 
    printf("%p",p);//输出000000000062FE14
    printf("\n%p",&i); //000000000062FE14
    
    printf("\n%d",*p); //输出1,*p表示p指向的内存地址所存放的内容 
    printf("\n%d",i);  //输出1        
    
    int **P=&p;       //使二级指针P指向p的内存地址  
    printf("\n%p",*P);  //输出000000000062FE14 
    printf("\n%p",&p); //输出000000000062FE08 
    printf("\n%p",&*P); //输出000000000062FE08 
    
    printf("\n%d",**P);  //输出1
    printf("\n%d",*P);  //输出6487572 
    printf("\n%d",p);   //输出6487572 

【同类型题1】编写函数fun,其功能是:将a、b中的两个两位正整数合并成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的百位和个位上,b中的十位和个位数依次放在变量c的十位和千位上
例如,当a=45,b=12,调用该函数后c =2415。

void fun(int a, int b, long *c)
{

	*c=(a/10)*100+(a%10)+(b/10)*10+(b%10)*1000;

}

【同类型题2】编一个函数double fun(double h),该函数的功能是:使变量h中的值保留两位小数,并对第三位进行四舍五入(规定h中的值为正数)。
例如,若h值为1234.567,则函数返回1234.570000;若h值为1234.564,则函数返回1234.560000。

double fun ( double  h )
{
	long a=(h*1000+5)/10;  //1234.567 ->1234567 ->1234572 -> 123457 ->
	return a*0.01; // 1234.570000,将长整型转浮点型
}

批注:

(1)long int 取值范围:-2147483648 ~ 2147483647

unsigned long int 取值范围:0 ~ 4294967295

2-2 平均数

在此程序中,m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平
均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。

例如,当score数组中的数据为10、20、 30、40、50、60、 70、80、90时,函数返回的人数应该是4,below中的数据应为10、20、30、 40。

int fun(int score[], int m, int below[])
{
	int i,n=0;
	double sum=0.0;
	for (i = 0 ; i < m ; i++)//计算总分
	{
		sum+=score[i];
	}
	for (i = 0 ; i < m ; i++)
	{
		if(score[i]<sum/m)//若小于平均分则放入below数组
		{
			below[n++]=score[i];
		}
	}
	below[n]='\0';
	return n;
}

【同类型题1】在此程序中,学生的记录由学号和成绩组成。N名学生的数据已放入主函数中的结构体数组s中,请编写函数fun,其功能是〉把高于等于平均分的学生数据放在b所指的数组中,高于等于平均分的学生人数通过形参n传回,平均分通过函数值返回

double  fun( STREC  *a, STREC *b, int *n )
{
	int i,k=0;//k用于记录分数>=平均分的人数
	double sum=0.0;
	for(i=0;i<N;i++)//求分数总和
	{
		sum=sum+a[i].s;
	}
	for(i=0;i<N;i++)//将分数>=平均分的人存放到数组b
	{
		if(a[i].s>=sum/N) b[k++]=a[i]; 
	}
	*n=k;//将分数>=平均分的人数通过n返回
	return sum/N;//返回平均分

}

 【同类型题2】请编写函数fun,其功能是:在一个含有11个四位数的数组中,统计出这些数的奇数、偶数个数,然后计算出个数多的那些数的算术平均值并由函数返回,个数通过yy传回。
例如,若11个数据为:
1101,1202,1303,1404,1505,2611,2712,2813,2914,3202,4222则输出: yy=6, pjz=2609.33

double fun( int xx[], int *yy )
{
     int i,n1=0,n2=0;
	 double sum1=0.0,sum2=0.0;//函数要求返回double 型
	 for(i=0;i<N;i++)
	 {
		 if(xx[i]%2==0)    //偶数
		 {
			 n1++;        //计数
			 sum1=sum1+xx[i];    //求和
		 }
		 else
		 {
			 n2++;
			 sum2=sum2+xx[i];
		 }
	 }

	 if(n1>n2)    //若偶数个数多于奇数个数
	 {
		 *yy=n1;    //通过yy返回偶数个数
		 return sum1/n1;    //返回平均值
	 }
	 else    //否则返回奇数个数,所有奇数的平均值
	 {
		 *yy=n2;
		 return sum2/n2;
	 }
}

2-3 除数

编写函数void fun (int x, int ppD, int *n),它的功能是:求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回
例如,若x中的值为30,则有4个数符合要求,它们是1、3、5、15。

void  fun ( int x, int  pp[], int *n )
{
	int i,j=0;
	for(i=1;i<x;i++)//i的除数范围[1,i-1]
	{
		if(x%i==0&&i%2==1) pp[j++]=i;
	}
	pp[j]='\0';
	*n=j;
}

批注:也可以通过改变i的步长来排除偶数除数for(i=1;i<x;i=i+2)

若i+2,则i不会发生变化!i=i+2才能让i值发生变化。

【同类型题1】请编写函数fun,其功能是:统计出x所指数组中能被e整除的所有元素,这些元素的和通过函数值返回主函数,元素个数通过形参num返回主函数。x所指数组的元素个数通过形参n传入。
例如,当数组x内容为1,9,8,6,12,整数e内容为3时,输出结果应该是:sum=27,num=3

int fun(int x[], int n, int e, int *num)
{
	int i,sum=0,k=0;
	for(i=0;i<n;i++)
	{
		if(x[i]%e==0) //数组x中可以被e整除的数
		{
			sum=sum+x[i];//求和
			k++;//个数+1
		}
	}
	*num=k;//通过num返回数组x中可以被e整除的数的个数
	return sum;

}

批注: 记录个数也可以通过:

    *num=0;//赋初值

    for(i=0;i<n;i++)
    {
        if(x[i]%e==0) //数组x中可以被e整除的数
        {
                (*num)++;
        }
    }

 【同类型题2】请编写函数fun,其功能是∶统计出x所指数组中能被e整除的元素个数,通过函数值返回主函数;同时,计算不能被e整除的元素之和,放到形参sum所指的存储单元中
例如,当数组x内容为1,7,8,6,10,15,11,13,29,31,整数e内容为3时,输出结果应该是:n=2.sum=110

int fun(int x[], int e, int *sum)//返回可以被e整除的个数,sum返回不能被e整除的数之和
{
	int i,n=0;
	*sum=0;
	for(i=0;i<N;i++)
	{
		if(x[i]%e==0)
		{
			n++;
		}
		else
		{
			*sum+=x[i];
		}
	}
	return n;//返回可以被e整除的个数

}

2-4 特别的数

请编写函数fun,其功能是:给定一个整数n (n<10000),如果n加上100后是一个完全平方数(所谓“完全平方数”,就是开方后的结果是整数的数),并且n加上268也是一个完全平方数,则函数值返回1,否则返回0。

int fun(long n)
{
	int a,b;
	a=(int) sqrt((double) n+100);
	b=(int) sqrt((double) n+268);
	if(a==sqrt((double) n+100)&&b==sqrt((double) n+268)) return 1;//判断开方后是否为整数,若左式==右式,则代表开方后为整数
	else return 0;
}

批注:

(1)求开方 :double sqrt((double) n)

(2)强制转换:a=(int) sqrt((double) n+100);

涉及强制转换的例题:求双精度aa的整数部分和小数部分

void  fun(  double  aa, int  *x, double  *y )

    *x=(int)aa;//整数部分
    *y=aa-*x;//小数部分

}

【同类型题1】请编写函数fun,其功能是:求n (n<10000)以内的所有四叶玫瑰数并逐个存放到result所指的数组中,四叶玫瑰数的个数作为函数值返回。
如果一个4位正整数等于其各个数字的4次方之和,则称该数为四叶玫瑰数。
例如,1634 = 1*1*1*1+6*6*6*6+ 3*3*3*3+4*4*4*4,因此1634就是一个四叶玫瑰数。

int fun(int n, int result[])//n = fun(9999, result);
{ 
	int i,a,b,c,d,j=0;
	for(i=1000;i<n;i++)//i为四位正整数数
	{
		a=i/1000;//千位数
		b=i/100%10;//百位数
		c=i/10%10;//十位数
		d=i%10;//个位数
		if(i==a*a*a*a+b*b*b*b+c*c*c*c+d*d*d*d)//判断是否是四叶玫瑰数
		{
			result[j++]=i;
		}
	}
	result[j]='\0';
	return j;//数组result的长度就是四叶玫瑰数的个数

}

【同类型题3】有一个很奇怪的车牌号,它是一个4位十进制数,是某一个数的平方数,且这4个数字从右至左一个比一个小。程序的功能是把这个车牌号找出来。请编写函数fun,其功能是:将一个4位数的每一位数分离出来,并依次存放在结构体变量成员中,通过函数值返回给主函数。
例如,一个4位数n为2579,则应把2放在res.m3中,把5放在res.m2中,把7放在res.m1中,把9放在res.m0中。
程序正确运行后的输出结果是:No. is 1369

struct BITS { int  m3, m2, m1, m0; };//千位,百位,十位,个位
struct BITS  fun(int  n)//对结构体进行赋值
{
   struct BITS  res;
/* 在这里将函数代码补充完整 */
   res.m3=n/1000;       //千位
   res.m2=n/100%10;    //百位
   res.m1=n/10%10;    //十位
   res.m0=n%10;      //个位
   return res;
}


main( )//主函数
{	struct  BITS  a;	
	int  i=0, n=0;
	for (i=32; i<100; i++)
	{	n = i * i;  //平方数
		a= fun(n);
		if (a.m3 < a.m2 && a.m2 < a.m1 && a.m1 < a.m0) //判断车牌号
		printf("No. is %d\n", n);
	}
}

 2-5 素数

编写-个函数void fun(int m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入xx所指的数组中
例如,若输入17  5,则应输出19、23、29、31、37。

void fun(int m,int k,int xx[])
{
   int i,j,n=0;
   for(i=m+1;n<k;i++)//大于m的k个素数,所以要循环k次
   {
	   for(j=2;j<i;j++)//i的除数范围[2,i-1]
	   {
		   if(i%j==0)break;//非素数i:i可以被j整除,就结束循环,此时i<j
	   }
	   if(j>=i) xx[n++]=i;//素数:不可以被j整除,此时j>=i
   }//若改成if(j<i) xx[n++]=i; 则xx里的非素数为18 20 21 22 24
   xx[n]='\0';
}

批注:用循环判断素数i,若能被j整除则中断循环,此时仍符合循环条件i<j【非素数】,则意味着不能被整除时j>=i【素数】

【同类型题1】找出小于或等于lim的素数存入aa数组中并统计素数个数

int fun(int lim, int aa[MAX])
{
  /* 以下代码仅供参考 */
  int i,j,k=0;
  /* 其中变量k用于统计素数个数 */
  for(i=2;i<=lim;i++)
  {
    /* 以下找出小于或等于lim的素数存入aa数组中并统计素数个数 */
	  for(j=2;j<i;j++)
	  {
		  if(i%j==0) break;
	  }
	  if(j>=i) aa[k++]=i;
  }
  return k;
}

【同类型题2】编写函数fun,该函数的功能是:判断字符串是否为回文,若是,则函数返回1,主函数中输出YES",否则返回o,主函数中输出"NO"。回文是指顺读和倒读都—样的字符串。
例如,字符串LEVEL是回文,而字符串123312就不是回文。

int fun(char *str)
{
	int i,j;
	int frag=0;
	for(i=0;i<=strlen(str)/2;i++)
	{                                            //第一个和倒数第一个比较,依次比较(字符串长度/2)次
		if(str[i]!=str[strlen(str)-1-i]) break; //当不是回文时,i<=strlen(str)/2
	}
	if(i>strlen(str)/2) frag=1;//不符合for循环的循环条件就是回文,即i>strlen(str)/2
	return frag;
}

【同类型题3】根据哥德巴赫猜想,任意一个大偶数都可以分解为两个素数之和。但许多偶数分解为两个素数之和并不是唯一的。
请编写函数fun,其功能是:求1000(不包括1000)以内的所有恰好能分解成10组两个素数之和(5+109和109+5被认为是同一组)的偶数,并依次存入数组a中并在屏幕上打印出来,打印时每个数单独一行,符合条件的个数通过函数值返回。
例如,114=5+109=7+107=11+103=13+101=17+97=31+83=41+73=43+71=47+67=53+61
114恰好可以分解为10组素数之和,因此114是我们要找的偶数。
而116=3+113=7+109=13+103=19+97=37+79=43+73
120=7+113=11+109=13+107=17+103=19+101=23+97=31+89=37+83=41+79 =47+73=53+67=59+61116可以分解为6组素数之和,120可以分解为12组素数之和,因此116和120都不是我们要找的偶数。
函数prime用来判断—个数n是否为素数,是则返回1,否则返回0。

int prime(int n)
{	int k,flag=1;
	for (k=2; k<=(int)sqrt((double)n); k++)
		if (n%k == 0)
			flag=0;
	return flag;
}
int fun(int m, int a[])
{ 
  int k, s, count, i=0;
   for(k=6; k<=m; k+=2)
   {   count = 0;
	   /* 请在此处填写代码 */
		for(s=2;s<=k/2;s++)//把k拆分两个素数之和,注意s的范围[2,k/2],注意从2开始,1不是素数!
		{
			if(prime(s)==1&&prime(k-s)==1) // k分为一组素数之和k=s+(k-s) 
                count++;
		}

       if (count == 10) {
		   printf("%d\n", k);
		   a[i++] = k;
	   }
   }
   return i;
}

 

【同类型题4】请编写函数fun,其功能是:验证参数n是否可以分解成2个素数相乘,是则返回1,否则返回0,并通过指针变量x、y返回分解后的2个素数值,要求*x<*y。主程序中将打印出分解结果。
例如,111= 3*37,当函数fun的参数n为111时,可以分解为2个素数((3和37)的乘积,函数返回值为1。
补充:

int prime(int m)//判断m是否是素数
{
    int k,flag=1;
    for(k=2;k<(int)sqrt((double)m);k++)
        if(m%k==0)
            flag=0;
    return flag;
}

int fun(int n,int *x,int *y)
{
	int k,flag=0;int t;
	for(k=2;k<=(int)sqrt((double) n);k++)//注意k的范围,[2,√n]
	{
		if(n%k==0&&prime(k)==1&&prime(n/k)==1)//n可以被因子k整除,n由两个素数相乘所得
		{
			*x=k;
			*y=n/k;
			flag=1;
		}
	}
    return flag;
}

2-6 幂

结构体struct mpow两个成员的意义是:a为幂的底,t为幂的指数。
请编写函数fun,其功能是:计算出x所指数组中n个幂数之和并返回。
例如,当结构体数组用如此数据12,0,9,2,23,1,7,2初始化时,程序的输出结果应该是:sum=154.000000
 

double fun(struct mpow *x,int n)
{
	int i,j,k;
	double sum=0.0;
	for(i=0;i<n;i++)
	{
		k=1;//每计算一个幂数,k就初始化一次
		for(j=0;j<x[i].t;j++)//计算幂,相当于pow(x[i].a,x[i].t);x[i].a的x[i].t次幂
		{
			k*=x[i].a;//整数*整型=整型
		}
		sum=sum+k;//双精度浮点型+整型=双精度浮点型
	}
	return sum;
}

2-7 最值

请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分)。

补充:

#define N 10
typedef struct ss    /*定义结构体*/
{ char num[10]; 
  int s;
} STU;

  STU a[N]={{ "A01",81},{ "A02",89},{ "A03",66},{ "A04",87},{ "A05",77},
  { "A06",90},{ "A07",79},{ "A08",61},{ "A09",80},{ "A10",71}},m;

 fun(a,&m);

void fun(STU a[], STU *s)
{
	int i;
	*s=a[0];//赋初值
	for(i=1;i<N;i++)
	{
		if(s->s<a[i].s)//找最高分
			*s=a[i];
	}
}

批注:结构体数组用.使用结构体成员,结构体指针用->使用结构体成员

【同类型题1】已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。已给出函数的首部,请完成该函数。

void fun(  STU  a[], STU  *s  )
{
	int i;
	*s=a[0];
	for(i=1;i<N;i++)
	{
		if(s->s>a[i].s) *s=a[i];//找最低分
	}
}

【同类型题2】编写一个函数,其功能是:从传入的num个字符串中找出最长的一个字符串,并通过形参指针max传回该串地址(每个字符串都用****作为结束输入的标识,最后只输出****则停止输入)。

char *fun(char (*a)[81], int num, char *max)
{
	int i;
	max=a[0];//赋初值
	for(i=0;i<num;i++)
	{
		if(strlen(max)<strlen(a[i])) max=a[i];  //由于#include<string.h>,所以可以引用strlen()来计算字符串长度
	}
	return max;
}

【同类型题3】在此程序中,N名学生的成绩已在主函数中放入一个带有头节点的链表结构中,h指向链表的头节点。请编写函数fun,其功能是:找出学生的最高分,并由函数值返回。

double  fun( STREC *h  )
{
	double max=h->s;//给最高分赋初值
	h=h->next;//使指针指向下一个结点,也可以忽略这步,直接开始遍历链表
	while(h)//如果指针不为空,开始遍历链表
	{
		if(max<h->s) max=h->s;//更新最大值
		else h=h->next;//否则继续遍历
	}
	return max;
}

【同类型题4】在整数数组中,如果一个数的出现次数和它的数值大小相等,我们就称这个数为“幸运数”,请编写函数fun,其功能是:从给定的长度为n(ns1000)的整数数组a中,找出其中最大的幸运数并返回;如果该数组中不存在幸运数,则返回-1。
例如:当a数组长度为6,元素值为:1,3,3,3,2,2时,应返回最大幸运数3。
当a数组长度为5,元素值为:2,3,2,3,2时,应返回-1。

int fun(int a[], int n)
{  int c[1000]={0}; /* 计数器,每个数的出现次数 */
   int t[1000]; /* 去掉重复后的整数系列 */
   int k=0,i,j, lucky;
   for (i=0; i<n; i++)
   {
	    for (j=0;j<k;j++)
		   if (a[i] == t[j])
		   {
			   c[j]++;
			   break;
		   }
		if (j>=k)
	    {   t[k] = a[i];
		    c[k] = 1;
		    k++;
	    }	
   }
   lucky = -1;
   /* 请在此处填入必要的代码,找出最大幸运数 */
   for (i=0; i<n; i++)
   { 
	   if(c[i]==t[i]&&t[i]>lucky)lucky=t[i];//c为计数数组,t为去重数组
   }
   return lucky;
}

 【同类型题5】请编写函数fun,其功能是:把指定分数范围内的学生数据放在b所指的数组中,分数范围内的学生人数由函数值返回
例如,输入的分数是60、69,则应当把分数在60~69的学生数据输出,包含60分和69分的学生数据。主函数中把60放在low中,把69放在heigh中。

int  fun( STREC  *a,STREC *b,int l, int h )//  n=fun( s,h,low,heigh );
{
	int i,k=0;
	for(i=0;i<N;i++)
	{
		if(a[i].s>=l&&a[i].s<=h)
		{
			b[k++]=a[i];
		}
	}
	return k;

}

【同类型题6】请编写函数void fun(int*dp, int n, int upordown),其功能是,找出dp所指数组中的最小或最大值并与其第1个元素交换。形参n为元素的个数,形参upordown为查找标志:值为0时找最小值;值为1时找最大值。

void fun (int *dp,int n,int upordown)
{
	int i,t;
	int max=0,min=0;
	for(i=1;i<n;i++)//找最大值元素的位置
	{
		if(dp[max]<dp[i])max=i;
	}
	for(i=0;i<n;i++)//找最小值元素的位置
	{
		if(dp[min]>dp[i])min=i;
	}
	if(upordown==0)//若标志==0,则最小值元素与第一个元素互换位置
	{
		t=dp[0];
		dp[0]=dp[min];
		dp[min]=t;
	}
	else//若标志==1,则最大值元素与第一个元素互换位置
	{	
		t=dp[0];
		dp[0]=dp[max];
		dp[max]=t;
	}

}

【同类型题7】编写一个函数int fun(int *s, int t, int *k),用来求出数组的最大元素在数组中的下标并存放在k所指向的存储单元中。
例如,输入如下整数:
876675896 101301401980 431451777则输出结果为6,980。

int fun(int *s, int t, int *k)//k指向数组s中的最大值的下标
{
	int i;*k=0;
	for(i=1;i<t;i++)
	{
		if(s[*k]<s[i]) *k=i;
	}
	return s[*k];//返回最大值

}

2-8 排序

在此程序中,学生的记录出学号和成绩组成,N名学生的数据已放入主函数中的结构体数组s中,请编写函数fun,其功能是:按分数降序排列学生的记录,高分在前,低分在后

#define   N   16
typedef  struct
{  char  num[10];
   int   s;
} STREC;

void  fun( STREC  a[] )//冒泡排序
{
	int i,j;STREC p;
	for(i=1;i<N;i++)//N个数要比较N-1次
	{
		for(j=0;j<N-1;j++)//每个数又要比较N-1次
		{
			if(a[i].s>a[j].s)//若当前元素成绩小于后一个元素成绩就交换,实现降序排列。
			{                //若升序输出,则改>为<
				p=a[i];
				a[i]=a[j];
				a[j]=p;
			}
		}
	}
}
void  fun( STREC  a[] )//插入排序
{
	int i,j;STREC p;
	for(i=1;i<N;i++)//N个数要比较N-1次
	{
		p=a[i];//暂时保存元素
		for(j=i-1;j>=0&&p.s>a[j].s;j--)//从后往前找元素的插入位置
		{
			a[j+1]=a[j];//后移
		}
		a[j+1]=p;//插入元素
	}
}
void  fun( STREC  a[] )//选择排序
{
	int i,j,max;STREC p;
	for(i=0;i<N-1;i++)
	{
		max=i;//定义当前位置为最大值
		for(j=i+1;j<N;j++)
		{
			if(a[max].s<a[j].s) max=j;//更新最大值位置
		}
		if(max!=i)//和之前定义最大值位置不一致就交换
		{
			p=a[i];
			a[i]=a[max];
			a[max]=p;
		}
	}
}

2-9 矩阵

在此程序中,定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a][N],int n),该函数的功能是:使数组左下半三角元素中的值乘以n。

#define    N  5
void fun(int a[ ][N], int n)
{
	int i,j;
	for(i=0;i<N;i++)
	{
		for(j=i;j<N;j++)
		{
			a[j][i]*=n;
		}
	}
}

【同类型题1】使数组右上半三角元素中的值乘以m

 

void fun ( int a[][N], int m )
{
	int i,j;
	for(i=0;i<N;i++)
	{
		for(j=i;j<N;j++)
		{
			a[i][j]*=m;//右上元素a[i][j],左下元素是a[j][i]
		}
	}
}

【同类型题2】程序中定义了N×N的二维数组,并已在主函数中赋初值。请编写函数fun,其功能是:将a所指数组主对角线上的元素分别乘以2;次对角线上的元素分别乘以3,依次放入指针p所指的数组中。计算过程中不得修改a所指数组中的数据。

void fun( int a[N][N],int *p)
{
	int i,j=0;
	for(i=0;i<N;i++)
	{
		p[j++]=a[i][i]*2;//主对角线*2
	}
	for(i=0;i<N;i++)
	{
		p[j++]=a[i][N-i-1]*3;//次对角线*3
	}

}

【同类型题3】在此程序中,定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a][NJ),该函数的功能是:将数组左下半三角元素中的值全部置成0只需令 a[j][i]=0;

【同类型题4】实现矩阵的转置

void fun(int array[3][3])
{
	int i,j,t;
    for (i=0;i<3;i++)
    {   for (j=i+1;j<3;j++)    //右上和左下三角元素交换
		{
			t=array[i][j];    //array[i][j]表示列元素
			array[i][j]=array[j][i];    //array[j][i]表示行元素
			array[j][i]=t;
		}
	}
}

【同类型题5】实现矩阵的转置

void change(int p[][N],int n)
{
	int i,j,t;
	for(i=0;i<N;i++)
	{
		for(j=i;j<N;j++)//或者for(j=i+1;j<N;j++),两两交换
		{
			t=p[i][j];
			p[i][j]=p[j][i];
			p[j][i]=t;
		}
	}

}

【同类型题6】编写函数fun,该函数的功能是:将M行N列的二维数组中的数据,按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中

void  fun(int  (*s)[10], int  *b, int  *n, int mm, int nn)//mm为行数,nn为列数
{
	int i,j,k=0;
	for(i=0;i<mm;i++)
	{
		for(j=0;j<nn;j++)
		{
			b[k++]=s[i][j];//按行存储,若按列存储则是b[k++]=s[j][i];
		}
	}
	*n=k;//通过指针*n返回数组b的元素个数
}

 【同类型7】编写函数fun,该函数的功能是:将M行N列的二维数组中的字符数据,按列的顺序依次放到—个字符串中。

#define     M   3//行数
#define     N   4//列数
void  fun(char  s[][N], char *b)
{
	int i,j,n=0;
	for(i=0; i < N;i++)  /* 请填写相应语句完成其功能 */
	{
		for(j=0;j<M;j++)
		{
			b[n++]=s[j][i];//按列存储
		}
	}
	b[n]='\0';
}

【同类型题8】编写函数fun,该函数的功能是:将放在字符串数组中的M个字符串(每串的长度不超过N),按顺序合并组成一个新的字符串。
例如,若字符串数组中的M个字符串为(“AAAA”, "BBBBBBB",“CC”}则合并后的字符串内容应该是“AAAABBB8BBBCC”,

void  fun(char  a[M][N], char  *b)
{
	/* 以下代码仅供参考 */
	int i,j,k=0; *b=0;
	for(i=0;i<M;i++)
	{
		for(j=0;a[i][j]!='\0';j++)
		{
			b[k++]=a[i][j];
		}
	}
	b[k]='\0';
}

【同类型题9】矩阵周边元素的平均值

double fun ( int w[][N] )
{
	int i,j,n=0,sum=0;//n用于记录周边元素的个数,或者用N*N-(N-2)*(N-2)
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
		{
			if(i==0||i==N-1||j==0||j==N-1)//周边元素为第一行、最后一行、第一列、最后一列
			{
				sum+=w[i][j];//周边元素求和
				n++;
			}
		}
	}
	return sum*1.0/n;//返回double型的平均值

}

2-10 多项式求和

#include <math.h>//pow(long double x,int y)的头文件
double fun(double x , int  n)
{
	int i;
	double sum=1.0,s=1.0;//赋初值
	for(i=1;i<=n;i++)
	{
		s*=i;//分母
		sum+=pow(x,i)/s;//pow(long double x,int y)用于计算x的y次幂
	}
	return sum;

}

批注:pow(long double x,int y)用于计算x的y次幂

【同类型题1】fun的功能是。根据以下公式求Π的值(要求精度0.0005,即某项小于0.0005时停止迭代)
 

double  fun ( double  eps)
{
	double sum=0.0,s=1.0;//sum算的是Π/2,从0.0开始求各项和
	int n=1;
	while(s>=eps)//当前这一项不小于eps则继续迭代
	{
		sum+=s;//各项求和
		s=s*n/(2*n+1);//各项,如果是s*=n/(2*n+1);则运行报错,因为n为整数,(2*n+1)也是整数,所以二者的商为整数,这个结果在成*s结果就不精确了!
		n++;
	}
	return sum*2;//由于sum算的是Π/2,则Π=sum*2;
}

批注:

(1)也开始使用for循环来实现

    for(n=1;s>=eps;n++)
    {
        sum+=s;
        s=s*n/(2*n+1);
    }

(2)C语言中:整数/整数=整数; 浮点型/整数=浮点型;

【同类型题2】编写函数fun,其功能是:根据以下公式计算s,并计算结果作为函数值返回,n通过形参传入。
 

float fun(int  n)
{
	int i,s1=0;   //s1为除数
	float s=0.0;  //返回值浮点型值s赋初值
	for(i=1;i<=n;i++)
	{
		s1+=i;   //修改除数,除数为整数之和
		s+=1.0/s1;  //求和,由于除数s1为整型,所以修改被除数为浮点型,以保证结果为浮点型
	}
	return s;
}

【同类型题3】编写函数fun,其功能是∶根据以下公式求P的值,结果由函数值带回。m与n为两个正整数且要求m>n,

例如:m= 12,n=8时,运行结果为495.000000。

float  fun(int m, int n)
{
	float a=1.0,b=1.0,c=1.0;
	int i;
	for(i=1;i<=m;i++)    //m的阶乘
	{
		a*=i;
	}
	for(i=1;i<=n;i++)    //n的阶乘
	{
		b*=i;
	}
	for(i=1;i<=m-n;i++)    //(m-n)的阶乘
	{
		c*=i;
	}
	return a/(b*c);
}

 【同类型题4】

double fun(int n)
{
	int i;
	double S=0.0;
	for(i=1;i<=n;i++)
	{
		S=S+1.0/(i*(i+1));    //注意是1.0/(i*(i+1)),若是1/(i*(i+1))结果为0
	}
	return S;
}

考试顺利,天天开心~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值