第7.3关 函数声明

第1关:任务07-03-01 函数返回两个实数的和

100

  • 任务要求
  • 评论

任务描述

编写函数返回两个实数的和。主函数中输入两个实数,输出它们的和。请恰当地使用函数声明。

输入样例:

 
  1. 18 -299

输出样例

 
  1. -281.000000

任务分析

题目要求设计“函数返回两个实数的和”,可知函数的形式参数应为两个实型(float或double型),返回值也应该为实型。

任务代码

 
  1. #include<stdio.h>
  2. double add(double x,double y); //函数声明
  3. int main(){
  4. double a,b,m;
  5. scanf("%lf%lf",&a,&b);
  6. m=add(a,b); //函数调用
  7. printf("%lf",m);
  8. return 0;
  9. }
  10. double add(double x,double y){ //函数定义
  11. return x+y;
  12. }

相关知识 函数声明

函数一定要先定义后调用(整型或void型函数除外),如果一个函数的定义被放在了调用它的函数之后,那么一定要先声明再调用,就是在调用之前对这个函数进行声明(也称为说明)。 函数声明语句只要将函数定义的首部(第一行)直接拿来就可以了,因为函数声明是一条语句,所以后面要加分号。 函数声明语句中,形参列表中可以只保留参数类型而省略参数名称,或者省略整个形参列表。

代码测试与分析

输入:1 1 输出:2.000000 输入:2.5 3.5 输出:7.000000 输入:0 0 输出:0.000000

程序中对double型函数add先声明后使用再定义,且声明和定义类型及参数相符,无语法和编译错误。如果将函数声明语句删除,则程序在编译时发生以下错误,提示add没有定义。

 

函数声明的关键信息是函数类型和名称,所以程序中的函数声明语句也可以写成如下两种形式: double add(double,double); double add( );

第2关:任务07-03-02 实数四则运算

100

  • 任务要求
  • 评论

任务描述

请分别编写4个自定义函数,功能分别为返回两实数和、差、积、商。主函数的功能为输入两个实数,调用你的自定义函数输出它们的和、差、积、商。所有的输入数据中保证除数不为0。(请在程序中应用函数声明)

输入样例(不用考虑除数为0):

 
  1. 5.0 2.0

输出样例:

 
  1. 7.000000 3.000000 10.000000 2.500000

开始你的任务吧,祝你成功!

//请在此输入你的代码,复杂程序可先在Dev C++中运行调试后再提交
#include <stdio.h>

int main()
{
    int x,y;
    
    int add(int a,int b);
    int subtract(int a,int b);
    int multiply(int a,int b);
    float divide(int a,int b);
    
    scanf("%d %d",&x,&y);
    
    printf("%.6f ",(float)add(x,y));
    printf("%.6f ",(float)subtract(x,y));
    printf("%.6f ",(float)multiply(x,y));
    printf("%.6f",(float)divide(x,y));
}
int add(int a,int b)
{
    return a+b;
}

int subtract(int a,int b)
{
    return a-b;
}

int multiply(int a,int b)
{
    return a*b;
}
float divide(int a,int b)
{
    return (float)(a)/b;
}

第3关:任务07-03-03 函数返回整数真约数和

100

  • 任务要求
  • 评论

任务描述

编写函数返回整数的真约数和,主函数中输入整数N,输出N的真约数和。

输入样例:

 
  1. 20

输出样例:

 
  1. 22

输入样例:

 
  1. 28

输出样例:

 
  1. 28

任务分析

题目要求设计“函数返回一个整数真约数的和”,所以我们设计以下函数框架: int fun(int n){ //一个int型形式参数n,返回值为int型 //计算正整数n的真约数 return s; //返回n的真约数的和 }

任务代码

 
  1. #include<stdio.h>
  2. //函数fun的类型为int,有不用先声明的特权
  3. int main(){
  4. int n;
  5. scanf("%d",&n);
  6. printf("%d",fun(n)); //调用函数fun,实在参数为n
  7. return 0;
  8. }
  9. int fun(int n){ //一个int型形式参数n,返回值为int型
  10. int i,s=0;
  11. for(i=1;i<=n/2;i++) //穷举i找真约数
  12. if(n%i==0) //找到真约数就累加到s中
  13. s+=i;
  14. return s; //返回n的真约数的和
  15. }

代码测试与分析

输入:10 输出:8 输入:6 输出:6

函数fun的功能就是:形式参数n接收到实在参数的值后(调用发生),先通过for循环统计真约数的和s,然后通过return s;语句结束函数并返回s的值。 小白弟弟请注意:fun函数的定义在调用之后,却没有在程序的开始处声明,为什么呢? 因为,C语言规定返回值为int型的函数可以不用声明,直接调用。

第4关:任务07-03-04 短信计费

100

  • 任务要求
  • 评论

任务描述

用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字)。如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信发送。假设已经知道你当月所发送的短信的字数,试统计一下你当月短信的总资费。

输入格式:

第一行是整数n,表示当月发送短信的总次数,接着n行每行一个整数,表示每次短信的字数。

输出格式:

输出一行,当月短信总资费,单位为元,精确到小数点后1位。

输入样例:

 
  1. 10
  2. 39
  3. 49
  4. 42
  5. 61
  6. 44
  7. 147
  8. 42
  9. 72
  10. 35
  11. 46

输出样例:

 
  1. 1.3

题目来源

该题目选自OpenJudge网站,在线网址:OpenJudge - 02:短信计费


任务分析

根据题目的要求,我们可以设计一个函数用来“计算一条短信的费用”,这样,我们在主函数中,就可以调用这个函数统计总费用了。

 
  1. int main(){
  2. int n,t,i;
  3. double s=0.0; //总费用
  4. scanf("%d",&n); //读入第一个整数n(短信条数)
  5. for(i=1;i<=n;i++){ //依次读入处理n条短信(字数)
  6. scanf("%d",&t); //读入本条短信字数(第i条)
  7. s+=cal(t); //计算并累计本条短信费用
  8. }
  9. printf("%.1lf",s); //输出总费用
  10. return 0;
  11. }

主函数中处理多组数据,而且组数固定,通过for循环处理每组数据。在循环体内,通过scanf读取每条短信的字数t,通过cal(t)计算本条短信的费用并累计到变量s中。 函数cal(t)的功能就是计算一条短信费用。它的形式参数是一个int型的,表示一条短信的字数,它的返回值应该为实型,表示此条短信的费用。

 
  1. double cal(int t){
  2. int s;
  3. s=t/70+(t%70>0); //计算短信计费单位
  4. return s*0.1;
  5. }

函数中表达式t/70+(t%70>0)的功能是计算短信的计费单位,每70个字算1个计费单位,如果不足70个字部分也算1个计算单位。

任务代码 解法1:

 
  1. #include<stdio.h>
  2. double cal(int t); //函数声明
  3. int main(){
  4. int n,t,i;
  5. double s=0.0; //总费用
  6. scanf("%d",&n); //读入第一个整数n(短信条数)
  7. for(i=1;i<=n;i++){ //依次读入处理n条短信(字数)
  8. scanf("%d",&t); //读入本条短信字数(第i条)
  9. s+=cal(t); //调用函数,计算并累计本条短信费用
  10. }
  11. printf("%.1lf",s); //输出总费用
  12. return 0;
  13. }
  14. double cal(int t){ //计算一条短信的费用
  15. int s;
  16. s=t/70+(t%70>0); //计算短信计费单位
  17. return s*0.1;
  18. }

代码分析

函数cal的类型为double,定义在调用之后,所以必须要在调用前声明。主函数中通过调用函数cal计算每条短信的费用。 我们也可以定义一个函数double fun(int n){ },实现处理n组输入数据,并返回所有短信的总费用。

任务代码 解法2:

 
  1. #include<stdio.h>
  2. double cal(int t); //函数声明
  3. double fun(int n); //函数声明
  4. int main(){
  5. int n;
  6. scanf("%d",&n); //读入第一个整数n(短信条数)
  7. printf("%.1lf",fun(n)); //输出总费用
  8. return 0;
  9. }
  10. double fun(int n){ //处理n条短信数据返回总费用
  11. int t,i;
  12. double s=0.0; //总费用
  13. for(i=1;i<=n;i++){ //依次读入处理n条短信(字数)
  14. scanf("%d",&t); //读入本条短信字数(第i条)
  15. s+=cal(t); //调用函数,计算并累计本条短信费用
  16. }
  17. return s;
  18. }
  19. double cal(int t){ //计算一条短信的费用
  20. int s;
  21. if(t%70==00) s=t/70; //计算短信计费单位
  22. else s=t/70+1;
  23. return s*0.1;
  24. }

代码分析

函数fun的功能为:处理全部n条短信数据并返回总费用,在函数内又调用了cal函数计算单条短信的费用。这样,主函数就显得非常简洁清晰,这正体现了模块化程序设计的思想。


开始你的任务吧,祝你成功!

第5关:任务07-03-05 甲流病人初筛

100

  • 任务要求
  • 评论

任务描述

目前正是甲流盛行时期,为了更好地进行分流治疗,医院在挂号时要求对病人的体温和咳嗽情况进行检查,对于体温超过37.5度(含等于37.5度)并且咳嗽的病人初步判定为甲流病人(初筛)。现需要统计某天前来挂号就诊的病人中有多少人被初筛为甲流病人。 (请设计函数判断一个患者是否为甲流病人)

输入格式:

第一行是某天前来挂号就诊的病人数n。(n < 200)

其后有n行,每行是病人的信息,包括三个信息:编号(整型)、体温(实型)、是否咳嗽(整数,1表示咳嗽,0表示不咳嗽)。每行三个信息之间以一个空格分开。

输出格式:

按输入顺序依次输出所有被筛选为甲流的病人的编号,每个编号占一行。之后再下一行输出一个整数,表示被筛选为甲流的病人数量。

输入样例:

 
  1. 5
  2. 1 38.3 0
  3. 2 37.5 1
  4. 4 37.1 1
  5. 5 39.0 1
  6. 8 38.2 1

输出样例:

 
  1. 2
  2. 5
  3. 8
  4. 3

开始你的任务吧,祝你成功!

#include<stdio.h>
int main()
{
	int n,i,m=0;
	char a[200][9];
	float b[200];
	int c[200];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%s %f %d",a[i],&b[i],&c[i]);
	}
	for(i=0;i<n;i++)
	{
		if(b[i]>=37.5&&c[i]==1)
		{
			printf("%s\n",a[i]);
			m++;
		}
	}
	printf("%d",m);
	return 0;
}
 

第6关:任务07-03-06 素数距离问题

100

  • 任务要求
  • 评论

任务描述

 
  1. 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
  2. 如果输入的整数本身就是素数,则输出该素数本身,距离输出0

输入格式:

 
  1. 第一行给出测试数据组数N(0<N<=10000)
  2. 接下来的N行每行有一个整数M(0<M<1000000),

输出格式:

 
  1. 每行输出两个整数 A B.
  2. 其中A表示离相应测试数据最近的素数,B表示其间的距离。

输入样例:

 
  1. 3
  2. 6
  3. 8
  4. 10

输出样例:

 
  1. 5 1
  2. 7 1
  3. 11 1

开始你的任务吧,祝你成功!

#include <stdio.h>
#include <math.h>
int pro(int p);
int main() {
int a,n;
scanf("%d",&n);
while(n--) {
scanf("%d",&a);
pro(a);
}
}
int pro(int p) { //求距离最近的素数及距离
int b,c,d,k,m,n,sum1,sum2;
int prime(int x);
if(p==1) printf("2 1\n"); //输入为1时的输出
else {
if(prime(p)!=0) printf("%d 0\n",p); //是素数的输出
else { //其它不是素数的输出
b=p,c=p;
while(b--) {
if(prime(b)!=0) break;
}
m=b;
while(c++) {
if(prime(c)!=0) break;
}
n=c;
sum1=p-m;
sum2=n-p;
if(sum1<=sum2) k=sum1,d=m;
else k=sum2,d=n;
printf("%d %d\n",d,k);
}
}
}
int prime(int x) { //判断是否为素数
int i,j;
j=sqrt(x);
for(i=2;i<=j;i++){
if(x%i==0) x=0;
}
return x;
}

第7关:任务07-03-07 与7无关的数

100

  • 任务要求
  • 评论

任务描述

一个正整数,如果它能被7整除,或者它的十进制表示法中某一位上的数字为7,则称其为与7相关的数.现求所有小于等于n(n < 100)的与7无关的正整数的平方和.

输入格式:

输入为一行,正整数n(n < 100)

输出格式:

输出一行,包含一个整数,即小于等于n的所有与7无关的正整数的平方和。

输入样例:

 
  1. 21

输出样例:

 
  1. 2336

题目来源

选自OpenJudge网站,在线网址:OpenJudge - 011:与7无关的数


开始你的任务吧,祝你成功!

//请在此输入你的代码,复杂程序可先在Dev C++中运行调试后再提交
#include<stdio.h>
int main()
{
    int sum=0,g=0,s=0,i=1,n=0;//s是十位数字,g是个位数字
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        s=i/10;
        g=i%10;
        if(i%7!=0&&s!=7&&g!=7)//若这个数能被7整除且个位和十位数字都不为7
        sum=sum+i*i;
    }
   printf("%d",sum);
    return 0;
}

第8关:任务07-03-08 二进制分类

100

  • 任务要求
  • 评论

任务描述

若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数称为A类数,否则就称其为B类数。 例如: (13)10​=(1101)2​,其中1的个数为3,0的个数为1,则称此数为A类数; (10)10​=(1010)2​,其中1的个数为2,0的个数也为2,称此数为B类数; (24)10​=(11000)2​,其中1的个数为2,0的个数为3,则称此数为B类数; 程序要求:求出k1~k2之中(包括在1与1000区间内),全部A、B两类数的个数。

输入格式:

 
  1. 一行中两个整数,空格分隔,表示k1和k2,保证k1<k2。

输出格式:

 
  1. 一行,包含两个整数,分别是A类数和B类数的个数,中间用单个空格隔开。

输入样例:

 
  1. 1 1000

输出样例:

 
  1. 538 462

题目来源

注:该题目选自OpenJudge网站,在线网址:OpenJudge - 36:二进制分类


开始你的任务吧,祝你成功!

//请在此输入你的代码,复杂程序可先在Dev C++中运行调试后再提交
#include <stdio.h>
int main() 
{
    int a = 0, b = 0,k1,k2;
    scanf("%d %d",&k1,&k2);
    for (int i = k1; i <= k2; ++i) 
    {
        int n = i;
        int aa = 0, bb = 0;
        while (n != 0) 
        {
            if (n%2) 
                aa++; 
            else 
                bb++;
            n/=2;
        }
        if (aa>bb)
            a++; 
        else
            b++;
    }
    printf("%d %d",a,b);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值