第1关:任务07-03-01 函数返回两个实数的和
100
- 任务要求
- 评论
任务描述
编写函数返回两个实数的和。主函数中输入两个实数,输出它们的和。请恰当地使用函数声明。
输入样例:
18 -299
输出样例
-281.000000
任务分析
题目要求设计“函数返回两个实数的和”,可知函数的形式参数应为两个实型(float或double型),返回值也应该为实型。
任务代码
#include<stdio.h>
double add(double x,double y); //函数声明
int main(){
double a,b,m;
scanf("%lf%lf",&a,&b);
m=add(a,b); //函数调用
printf("%lf",m);
return 0;
}
double add(double x,double y){ //函数定义
return x+y;
}
相关知识 函数声明
函数一定要先定义后调用(整型或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):
5.0 2.0
输出样例:
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的真约数和。
输入样例:
20
输出样例:
22
输入样例:
28
输出样例:
28
任务分析
题目要求设计“函数返回一个整数真约数的和”,所以我们设计以下函数框架: int fun(int n){ //一个int型形式参数n,返回值为int型 //计算正整数n的真约数 return s; //返回n的真约数的和 }
任务代码
#include<stdio.h>
//函数fun的类型为int,有不用先声明的特权
int main(){
int n;
scanf("%d",&n);
printf("%d",fun(n)); //调用函数fun,实在参数为n
return 0;
}
int fun(int n){ //一个int型形式参数n,返回值为int型
int i,s=0;
for(i=1;i<=n/2;i++) //穷举i找真约数
if(n%i==0) //找到真约数就累加到s中
s+=i;
return s; //返回n的真约数的和
}
代码测试与分析
输入: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位。
输入样例:
10
39
49
42
61
44
147
42
72
35
46
输出样例:
1.3
题目来源
该题目选自OpenJudge网站,在线网址:OpenJudge - 02:短信计费
任务分析
根据题目的要求,我们可以设计一个函数用来“计算一条短信的费用”,这样,我们在主函数中,就可以调用这个函数统计总费用了。
int main(){
int n,t,i;
double s=0.0; //总费用
scanf("%d",&n); //读入第一个整数n(短信条数)
for(i=1;i<=n;i++){ //依次读入处理n条短信(字数)
scanf("%d",&t); //读入本条短信字数(第i条)
s+=cal(t); //计算并累计本条短信费用
}
printf("%.1lf",s); //输出总费用
return 0;
}
主函数中处理多组数据,而且组数固定,通过for循环处理每组数据。在循环体内,通过scanf读取每条短信的字数t,通过cal(t)计算本条短信的费用并累计到变量s中。 函数cal(t)的功能就是计算一条短信费用。它的形式参数是一个int型的,表示一条短信的字数,它的返回值应该为实型,表示此条短信的费用。
double cal(int t){
int s;
s=t/70+(t%70>0); //计算短信计费单位
return s*0.1;
}
函数中表达式t/70+(t%70>0)的功能是计算短信的计费单位,每70个字算1个计费单位,如果不足70个字部分也算1个计算单位。
任务代码 解法1:
#include<stdio.h>
double cal(int t); //函数声明
int main(){
int n,t,i;
double s=0.0; //总费用
scanf("%d",&n); //读入第一个整数n(短信条数)
for(i=1;i<=n;i++){ //依次读入处理n条短信(字数)
scanf("%d",&t); //读入本条短信字数(第i条)
s+=cal(t); //调用函数,计算并累计本条短信费用
}
printf("%.1lf",s); //输出总费用
return 0;
}
double cal(int t){ //计算一条短信的费用
int s;
s=t/70+(t%70>0); //计算短信计费单位
return s*0.1;
}
代码分析
函数cal的类型为double,定义在调用之后,所以必须要在调用前声明。主函数中通过调用函数cal计算每条短信的费用。 我们也可以定义一个函数double fun(int n){ },实现处理n组输入数据,并返回所有短信的总费用。
任务代码 解法2:
#include<stdio.h>
double cal(int t); //函数声明
double fun(int n); //函数声明
int main(){
int n;
scanf("%d",&n); //读入第一个整数n(短信条数)
printf("%.1lf",fun(n)); //输出总费用
return 0;
}
double fun(int n){ //处理n条短信数据返回总费用
int t,i;
double s=0.0; //总费用
for(i=1;i<=n;i++){ //依次读入处理n条短信(字数)
scanf("%d",&t); //读入本条短信字数(第i条)
s+=cal(t); //调用函数,计算并累计本条短信费用
}
return s;
}
double cal(int t){ //计算一条短信的费用
int s;
if(t%70==00) s=t/70; //计算短信计费单位
else s=t/70+1;
return s*0.1;
}
代码分析
函数fun的功能为:处理全部n条短信数据并返回总费用,在函数内又调用了cal函数计算单条短信的费用。这样,主函数就显得非常简洁清晰,这正体现了模块化程序设计的思想。
开始你的任务吧,祝你成功!
第5关:任务07-03-05 甲流病人初筛
100
- 任务要求
- 评论
任务描述
目前正是甲流盛行时期,为了更好地进行分流治疗,医院在挂号时要求对病人的体温和咳嗽情况进行检查,对于体温超过37.5度(含等于37.5度)并且咳嗽的病人初步判定为甲流病人(初筛)。现需要统计某天前来挂号就诊的病人中有多少人被初筛为甲流病人。 (请设计函数判断一个患者是否为甲流病人)
输入格式:
第一行是某天前来挂号就诊的病人数n。(n < 200)
其后有n行,每行是病人的信息,包括三个信息:编号(整型)、体温(实型)、是否咳嗽(整数,1表示咳嗽,0表示不咳嗽)。每行三个信息之间以一个空格分开。
输出格式:
按输入顺序依次输出所有被筛选为甲流的病人的编号,每个编号占一行。之后再下一行输出一个整数,表示被筛选为甲流的病人数量。
输入样例:
5
1 38.3 0
2 37.5 1
4 37.1 1
5 39.0 1
8 38.2 1
输出样例:
2
5
8
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
- 任务要求
- 评论
任务描述
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0
输入格式:
第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000),
输出格式:
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
输入样例:
3
6
8
10
输出样例:
5 1
7 1
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无关的正整数的平方和。
输入样例:
21
输出样例:
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两类数的个数。
输入格式:
一行中两个整数,空格分隔,表示k1和k2,保证k1<k2。
输出格式:
一行,包含两个整数,分别是A类数和B类数的个数,中间用单个空格隔开。
输入样例:
1 1000
输出样例:
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);
}