所谓函数题,是指主函数main()题目中已给出,要求为程序写一个/两个函数,以实现某种功能,如为一组数据排序。
练习5-1 求m到n之和 (10分)
本题要求实现一个计算m~n(m<n)之间所有整数的和的简单函数。
函数接口定义:
int sum( int m, int n );
其中m
和n
是用户传入的参数,保证有m<n。函数返回的是m~n之间所有整数的和。
裁判测试程序样例:
#include <stdio.h>
int sum(int m, int n);
int main()
{
int m, n;
scanf("%d %d", &m, &n);
printf("sum = %d\n", sum(m, n));
return 0;
}
/* 你的代码将被嵌在这里 */
答案
int sum(int m,int n){
int i;
int sum = 0;
for(i=m; i<=n; i++){
sum += i;
}
return sum;
}
练习5-2 找两个数中最大者 (10分)
本题要求对两个整数a和b,输出其中较大的数。
函数接口定义:
int max( int a, int b );
其中a
和b
是用户传入的参数,函数返回的是两者中较大的数。
裁判测试程序样例:
#include <stdio.h>
int max( int a, int b );
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("max = %d\n", max(a, b));
return 0;
}
答案
int max(int a,int b)
{
if(a<=b)
return b;
else
return a;
}
练习5-3 数字金字塔 (15分)
本题要求实现函数输出n行数字金字塔。
函数接口定义:
void pyramid( int n );
其中n
是用户传入的参数,为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n
行数字金字塔。注
意每个数字后面跟一个空格。
裁判测试程序样例:
#include <stdio.h>
void pyramid( int n );
int main()
{
int n;
scanf("%d", &n);
pyramid(n);
return 0;
}
答案
void pyramid( int n ){
int i,j,k,m;
m = n;
for(i=1;i<=n;i++,m--){
j=m;
for(;j>0;j--)
printf(" ");
for(k=i;k>0;k--)
printf("%d ", i);
printf("\n");
}
}
习题5-1 符号函数 (10分)
本题要求实现符号函数sign(x)。
函数接口定义:
int sign( int x );
其中x
是用户传入的整型参数。符号函数的定义为:若x
大于0,sign(x)
= 1;若x
等于0,sign(x)
= 0;否则,sign(x)
= −1。
裁判测试程序样例:
#include <stdio.h>
int sign( int x );
int main()
{
int x;
scanf("%d", &x);
printf("sign(%d) = %d\n", x, sign(x));
return 0;
}
答案
int sign(int x)
{
// int n;
// n=x;
if(x>0)
return 1;
else if(x==0)
return 0;
else
return -1;
}
习题5-2 使用函数求奇数和 (15分)
本题要求实现一个函数,计算N个整数中所有奇数的和,同时实现一个判断奇偶性的函数。
函数接口定义:
int even( int n );
int OddSum( int List[], int N );
其中函数even
将根据用户传入的参数n
的奇偶性返回相应值:当n
为偶数时返回1,否则返回0。函数OddSum
负责计算并返回传入的N
个整数List[]
中所有奇数的和。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int even( int n );
int OddSum( int List[], int N );
int main()
{
int List[MAXN], N, i;
scanf("%d", &N);
printf("Sum of ( ");
for ( i=0; i<N; i++ ) {
scanf("%d", &List[i]);
if ( even(List[i])==0 )
printf("%d ", List[i]);
}
printf(") = %d\n", OddSum(List, N));
return 0;
}
答案
int even(int n)
{
if(n%2==0)
return 1;
else
return 0;
}
int OddSum(int List[],int N)
{
int i,sum=0;
for(i=0;i<N;i++)
{
if(even(List[i])==0)
sum+=List[i];
}
return sum;
}
习题5-3 使用函数计算两点间的距离 (10分)
本题要求实现一个函数,对给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离。
函数接口定义:
double dist( double x1, double y1, double x2, double y2 );
其中用户传入的参数为平面上两个点的坐标(x1
, y1
)和(x2
, y2
),函数dist
应返回两点间的距离。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
double dist( double x1, double y1, double x2, double y2 );
int main()
{
double x1, y1, x2, y2;
scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
printf("dist = %.2f\n", dist(x1, y1, x2, y2));
return 0;
}
答案
double dist(double x1, double y1, double x2, double y2 )
{
double x,y,sum;
/* if(x1>x2)
x=x1-x2;
else
x=x2-x1;
if(y1>y2)
y=y1-y2;
elsev
y=y2-y1; */
x=fabs(x1-x2); //fabs 求双精度浮点数的绝对值,abs 求整数的绝对值
y=fabs(y1-y2);
sum=sqrt(x*x+y*y);
return sum;
}
习题5-4 使用函数求素数和 (20分)
本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。
素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
函数接口定义:
int prime( int p );
int PrimeSum( int m, int n );
其中函数prime
当用户传入参数p
为素数时返回1,否则返回0;函数PrimeSum
返回区间[m
, n
]内所有素数的和。题目保证用户传入的参数m
≤n
。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
int prime( int p );
int PrimeSum( int m, int n );
int main()
{
int m, n, p;
scanf("%d %d", &m, &n);
printf("Sum of ( ");
for( p=m; p<=n; p++ ) {
if( prime(p) != 0 )
printf("%d ", p);
}
printf(") = %d\n", PrimeSum(m, n));
return 0;
}
答案
int prime( int p )
{
if(p<=1)
return 0;
else
{
for(int i=2;i<p;i++)
{
if(p%i==0)
return 0;
}
return 1;
}
}
int PrimeSum( int m, int n )
{
int sum=0;
for(int i=m;i<=n;i++)
{
if(prime(i)==1)
sum+=i;
}
return sum;
}
习题5-6 使用函数输出水仙花数 (20分)
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
函数接口定义:
int narcissistic( int number );
void PrintN( int m, int n );
函数narcissistic
判断number
是否为水仙花数,是则返回1,否则返回0。
函数PrintN
则打印开区间(m
, n
)内所有的水仙花数,每个数字占一行。题目保证100≤m
≤n
≤10000。
裁判测试程序样例:
#include <stdio.h>
int narcissistic( int number );
void PrintN( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
PrintN(m, n);
if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);
return 0;
}
答案
int narcissistic( int number )
{
int i,count=0,sum=0; //此处count要加上赋值,没加上时结果错误,后面sum的赋值竟然对于count无效
int test=number;
while(number)
{
number/=10;
count++;
}
number=test;
while(number)
{
int j=number%10;
int mult=1; //mult要记得赋值为1,则每次循环都是值为1
for(int i=0;i<count;i++)
{
mult*=j;
}
sum+=mult;
number/=10;
}
if(sum==test)
return 1;
else
return 0;
}
void PrintN( int m, int n )
{
m=m+1;
for(;m<n;m++)
{
if(narcissistic(m)==1)
printf("%d\n",m);
}
}
习题6-1 分类统计字符个数 (15分)
本题要求实现一个函数,统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。
函数接口定义:
void StringCount( char s[] );
其中 char s[]
是用户传入的字符串。函数StringCount
须在一行内按照
letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数
的格式输出。
裁判测试程序样例:
#include <stdio.h>
#define MAXS 15
void StringCount( char s[] );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */
int main()
{
char s[MAXS];
ReadString(s);
StringCount(s);
return 0;
}
答案
void StringCount( char s[] )
{
int letter,blank,digit,other;
letter=blank=digit=other=0;
int i=0; //或者使用strlen(s)得到字符串的长度
for (;s[i]!='\0';i ++)
{
if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
letter++;
else if(s[i]==' ')
blank++;
else if(s[i]>='0'&&s[i]<='9'