首页 > 其他 > 详细

2.3 顺序结构程序设计案例

时间:2021-04-14 15:10:32      阅读:12      评论:0      收藏:0      [点我收藏+]

例 2-9

交换变量。定义两个变量 a 和 b 并输入两个数字存储进它们。交换这两个变量的值并输出。

建模分析:

交换两个变量,需要有第三个变量 c 做临时存放地点。先将 a 给 c,然后将 b 给 a,最后将 c 给 b,完成交换。

#include<iostream>
using namespace std;

int main()
{
    int a,b,c;
    cin>>a>>b;
    c=a;
    a=b;
    b=c;
    cout<<a<<‘ ‘<<b;
    return 0;
}

C语言版:

#include<iostream>
using namespace std;

int main()
{
    int a,b,c;
    scanf("%d %d",&a,&b);
    c=a;
    a=b;
    b=c;
    printf("%d %d",a,b);
    return 0;
}

因为题目说明变量是数字,那么则可以利用数字的特性,进行加减来交换值。可以不用第三个变量c。

#include<iostream>
using namespace std;

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    a=a+b;
    b=a-b;
    a=a-b;
    printf("%d %d",a,b);
    return 0;
}

例 2-10

小鱼的游泳时间(洛谷P1425)

伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。

这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按24小时制计算),它发现自己从a时b分一直游泳到当天的c时d分,请你帮小鱼计算一下,它这天一共游了多少时间呢?

小鱼游的好辛苦呀,你可不要算错了哦。

输入格式

一行内输入 4 个整数,分别表示 a, b, c, d。

输出格式

一行内输出 2 个整数 e 和 f,用空格间隔,依次表示小鱼这天一共游了多少小时多少分钟。其中表示分钟的整数 f 应该小于60。

输入输出样例

输入 输出
12 50 19 10 6 20

建模分析:

首先,0 <= a <=24,0 <= c <= 24,0 <= b <=60,0 <= d <=60,弄明白了时间是60进的。就将小时转化成分钟数。用分钟数计算后再换成小时和分钟就可以了。

解答

#include<cstdio>
using namespace std;

int main()
{
    int a,b,c,d,e,f,delta;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    delta=(60*c+d)-(60*a+b);
    e=delta/60;
    f=delta%60;
    printf("%d %d",e,f);
    return 0;
}

因为 c 一定 大于 a,所以也可以直接得出结果。

#include<iostream>
using namespace std;

int a,b,c,d,e,f;
int main()
{
    cin>>a>>b>>c>>d;
    e=c-a;
    if(b>d)
    {
        e=e-1;
        f=60-b+d;
    }
    else
        f=d-b;
    
    cout<<e<<" "<<f;
}

例 2-11

成绩(洛谷P3954,NOIP 2017 普及组)

牛牛最近学习了C++入门课程,这门课程的总成绩计算方法是:

总成绩=作业成绩×20%+小测成绩×30%+期末考试成绩×50%

牛牛想知道,这门课程自己最终能得到多少分。

输入格式

三个非负整数A,B,C,分别表示牛牛的作业成绩、小测成绩和期末考试成绩。相邻两个数之间用一个空格隔开,三项成绩满分都是100分。

输出格式

一个整数,即牛牛这门课程的总成绩,满分也是100100分。

输入输出样例

输入 输出
100 100 80 90
60 90 80 79

建模分析:

说明/提示

输入输出样例1说明
牛牛的作业成绩是100分,小测成绩是100分,期末考试成绩是80分,总成绩是 100×20%+100×30%+80×50%=20+30+40=90。

输入输出样例2说明
牛牛的作业成绩是60分,小测成绩是90分,期末考试成绩是80分,总成绩是60×20%+90×30%+80×50%=12+27+40=79。

数据说明

对于30%的数据,A=B=0。

对于另外30%的数据,A=B=100。

对于100%的数据,0≤A,B,C≤100且A,B,C都是10的整数倍。

解答

#include<cstdio>
using namespace std;

int main()
{
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    printf("%d",int(a*0.2 + b*0.3 + c*0.5 + 0.5)); //因为int是向下取整,所以需要加0.5,这样就可以保证是四舍五入。
    return 0;
}

因为数据保证是10的倍数,因为浮点数计算容易出现误差,可能会出现类似 78.99999999 这样的数字。为了避免进行浮点类型的运算,采用整数进行运算。

#include<cstdio>
using namespace std;

int main()
{
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    printf("%d",a*2/10 + b*3/10 + c*5/10); //因为int是向下取整,所以需要加0.5,这样就可以保证是四舍五入。
    return 0;
}

例 2-12

yyy 的学校要求早上 8 点前到达。学校到 yyy 的家一共有 s(s≤10000) 米,而 yyy 可以以 v(v<10000) 米每分钟的速度匀速走到学校。此外在上学路上它还要额外花 10 分钟时间进行垃圾分类。请问为了避免迟到 yyy 最晚什么时候出门?输出 HH:MM 的时间格式,不足两位时补零。由于路途遥远, yyy 可能不得不提前一天出发,不过不可能提前超过一天。

输入格式

两个正整数 s,v,意思已经在题目中给定。

输出格式

hh:mm 表示最晚离开家的时间(时:分,必须输出两位,不足两位前面补0)

输入输出样例

输入 输出
100 99 07:48

建模分析:

  1. 用 v/s 算出路上花费的时间,注意除不尽的情况要加多一分钟;
  2. 加上垃圾分类的 10 分钟;
  3. 计算需时多少小时多少分钟;
  4. 如果需时大于 8 小时,则需要提前一天出发。
  5. 将需时减去 8 小时后,继续用 24 时计算出发时间。

解答:

#include<iostream>
#include <iomanip>
using namespace std;

int main()
{
    int s,v,needmins,hh,mm;
    cin>>s>>v;
    
    needmins=s/v;
    if(s%v>0)
        needmins++;
    needmins+=10;
    
    hh=needmins/60;
    mm=needmins%60;
    
    if(hh<8)
    {
        hh=8-hh-1; //花费0小时从7时出发
        
        if(mm>0)
            mm=60-mm;
    }
    else
    {
        hh=24-(hh-8+1); //花费8小时从23时出发
            if(mm>0)
        mm=60-mm;
    }
    cout<<setw(2)<<setfill(‘0‘)<<hh;
    cout<<‘:‘;
    cout<<setw(2)<<setfill(‘0‘)<<mm;
    return 0;
}

技能:

setw(2)指定输出宽度为2个字符,如果不足则默认用空格补齐。
setfill(‘0‘)用指定字符替换默认补全字符空格,这里指定用‘0‘补全。

解法二

因为时间不会提前超过一天,那么我知道话费时间后,就可以先计算出从前一天 0 点到今天 8 有多少时间(分钟),然后将这个时间减去 需要花费的时间,就是需要的结果。

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
    int s,v;
    scanf("%d%d",&s,&v);
    int t_walk=ceil(1.0*s/v)+10;
    int from_zero=60*(24+8)-t_walk; 
    int hh=(from_zero/60)%24;
    int mm=from_zero%60;
    printf("%02d:%02d\n",hh,mm);
    
    return 0;
}

技能:
ceil向上取整。
eg. ceil(3)=3ceil(2.8) = 3ceil(2.1) = 3

%02d的是用输出至少 2 位的整数,不足部分用 ‘0‘ 补齐。

2.3 顺序结构程序设计案例

原文:https://www.cnblogs.com/codespark/p/14657234.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!